1- import { markdown as markdownExtension } from '@codemirror/lang-markdown'
2- import {
3- defineLanguageFacet ,
4- foldNodeProp ,
5- foldService ,
6- indentNodeProp ,
7- Language ,
8- languageDataProp ,
9- syntaxTree ,
10- } from '@codemirror/language'
1+ import { markdown } from '@codemirror/lang-markdown'
2+ import { foldNodeProp } from '@codemirror/language'
113import { type Extension } from '@codemirror/state'
12- import { NodeProp , type NodeType , type Parser , type SyntaxNode } from '@lezer/common'
13- import { ensoMarkdownParser } from 'ydoc-shared/ast/ensoMarkdown'
14-
15- function mkLang ( parser : Parser ) {
16- return new Language ( data , parser , [ headerIndent ] , 'markdown' )
17- }
18-
19- const data = defineLanguageFacet ( { commentTokens : { block : { open : '<!--' , close : '-->' } } } )
20-
21- const headingProp = new NodeProp < number > ( )
22-
23- const commonmarkCodemirrorLanguageExtension = {
24- props : [
25- foldNodeProp . add ( ( type ) => {
26- return ! type . is ( 'Block' ) || type . is ( 'Document' ) || isHeading ( type ) != null || isList ( type ) ?
27- undefined
28- : ( tree , state ) => ( { from : state . doc . lineAt ( tree . from ) . to , to : tree . to } )
29- } ) ,
30- headingProp . add ( isHeading ) ,
31- indentNodeProp . add ( {
32- Document : ( ) => null ,
33- } ) ,
34- languageDataProp . add ( {
35- Document : data ,
36- } ) ,
37- ] ,
38- }
39-
40- function isHeading ( type : NodeType ) {
41- const match = / ^ (?: A T X | S e t e x t ) H e a d i n g ( \d ) $ / . exec ( type . name )
42- return match ? + match [ 1 ] ! : undefined
43- }
44-
45- function isList ( type : NodeType ) {
46- return type . name == 'OrderedList' || type . name == 'BulletList'
47- }
48-
49- function findSectionEnd ( headerNode : SyntaxNode , level : number ) {
50- let last = headerNode
51- for ( ; ; ) {
52- const next = last . nextSibling
53- let heading
54- if ( ! next || ( ( heading = isHeading ( next . type ) ) != null && heading <= level ) ) break
55- last = next
56- }
57- return last . to
58- }
59-
60- const headerIndent = foldService . of ( ( state , start , end ) => {
61- for (
62- let node : SyntaxNode | null = syntaxTree ( state ) . resolveInner ( end , - 1 ) ;
63- node ;
64- node = node . parent
65- ) {
66- if ( node . from < start ) break
67- const heading = node . type . prop ( headingProp )
68- if ( heading == null ) continue
69- const upto = findSectionEnd ( node , heading )
70- if ( upto > end ) return { from : end , to : upto }
71- }
72- return null
73- } )
4+ import { ensoMarkdownExtension } from 'ydoc-shared/ast/ensoMarkdown'
745
756const tableCodemirrorLanguageExtension = {
767 props : [
@@ -80,13 +11,8 @@ const tableCodemirrorLanguageExtension = {
8011 ] ,
8112}
8213
83- const extension = markdownExtension ( {
84- base : mkLang (
85- ensoMarkdownParser . configure ( [
86- commonmarkCodemirrorLanguageExtension ,
87- tableCodemirrorLanguageExtension ,
88- ] ) ,
89- ) ,
14+ const extension = markdown ( {
15+ extensions : [ ensoMarkdownExtension , tableCodemirrorLanguageExtension ] ,
9016} )
9117
9218export const ensoMarkdownSyntax = ( ) : Extension => extension
0 commit comments