Comments (4)
The reason we were doing this is because we want to be compatible with the ThemedToken
interface (altering color
from string
to object will break the other tool), while merging all colors into color
as a flat string might not be flexible enough.
Can you elaborate more about your usage? If it's a valid concern, we could introduce an additional utility for it maybe.
from shikiji.
Since the codeToHast
and codeToHtml
methods both support multiple(light/dark) themes, codeToThemedTokens
should have supported it too, for a better API consistency.
Takes an example of a custom code block in React.js:
export function CodeBlock({ code, lang, className, ...props }: CodeBlockProps) {
const tokens = useMemo(
() =>
highlighter.codeToThemedTokens(code, {
lang
}),
[code]
)
return (
<Pre className={cn('bg-black', className)} {...props}>
<code className="grid">
{tokens.map((token, i) => (
<span data-line key={i}>
{token.map((s, j) => (
<span key={j} style={{ color: s.color }}>
{s.content}
</span>
))}
</span>
))}
</code>
</Pre>
)
}
Obviously if we use codeToTokensWithThemes
here, we must preprocess the returned array on our own, to combine to all variants of a node into one. Otherwise, the simplest solution is to render a code block for individual themes, which is not ideal in terms of bundle size.
Although I ended up implementing my own function to flatten nodes, the codeToTokensWithThemes
API itself is not well-documented and straightforward enough (feels like a hacky way to me). Would appreciate it if thereโs an additional utility to make it more convenience.
from shikiji.
I wonder what prevents you from using codeToHast
directly for rendering the nodes?
from shikiji.
That would be a great solution, I initially missed it because codeToThemedTokens
seemed to be more straightforward for me when comes to be rendering and animating it. Hast nodes are not typed and I was unsure of its properties, they are pretty enough for normal code blocks though
from shikiji.
Related Issues (20)
- Extra <span class="line"></span> added to code blocks? HOT 2
- Undocumented differences compared to Shiki-Twoslash HOT 3
- Docs: Nav: Typo "Compatibly" HOT 1
- `transformerMetaWordHighlight` highlight is not working when word includes symbols HOT 7
- Support for inline code HOT 2
- `rehype-shikiji` support metastring from `node.properties`
- Add ability for language alias rehype-shiki
- Extra leading space in `span`s containing TypeScript types causes underlines to start early HOT 2
- Allow CSS Variables theme HOT 4
- Compatibility with unwasm HOT 6
- Additional types for ThemeRegistrationResolved HOT 7
- Setting up fine-grained highlighter from web bundle bundles all themes HOT 1
- Improve In-Browser Markdown Processing Speed with Caching HOT 4
- Code overflow in the type information popup
- code block bg parm HOT 1
- Support Vue SFC for TwoSlash HOT 1
- vitepress-plugin-twoslash: Unknown file extension ".css" HOT 3
- [markdown-it-shikiji]: Issues with line number highlights while using markdown-it-attrs HOT 4
- Word highlighting
- Issue template mentions unrelated project HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from shikiji.