-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathparser-v9.ts
59 lines (52 loc) · 1.51 KB
/
parser-v9.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* A simplified version of the message parser that handles messages like vue-i18n v8.
* This parser probably has poor performance.
*/
import type {
CompileError,
NamedNode,
ResourceNode
} from '@intlify/message-compiler'
import { NodeTypes } from './utils'
import { parse as baseParse } from './parser'
import type { MessageElementNode } from './traverser'
import { traverseNode } from './traverser'
// The deprecated Rails i18n format.
export type ModuloNamedNode = NamedNode & { modulo?: boolean }
export function parse(code: string): {
ast: ResourceNode
errors: CompileError[]
} {
const { ast, errors } = baseParse(code)
traverseNode(ast, node => {
if (node.type === NodeTypes.Message) {
transformModuloNamedNode(node.items)
}
})
return {
ast,
errors
}
function transformModuloNamedNode(nodes: MessageElementNode[]) {
// Converts nodes with a '%' before the brackets into modulo nodes.
for (let index = nodes.length - 1; index >= 1; index--) {
const node = nodes[index]
if (
node.type !== NodeTypes.Named ||
code[node.loc!.start.offset - 1] !== '%'
)
continue
const prev = nodes[index - 1]
if (prev.type !== NodeTypes.Text || !prev.value?.endsWith('%')) continue
node.modulo = true
prev.loc!.end.offset -= 1
prev.loc!.end.column -= 1
prev.end! -= 1
prev.value = prev.value!.slice(0, -1)
if (prev.start === prev.end) {
nodes.splice(index - 1, 1)
index--
}
}
}
}