mirror of
https://activitypub.software/TransFem-org/sfm-js
synced 2024-11-24 23:15:14 +00:00
refactor parser (#78)
This commit is contained in:
parent
ce17943f3c
commit
196a64d3e4
1 changed files with 24 additions and 32 deletions
|
@ -63,13 +63,13 @@
|
|||
//
|
||||
|
||||
fullParser
|
||||
= nodes:(&. n:full { return n; })* { return mergeText(nodes); }
|
||||
= nodes:(&. @full)* { return mergeText(nodes); }
|
||||
|
||||
plainParser
|
||||
= nodes:(&. n:plain { return n; })* { return mergeText(nodes); }
|
||||
= nodes:(&. @plain)* { return mergeText(nodes); }
|
||||
|
||||
inlineParser
|
||||
= nodes:(&. n:inline { return n; })* { return mergeText(nodes); }
|
||||
= nodes:(&. @inline)* { return mergeText(nodes); }
|
||||
|
||||
//
|
||||
// syntax list
|
||||
|
@ -131,7 +131,7 @@ quote
|
|||
= &(BEGIN ">") q:quoteInner LF? { return q; }
|
||||
|
||||
quoteInner
|
||||
= head:quoteMultiLine tails:quoteMultiLine+
|
||||
= head:(quoteLine / quoteEmptyLine) tails:(quoteLine / quoteEmptyLine)+
|
||||
{
|
||||
const children = applyParser([head, ...tails].join('\n'), 'fullParser');
|
||||
return QUOTE(children);
|
||||
|
@ -142,11 +142,8 @@ quoteInner
|
|||
return QUOTE(children);
|
||||
}
|
||||
|
||||
quoteMultiLine
|
||||
= quoteLine / quoteEmptyLine
|
||||
|
||||
quoteLine
|
||||
= BEGIN ">" _? text:$(CHAR+) END { return text; }
|
||||
= BEGIN ">" _? text:$CHAR+ END { return text; }
|
||||
|
||||
quoteEmptyLine
|
||||
= BEGIN ">" _? END { return ''; }
|
||||
|
@ -198,7 +195,7 @@ mathBlockLine
|
|||
// block: center
|
||||
|
||||
center
|
||||
= BEGIN "<center>" LF? content:(!(LF? "</center>" END) i:inline { return i; })+ LF? "</center>" END
|
||||
= BEGIN "<center>" LF? content:(!(LF? "</center>" END) @inline)+ LF? "</center>" END
|
||||
{
|
||||
return CENTER(mergeText(content));
|
||||
}
|
||||
|
@ -210,14 +207,11 @@ center
|
|||
// inline: emoji code
|
||||
|
||||
emojiCode
|
||||
= ":" name:emojiCodeName ":"
|
||||
= ":" name:$[a-z0-9_+-]i+ ":"
|
||||
{
|
||||
return EMOJI_CODE(name);
|
||||
}
|
||||
|
||||
emojiCodeName
|
||||
= [a-z0-9_+-]i+ { return text(); }
|
||||
|
||||
// inline: unicode emoji
|
||||
|
||||
// NOTE: if the text matches one of the emojis, it will count the length of the emoji sequence and consume it.
|
||||
|
@ -230,7 +224,7 @@ unicodeEmoji
|
|||
// inline: big
|
||||
|
||||
big
|
||||
= "***" content:(!"***" i:inline { return i; })+ "***"
|
||||
= "***" content:(!"***" @inline)+ "***"
|
||||
{
|
||||
return FN('tada', { }, mergeText(content));
|
||||
}
|
||||
|
@ -238,15 +232,15 @@ big
|
|||
// inline: bold
|
||||
|
||||
bold
|
||||
= "**" content:(!"**" i:inline { return i; })+ "**"
|
||||
= "**" content:(!"**" @inline)+ "**"
|
||||
{
|
||||
return BOLD(mergeText(content));
|
||||
}
|
||||
/ "<b>" content:(!"</b>" i:inline { return i; })+ "</b>"
|
||||
/ "<b>" content:(!"</b>" @inline)+ "</b>"
|
||||
{
|
||||
return BOLD(mergeText(content));
|
||||
}
|
||||
/ "__" content:$(!"__" c:([a-z0-9]i / _) { return c; })+ "__"
|
||||
/ "__" content:$(!"__" @([a-z0-9]i / _))+ "__"
|
||||
{
|
||||
const parsedContent = applyParser(content, 'inlineParser');
|
||||
return BOLD(parsedContent);
|
||||
|
@ -255,7 +249,7 @@ bold
|
|||
// inline: small
|
||||
|
||||
small
|
||||
= "<small>" content:(!"</small>" i:inline { return i; })+ "</small>"
|
||||
= "<small>" content:(!"</small>" @inline)+ "</small>"
|
||||
{
|
||||
return SMALL(mergeText(content));
|
||||
}
|
||||
|
@ -267,7 +261,7 @@ italic
|
|||
/ italicAlt
|
||||
|
||||
italicTag
|
||||
= "<i>" content:(!"</i>" i:inline { return i; })+ "</i>"
|
||||
= "<i>" content:(!"</i>" @inline)+ "</i>"
|
||||
{
|
||||
return ITALIC(mergeText(content));
|
||||
}
|
||||
|
@ -287,11 +281,11 @@ italicAlt
|
|||
// inline: strike
|
||||
|
||||
strike
|
||||
= "~~" content:(!("~" / LF) i:inline { return i; })+ "~~"
|
||||
= "~~" content:(!("~" / LF) @inline)+ "~~"
|
||||
{
|
||||
return STRIKE(mergeText(content));
|
||||
}
|
||||
/ "<s>" content:(!("</s>" / LF) i:inline { return i; })+ "</s>"
|
||||
/ "<s>" content:(!("</s>" / LF) @inline)+ "</s>"
|
||||
{
|
||||
return STRIKE(mergeText(content));
|
||||
}
|
||||
|
@ -299,7 +293,7 @@ strike
|
|||
// inline: inlineCode
|
||||
|
||||
inlineCode
|
||||
= "`" content:$(![`´] c:CHAR { return c; })+ "`"
|
||||
= "`" content:$(![`´] CHAR)+ "`"
|
||||
{
|
||||
return INLINE_CODE(content);
|
||||
}
|
||||
|
@ -307,7 +301,7 @@ inlineCode
|
|||
// inline: mathInline
|
||||
|
||||
mathInline
|
||||
= "\\(" content:$(!"\\)" c:CHAR { return c; })+ "\\)"
|
||||
= "\\(" content:$(!"\\)" CHAR)+ "\\)"
|
||||
{
|
||||
return MATH_INLINE(content);
|
||||
}
|
||||
|
@ -315,7 +309,7 @@ mathInline
|
|||
// inline: mention
|
||||
|
||||
mention
|
||||
= "@" name:mentionName host:("@" host:mentionHost { return host; })?
|
||||
= "@" name:mentionName host:("@" @mentionHost)?
|
||||
{
|
||||
return MENTION(name, host, text());
|
||||
}
|
||||
|
@ -355,7 +349,8 @@ invalidHashtagContent
|
|||
= [0-9]+
|
||||
|
||||
hashtagContentPart
|
||||
= hashtagBracketPair / hashtagChar
|
||||
= hashtagBracketPair
|
||||
/ hashtagChar
|
||||
|
||||
hashtagBracketPair
|
||||
= "(" hashtagContent* ")"
|
||||
|
@ -407,16 +402,13 @@ link
|
|||
}
|
||||
|
||||
linkLabel
|
||||
= parts:linkLabelPart+
|
||||
{
|
||||
return parts;
|
||||
}
|
||||
= linkLabelPart+
|
||||
|
||||
linkLabelPart
|
||||
= url { return text(); /* text node */ }
|
||||
/ link { return text(); /* text node */ }
|
||||
/ mention { return text(); /* text node */ }
|
||||
/ !"]" n:inline { return n; }
|
||||
/ !"]" @inline
|
||||
|
||||
linkUrl
|
||||
= url { return text(); }
|
||||
|
@ -438,7 +430,7 @@ fnVer2
|
|||
}
|
||||
|
||||
fnArgs
|
||||
= "." head:fnArg tails:("," arg:fnArg { return arg; })*
|
||||
= "." head:fnArg tails:("," @fnArg)*
|
||||
{
|
||||
const args = { };
|
||||
for (const pair of [head, ...tails]) {
|
||||
|
@ -458,7 +450,7 @@ fnArg
|
|||
}
|
||||
|
||||
fnContentPart
|
||||
= !("]") i:inline { return i; }
|
||||
= !("]") @inline
|
||||
|
||||
// inline: text
|
||||
|
||||
|
|
Loading…
Reference in a new issue