Skip to content

Commit

Permalink
Updated alternative parser support
Browse files Browse the repository at this point in the history
As commented on [Polyconseil#72](Polyconseil#72)
  • Loading branch information
Knogobert committed Sep 1, 2020
1 parent 6d5e546 commit 24bc239
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 43 deletions.
2 changes: 1 addition & 1 deletion src/extract-cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ const minimist = require('minimist');

const constants = require('./constants.js');
const extract = require('./extract.js');
const {PROGRAM_NAME} = require('./extract-utils.js');

const PROGRAM_NAME = 'easygettext';
const ALLOWED_EXTENSIONS = ['html', 'htm', 'jade', 'js', 'pug', 'vue', 'ts'];
const ALLOWED_EXTENSIONS_EXCEPTIONS = ['.d.ts'];

Expand Down
2 changes: 2 additions & 0 deletions src/extract-utils.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const Pofile = require('pofile');
const {MARKER_NO_CONTEXT} = require('./constants.js');
const PROGRAM_NAME = 'easygettext';

function lineNumToString(withLineNumbers = false) {
return (withLineNumbers && this.line)
Expand Down Expand Up @@ -38,5 +39,6 @@ function getTextEntries(filename, textEntries) {
}

module.exports = {
PROGRAM_NAME,
getTextEntries,
};
2 changes: 1 addition & 1 deletion src/extract.js
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ exports.Extractor = class Extractor {
}
}

parseJavascript(filename, content, parser='auto') {
parseJavascript(filename, content, parser = 'auto') {
const jsContent = flowRemoveTypes(content).toString();

const extractedStringsFromScript = jsExtractor.extractStringsFromJavascript(filename, jsContent, parser);
Expand Down
96 changes: 56 additions & 40 deletions src/javascript-extract.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const {Parser} = require('acorn');
const stage3 = require('acorn-stage3');
const babel = require('@babel/core');
const {getTextEntries} = require('./extract-utils.js');
const {getTextEntries, PROGRAM_NAME} = require('./extract-utils.js');

const {DEFAULT_VUE_GETTEXT_FUNCTIONS} = require('./constants.js');

Expand All @@ -15,43 +15,8 @@ function extractConcatenatedStrings(value, allTokens, index) {
return value + extractConcatenatedStrings(nextValue, allTokens, index + 2);
}


function getGettextEntriesFromJavaScript(script, parser = 'auto') {
const allTokens = [];

switch (parser) {
case 'acorn':
const ACORN_OPTIONS = {
ecmaVersion: 10,
sourceType: 'module',
locations: true,
onToken: allTokens,
plugins: {
stage3: true,
},
};

Parser.extend(stage3).parse(script, ACORN_OPTIONS);
break;
case 'babel':
const babelResult = babel.parseSync(script, {
sourceType: 'module',
parserOpts: {
tokens: true,
},
});
allTokens.push(...babelResult.tokens);
break;
case 'auto':
default:
try {
return getGettextEntriesFromJavaScript(script, 'acorn');
} catch (e) {
return getGettextEntriesFromJavaScript(script, 'babel');
}
}


function getGettextEntriesFromJavaScript(argTokens = []) {
let allTokens = argTokens;
let extractedEntries = [];

// parse all tokens
Expand Down Expand Up @@ -80,7 +45,7 @@ function getGettextEntriesFromJavaScript(script, parser = 'auto') {

if (closingToken.type.label !== '`') {
const line = currentToken.loc.start.line;
throw new Error(`easygettext currently does not support translated template strings with variables! [line ${line}]`);
throw new Error(`${PROGRAM_NAME} currently does not support translated template strings with variables! [line ${line}]`);
}
obj[argName] = nextToken.value.trim();
return obj;
Expand Down Expand Up @@ -108,8 +73,59 @@ function getGettextEntriesFromJavaScript(script, parser = 'auto') {
return extractedEntries;
}

function parseJSGettextWithAcorn(script) {
let allTokens = [];

const ACORN_OPTIONS = {
ecmaVersion: 10,
sourceType: 'module',
locations: true,
onToken: allTokens,
plugins: {
stage3: true,
},
};

Parser.extend(stage3).parse(script, ACORN_OPTIONS);

return allTokens;
}

function parseJSGettextWithBabel(script) {
let allTokens = [];

const babelResult = babel.parseSync(script, {
sourceType: 'module',
parserOpts: {
tokens: true,
},
});
allTokens.push(...babelResult.tokens);

return allTokens;
}

function extractStringsFromJavascript(filename, script, parser = 'auto') {
return getTextEntries(filename, getGettextEntriesFromJavaScript(script, parser));
let extractedEntries;

switch (parser) {
case 'acorn':
extractedEntries = getGettextEntriesFromJavaScript(parseJSGettextWithAcorn(script));
break;
case 'babel':
extractedEntries = getGettextEntriesFromJavaScript(parseJSGettextWithBabel(script));
break;

default:
try {
extractedEntries = getGettextEntriesFromJavaScript(parseJSGettextWithAcorn(script));
} catch (e) {
console.log(`[${PROGRAM_NAME}] will switch extracting using acorn as parser and use babel instead`); // eslint-disable-line no-console
extractedEntries = getGettextEntriesFromJavaScript(parseJSGettextWithBabel(script));
}
}

return getTextEntries(filename, extractedEntries);
}

module.exports = {
Expand Down
3 changes: 2 additions & 1 deletion src/javascript-extract.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,8 @@ describe('Javascript extractor object', () => {
expect(() => {
jsExtractor.extractStringsFromJavascript(
filename,
fixtures.SCRIPT_WITH_TEMPLATE_LITERALS_WITH_VARIABLES
fixtures.SCRIPT_WITH_TEMPLATE_LITERALS_WITH_VARIABLES,
'acorn'
);
}).toThrow();
});
Expand Down

0 comments on commit 24bc239

Please sign in to comment.