1
- // capture h2, h3, and h4 headings
2
- const headingRegex = / ^ # # # ? # ? ( .* ?) $ / gm
1
+ const astFromMarkdown = require ( 'mdast-util-from-markdown' )
2
+ const toString = require ( 'mdast-util-to-string' )
3
+ const visit = require ( 'unist-util-visit' )
4
+ const findPage = require ( './find-page' )
3
5
4
6
// for any translated page, first get corresponding English markdown
5
7
// then get the headings on both the translated and English pageMap
@@ -16,22 +18,31 @@ module.exports = function getEnglishHeadings (page, context) {
16
18
} , { } )
17
19
}
18
20
19
- const translatedHeadings = page . markdown . match ( headingRegex )
20
- if ( ! translatedHeadings ) return
21
+ const translatedHeadings = getHeadings ( page . markdown )
22
+ if ( ! translatedHeadings . length ) return
21
23
22
- const englishPage = context . pages [ `/en/${ page . relativePath . replace ( / .m d $ / , '' ) } ` ]
24
+ const englishPage = findPage ( `/en/${ page . relativePath . replace ( / .m d $ / , '' ) } ` , context . pages , context . redirects )
23
25
if ( ! englishPage ) return
24
26
25
27
// FIX there may be bugs if English headings are updated before Crowdin syncs up :/
26
- const englishHeadings = englishPage . markdown . match ( headingRegex )
27
- if ( ! englishHeadings ) return
28
-
29
- // select heading text only
30
- const cleanTranslatedHeadings = translatedHeadings . map ( h => h . replace ( headingRegex , '$1' ) )
31
- const cleanEnglishHeadings = englishHeadings . map ( h => h . replace ( headingRegex , '$1' ) )
28
+ const englishHeadings = getHeadings ( englishPage . markdown )
29
+ if ( ! englishHeadings . length ) return
32
30
33
31
// return a map from translation:English
34
- return Object . assign ( ...cleanTranslatedHeadings . map ( ( k , i ) => ( {
35
- [ k ] : cleanEnglishHeadings [ i ]
32
+ return Object . assign ( ...translatedHeadings . map ( ( k , i ) => ( {
33
+ [ k ] : englishHeadings [ i ]
36
34
} ) ) )
37
35
}
36
+
37
+ function getHeadings ( markdown ) {
38
+ const ast = astFromMarkdown ( markdown )
39
+ const headings = [ ]
40
+
41
+ visit ( ast , node => {
42
+ if ( node . type !== 'heading' ) return
43
+ if ( ! [ 2 , 3 , 4 ] . includes ( node . depth ) ) return
44
+ headings . push ( toString ( node ) )
45
+ } )
46
+
47
+ return headings
48
+ }
0 commit comments