3
3
import { getInnerText } from '@redocly/realm/dist/shared/markdoc.js' ;
4
4
5
5
import { dirname , relative , join as joinPath } from 'path' ;
6
- import markdoc from '@markdoc/markdoc' ;
7
6
8
7
export function codeSamples ( ) {
9
8
/** @type {import("@redocly/realm/dist/server/plugins/types").PluginInstance } */
10
9
const instance = {
11
- processContent : async ( contentProvider , actions ) => {
10
+ processContent : async ( actions , { fs , cache } ) => {
12
11
try {
13
12
const samples = [ ] ;
14
13
const allLands = new Set ( ) ;
15
- const allCodeSampleFiles = Array . from ( contentProvider . fsFilesList . values ( ) ) ;
14
+ const allCodeSampleFiles = await fs . scan ( ) ;
16
15
17
- const readmes = allCodeSampleFiles . filter ( file => file . match ( / _ c o d e - s a m p l e s [ \/ \\ ] ( [ ^ \\ \/ ] * ) [ \/ \\ ] R E A D M E \. m d $ / ) ) ;
16
+ const readmes = allCodeSampleFiles . filter ( ( file ) => file . relativePath . match ( / ^ _ c o d e - s a m p l e s [ \/ \\ ] ( [ ^ \\ \/ ] * ) [ \/ \\ ] R E A D M E \. m d $ / ) ) ;
18
17
19
- for ( const relativePath of readmes ) {
20
- const record = contentProvider . loadContent ( relativePath , 'frontmatter ' ) ;
18
+ for ( const { relativePath } of readmes ) {
19
+ const { data } = await cache . load ( relativePath , 'markdown-ast ' ) ;
21
20
22
- const ast = markdoc . parse ( record . content ) ;
23
-
24
- const dirPath = dirname ( relativePath )
21
+ const dirPath = dirname ( relativePath ) ;
25
22
const langs = unique (
26
23
allCodeSampleFiles
27
- . filter ( file => file . startsWith ( dirPath ) && ! file . endsWith ( 'README.md' ) )
28
- . map ( file => relative ( dirPath , file ) . split ( '/' ) [ 0 ] )
24
+ . filter ( ( file ) => file . relativePath . startsWith ( dirPath ) && ! file . relativePath . endsWith ( 'README.md' ) )
25
+ . map ( ( file ) => relative ( dirPath , file . relativePath ) . split ( '/' ) [ 0 ] )
29
26
) ;
30
- const title = extractFirstHeading ( ast ) || '' ;
27
+ const title = extractFirstHeading ( data . ast ) || '' ;
31
28
samples . push ( {
32
29
path : dirPath ,
33
30
title : title || toTitleCase ( dirname ( dirPath ) ) ,
34
- description : getInnerText ( [ ast . children [ 1 ] ] ) . replace ( title , '' ) . trim ( ) ,
31
+ description : getInnerText ( [ data . ast . children [ 1 ] ] ) . replace ( title , '' ) . trim ( ) ,
35
32
href : joinPath ( 'content' , dirPath ) ,
36
33
langs,
37
34
} ) ;
38
35
39
- langs . forEach ( l => allLands . add ( l ) ) ;
36
+ langs . forEach ( ( l ) => allLands . add ( l ) ) ;
40
37
}
41
38
42
39
const sortedSamples = samples . sort ( ( a , b ) => normalizeTitleForSort ( a ) . localeCompare ( normalizeTitleForSort ( b ) ) ) ;
43
40
44
- actions . createSharedData ( 'code-samples' , { codeSamples : sortedSamples , langs : Array . from ( allLands ) } ) ;
41
+ actions . createSharedData ( 'code-samples' , {
42
+ codeSamples : sortedSamples ,
43
+ langs : Array . from ( allLands ) ,
44
+ } ) ;
45
45
actions . addRouteSharedData ( '/resources/code-samples/' , 'code-samples' , 'code-samples' ) ;
46
46
actions . addRouteSharedData ( '/ja/resources/code-samples/' , 'code-samples' , 'code-samples' ) ;
47
47
} catch ( e ) {
@@ -64,8 +64,8 @@ const WORDS_TO_CAPS = ['xrp'];
64
64
function toTitleCase ( s ) {
65
65
const words = s . split ( / _ | [ ^ \w ' ] / ) ;
66
66
return words
67
- . filter ( word => word )
68
- . map ( word => ( WORDS_TO_CAPS . includes ( word ) ? word . toUpperCase ( ) : word . charAt ( 0 ) . toUpperCase ( ) + word . slice ( 1 ) ) )
67
+ . filter ( ( word ) => word )
68
+ . map ( ( word ) => ( WORDS_TO_CAPS . includes ( word ) ? word . toUpperCase ( ) : word . charAt ( 0 ) . toUpperCase ( ) + word . slice ( 1 ) ) )
69
69
. join ( ' ' )
70
70
. replace ( "'S" , "'s" )
71
71
. replace ( ' A ' , ' a ' ) ;
@@ -78,7 +78,7 @@ function unique(array) {
78
78
function extractFirstHeading ( ast ) {
79
79
let heading ;
80
80
81
- visit ( ast , node => {
81
+ visit ( ast , ( node ) => {
82
82
if ( ! isNode ( node ) ) {
83
83
return ;
84
84
}
0 commit comments