Skip to content

Commit

Permalink
wip: guillemet
Browse files Browse the repository at this point in the history
  • Loading branch information
Toliak committed Jul 17, 2023
1 parent 8233061 commit 35d1a24
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/ast/parsing/lexer/function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,10 @@ const parsersByType: Record<TokenType, TokenParser[]> = {
parseLinkSimple,
parseList,
parseCode,

// TODO: check the implementation
// parseGuillemet,

parseFormulaSpan,
parseFormulaOrLatex,
parseLatexSpan,
Expand Down
77 changes: 77 additions & 0 deletions src/ast/parsing/lexer/node/guillemet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { TokenParser } from '../struct';
import {
applyVisitors,
findTokenClosingBracket,
isOpenArgumentBracket,
isOpenLabelBracket,
sliceTokenText,
unexpectedEof,
} from '../index';
import {
LinkNode,
NodeType,
RawNodeType,
TextNode,
TokensNode,
} from '../../../node';
import { TokenType } from '../../tokenizer';

/**
* Angle bracket
*/
export function isOpenGuillemet(tokens: TokensNode, index: number): boolean {
const token = tokens.tokens[index];
return token.type === TokenType.JoinableSpecial && token.text == '<<<';
}

export const parseGuillemet: TokenParser = function (tokens, index) {
const token = tokens.tokens[index];
if (!isOpenGuillemet(tokens, index)) {
return null;
}

const closingBracketResult = findTokenClosingBracket(tokens, index);
if (!closingBracketResult) {
return unexpectedEof(
tokens,
index,
'Unable to find closing bracket for guillemet',
);
}

const hrefStartToken = tokens.tokens[index + 1];
const hrefStopToken = tokens.tokens[closingBracketResult.index - 1];
const hrefText = tokens.tokens
.slice(index + 1, closingBracketResult.index)
.map(v => v.text)
.join('');

const hrefTextNode: TextNode = {
type: NodeType.Text,
text: hrefText,
parent: null,
pos: {
start: hrefStartToken.pos,
end: hrefStopToken.pos + hrefStopToken.text.length,
},
};

const endToken = closingBracketResult.token;
const linkNode: LinkNode = {
type: NodeType.Link,
parent: tokens.parent,
pos: {
start: token.pos,
end: endToken.pos + endToken.text.length,
},
children: [],
href: hrefTextNode,
};
hrefTextNode.parent = linkNode;

return {
nodes: [linkNode],
index: closingBracketResult.index + 1,
diagnostic: [],
};
};

0 comments on commit 35d1a24

Please sign in to comment.