You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.1 KiB
49 lines
1.1 KiB
|
2 years ago
|
"use strict";
|
||
|
|
|
||
|
|
const JsxLikeTokenizer = require("./jsx-like-tokenizer");
|
||
|
|
|
||
|
|
const MINUS = "-".charCodeAt(0);
|
||
|
|
const LINE_FEED = "\n".charCodeAt(0);
|
||
|
|
|
||
|
|
module.exports = class AstroTokenizer extends JsxLikeTokenizer {
|
||
|
|
constructor(...args) {
|
||
|
|
super(...args);
|
||
|
|
this._hasFrontmatter = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
parse() {
|
||
|
|
super.parse();
|
||
|
|
}
|
||
|
|
|
||
|
|
stateText(c) {
|
||
|
|
if (!this._hasFrontmatter) {
|
||
|
|
if (c === MINUS) {
|
||
|
|
const startIndex = this.index - this.offset;
|
||
|
|
if (
|
||
|
|
startIndex === 0 &&
|
||
|
|
this.buffer.slice(startIndex, startIndex + 3) === "---"
|
||
|
|
) {
|
||
|
|
const closeIndex = this.buffer.indexOf("\n---", startIndex + 3);
|
||
|
|
if (closeIndex >= 0) {
|
||
|
|
this.index = closeIndex + 3;
|
||
|
|
this._hasFrontmatter = true;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (c === LINE_FEED) {
|
||
|
|
const startIndex = this.index - this.offset;
|
||
|
|
if (this.buffer.slice(startIndex, startIndex + 4) === "\n---") {
|
||
|
|
const closeIndex = this.buffer.indexOf("\n---", startIndex + 4);
|
||
|
|
if (closeIndex >= 0) {
|
||
|
|
this.index = closeIndex + 3;
|
||
|
|
this._hasFrontmatter = true;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
super.stateText(c);
|
||
|
|
}
|
||
|
|
};
|