Inserting some custom extension components into the content of the article may be a requirement for some people (like me).
xfm (xLog flavored markdown) is basically based on gfm and provides some built-in component extensions.
So if you have a certain customization requirement for the content, you can directly use HTML tags to build it.
Embedding Video Components#
The most commonly used video websites use iframes to embed videos (such as Bilibili).
Bilibili Video
However, embedding Bilibili's player requires customizing some styles and using some parameters to make it work properly.
<style>iframe{ aspect-ratio: 16/9 }</style>
<iframe src="//player.bilibili.com/player.html?bvid=BV1Zh411M7P7&autoplay=0" width="100%" allowfullscreen> </iframe>
Since the content of xlog uses remark-directive
, if you don't like writing HTML tags, you can also use:
::style[iframe{aspect-ratio: 16/9}]
::iframe{src="//player.bilibili.com/player.html?bvid=BV1Zh411M7P7&autoplay=0" width="100%" allowfullscreen}
Of course, there is also YouTube:
YouTube
<iframe width="560" height="315" src="https://www.youtube.com/embed/uHGShqcAHlQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
Embedding iframes can be very simple, but what if you need components with some interactivity?
Simple Content Interaction Extension Components#
In fact, modern CSS can provide some interactive capabilities, but it requires a deep understanding of CSS techniques.
However, based on the functionality of iframes, we can completely use front-end framework components to extend your article content with components. But there are a few prerequisites here.
Using iframes to use front-end framework components#
For example, now I have a web component (from YunYouJun).
<!-- Actually, there should be normal HTML structure -->
<script
type="module"
src="https://cdn.jsdelivr.net/npm/wc-github-corners@latest"
></script>
<github-corners blank="true"></github-corners>
In normal cases, we can convert this HTML code to base64 and put it in the src attribute of the iframe. The following should be usable, but due to the absolute positioning of this component, the display effect may not be very good.
<iframe
src="data:text/html;base64,PGh0bWwgc3R5bGU9IiI+DQo8aGVhZD4NCjxzY3JpcHQgdHlwZT0ibW9kdWxlIiBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vd2MtZ2l0aHViLWNvcm5lcnNAbGF0ZXN0Ij48L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsiPg0KPGdpdGh1Yi1jb3JuZXJzIGJsYW5rPSJ0cnVlIj48L2dpdGh1Yi1jb3JuZXJzPg0KPC9ib2R5Pg0KPC9odG1sPg==" style="color-scheme: auto;"></iframe>
But since xLog does not allow protocols other than http
and https
to appear in the src attribute, how can we solve this? Contribute code to xlog to remove this restriction
Obviously, that won't work, so we can provide a very simple service to convert the parameters directly into HTML and return it. This way, we can provide some simple interactive components. Don't forget to use encodeURIComponent
for URL parameters.
The service used in the following example is a randomly written vercel function and has no stability.
Of course, this approach can completely use some simple front-end framework components, or web components can directly find existing components.
If using React, you may need
babel-standalone
.
If the HTML scale is too large, solutions like Apline.js
or vue/petite-vue
will inevitably cause the base64 string to exceed the URL length. Therefore, if the functionality is complex, it is recommended to publish an npm package and import it via CDN.
More Comprehensive Content Interactivity#
But in the end, using iframes still has its drawbacks, and there is an extra step of converting to base64, which is quite troublesome.
So in the future, if xLog can allow the inclusion of web components, it would be a good solution, after all, web components are also a standard and will inevitably be supported.
It may be necessary to rewrite rehype-sanitize
to support tags with any or specified prefixes.