Complete Syntax Highlighting for Markdown It with Shiki. Inspired by markdown-it-shiki
With shada-it
, you can effortlessly manage your code blocks using simple comments with the shada:{remove,add,highlight,focus}
syntax. It's compatible with various single-line comment styles, including:
#
for Ruby<%#
for ERB Ruby//
for JavaScript, TypeScript, and C++/* */
for CSS
Demo: https://maful.web.id
npm i -D shada-it
import MarkdownIt from 'markdown-it'
import ShadaIt from 'shada-it'
const md = MarkdownIt()
md.use(ShadaIt, {
theme: 'dracula'
})
Example:
```ts
interface AttrsLineOptions {
lineNumber: boolean // shada:remove
lineNumbers: boolean // shada:add
}
```
![image](https://private-user-images.githubusercontent.com/6563823/255499677-a5d011b4-2bf8-4fb8-ac57-ba718798ce13.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDE5NTUsIm5iZiI6MTczOTIwMTY1NSwicGF0aCI6Ii82NTYzODIzLzI1NTQ5OTY3Ny1hNWQwMTFiNC0yYmY4LTRmYjgtYWM1Ny1iYTcxODc5OGNlMTMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTBUMTUzNDE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NTRkZDVlYjBmYTA0NzlhMmVhZDhjMjE2NTlkYzM3NGZlN2M1Y2VjOWZiODIwNzc3OTg0YzFlMzRmMzI3ZWZhMCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.3SNPv0PK-PpeabN9Eov6d7rzgjynL_F8XagN37lud-8)
By default, line numbers are hidden. To display them, simply include the {lineNumbers:true}
option in your code block.
```ruby {lineNumbers:true}
class Post < ApplicationRecord
validates :title, presence: true
validates :body, presence: true
end
```
![image](https://private-user-images.githubusercontent.com/6563823/255499805-24ac0f79-32e1-4b7c-afbb-6339a7ce1104.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDE5NTUsIm5iZiI6MTczOTIwMTY1NSwicGF0aCI6Ii82NTYzODIzLzI1NTQ5OTgwNS0yNGFjMGY3OS0zMmUxLTRiN2MtYWZiYi02MzM5YTdjZTExMDQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTBUMTUzNDE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YjJkM2ZiMmRmZDQ1YzM4OTZjZDY1ODg1YTgzMTE4MDBkYjdmNWM0NTNiNWI2YWFjMGQ5NzFmYjZlODYwODRlOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.upcamMikxGRpSvKHrabn8JrLvkceYyTMu6dISuDMlWU)
Adding lines to your code is a breeze with shada:add
. Just use the appropriate comment syntax for your code block.
```ruby
class Post < ApplicationRecord
has_one_attached :image # shada:add
end
```
![image](https://private-user-images.githubusercontent.com/6563823/255499963-49565fdf-1daf-41d6-bfea-b43bc9d4c69a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDE5NTUsIm5iZiI6MTczOTIwMTY1NSwicGF0aCI6Ii82NTYzODIzLzI1NTQ5OTk2My00OTU2NWZkZi0xZGFmLTQxZDYtYmZlYS1iNDNiYzlkNGM2OWEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTBUMTUzNDE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGUxMDkwZjNmODc4NzM3NDI4MjlhZDQ0ZmYyMTBiNjI4NDU2ZTJlYzBlN2U0NjJjYmM0ZjAwNWNhMTdjYmY1YiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.UlL9tG_krxMDI3wVfKla0pCEX8m2ycI1L_PtrkxuUqY)
With shada:remove
, you can easily indicate lines that should be removed from your code block using comments.
```ruby
class Post < ApplicationRecord
has_one_attached :image # shada:remove
end
```
![image](https://private-user-images.githubusercontent.com/6563823/255500070-56e9833e-eff5-483a-b574-eaabb9402a35.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDE5NTUsIm5iZiI6MTczOTIwMTY1NSwicGF0aCI6Ii82NTYzODIzLzI1NTUwMDA3MC01NmU5ODMzZS1lZmY1LTQ4M2EtYjU3NC1lYWFiYjk0MDJhMzUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTBUMTUzNDE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9M2VhYTA0NDE0MzY2NmU4MTBlODUyYTg5Zjk1ZjliYzI5NTgyYjQ5NDkxNDdlMDQzZjI0Nzc2N2VlYzAyYTFmMiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.DaTeUjU4Hf44tY0eB-br83AzfQQ92AuBM8lprT0rwh8)
Make specific lines stand out by using shada:highlight
with comment syntax tailored to your code block.
```ruby
class Post < ApplicationRecord
has_one_attached :image # shada:highlight
end
```
![image](https://private-user-images.githubusercontent.com/6563823/255500160-1e705b60-2cf9-4477-8b96-f421412f3ad8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDE5NTUsIm5iZiI6MTczOTIwMTY1NSwicGF0aCI6Ii82NTYzODIzLzI1NTUwMDE2MC0xZTcwNWI2MC0yY2Y5LTQ0NzctOGI5Ni1mNDIxNDEyZjNhZDgucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTBUMTUzNDE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MmJiM2IxY2Q2OTVlYmI2ZmQ5OTc4NjYxM2VlODg1NDQyZTFmMzQyNWZjNDgyOGY4YzE0ODUxMjFiZTMwOWQ0NCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.vgp4rdnI3hM_l20z1wrclx8eLILYz34_svk0U4PLSHA)
Need to draw attention to certain lines? Utilize shada:focus
with the appropriate comment syntax for your code block.
```ruby
class Post < ApplicationRecord
has_one_attached :image # shada:focus
end
```
Last, add these to your CSS
pre code.has-focus-lines .line:not(.line-focus) {
filter: blur(.095rem);
opacity: .65;
transition: filter .35s,opacity .35s
}
pre code.has-focus-lines:hover .line:not(.line-focus) {
filter: blur();
opacity: 1
}
![image](https://private-user-images.githubusercontent.com/6563823/255500314-e3e29ed4-4588-4538-9201-6a2ec5e002b1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDE5NTUsIm5iZiI6MTczOTIwMTY1NSwicGF0aCI6Ii82NTYzODIzLzI1NTUwMDMxNC1lM2UyOWVkNC00NTg4LTQ1MzgtOTIwMS02YTJlYzVlMDAyYjEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDIxMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTAyMTBUMTUzNDE1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9Yzg0ODRhZmJiYWViZmE4OTViYTA0OWRmOTBmMzBiMjk3NGY0ZThmMzY1NjAxNjYwZmQwMGZmZjlhOTRjNDNiMCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.MxJLO0vnKfkChOFv6ICOYnoXwnx1cD9pyKEnXRg7FTA)
The gem is available as open source under the terms of the MIT License.