From 857a5da8f12d1cd360ed12ad311b61e55e7203b8 Mon Sep 17 00:00:00 2001 From: Syed Abdullah Date: Thu, 12 Jan 2017 00:04:54 +0800 Subject: [PATCH] Fix inverted calculation of RTL text percentage in bidi. --- src/core/bidi.js | 2 +- test/unit/bidi_spec.js | 50 +++++++++++++++++++++++++++++++++++++++ test/unit/clitests.json | 1 + test/unit/jasmine-boot.js | 31 ++++++++++++------------ 4 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 test/unit/bidi_spec.js diff --git a/src/core/bidi.js b/src/core/bidi.js index 49a4f62a6..f446e123a 100644 --- a/src/core/bidi.js +++ b/src/core/bidi.js @@ -171,7 +171,7 @@ } if (startLevel === -1) { - if ((strLength / numBidi) < 0.3) { + if ((numBidi / strLength) < 0.3) { isLTR = true; startLevel = 0; } else { diff --git a/test/unit/bidi_spec.js b/test/unit/bidi_spec.js new file mode 100644 index 000000000..d2bec0b9d --- /dev/null +++ b/test/unit/bidi_spec.js @@ -0,0 +1,50 @@ +/* Copyright 2017 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define('pdfjs-test/unit/bidi_spec', ['exports', 'pdfjs/core/bidi'], + factory); + } else if (typeof exports !== 'undefined') { + factory(exports, require('../../src/core/bidi.js')); + } else { + factory((root.pdfjsTestUnitBidiSpec = {}), root.pdfjsCoreBidi); + } +}(this, function (exports, coreBidi) { + +var bidi = coreBidi.bidi; + +describe('bidi', function () { + it('should mark text as RTL if more than 30% of text is RTL', function() { + // 33% of test text are RTL characters + var test = '\u0645\u0635\u0631 Egypt'; + var result = 'Egypt \u0631\u0635\u0645'; + var bidiText = bidi(test, -1, false); + + expect(bidiText.str).toEqual(result); + expect(bidiText.dir).toEqual('rtl'); + }); + + it('should mark text as LTR if less than 30% of text is RTL', function() { + var test = 'Egypt is known as \u0645\u0635\u0631 in Arabic.'; + var result = 'Egypt is known as \u0631\u0635\u0645 in Arabic.'; + var bidiText = bidi(test, -1, false); + + expect(bidiText.str).toEqual(result); + expect(bidiText.dir).toEqual('ltr'); + }); +}); +})); diff --git a/test/unit/clitests.json b/test/unit/clitests.json index e1635a9b4..ee92e899f 100644 --- a/test/unit/clitests.json +++ b/test/unit/clitests.json @@ -1,6 +1,7 @@ { "spec_dir": "test/unit", "spec_files": [ + "bidi_spec.js", "cff_parser_spec.js", "crypto_spec.js", "document_spec.js", diff --git a/test/unit/jasmine-boot.js b/test/unit/jasmine-boot.js index b010e4f7e..2637ca373 100644 --- a/test/unit/jasmine-boot.js +++ b/test/unit/jasmine-boot.js @@ -46,24 +46,25 @@ function initializePDFJS(callback) { require.config({paths: {'pdfjs': '../../src', 'pdfjs-web': '../../web', 'pdfjs-test': '..'}}); require(['pdfjs/display/global', 'pdfjs-test/unit/annotation_layer_spec', - 'pdfjs-test/unit/api_spec', 'pdfjs-test/unit/cff_parser_spec', - 'pdfjs-test/unit/cmap_spec', 'pdfjs-test/unit/crypto_spec', - 'pdfjs-test/unit/document_spec', 'pdfjs-test/unit/dom_utils_spec', - 'pdfjs-test/unit/evaluator_spec', 'pdfjs-test/unit/fonts_spec', - 'pdfjs-test/unit/function_spec', 'pdfjs-test/unit/metadata_spec', - 'pdfjs-test/unit/murmurhash3_spec', 'pdfjs-test/unit/network_spec', - 'pdfjs-test/unit/parser_spec', 'pdfjs-test/unit/primitives_spec', - 'pdfjs-test/unit/stream_spec', 'pdfjs-test/unit/type1_parser_spec', + 'pdfjs-test/unit/api_spec', 'pdfjs-test/unit/bidi_spec', + 'pdfjs-test/unit/cff_parser_spec', 'pdfjs-test/unit/cmap_spec', + 'pdfjs-test/unit/crypto_spec', 'pdfjs-test/unit/document_spec', + 'pdfjs-test/unit/dom_utils_spec', 'pdfjs-test/unit/evaluator_spec', + 'pdfjs-test/unit/fonts_spec', 'pdfjs-test/unit/function_spec', + 'pdfjs-test/unit/metadata_spec', 'pdfjs-test/unit/murmurhash3_spec', + 'pdfjs-test/unit/network_spec', 'pdfjs-test/unit/parser_spec', + 'pdfjs-test/unit/primitives_spec', 'pdfjs-test/unit/stream_spec', + 'pdfjs-test/unit/type1_parser_spec', 'pdfjs-test/unit/ui_utils_spec', 'pdfjs-test/unit/unicode_spec', 'pdfjs-test/unit/util_spec'], function (displayGlobal, testUnitAnnotationLayerSpec, testUnitApiSpec, - testUnitCFFParserSpec, testUnitCMapSpec, testUnitCryptoSpec, - testUnitDocumentSpec, testUnitDOMUtilsSpec, testUnitEvaluatorSpec, - testUnitFontsSpec, testUnitFunctionSpec, testUnitMetadataSpec, - testUnitMurmurHash3Spec, testUnitNetworkSpec, testUnitParserSpec, - testUnitPrimitivesSpec, testUnitStreamSpec, - testUnitType1ParserSpec, testUnitUiUtilsSpec, testUnitUnicodeSpec, - testUnitUtilSpec) { + testUnitBidiSpec, testUnitCFFParserSpec, testUnitCMapSpec, + testUnitCryptoSpec, testUnitDocumentSpec, testUnitDOMUtilsSpec, + testUnitEvaluatorSpec, testUnitFontsSpec, testUnitFunctionSpec, + testUnitMetadataSpec, testUnitMurmurHash3Spec, + testUnitNetworkSpec, testUnitParserSpec, testUnitPrimitivesSpec, + testUnitStreamSpec, testUnitType1ParserSpec, testUnitUiUtilsSpec, + testUnitUnicodeSpec, testUnitUtilSpec) { // Configure the worker. displayGlobal.PDFJS.workerSrc = '../../src/worker_loader.js';