diff --git a/packages/react-intl-universal-extract/README.md b/packages/react-intl-universal-extract/README.md index 5ddff03..8067db0 100644 --- a/packages/react-intl-universal-extract/README.md +++ b/packages/react-intl-universal-extract/README.md @@ -1,5 +1,10 @@ -# react-intl-universal-extract -Extract default messages in application using [react-intl-universal](https://github.com/alibaba/react-intl-universal). +# react-intl-universal-extract-pluto + - Since react-intl-universal-extract does not support Chinese as a key, based on react-intl-universal-extract, an entry - file supporting Chinese key extraction is released. + + - If there is any infringement of react-intl-universal-extract, please contact the contributor in time to delete the copy and related content + + - Extract default messages in application using [react-intl-universal](https://github.com/alibaba/react-intl-universal). + - Support key to obtain Chinese key-value pairs ![react-intl-universal-extract](https://img.alicdn.com/imgextra/i4/O1CN01v8z1us1xc6TAXlHBC_!!6000000006463-2-tps-738-340.png) @@ -9,6 +14,7 @@ For example, suppose you have a file: render() { const name = 'Tony'; return (<> + {intl.get('hello')} {intl.get('hello1').d('Hello World')} {intl.get('hello2', {name} ).d(`Hello ${name}`)} ); diff --git a/packages/react-intl-universal-extract/package.json b/packages/react-intl-universal-extract/package.json index c9d681f..499a66d 100644 --- a/packages/react-intl-universal-extract/package.json +++ b/packages/react-intl-universal-extract/package.json @@ -1,6 +1,6 @@ { - "name": "react-intl-universal-extract", - "version": "1.0.3", + "name": "react-intl-universal-extract-pluto", + "version": "1.0.5", "description": "A react-intl-universal message extractor", "keywords": [ "intl", @@ -23,6 +23,7 @@ "preversion": "npm run clean && npm run build && npm run test", "prepublish": "npm run clean && npm run build" }, + "homepage": "https://github.com/hongdeyuan/react-intl-universal#readme", "license": "BSD-3-Clause", "dependencies": { "chalk": "2.1.0", diff --git a/packages/react-intl-universal-extract/src/extract/index.test.js b/packages/react-intl-universal-extract/src/extract/index.test.js index b037718..17ace55 100644 --- a/packages/react-intl-universal-extract/src/extract/index.test.js +++ b/packages/react-intl-universal-extract/src/extract/index.test.js @@ -16,87 +16,8 @@ test("Test extract", () => { // verbose: true, }); - expect(getOriginal(result, 'basic1')).toBe('default message'); - expect(getTransformed(result, 'basic1')).toBe('default message'); - - expect(getOriginal(result, 'basic2')).toBe('Default message for basic[2]'); - expect(getTransformed(result, 'basic2')).toBe('Default message for basic[2]'); - - expect(getOriginal(result, 'basic3')).toBe('Default message for basic(3)'); - expect(getTransformed(result, 'basic3')).toBe('Default message for basic(3)'); - - expect(getOriginal(result, 'basic4')).toBe('Default message for basic(4) with 中文'); - expect(getTransformed(result, 'basic4')).toBe('Default message for basic(4) with 中文'); - - expect(getOriginal(result, 'basic5')).toBe('Default message for basic5 with 中文(5)'); - expect(getTransformed(result, 'basic5')).toBe('Default message for basic5 with 中文(5)'); - - expect(getOriginal(result, 'basic6')).toBe('Default message for basic6 with "123(中文)"'); - expect(getTransformed(result, 'basic6')).toBe('Default message for basic6 with "123(中文)"'); - - expect(getOriginal(result, 'character1')).toBe('Expression support: ==,!=,>=,>,<=,<,&&,!,(),+,-,*,/,%'); - expect(getTransformed(result, 'character1')).toBe('Expression support: ==,!=,>=,>,<=,<,&&,!,(),+,-,*,/,%'); - - expect(getOriginal(result, 'html1')).toBe('This is html'); - expect(getTransformed(result, 'html1')).toBe('This is html'); - - expect(getOriginal(result, 'html2')).toBe('This is html'); - expect(getTransformed(result, 'html2')).toBe('This is html'); - - expect(getOriginal(result, 'html3')).toBe('(This is html)'); - expect(getTransformed(result, 'html3')).toBe('(This is html)'); - - expect(getOriginal(result, 'html4')).toBe('Hello4 {name}'); - expect(getTransformed(result, 'html4')).toBe('Hello4 {name}'); - - expect(getOriginal(result, 'html5')).toBe('Hello5 {name}, welcome to my website!'); - expect(getTransformed(result, 'html5')).toBe('Hello5 {name}, welcome to my website!'); - - expect(getOriginal(result, 'html6')).toBe('welcome to my website'); - expect(getTransformed(result, 'html6')).toBe('welcome to my website'); - - expect(getOriginal(result, 'html7')).toBe('Hello7 {name}'); - expect(getTransformed(result, 'html7')).toBe('Hello7 {name}'); - - expect(getOriginal(result, 'html8')).toBe('html8'); - expect(getTransformed(result, 'html8')).toBe('html8'); - - expect(getOriginal(result, 'html9')).toBe('html9'); - expect(getTransformed(result, 'html9')).toBe('html9'); - - expect(getOriginal(result, 'newline1')).toBe('Default message for newline1'); - expect(getTransformed(result, 'newline1')).toBe('Default message for newline1'); - - expect(getOriginal(result, 'newline2')).toBe('Default message for newline2'); - expect(getTransformed(result, 'newline2')).toBe('Default message for newline2'); - - expect(getOriginal(result, 'newline3')).toBe('Default message for newline1'); - expect(getTransformed(result, 'newline3')).toBe('Default message for newline1'); - - expect(getOriginal(result, 'newline4')).toBe('Default message for newline2'); - expect(getTransformed(result, 'newline4')).toBe('Default message for newline2'); - - expect(getOriginal(result, 'same-same_line2')).toBe('Default message for same_line2'); - expect(getTransformed(result, 'same-same_line2')).toBe('Default message for same_line2'); - - expect(getOriginal(result, 'same_line1')).toBe('Default message for same_line1'); - expect(getTransformed(result, 'same_line1')).toBe('Default message for same_line1'); - - expect(getOriginal(result, 'var1')).toBe('Hello1, ${name}. Welcome to ${where}!'); - expect(getTransformed(result, 'var1')).toBe('Hello1, {name}. Welcome to {where}!'); - - expect(getOriginal(result, 'var2')).toBe('你好2, ${name}. 欢迎来到 ${where}!'); - expect(getTransformed(result, 'var2')).toBe('你好2, {name}. 欢迎来到 {where}!'); - - expect(getOriginal(result, 'var3')).toBe('Hello3, ${name}. Welcome to ${where}!'); - expect(getTransformed(result, 'var3')).toBe('Hello3, {name}. Welcome to {where}!'); - - expect(getOriginal(result, 'var4')).toBe('你好4, ${name}. 欢迎来到 ${where}!'); - expect(getTransformed(result, 'var4')).toBe('你好4, {name}. 欢迎来到 {where}!'); - - expect(getOriginal(result, 'var5')).toBe('Hello5, ${name}. Welcome to ${where}!'); - expect(getTransformed(result, 'var5')).toBe('Hello5, {name}. Welcome to {where}!'); - + expect(getOriginal(result, 'basic1')).toBe('basic1'); + expect(getTransformed(result, 'basic1')).toBe('basic1'); }); diff --git a/packages/react-intl-universal-extract/src/util/constant.js b/packages/react-intl-universal-extract/src/util/constant.js index 0a81269..148d1ed 100644 --- a/packages/react-intl-universal-extract/src/util/constant.js +++ b/packages/react-intl-universal-extract/src/util/constant.js @@ -1,12 +1,9 @@ -const DETECT_REGEXP = /(intl|IntlUtils)\s*\.\s*(get\s*\(\s*["'`]([\w\.-]+)["'`][\s\S]*?\)\s*\.\s*(defaultMessage|d)\s*\(\s*[`"']([\s\S]+?)[`"']|getHTML*\s*\(\s*["'`]([\w\.-]+)["'`][\s\S]*?\)\s*\.\s*(defaultMessage|d)\s*\(\s*(["'`<][\s\S]+?["'`>]))[\s*,]*\)/gm; - -const NO_DEFAULT_REGEXP = /intl\s*\.\s*get(HTML)*\s*\(\s*["'`]([\w\.-]+)["'`]['"\w\.,{}:\s-]*\)\s*(?!\s*\.\s*(d|defaultMessage)\s*\(\s*[<'"`\s\\]+)/gm; +const DETECT_REGEXP = /(intl|IntlUtils)\s*\.\s*(get\s*\(\s*["'`]([\s\S]+?)["'`][\s\S]*?\)\s*|getHTML\s*\(\s*["'`]([\s\S]+?)["'`][\s\S]*?\))/gm; const COMMENT_REGEXP = /(\/\/.*)|(\/\*[\s\S]*?\*\/)/gm; module.exports = { DETECT_REGEXP, - COMMENT_REGEXP, - NO_DEFAULT_REGEXP + COMMENT_REGEXP }; \ No newline at end of file diff --git a/packages/react-intl-universal-extract/src/util/util.js b/packages/react-intl-universal-extract/src/util/util.js index bddebb5..8119bf0 100644 --- a/packages/react-intl-universal-extract/src/util/util.js +++ b/packages/react-intl-universal-extract/src/util/util.js @@ -3,7 +3,7 @@ const pathtool = require('path'); const config = require('../../config'); const chalk = require('chalk'); const _ = require('lodash'); -const { DETECT_REGEXP, NO_DEFAULT_REGEXP } = require('./constant'); +const { DETECT_REGEXP } = require('./constant'); /** @@ -66,8 +66,7 @@ function scanFiles(dirPath, options, ig) { function processFile(path) { logger.info('Processing file: ', path) const content = fs.readFileSync(path, 'utf-8').toString(); - const invalidMessages = getNoDefaultMessages(content, path); - const messages = extractMessages(content, path).concat(invalidMessages); + const messages = extractMessages(content, path); messages.forEach((message) => logger.log(` - key="${message.key}" originalDefaultMessage="${message.originalDefaultMessage}" transformedDefaultMessage="${message.transformedDefaultMessage}"`)); return messages; } @@ -81,10 +80,10 @@ function extractMessages(content, path) { const _messages = []; let match; while ((match = DETECT_REGEXP.exec(content)) != null) { - const keyIndex = match[3] ? 3 : 6; + const keyIndex = match[3] ? 3 : 4; const messageIndex = match[5] ? 5 : 8; let key = match[keyIndex]; - let defaultMessage = match[messageIndex]; + let defaultMessage = match[messageIndex] || key; // Trim "${variable}" to "{variable}" const shouldTrim = /\.(d|defaultMessage)\([\s\S]*`[\s\S]*\)/.test(match[0]); @@ -135,26 +134,6 @@ function verifyMessages(messages) { return isOK; } -/** - * Given file content, get intl object has no default message. - * @param {string} content file content - * @param {string} filePath file path - */ -function getNoDefaultMessages(content, filePath) { - const _messages = []; - let match; - while ((match = NO_DEFAULT_REGEXP.exec(content)) != null) { - let key = match[2]; - _messages.push({ - key, - path: filePath, - isValid: false, - invalidType: 'no_default', - }); - } - return _messages; -} - /** * Transform variables in source defaultMessage (such as ES6 template strings) to target defaultMessage (such as ICU format) * Example: 'Hello, ${name}. Welcome to ${where}!' -> 'Hello, {name}. Welcome to {where}!' @@ -202,6 +181,5 @@ module.exports = { processParameters, scanFiles, verifyMessages, - getNoDefaultMessages, logger, }; diff --git a/packages/react-intl-universal-extract/test-files/App.js b/packages/react-intl-universal-extract/test-files/App.js index 9fb3243..3ba9fc8 100644 --- a/packages/react-intl-universal-extract/test-files/App.js +++ b/packages/react-intl-universal-extract/test-files/App.js @@ -14,7 +14,7 @@ class App extends Component {
{intl.get('basic1').defaultMessage('default message')}
{intl.get('basic2').d('Default message for basic[2]')}
{intl.get('basic3').d('Default message for basic(3)')}
-
{intl.get('basic4').d('Default message for basic(4) with 中文')}
+
{intl.get('特征4').d('Default message for basic(4) with 中文')}
{intl.get('basic5').d('Default message for basic5 with 中文(5)')}
{intl.get('basic6').d('Default message for basic6 with "123(中文)"')}