Docusaurus: [Enhancement] Improved code blocks

Created on 30 Sep 2017  路  8Comments  路  Source: facebook/docusaurus

In this issue I want to collect some ideas for improving our fenced code block widget. 1.0 will launch without this.

  • [ ] Language toggling
    A good example of this can be found in the Parse docs.
  • [ ] Sub-language toggles
    (e.g. ES6, ES5)
  • [ ] Line highlighting
    Support ```javascript{3,5-7} syntax for highlighting (#105 @rickyvetter)

(There may be other ideas for features to implement in this issue https://github.com/facebook/react/issues/10991)

advanced feature claimed

Most helpful comment

I actually hacked together a plugin called "file tabs" to do this. I just wanted to use docusaurus to quickly prototype something, so the plugin was meant to be quick and dirty. Source is here: https://github.com/govau/platforms-alpha/blob/master/lib/shared/fileTabs.js

Install into your site like this: https://github.com/govau/platforms-alpha/blob/master/tell/website/siteConfig.js#L52

And here's how you use it in your .md file:

````md

file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.cs lang=csharp label=C#
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.go lang=go label=Go
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.inline parser=md label=Java
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.js lang=js label=Node.js
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.php lang=php label=PHP
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.py lang=python label=Python
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.rb lang=ruby label=Ruby

````

And how it ends up looking:

image

image

Edit:

One problem as it stands is that this doesn't account for versioning:

  1. docs/** are not copied when versioning. Hoping that https://github.com/facebook/Docusaurus/pull/705 resolves this
  2. the versioned_docs/**/*.md files are going to have filetabs fences that refer to the latest/master set of files. Need to figure out how this would be handled. Ideally filetabs would work by having files be relative to the current file, but from memory when I tried doing that originally it didn't work and I needed to make the file relative to the project root.

All 8 comments

What would be a good syntax for code blocks with language toggling?

image

I am very interesting in trying to make a Pull Request for this. Before I get started, I'd appreciate some collaboration on the design :).

I like the idea of just having multiple code blocks, one after another, with no text between them:

screen shot 2018-03-02 at 18 10 12

A toggle would be very helpful. The one in the parse docs is great if you have a small list of languages, but if you have more than 5 it's hard to make it work. Perhaps use that if the number of languages is 3 or fewer and a select list otherwise?

I actually hacked together a plugin called "file tabs" to do this. I just wanted to use docusaurus to quickly prototype something, so the plugin was meant to be quick and dirty. Source is here: https://github.com/govau/platforms-alpha/blob/master/lib/shared/fileTabs.js

Install into your site like this: https://github.com/govau/platforms-alpha/blob/master/tell/website/siteConfig.js#L52

And here's how you use it in your .md file:

````md

file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.cs lang=csharp label=C#
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.go lang=go label=Go
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.inline parser=md label=Java
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.js lang=js label=Node.js
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.php lang=php label=PHP
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.py lang=python label=Python
file=website/blog/2018-06-13-docusaurus-file-tabs-plugin/example.rb lang=ruby label=Ruby

````

And how it ends up looking:

image

image

Edit:

One problem as it stands is that this doesn't account for versioning:

  1. docs/** are not copied when versioning. Hoping that https://github.com/facebook/Docusaurus/pull/705 resolves this
  2. the versioned_docs/**/*.md files are going to have filetabs fences that refer to the latest/master set of files. Need to figure out how this would be handled. Ideally filetabs would work by having files be relative to the current file, but from memory when I tried doing that originally it didn't work and I needed to make the file relative to the project root.

@jonathaningram This looks amazing! I also like that the code is stored outside of the Markdown file. We'll look into including it! 馃槃

@yangshun thanks! Yeah we'd probably publish as an npm package and then it could just be imported like any other old package, but for my case I didn't want to bother publishing a new package so I just needed to hack together a way to import it from multiple docusaurus instances.

And of course the tabs HTML and CSS would need to be cleaned up, verify accessibility, and so on.

Finally, I think the fence syntax is pretty neat, but would be good to validate that it's scalable too.

Oh, it actually lets you embed another MD file like this:

image

Hi I'm interested in this issue. Is it an appropriate bug to work on?

@fiennyangeln - I think this is quite appropriate. Language Toggling would be great and a feature that people really have asked for. And anything else you feel could improve the code blocks too.

I will mark this issue as claimed by you 馃槃

Was this page helpful?
0 / 5 - 0 ratings

Related issues

azu picture azu  路  3Comments

JoelMarcey picture JoelMarcey  路  3Comments

microbouji picture microbouji  路  3Comments

ericnakagawa picture ericnakagawa  路  3Comments

omry picture omry  路  3Comments