spip2md/spip2md/spip.lark

106 lines
2.9 KiB
Plaintext
Raw Normal View History

2023-04-28 15:44:50 +02:00
// Flexible SPIP Markup grammar for Lark parser
start: _N* block ( _N+ block )* _N*
2023-05-03 16:06:23 +02:00
?block: HORIZONTAL_RULE
| heading
| list
| table
2023-05-02 10:56:28 +02:00
| _block_tag
2023-05-09 09:28:29 +02:00
| paragraph{TEXT}
2023-04-28 15:44:50 +02:00
HORIZONTAL_RULE: /----+/
2023-04-26 11:13:47 +02:00
2023-04-27 17:33:39 +02:00
?list: unordered_list
| ordered_list
2023-04-28 15:44:50 +02:00
unordered_list: ( _UL list_item _N )+
ordered_list: ( _OL list_item _N )+
list_item: _inline{TEXT}+
_UL: /-\*|-[^#-]/
_OL: /-#/
2023-05-09 09:29:10 +02:00
table: ( _TBL_META table_metadata "||" _N )? ( table_row _N )+
2023-04-28 15:44:50 +02:00
table_metadata: table_title "|" table_description
table_title: _inline{TABLE_TEXT}
table_description: _inline{TABLE_TEXT}
table_row: ( _TBL table_cell )+ "|"
table_cell: _inline{TABLE_TEXT}
2023-05-09 09:29:10 +02:00
_TBL_META: "||"
_TBL: "|"
2023-04-28 15:44:50 +02:00
heading: _H _inline{MARKED_TEXT}+ "}}}"
_H: "{{{"
2023-05-09 09:29:10 +02:00
_block_tag: pair_block_tag
| orphan_block_tag
2023-05-02 10:56:28 +02:00
2023-05-03 17:00:15 +02:00
pair_block_tag: _PAIR_TAG_ANGLE TAG_NAME ( _OPTION_SEP TAG_OPTION )* ">" start "</" _PURE_TEXT ">" -> tag
orphan_block_tag: _ORPHAN_TAG_ANGLE "/"? TAG_NAME ( _OPTION_SEP TAG_OPTION )* ">" -> orphan_tag
2023-05-02 10:56:28 +02:00
2023-05-04 11:54:37 +02:00
_PAIR_TAG_ANGLE: /<(?=([0-9A-Za-z_:|,=\/\-\. ]+)>\r?\n[\s\S]+<\/\1>)/
_ORPHAN_TAG_ANGLE: /<(?=([0-9A-Za-z_:|,=\/\-\. ])+>\r?\n)(?![\s\S]+\<\/\1\>)/
2023-05-02 10:56:28 +02:00
paragraph{text}: _inline{PARAGRAPH_TEXT} _N? ( _inline{text} _N? )*
2023-04-28 15:44:50 +02:00
2023-05-02 10:56:28 +02:00
_inline{text}: _inline_tag
| _link
2023-04-28 15:44:50 +02:00
| emphasis
| strong
2023-05-02 10:56:28 +02:00
| text
2023-04-28 15:44:50 +02:00
2023-05-09 09:29:10 +02:00
_inline_tag: pair_inline_tag
2023-05-09 10:15:53 +02:00
| orphan_inline_tag
2023-04-28 15:44:50 +02:00
2023-05-09 09:28:29 +02:00
pair_inline_tag: _PAIR_INLINE_TAG_ANGLE TAG_NAME ( _OPTION_SEP TAG_OPTION )* ">" _N? paragraph{TEXT} ( "</" _PURE_TEXT ">" | _N ) -> tag
2023-05-04 11:59:55 +02:00
orphan_inline_tag: _INLINE_TAG_ANGLE TAG_NAME ( _OPTION_SEP TAG_OPTION )* ">" -> orphan_tag
2023-05-02 10:56:28 +02:00
2023-05-09 10:15:53 +02:00
_PAIR_INLINE_TAG_ANGLE: /<(?!\/|img|emb|doc)(?=[0-9A-Za-z_:,=\/\.\|\- ]*>)/i
2023-05-04 11:59:55 +02:00
_INLINE_TAG_ANGLE: /<\/?(?=(?:img|emb|doc)[0-9A-Za-z\|_:,=\/\.\|\- ]+>)/i
2023-04-28 15:44:50 +02:00
2023-05-02 10:56:28 +02:00
_link: footnote
| wikilink
| anchor
2023-04-28 15:44:50 +02:00
2023-05-03 16:32:36 +02:00
footnote: _FOOT FOOTNOTE_CONTENT "]]"
2023-05-02 10:56:28 +02:00
wikilink: _WIKI HREF "]"
2023-05-03 17:00:15 +02:00
anchor: _A A_TEXT "->" " "* HREF " "* "]"
2023-04-28 15:44:50 +02:00
_FOOT: /\[\[/
_WIKI: /\[\?/
_A: /\[(?=[^\[\n\r]+->)/
2023-05-03 16:32:36 +02:00
FOOTNOTE_CONTENT: /[0-9A-Za-z_:\/\-\.\ ]+/
2023-05-03 17:00:15 +02:00
HREF: _PURE_TEXT | _PLACEHOLDER
2023-04-28 15:44:50 +02:00
A_TEXT: /[^\r\n\{]+?(?=->)/
2023-05-02 10:56:28 +02:00
strong: _B ( _inline{MARKED_TEXT} )+ ( "}}" | _N )
emphasis: _I ( _inline{MARKED_TEXT} )+ ( "}" | _N )
_B: /{{(?=[^\{])/
_I: /{(?=[^\{])/
2023-04-28 15:44:50 +02:00
PARAGRAPH_TEXT: / [^\r\n|\-{<]
(?:[^\r\n{<](?!
[^\[\r\n]*->
|\?[^\[\r\n]*\]
|\[[^\[\r\n]*\]\]
))*
| (?:\<(?![0-9A-Za-z_:|,=\/\-\. ]+\>))+
| \\{
/x
2023-05-09 09:29:10 +02:00
TEXT: / (?:[^\r\n{<](?!
[^\[\r\n]*->
|\?[^\[\r\n]*\]
|\[[^\[\r\n]*\]\]
2023-05-09 10:15:53 +02:00
))+
| (?:\<(?![0-9A-Za-z_:|,=\/\-\. ]+\>))+
| \\{
/x
2023-05-09 09:29:10 +02:00
TABLE_TEXT: /(?:[^\|\r\n\{](?![^\[\n\r]*->))+/
MARKED_TEXT: /(?:[^\}\r\n\{](?![^\[\n\r]*->))+/
2023-04-28 15:44:50 +02:00
TAG_NAME: _PURE_TEXT
TAG_OPTION: _PURE_TEXT
2023-05-03 17:00:15 +02:00
_OPTION_SEP: " "* "|" " "* | " "+
_N: /\r?\n/
2023-05-03 17:00:15 +02:00
_PURE_TEXT: /[0-9A-Za-z_:,=\/\-\.]+/
_PLACEHOLDER: /[\*]+/