@@ -5,7 +5,6 @@ import nlp from "compromise/three";
5
5
import { nullableAsArray , throwError } from "../misc/misc.ts" ;
6
6
import {
7
7
all ,
8
- allAtLeastOnceWithCheck ,
9
8
allWithCheck ,
10
9
checkedAsWhole ,
11
10
CheckedParser ,
@@ -73,18 +72,21 @@ const keyword = memoize(<T extends string>(keyword: T) =>
73
72
)
74
73
) as Parser < T >
75
74
) ;
76
- const unescapedWord = allAtLeastOnceWithCheck (
77
- new CheckedParser (
78
- choiceOnlyOne ( wordCharacter , backtick ) ,
79
- choiceWithCheck (
80
- checkedAsWhole ( wordCharacter ) ,
81
- checkedSequence ( backtick , character . skip ( backtick ) )
82
- . map ( ( [ _ , character ] ) => character ) ,
83
- comment . map ( ( ) => "" ) ,
75
+ const checkedCharacter = checkedAsWhole ( wordCharacter ) ;
76
+ const escape = checkedSequence ( backtick , character . skip ( backtick ) )
77
+ . map ( ( [ _ , character ] ) => character ) ;
78
+ const unescapedWord = sequence (
79
+ choiceWithCheck ( checkedCharacter , escape ) ,
80
+ allWithCheck (
81
+ new CheckedParser (
82
+ choiceOnlyOne ( wordCharacter , backtick , comment . check ) ,
83
+ choiceWithCheck ( checkedCharacter , escape , comment . map ( ( ) => "" ) ) ,
84
84
) ,
85
85
) ,
86
86
)
87
- . map ( ( word ) => word . join ( "" ) . replaceAll ( / \s + / g, " " ) . trim ( ) ) ;
87
+ . map ( ( [ first , rest ] ) =>
88
+ `${ first } ${ rest . join ( "" ) } ` . replaceAll ( / \s + / g, " " ) . trim ( )
89
+ ) ;
88
90
const word = unescapedWord . map ( escapeHtml ) ;
89
91
const number = choiceOnlyOne ( keyword ( "singular" ) , keyword ( "plural" ) ) ;
90
92
const optionalNumber = optionalAll ( number ) ;
0 commit comments