]>
git.proxmox.com Git - mirror_novnc.git/blob - po/xgettext-html
3 * xgettext-html: HTML gettext parser
4 * Copyright (C) 2016 Pierre Ossman
5 * Licensed under MPL 2.0 (see LICENSE.txt)
8 var getopt
= require('node-getopt');
10 var jsdom
= require("jsdom");
11 var fs
= require("fs");
14 ['o' , 'output=FILE' , 'write output to specified file'],
15 ['h' , 'help' , 'display this help'],
16 ]).bindHelp().parseSystem();
20 function addString(str
, location
) {
21 if (str
.length
== 0) {
25 if (strings
[str
] === undefined) {
28 strings
[str
][location
] = null;
31 // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
32 function process(elem
, locator
, enabled
) {
33 function isAnyOf(searchElement
, items
) {
34 return items
.indexOf(searchElement
) !== -1;
37 if (elem
.hasAttribute("translate")) {
38 if (isAnyOf(elem
.getAttribute("translate"), ["", "yes"])) {
40 } else if (isAnyOf(elem
.getAttribute("translate"), ["no"])) {
46 if (elem
.hasAttribute("abbr") &&
47 elem
.tagName
=== "TH") {
48 addString(elem
.getAttribute("abbr"), locator(elem
));
50 if (elem
.hasAttribute("alt") &&
51 isAnyOf(elem
.tagName
, ["AREA", "IMG", "INPUT"])) {
52 addString(elem
.getAttribute("alt"), locator(elem
));
54 if (elem
.hasAttribute("download") &&
55 isAnyOf(elem
.tagName
, ["A", "AREA"])) {
56 addString(elem
.getAttribute("download"), locator(elem
));
58 if (elem
.hasAttribute("label") &&
59 isAnyOf(elem
.tagName
, ["MENUITEM", "MENU", "OPTGROUP",
60 "OPTION", "TRACK"])) {
61 addString(elem
.getAttribute("label"), locator(elem
));
63 if (elem
.hasAttribute("placeholder") &&
64 isAnyOf(elem
.tagName
in ["INPUT", "TEXTAREA"])) {
65 addString(elem
.getAttribute("placeholder"), locator(elem
));
67 if (elem
.hasAttribute("title")) {
68 addString(elem
.getAttribute("title"), locator(elem
));
70 if (elem
.hasAttribute("value") &&
71 elem
.tagName
=== "INPUT" &&
72 isAnyOf(elem
.getAttribute("type"), ["reset", "button", "submit"])) {
73 addString(elem
.getAttribute("value"), locator(elem
));
77 for (var i
= 0;i
< elem
.childNodes
.length
;i
++) {
78 node
= elem
.childNodes
[i
];
79 if (node
.nodeType
=== node
.ELEMENT_NODE
) {
80 process(node
, locator
, enabled
);
81 } else if (node
.nodeType
=== node
.TEXT_NODE
&& enabled
) {
82 addString(node
.data
.trim(), locator(node
));
87 for (var i
= 0;i
< opt
.argv
.length
;i
++) {
91 file
= fs
.readFileSync(fn
, "utf8");
92 dom
= new jsdom
.JSDOM(file
, { includeNodeLocations
: true });
93 body
= dom
.window
.document
.body
;
95 locator = function (elem
) {
96 offset
= dom
.nodeLocation(elem
).startOffset
;
97 line
= file
.slice(0, offset
).split("\n").length
;
98 return fn
+ ":" + line
;
101 process(body
, locator
, true);
106 for (str
in strings
) {
108 for (location
in strings
[str
]) {
109 output
+= " " + location
;
113 output
+= "msgid " + JSON
.stringify(str
) + "\n";
114 output
+= "msgstr \"\"\n";
118 fs
.writeFileSync(opt
.options
.output
, output
);