Use separate offset token for comments instead of duration

This commit is contained in:
Rene Saarsoo 2021-03-02 21:37:51 +02:00
parent 99dd16199d
commit ba92dd50d1
2 changed files with 22 additions and 5 deletions

View File

@ -62,7 +62,7 @@ const parseIntervalComments = (tokens: Token[], intervalDuration: Duration): [Co
while (tokens[0]) { while (tokens[0]) {
const [start, offset, text, ...rest] = tokens; const [start, offset, text, ...rest] = tokens;
if (start.type === "comment-start") { if (start.type === "comment-start") {
if (!offset || offset.type !== "duration") { if (!offset || offset.type !== "offset") {
throw new ParseError( throw new ParseError(
`Expected [comment offset] instead got ${tokenToString(offset)}`, `Expected [comment offset] instead got ${tokenToString(offset)}`,
offset?.loc || start.loc, offset?.loc || start.loc,
@ -73,7 +73,7 @@ const parseIntervalComments = (tokens: Token[], intervalDuration: Duration): [Co
} }
comments.push({ comments.push({
// when offset is negative, recalculate it based on interval length // when offset is negative, recalculate it based on interval length
offset: new Duration(offset.value >= 0 ? offset.value : intervalDuration.seconds + offset.value), offset: new Duration(offset.kind === "absolute" ? offset.value : intervalDuration.seconds - offset.value),
text: text.value, text: text.value,
loc: offset.loc, loc: offset.loc,
}); });

View File

@ -36,6 +36,12 @@ export type NumberToken = {
value: number; value: number;
loc: SourceLocation; loc: SourceLocation;
}; };
export type OffsetToken = {
type: "offset";
kind: "absolute" | "relative-plus" | "relative-minus";
value: number;
loc: SourceLocation;
};
export type RangeIntensityToken = { export type RangeIntensityToken = {
type: "intensity-range"; type: "intensity-range";
value: [number, number]; value: [number, number];
@ -46,7 +52,14 @@ export type CommentStartToken = {
value?: undefined; value?: undefined;
loc: SourceLocation; loc: SourceLocation;
}; };
export type Token = HeaderToken | IntervalToken | TextToken | NumberToken | RangeIntensityToken | CommentStartToken; export type Token =
| HeaderToken
| IntervalToken
| TextToken
| NumberToken
| OffsetToken
| RangeIntensityToken
| CommentStartToken;
const toInteger = (str: string): number => { const toInteger = (str: string): number => {
return parseInt(str.replace(/[^0-9]/, ""), 10); return parseInt(str.replace(/[^0-9]/, ""), 10);
@ -93,13 +106,17 @@ const tokenizeComment = (line: string, row: number): Token[] | undefined => {
if (!commentHead) { if (!commentHead) {
return undefined; return undefined;
} }
const sign = minus ? -1 : 1;
if (!DURATION_REGEX.test(offset)) { if (!DURATION_REGEX.test(offset)) {
throw new ParseError("Invalid comment offset", { row, col: commentHead.length }); throw new ParseError("Invalid comment offset", { row, col: commentHead.length });
} }
return [ return [
{ type: "comment-start", loc: { row, col: line.indexOf("@") } }, { type: "comment-start", loc: { row, col: line.indexOf("@") } },
{ type: "duration", value: sign * toSeconds(offset), loc: { row, col: commentHead.length } }, {
type: "offset",
kind: minus ? "relative-minus" : "absolute",
value: toSeconds(offset),
loc: { row, col: commentHead.length },
},
{ type: "text", value: commentText.trim(), loc: { row, col: commentHead.length + offset.length } }, { type: "text", value: commentText.trim(), loc: { row, col: commentHead.length + offset.length } },
]; ];
}; };