mirror of
https://github.com/danbulant/lezer-markdown-obsidian
synced 2026-07-05 11:00:44 +00:00
add parsing for hashtags
This commit is contained in:
parent
d1dc4afca6
commit
e8212b6644
2 changed files with 46 additions and 2 deletions
|
|
@ -12,6 +12,9 @@ const specParser = new SpecParser(parser, {
|
||||||
t: "TaskMarker",
|
t: "TaskMarker",
|
||||||
EM: "Embed",
|
EM: "Embed",
|
||||||
eM: "EmbedMark",
|
eM: "EmbedMark",
|
||||||
|
H: "Hashtag",
|
||||||
|
hm: "HashtagMark",
|
||||||
|
hl: "HashtagLabel",
|
||||||
IL: "InternalLink",
|
IL: "InternalLink",
|
||||||
iM: "InternalMark",
|
iM: "InternalMark",
|
||||||
iP: "InternalPath",
|
iP: "InternalPath",
|
||||||
|
|
@ -244,4 +247,14 @@ Line 5}
|
||||||
{HR:---}
|
{HR:---}
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
|
|
||||||
|
test(
|
||||||
|
"Hashtag",
|
||||||
|
`
|
||||||
|
{P:Some text. {H:{hm:#}{hl:tag}} {H:{hm:#}{hl:other-tag9}}^not part
|
||||||
|
{H:{hm:#}{hl:ñáø√}}}
|
||||||
|
|
||||||
|
{P:Test number #1234}
|
||||||
|
`
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { Input, PartialParse, Tree } from "@lezer/common";
|
import { Input } from "@lezer/common";
|
||||||
import {
|
import {
|
||||||
BlockContext,
|
BlockContext,
|
||||||
Element,
|
Element,
|
||||||
|
|
@ -61,6 +61,36 @@ export const TaskList: MarkdownConfig = {
|
||||||
};
|
};
|
||||||
/* End Copyright */
|
/* End Copyright */
|
||||||
|
|
||||||
|
const hashtagRE =
|
||||||
|
/^[^\u2000-\u206F\u2E00-\u2E7F'!"#$%&()*+,.:;<=>?@^`{|}~\[\]\\\s]+/;
|
||||||
|
|
||||||
|
export const Hashtag: MarkdownConfig = {
|
||||||
|
defineNodes: ["Hashtag", "HashtagMark", "HashtagLabel"],
|
||||||
|
parseInline: [
|
||||||
|
{
|
||||||
|
name: "Hashtag",
|
||||||
|
parse(cx, next, pos) {
|
||||||
|
if (next != 35 /* # */) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
const start = pos;
|
||||||
|
pos += 1;
|
||||||
|
const match = hashtagRE.exec(cx.text.slice(pos - cx.offset));
|
||||||
|
if (match && /\D/.test(match[0])) {
|
||||||
|
pos += match[0].length;
|
||||||
|
return cx.addElement(
|
||||||
|
cx.elt("Hashtag", start, pos, [
|
||||||
|
cx.elt("HashtagMark", start, start + 1),
|
||||||
|
cx.elt("HashtagLabel", start + 1, pos),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
function parseInternalLink(cx: InlineContext, pos: number): Element | null {
|
function parseInternalLink(cx: InlineContext, pos: number): Element | null {
|
||||||
if (
|
if (
|
||||||
cx.char(pos) != 91 /* [ */ ||
|
cx.char(pos) != 91 /* [ */ ||
|
||||||
|
|
@ -322,11 +352,12 @@ export const YAMLFrontMatter: MarkdownConfig = {
|
||||||
|
|
||||||
export const ObsidianMDExtensions = [
|
export const ObsidianMDExtensions = [
|
||||||
Footnote,
|
Footnote,
|
||||||
YAMLFrontMatter,
|
Hashtag,
|
||||||
InternalLink,
|
InternalLink,
|
||||||
Strikethrough,
|
Strikethrough,
|
||||||
Table,
|
Table,
|
||||||
TaskList,
|
TaskList,
|
||||||
|
YAMLFrontMatter,
|
||||||
];
|
];
|
||||||
|
|
||||||
export const parser = defParser.configure(ObsidianMDExtensions);
|
export const parser = defParser.configure(ObsidianMDExtensions);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue