From 50a85bb390d2a4a4ff47a11066b528d6b476daf8 Mon Sep 17 00:00:00 2001 From: Tatsunori Uchino Date: Wed, 27 Dec 2023 00:50:44 +0900 Subject: [PATCH] feat(theme-common): code block MagicComments support for (Visual) Basic/Batch/Fortran/COBOL/ML --- .../src/utils/codeBlockUtils.ts | 52 ++++++++++++++---- .../_pages tests/code-block-tests.mdx | 55 +++++++++++++++++++ 2 files changed, 97 insertions(+), 10 deletions(-) diff --git a/packages/docusaurus-theme-common/src/utils/codeBlockUtils.ts b/packages/docusaurus-theme-common/src/utils/codeBlockUtils.ts index 17a85878dcb51..74371c0d7e1d6 100644 --- a/packages/docusaurus-theme-common/src/utils/codeBlockUtils.ts +++ b/packages/docusaurus-theme-common/src/utils/codeBlockUtils.ts @@ -13,18 +13,31 @@ const codeBlockTitleRegex = /title=(?["'])(?.*?)\1/; const metastringLinesRangeRegex = /\{(?<range>[\d,-]+)\}/; // Supported types of highlight comments -const commentPatterns = { +const popularCommentPatterns = { js: {start: '\\/\\/', end: ''}, jsBlock: {start: '\\/\\*', end: '\\*\\/'}, jsx: {start: '\\{\\s*\\/\\*', end: '\\*\\/\\s*\\}'}, bash: {start: '#', end: ''}, html: {start: '<!--', end: '-->'}, +} as const; + +const commentPatterns = { + ...popularCommentPatterns, // shallow copy is sufficient + // minor comment styles lua: {start: '--', end: ''}, wasm: {start: '\\;\\;', end: ''}, tex: {start: '%', end: ''}, -}; + vb: {start: "['‘’]", end: ''}, + rem: {start: '[Rr][Ee][Mm]\\b', end: ''}, + f90: {start: '!', end: ''}, // Free format only + ml: {start: '\\(\\*', end: '\\*\\)'}, + cobol: {start: '\\*>', end: ''}, // Free format only +} as const; type CommentType = keyof typeof commentPatterns; +const popularCommentTypes = Object.keys( + popularCommentPatterns, +) as CommentType[]; export type MagicCommentConfig = { className: string; @@ -99,15 +112,34 @@ function getAllMagicCommentDirectiveStyles( case 'wasm': return getCommentPattern(['wasm'], magicCommentDirectives); + case 'vb': + case 'vbnet': // cspell: word vbnet + case 'vba': + case 'visual-basic': + return getCommentPattern(['vb', 'rem'], magicCommentDirectives); + + case 'batch': + return getCommentPattern(['rem'], magicCommentDirectives); + + case 'basic': // https://github.com/PrismJS/prism/blob/master/components/prism-basic.js#L3 + return getCommentPattern(['rem', 'f90'], magicCommentDirectives); + + case 'fsharp': + return getCommentPattern(['js', 'ml'], magicCommentDirectives); + + case 'ocaml': + case 'sml': + return getCommentPattern(['ml'], magicCommentDirectives); + + case 'fortran': + return getCommentPattern(['f90'], magicCommentDirectives); + + case 'cobol': + return getCommentPattern(['cobol'], magicCommentDirectives); + default: - // All comment types except lua, wasm and matlab - return getCommentPattern( - Object.keys(commentPatterns).filter( - (pattern) => - !['lua', 'wasm', 'tex', 'latex', 'matlab'].includes(pattern), - ) as CommentType[], - magicCommentDirectives, - ); + // All popular comment types + return getCommentPattern(popularCommentTypes, magicCommentDirectives); } } diff --git a/website/_dogfooding/_pages tests/code-block-tests.mdx b/website/_dogfooding/_pages tests/code-block-tests.mdx index 3b778e7cea569..d631092e3831d 100644 --- a/website/_dogfooding/_pages tests/code-block-tests.mdx +++ b/website/_dogfooding/_pages tests/code-block-tests.mdx @@ -384,6 +384,61 @@ y = times2(x); \end{document} ``` +```vbnet title="vbnet.vb" +Dim languages As New Set(Of String) From { + ' highlight-start + "C#", + "Visual Basic", + "F#", + ' highlight-end + "PowerShell", + ' highlight-next-line + "TypeScript" +} +``` + +```batch title="cmd.bat" +rem highlight-start +@echo off +setlocal +Rem highlight-end +ipconfig +REM highlight-next-line +echo Docusaurus is awesome +netstat +``` + +```fortran title="fortran.f90" +! highlight-start +program hello +! highlight-end + implicit none + ! highlight-next-line + print *, "Hello, World!" +end program hello +``` + +```cobol title="cobol.cob" +*> highlight-start +IDENTIFICATION DIVISION. +PROGRAM-ID. HELLO. +*> highlight-end +PROCEDURE DIVISION. + *> highlight-next-line + DISPLAY "Hello, World!". +END PROGRAM HELLO. +``` + +```fsharp title="fsharp.fsx" +(* highlight-start *) +[<EntryPoint>] +(* highlight-end *) +let main _ = + // highlight-next-line + printfn "Hello, World!" + 0 +``` + ## HTML - script + style highlighting See https://github.com/facebook/docusaurus/issues/9517