diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-04-20 03:09:25 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-04-24 16:14:29 +0200 |
commit | 82f2b76e25a4a67e01ec67e5ebe39d14ad771ea8 (patch) | |
tree | 965f6eb89b84d65a62b49008fd972c004832ccd1 /pogen | |
parent | e6e0cbc387c2a77b48e4065c229daa65bf1aa0fa (diff) |
Reorganize module loading.
We now use webpack instead of SystemJS, effectively bundling modules
into one file (plus commons chunks) for every entry point. This results
in a much smaller extension size (almost half). Furthermore we use
yarn/npm even for extension run-time dependencies. This relieves us
from manually vendoring and building dependencies. It's also easier to
understand for new developers familiar with node.
Diffstat (limited to 'pogen')
-rw-r--r-- | pogen/.gitignore | 1 | ||||
-rw-r--r-- | pogen/dumpTree.ts | 51 | ||||
-rw-r--r-- | pogen/example/messages.po | 107 | ||||
-rw-r--r-- | pogen/example/test.ts | 63 | ||||
-rw-r--r-- | pogen/example/test2.tsx | 15 | ||||
-rw-r--r-- | pogen/pogen.ts | 393 | ||||
-rw-r--r-- | pogen/tsconfig.json | 11 |
7 files changed, 0 insertions, 641 deletions
diff --git a/pogen/.gitignore b/pogen/.gitignore deleted file mode 100644 index a6c7c2852..000000000 --- a/pogen/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.js diff --git a/pogen/dumpTree.ts b/pogen/dumpTree.ts deleted file mode 100644 index 958c79416..000000000 --- a/pogen/dumpTree.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of TALER - (C) 2016 GNUnet e.V. - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - - -/** - * Print the syntax tree of a TypeScript program. - * - * @author Florian Dold - */ - -/// <reference path="../decl/node.d.ts" /> - -"use strict"; - -import {readFileSync} from "fs"; -import {execSync} from "child_process"; -import * as ts from "typescript"; - - -export function processFile(sourceFile: ts.SourceFile) { - processNode(sourceFile); - - function processNode(node: ts.Node, level=0) { - let indent = ""; - for (let i = 0; i < level; i++) { - indent = indent + " "; - } - console.log(indent + ts.SyntaxKind[node.kind]); - ts.forEachChild(node, (n) => processNode(n, level+1)); - } -} - -const fileNames = process.argv.slice(2); - -fileNames.forEach(fileName => { - let sourceFile = ts.createSourceFile(fileName, readFileSync(fileName).toString(), ts.ScriptTarget.ES2016, /*setParentNodes */ true); - processFile(sourceFile); -}); diff --git a/pogen/example/messages.po b/pogen/example/messages.po deleted file mode 100644 index 1addae3f2..000000000 --- a/pogen/example/messages.po +++ /dev/null @@ -1,107 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-27 01:51+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language-Team: LANGUAGE <LL@li.org>\n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: example/test.ts:3 -#, csharp-format -msgid "Hello1, World" -msgstr "" - -#: example/test.ts:4 -#, csharp-format -msgid "Hello2, World" -msgstr "" - -#: example/test.ts:5 -#, csharp-format -msgid "Hello3, World" -msgstr "" - -#. This is a comment and should be included -#: example/test.ts:9 -#, csharp-format -msgid "Hello4, World" -msgstr "" - -#: example/test.ts:12 -#, csharp-format -msgid "Hello5, World" -msgstr "" - -#: example/test.ts:13 -#, csharp-format -msgid "Hello6,{0} World" -msgstr "" - -#. This one has a multi line comment. -#. It has multiple lines, and a trailing empty line. -#. -#: example/test.ts:20 -#, csharp-format -msgid "Hello7,{0} World{1}" -msgstr "" - -#: example/test.ts:21 -#, csharp-format -msgid "{0}Hello8,{1} World{2}" -msgstr "" - -#. -#. This one has a multi line comment. -#. It has multiple lines, and a leading empty line. -#: example/test.ts:28 -#, csharp-format -msgid "Hello9,\" '\" World" -msgstr "" - -#: example/test.ts:32 -#, csharp-format -msgid "" -"Hello10\n" -" ,\" '\" Wo\n" -" rld" -msgstr "" - -#: example/test.ts:37 -#, csharp-format -msgid "" -"Hello11 this is a long long string\n" -"it will go over multiple lines and in the pofile\n" -"it should be wrapped and stuff" -msgstr "" - -#. This is a single line comment -#: example/test.ts:42 -#, csharp-format -msgid "" -"Hello12 this is a long long string it will go over multiple lines and in the " -"pofile it should be wrapped and stuff. asdf asdf asdf asdf asdf asdf asdf asdf " -"adsf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf " -"asdf" -msgstr "" - -#: example/test.ts:42 -#, csharp-format -msgid "This message appears twice" -msgstr "" - -#: example/test.ts:45 -#, csharp-format -msgid "This message appears twice" -msgstr "" - diff --git a/pogen/example/test.ts b/pogen/example/test.ts deleted file mode 100644 index d7d5d88d6..000000000 --- a/pogen/example/test.ts +++ /dev/null @@ -1,63 +0,0 @@ -declare var i18n: any; - -console.log(i18n`Hello1, World`); -console.log(i18n.foo()`Hello2, World`); -console.log(i18n.foo()`Hello3, World`); - - -/* This is a comment and should be included */ -console.log(i18n().foo()`Hello4, World`); - - -console.log(i18n.foo`Hello5, World`); -console.log(i18n.foo`Hello6,${123} World`); - -/* -This one has a multi line comment. -It has multiple lines, and a trailing empty line. - -*/ -console.log(/*lol*/i18n.foo`Hello7,${123} World${42}`); - - -i18n.plural(i18n`one ${"foo"}`, i18`many ${"bar"}`); - -i18n.plural(i18n.foo`one bla ${"foo"}`, i18.foo`many bla ${"bar"}`); - -let x = 42; - -i18n.plural(i18n`I have ${x} apple`, i18n`I have ${x} apples`); - -console.log(i18n`${"foo"}Hello8,${123} World${42}`); - -/* - -This one has a multi line comment. -It has multiple lines, and a leading empty line. -*/ -console.log(i18n`Hello9," '" World`); - -// Comments with space inbetween do not count - -console.log(i18n`Hello10 - ," '" Wo - rld`); - - -console.log(i18n`Hello11 this is a long long string -it will go over multiple lines and in the pofile -it should be wrapped and stuff`); - -// This is a single line comment -console.log(i18n`Hello12 this is a long long string it will go over multiple lines and in the pofile it should be wrapped and stuff. asdf asdf asdf asdf asdf asdf asdf asdf adsf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf`); - -function foo(...args: any[]) { -} - -console.log(foo`Another string, must be excluded`); - - -// First occurence -console.log(i18n`This message appears twice`); -// Second occurence -console.log(i18n`This message appears twice`); diff --git a/pogen/example/test2.tsx b/pogen/example/test2.tsx deleted file mode 100644 index 4133f86fb..000000000 --- a/pogen/example/test2.tsx +++ /dev/null @@ -1,15 +0,0 @@ -let x = <i18n.Translate>foo -{bar} {" foo "} baz</i18n.Translate> - - -let y = ( - <i18n.TranslateSwitch> - <i18n.TranslateSingular> - singular form - second line - </i18n.TranslateSingular> - <i18n.TranslatePlural> - plural form - </i18n.TranslatePlural> - </i18n.TranslateSwitch> -); diff --git a/pogen/pogen.ts b/pogen/pogen.ts deleted file mode 100644 index 1d31a878a..000000000 --- a/pogen/pogen.ts +++ /dev/null @@ -1,393 +0,0 @@ -/* - This file is part of TALER - (C) 2016 GNUnet e.V. - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - */ - - -/** - * Generate .po file from list of source files. - * - * Note that duplicate message IDs are NOT merged, to get the same output as - * you would from xgettext, just run msguniq. - * - * @author Florian Dold - */ - -/// <reference path="../decl/node.d.ts" /> - -"use strict"; - -import {readFileSync} from "fs"; -import * as ts from "typescript"; - - -function wordwrap(str: string, width: number = 80): string[] { - var regex = '.{1,' + width + '}(\\s|$)|\\S+(\\s|$)'; - return str.match(RegExp(regex, 'g')); -} - -export function processFile(sourceFile: ts.SourceFile) { - processNode(sourceFile); - let lastTokLine = 0; - let preLastTokLine = 0; - - function getTemplate(node: ts.Node): string { - switch (node.kind) { - case ts.SyntaxKind.FirstTemplateToken: - return (<any>node).text; - case ts.SyntaxKind.TemplateExpression: - let te = <ts.TemplateExpression>node; - let textFragments = [te.head.text]; - for (let tsp of te.templateSpans) { - textFragments.push(`%${(textFragments.length-1)/2+1}$s`); - textFragments.push(tsp.literal.text.replace(/%/g, "%%")); - } - return textFragments.join(''); - default: - return "(pogen.ts: unable to parse)"; - } - } - - function getComment(node: ts.Node): string { - let lc = ts.getLineAndCharacterOfPosition(sourceFile, node.pos); - let lastComments; - for (let l = preLastTokLine; l < lastTokLine; l++) { - let pos = ts.getPositionOfLineAndCharacter(sourceFile, l, 0); - let comments = ts.getTrailingCommentRanges(sourceFile.text, pos); - if (comments) { - lastComments = comments; - } - } - if (!lastComments) { - return; - } - let candidate = lastComments[lastComments.length-1]; - let candidateEndLine = ts.getLineAndCharacterOfPosition(sourceFile, candidate.end).line; - if (candidateEndLine != lc.line - 1) { - return; - } - let text = sourceFile.text.slice(candidate.pos, candidate.end); - switch (candidate.kind) { - case ts.SyntaxKind.SingleLineCommentTrivia: - // Remove comment leader - text = text.replace(/^[/][/]\s*/, ""); - break; - case ts.SyntaxKind.MultiLineCommentTrivia: - // Remove comment leader and trailer, - // handling white space just like xgettext. - text = text - .replace(/^[/][*](\s*?\n|\s*)?/, "") - .replace(/(\n[ \t]*?)?[*][/]$/, ""); - break; - } - return text; - } - - function getPath(node: ts.Node): string[] { - switch (node.kind) { - case ts.SyntaxKind.PropertyAccessExpression: - let pae = <ts.PropertyAccessExpression>node; - return Array.prototype.concat(getPath(pae.expression), [pae.name.text]); - case ts.SyntaxKind.Identifier: - let id = <ts.Identifier>node; - return [id.text]; - } - return ["(other)"]; - } - - function arrayEq<T>(a1: T[], a2: T[]) { - if (a1.length != a2.length) { - return false; - } - for (let i = 0; i < a1.length; i++) { - if (a1[i] != a2[i]) { - return false; - } - } - return true; - } - - interface TemplateResult { - comment: string; - path: string[]; - template: string; - line: number; - } - - function processTaggedTemplateExpression(tte: ts.TaggedTemplateExpression): TemplateResult { - let lc = ts.getLineAndCharacterOfPosition(sourceFile, tte.pos); - if (lc.line != lastTokLine) { - preLastTokLine = lastTokLine; - lastTokLine = lc.line; - } - let path = getPath(tte.tag) - let res: TemplateResult = { - path, - line: lc.line, - comment: getComment(tte), - template: getTemplate(tte.template).replace(/"/g, '\\"'), - }; - return res; - } - - function formatMsgComment(line: number, comment?: string) { - if (comment) { - for (let cl of comment.split('\n')) { - console.log(`#. ${cl}`); - } - } - console.log(`#: ${sourceFile.fileName}:${line+1}`); - console.log(`#, c-format`); - } - - function formatMsgLine(head: string, msg: string) { - // Do escaping, wrap break at newlines - let parts = msg - .match(/(.*\n|.+$)/g) - .map((x) => x.replace(/\n/g, '\\n')) - .map((p) => wordwrap(p)) - .reduce((a,b) => a.concat(b)); - if (parts.length == 1) { - console.log(`${head} "${parts[0]}"`); - } else { - console.log(`${head} ""`); - for (let p of parts) { - console.log(`"${p}"`); - } - } - } - - interface JsxProcessingContext { - - } - - function getJsxElementPath(node: ts.Node) { - let path; - let process = (childNode) => { - switch (childNode.kind) { - case ts.SyntaxKind.JsxOpeningElement: - { - let e = childNode as ts.JsxOpeningElement; - return path = getPath(e.tagName); - } - default: - break; - } - }; - ts.forEachChild(node, process); - return path; - } - - function translateJsxExpression(node: ts.Node, h) { - switch (node.kind) { - case ts.SyntaxKind.StringLiteral: - { - let e = node as ts.StringLiteral; - return e.text; - } - default: - return `%${h[0]++}$s`; - } - } - - function trim(s) { - return s.replace(/^[ \n\t]*/, "").replace(/[ \n\t]*$/, ""); - } - - function getJsxContent(node: ts.Node) { - let fragments = []; - let holeNum = [1]; - let process = (childNode) => { - switch (childNode.kind) { - case ts.SyntaxKind.JsxText: - { - let e = childNode as ts.JsxText; - let t = e.getText().split("\n").map(trim).join("\n"); - fragments.push(t); - } - case ts.SyntaxKind.JsxOpeningElement: - break; - case ts.SyntaxKind.JsxElement: - fragments.push(`%${holeNum[0]++}$s`); - break; - case ts.SyntaxKind.JsxExpression: - { - let e = childNode as ts.JsxExpression; - fragments.push(translateJsxExpression(e.expression, holeNum)); - break; - } - case ts.SyntaxKind.JsxClosingElement: - break; - default: - let lc = ts.getLineAndCharacterOfPosition(childNode.getSourceFile(), childNode.getStart()); - console.error(`unrecognized syntax in JSX Element ${ts.SyntaxKind[childNode.kind]} (${childNode.getSourceFile().fileName}:${lc.line+1}:${lc.character+1}`); - break; - } - }; - ts.forEachChild(node, process); - return fragments.join(""); - } - - function getJsxSingular(node: ts.Node) { - let res; - let process = (childNode) => { - switch (childNode.kind) { - case ts.SyntaxKind.JsxElement: - { - let path = getJsxElementPath(childNode); - if (arrayEq(path, ["i18n", "TranslateSingular"])) { - res = getJsxContent(childNode); - } - } - default: - break; - } - }; - ts.forEachChild(node, process); - return res; - } - - function getJsxPlural(node: ts.Node) { - let res; - let process = (childNode) => { - switch (childNode.kind) { - case ts.SyntaxKind.JsxElement: - { - let path = getJsxElementPath(childNode); - if (arrayEq(path, ["i18n", "TranslatePlural"])) { - res = getJsxContent(childNode); - } - } - default: - break; - } - }; - ts.forEachChild(node, process); - return res; - } - - - function processNode(node: ts.Node) { - switch (node.kind) { - case ts.SyntaxKind.JsxElement: - let path = getJsxElementPath(node); - if (arrayEq(path, ["i18n", "Translate"])) { - let content = getJsxContent(node); - let {line} = ts.getLineAndCharacterOfPosition(sourceFile, node.pos); - let comment = getComment(node); - formatMsgComment(line, comment); - formatMsgLine("msgid", content); - console.log(`msgstr ""`); - console.log(); - return; - } - if (arrayEq(path, ["i18n", "TranslateSwitch"])) { - let {line} = ts.getLineAndCharacterOfPosition(sourceFile, node.pos); - let comment = getComment(node); - formatMsgComment(line, comment); - let singularForm = getJsxSingular(node); - if (!singularForm) { - console.error("singular form missing"); - process.exit(1); - } - let pluralForm = getJsxPlural(node); - if (!pluralForm) { - console.error("plural form missing"); - process.exit(1); - } - formatMsgLine("msgid", singularForm); - formatMsgLine("msgid_plural", pluralForm); - console.log(`msgstr[0] ""`); - console.log(`msgstr[1] ""`); - console.log(); - return; - } - break; - case ts.SyntaxKind.CallExpression: - { - // might be i18n.plural(i18n[.X]`...`, i18n[.X]`...`) - let ce = <ts.CallExpression>node; - let path = getPath(ce.expression); - if (!arrayEq(path, ["i18n", "plural"])) { - break; - } - if (ce.arguments[0].kind != ts.SyntaxKind.TaggedTemplateExpression) { - break; - } - if (ce.arguments[1].kind != ts.SyntaxKind.TaggedTemplateExpression) { - break; - } - let {line} = ts.getLineAndCharacterOfPosition(sourceFile, ce.pos); - let t1 = processTaggedTemplateExpression(<ts.TaggedTemplateExpression>ce.arguments[0]); - let t2 = processTaggedTemplateExpression(<ts.TaggedTemplateExpression>ce.arguments[1]); - let comment = getComment(ce); - - formatMsgComment(line, comment); - formatMsgLine("msgid", t1.template); - formatMsgLine("msgid_plural", t2.template); - console.log(`msgstr[0] ""`); - console.log(`msgstr[1] ""`); - console.log(); - - // Important: no processing for child i18n expressions here - return; - } - case ts.SyntaxKind.TaggedTemplateExpression: - { - let tte = <ts.TaggedTemplateExpression>node; - let {comment, template, line, path} = processTaggedTemplateExpression(tte); - if (path[0] != "i18n") { - break; - } - formatMsgComment(line, comment); - formatMsgLine("msgid", template); - console.log(`msgstr ""`); - console.log(); - break; - } - } - - ts.forEachChild(node, processNode); - } -} - -const fileNames = process.argv.slice(2); - -console.log( -`# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\\n" -"Report-Msgid-Bugs-To: \\n" -"POT-Creation-Date: 2016-11-23 00:00+0100\\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n" -"Language-Team: LANGUAGE <LL@li.org>\\n" -"Language: \\n" -"MIME-Version: 1.0\\n" -"Content-Type: text/plain; charset=UTF-8\\n" -"Content-Transfer-Encoding: 8bit\\n"`); -console.log() - -fileNames.sort(); - -fileNames.forEach(fileName => { - let sourceFile = ts.createSourceFile(fileName, readFileSync(fileName).toString(), ts.ScriptTarget.ES2016, /*setParentNodes */ true); - processFile(sourceFile); -}); diff --git a/pogen/tsconfig.json b/pogen/tsconfig.json deleted file mode 100644 index 3d2b2c002..000000000 --- a/pogen/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "noImplicitAny": false, - "sourceMap": false - }, - "files": [ - "pogen.ts" - ] -} |