Compare commits
No commits in common. "master" and "v3.7.107" have entirely different histories.
@ -1,6 +1,6 @@
|
|||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*.{js,jsm,mjs,json,html,css,pdf.link}]
|
[*.{js,jsm,json,html,css,pdf.link}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
@ -3,10 +3,12 @@ l10n/
|
|||||||
docs/
|
docs/
|
||||||
node_modules/
|
node_modules/
|
||||||
external/bcmaps/
|
external/bcmaps/
|
||||||
|
external/webL10n/
|
||||||
external/builder/fixtures/
|
external/builder/fixtures/
|
||||||
external/builder/fixtures_esprima/
|
external/builder/fixtures_esprima/
|
||||||
external/quickjs/
|
external/quickjs/
|
||||||
|
src/shared/cffStandardStrings.js
|
||||||
|
src/shared/fonts_utils.js
|
||||||
test/tmp/
|
test/tmp/
|
||||||
test/pdfs/
|
test/pdfs/
|
||||||
web/locale/
|
|
||||||
*~/
|
*~/
|
||||||
|
27
.eslintrc
27
.eslintrc
@ -22,27 +22,19 @@
|
|||||||
"browser": true,
|
"browser": true,
|
||||||
"es2022": true,
|
"es2022": true,
|
||||||
"worker": true,
|
"worker": true,
|
||||||
|
"amd": true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"globals": {
|
"globals": {
|
||||||
"PDFJSDev": "readonly",
|
"PDFJSDev": false,
|
||||||
"__non_webpack_import__": "readonly",
|
"exports": false,
|
||||||
},
|
},
|
||||||
|
|
||||||
"rules": {
|
"rules": {
|
||||||
// Plugins
|
// Plugins
|
||||||
"import/export": "error",
|
|
||||||
"import/exports-last": "error",
|
|
||||||
"import/extensions": ["error", "always", { "ignorePackages": true, }],
|
"import/extensions": ["error", "always", { "ignorePackages": true, }],
|
||||||
"import/first": "error",
|
|
||||||
"import/named": "error",
|
|
||||||
"import/no-cycle": "error",
|
|
||||||
"import/no-empty-named-blocks": "error",
|
|
||||||
"import/no-commonjs": "error",
|
|
||||||
"import/no-mutable-exports": "error",
|
|
||||||
"import/no-self-import": "error",
|
|
||||||
"import/no-unresolved": ["error", {
|
"import/no-unresolved": ["error", {
|
||||||
"ignore": ["display", "pdfjs", "pdfjs-lib", "pdfjs-web", "web", "fluent-bundle", "fluent-dom"],
|
"ignore": ["pdfjs", "pdfjs-lib", "pdfjs-web", "web"]
|
||||||
}],
|
}],
|
||||||
"mozilla/avoid-removeChild": "error",
|
"mozilla/avoid-removeChild": "error",
|
||||||
"mozilla/use-includes-instead-of-indexOf": "error",
|
"mozilla/use-includes-instead-of-indexOf": "error",
|
||||||
@ -65,20 +57,16 @@
|
|||||||
"unicorn/prefer-array-flat": "error",
|
"unicorn/prefer-array-flat": "error",
|
||||||
"unicorn/prefer-array-flat-map": "error",
|
"unicorn/prefer-array-flat-map": "error",
|
||||||
"unicorn/prefer-array-index-of": "error",
|
"unicorn/prefer-array-index-of": "error",
|
||||||
"unicorn/prefer-array-some": "error",
|
|
||||||
"unicorn/prefer-at": "error",
|
"unicorn/prefer-at": "error",
|
||||||
"unicorn/prefer-date-now": "error",
|
"unicorn/prefer-date-now": "error",
|
||||||
"unicorn/prefer-dom-node-append": "error",
|
"unicorn/prefer-dom-node-append": "error",
|
||||||
"unicorn/prefer-dom-node-remove": "error",
|
"unicorn/prefer-dom-node-remove": "error",
|
||||||
"unicorn/prefer-logical-operator-over-ternary": "error",
|
"unicorn/prefer-logical-operator-over-ternary": "error",
|
||||||
"unicorn/prefer-modern-dom-apis": "error",
|
"unicorn/prefer-modern-dom-apis": "error",
|
||||||
"unicorn/prefer-modern-math-apis": "error",
|
|
||||||
"unicorn/prefer-negative-index": "error",
|
"unicorn/prefer-negative-index": "error",
|
||||||
"unicorn/prefer-optional-catch-binding": "error",
|
|
||||||
"unicorn/prefer-regexp-test": "error",
|
"unicorn/prefer-regexp-test": "error",
|
||||||
"unicorn/prefer-string-replace-all": "error",
|
"unicorn/prefer-string-replace-all": "error",
|
||||||
"unicorn/prefer-string-starts-ends-with": "error",
|
"unicorn/prefer-string-starts-ends-with": "error",
|
||||||
"unicorn/prefer-ternary": ["error", "only-single-line"],
|
|
||||||
|
|
||||||
// Possible errors
|
// Possible errors
|
||||||
"for-direction": "error",
|
"for-direction": "error",
|
||||||
@ -140,12 +128,10 @@
|
|||||||
"no-implied-eval": "error",
|
"no-implied-eval": "error",
|
||||||
"no-iterator": "error",
|
"no-iterator": "error",
|
||||||
"no-lone-blocks": "error",
|
"no-lone-blocks": "error",
|
||||||
"no-lonely-if": "error",
|
|
||||||
"no-multi-str": "error",
|
"no-multi-str": "error",
|
||||||
"no-new": "error",
|
|
||||||
"no-new-func": "error",
|
"no-new-func": "error",
|
||||||
"no-new-symbol": "error",
|
|
||||||
"no-new-wrappers": "error",
|
"no-new-wrappers": "error",
|
||||||
|
"no-new": "error",
|
||||||
"no-octal-escape": "error",
|
"no-octal-escape": "error",
|
||||||
"no-octal": "error",
|
"no-octal": "error",
|
||||||
"no-redeclare": "error",
|
"no-redeclare": "error",
|
||||||
@ -243,9 +229,9 @@
|
|||||||
}],
|
}],
|
||||||
|
|
||||||
// ECMAScript 6
|
// ECMAScript 6
|
||||||
"arrow-body-style": ["error", "as-needed"],
|
|
||||||
"constructor-super": "error",
|
"constructor-super": "error",
|
||||||
"no-class-assign": "error",
|
"no-class-assign": "error",
|
||||||
|
"no-confusing-arrow": "error",
|
||||||
"no-const-assign": "error",
|
"no-const-assign": "error",
|
||||||
"no-dupe-class-members": "error",
|
"no-dupe-class-members": "error",
|
||||||
"no-duplicate-imports": "error",
|
"no-duplicate-imports": "error",
|
||||||
@ -258,7 +244,6 @@
|
|||||||
"avoidQuotes": true,
|
"avoidQuotes": true,
|
||||||
}],
|
}],
|
||||||
"prefer-const": "error",
|
"prefer-const": "error",
|
||||||
"require-yield": "error",
|
|
||||||
"sort-imports": ["error", {
|
"sort-imports": ["error", {
|
||||||
"ignoreCase": true,
|
"ignoreCase": true,
|
||||||
}],
|
}],
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
# Auto-format `.js` files with ESLint/Prettier
|
|
||||||
de36b2aabab2b7fd647d9591f959c4540129541d
|
|
||||||
# Auto-format `.css` files with Stylelint/Prettier
|
|
||||||
8aa2718d225ad701a5b8a2788b42d221f1e4327d
|
|
||||||
# Auto-format `.json` files with Prettier
|
|
||||||
29de9bdce6c9785574994fda0e51533d796a9bb4
|
|
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -4,7 +4,7 @@
|
|||||||
*.css text eol=lf
|
*.css text eol=lf
|
||||||
*.html text eol=lf
|
*.html text eol=lf
|
||||||
*.md text eol=lf
|
*.md text eol=lf
|
||||||
*.ftl text eol=lf
|
*.properties text eol=lf
|
||||||
*.yml text eol=lf
|
*.yml text eol=lf
|
||||||
*.json text eol=lf
|
*.json text eol=lf
|
||||||
*.config text eol=lf
|
*.config text eol=lf
|
||||||
|
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@ -1 +1 @@
|
|||||||
l10n/en-US/*.ftl @mozilla/pdfjs-l10n
|
l10n/en-US/*.properties @mozilla/pdfjs-l10n
|
||||||
|
27
.github/fluent_linter_config.yml
vendored
27
.github/fluent_linter_config.yml
vendored
@ -1,27 +0,0 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
# See https://github.com/mozilla-l10n/moz-fluent-linter/blob/main/src/fluent_linter/config.yml
|
|
||||||
# for details
|
|
||||||
|
|
||||||
---
|
|
||||||
ID01:
|
|
||||||
enabled: true
|
|
||||||
exclusions:
|
|
||||||
messages: []
|
|
||||||
files: []
|
|
||||||
ID02:
|
|
||||||
enabled: true
|
|
||||||
min_length: 9
|
|
||||||
exclusions:
|
|
||||||
messages: []
|
|
||||||
files: []
|
|
||||||
CO01:
|
|
||||||
enabled: true
|
|
||||||
brands:
|
|
||||||
- Firefox
|
|
||||||
- Mozilla
|
|
||||||
exclusions:
|
|
||||||
files: []
|
|
||||||
messages: []
|
|
1
.github/requirements.txt
vendored
1
.github/requirements.txt
vendored
@ -1 +0,0 @@
|
|||||||
moz-fluent-linter==0.4.*
|
|
20
.github/workflows/ci.yml
vendored
20
.github/workflows/ci.yml
vendored
@ -8,21 +8,16 @@ jobs:
|
|||||||
name: Test
|
name: Test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
node-version: [18, lts/*, latest]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js 18 LTS
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: '18'
|
||||||
|
|
||||||
- name: Install Gulp
|
- name: Install Gulp
|
||||||
run: npm install -g gulp-cli
|
run: npm install -g gulp-cli
|
||||||
@ -30,8 +25,5 @@ jobs:
|
|||||||
- name: Install other dependencies
|
- name: Install other dependencies
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Run external tests
|
- name: Run tests
|
||||||
run: gulp externaltest
|
run: gulp ci-test
|
||||||
|
|
||||||
- name: Run CLI unit tests
|
|
||||||
run: gulp unittestcli
|
|
||||||
|
8
.github/workflows/codeql.yml
vendored
8
.github/workflows/codeql.yml
vendored
@ -18,18 +18,18 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
queries: security-and-quality
|
queries: security-and-quality
|
||||||
|
|
||||||
- name: Autobuild CodeQL
|
- name: Autobuild CodeQL
|
||||||
uses: github/codeql-action/autobuild@v3
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
- name: Perform CodeQL analysis
|
- name: Perform CodeQL analysis
|
||||||
uses: github/codeql-action/analyze@v3
|
uses: github/codeql-action/analyze@v2
|
||||||
|
42
.github/workflows/fluent_linter.yml
vendored
42
.github/workflows/fluent_linter.yml
vendored
@ -1,42 +0,0 @@
|
|||||||
name: Lint Fluent Reference Files
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'l10n/en-US/**.ftl'
|
|
||||||
- '.github/fluent_linter_config.yml'
|
|
||||||
- '.github/workflows/fluent_linter.yml'
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'l10n/en-US/**.ftl'
|
|
||||||
- '.github/fluent_linter_config.yml'
|
|
||||||
- '.github/workflows/fluent_linter.yml'
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
workflow_dispatch:
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
name: Lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Use Python 3.12
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.12'
|
|
||||||
cache: 'pip'
|
|
||||||
|
|
||||||
- name: Install Fluent dependencies
|
|
||||||
run: |
|
|
||||||
pip install -r .github/requirements.txt
|
|
||||||
|
|
||||||
- name: Lint Fluent reference files
|
|
||||||
run: |
|
|
||||||
moz-fluent-lint ./l10n/en-US --config .github/fluent_linter_config.yml
|
|
64
.github/workflows/font_tests.yml
vendored
64
.github/workflows/font_tests.yml
vendored
@ -1,64 +0,0 @@
|
|||||||
name: Font tests
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'gulpfile.mjs'
|
|
||||||
- 'src/**'
|
|
||||||
- 'test/test.mjs'
|
|
||||||
- 'test/font/**'
|
|
||||||
- '.github/workflows/font_tests.yml'
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'gulpfile.mjs'
|
|
||||||
- 'src/**'
|
|
||||||
- 'test/test.mjs'
|
|
||||||
- 'test/font/**'
|
|
||||||
- '.github/workflows/font_tests.yml'
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
workflow_dispatch:
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Test
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
node-version: [lts/*]
|
|
||||||
os: [windows-latest, ubuntu-latest]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
|
|
||||||
- name: Install Gulp
|
|
||||||
run: npm install -g gulp-cli
|
|
||||||
|
|
||||||
- name: Install other dependencies
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: Use Python 3.12
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.12'
|
|
||||||
cache: 'pip'
|
|
||||||
|
|
||||||
- name: Install Fonttools
|
|
||||||
run: pip install fonttools
|
|
||||||
|
|
||||||
- name: Run font tests
|
|
||||||
run: gulp fonttest --headless
|
|
37
.github/workflows/lint.yml
vendored
37
.github/workflows/lint.yml
vendored
@ -1,37 +0,0 @@
|
|||||||
name: Lint
|
|
||||||
on: [push, pull_request]
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
name: Lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
node-version: [lts/*]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
|
|
||||||
- name: Install Gulp
|
|
||||||
run: npm install -g gulp-cli
|
|
||||||
|
|
||||||
- name: Install other dependencies
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: Run lint
|
|
||||||
run: gulp lint
|
|
||||||
|
|
||||||
- name: Run lint-chromium
|
|
||||||
run: gulp lint-chromium
|
|
16
.github/workflows/publish_website.yml
vendored
16
.github/workflows/publish_website.yml
vendored
@ -11,20 +11,16 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [lts/*]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js 18 LTS
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: '18'
|
||||||
|
|
||||||
- name: Install Gulp
|
- name: Install Gulp
|
||||||
run: npm install -g gulp-cli
|
run: npm install -g gulp-cli
|
||||||
@ -52,7 +48,7 @@ jobs:
|
|||||||
INPUT_PATH: build/gh-pages
|
INPUT_PATH: build/gh-pages
|
||||||
|
|
||||||
- name: Upload the website
|
- name: Upload the website
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: github-pages
|
name: github-pages
|
||||||
path: ${{ runner.temp }}/website.tar
|
path: ${{ runner.temp }}/website.tar
|
||||||
@ -69,4 +65,4 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Deploy the website
|
- name: Deploy the website
|
||||||
uses: actions/deploy-pages@v4
|
uses: actions/deploy-pages@v2
|
||||||
|
34
.github/workflows/types_tests.yml
vendored
34
.github/workflows/types_tests.yml
vendored
@ -1,34 +0,0 @@
|
|||||||
name: Types tests
|
|
||||||
on: [push, pull_request]
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
node-version: [lts/*]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
|
|
||||||
- name: Install Gulp
|
|
||||||
run: npm install -g gulp-cli
|
|
||||||
|
|
||||||
- name: Install other dependencies
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: Run types tests
|
|
||||||
run: gulp typestest
|
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "test/ttx/fonttools-code"]
|
||||||
|
path = test/ttx/fonttools-code
|
||||||
|
url = https://github.com/behdad/fonttools.git
|
@ -1,12 +0,0 @@
|
|||||||
build/
|
|
||||||
l10n/
|
|
||||||
docs/
|
|
||||||
node_modules/
|
|
||||||
external/bcmaps/
|
|
||||||
external/builder/fixtures/
|
|
||||||
external/builder/fixtures_esprima/
|
|
||||||
external/quickjs/
|
|
||||||
test/tmp/
|
|
||||||
test/pdfs/
|
|
||||||
web/locale/
|
|
||||||
*~/
|
|
11
.prettierrc
11
.prettierrc
@ -5,14 +5,5 @@
|
|||||||
"semi": true,
|
"semi": true,
|
||||||
"tabWidth": 2,
|
"tabWidth": 2,
|
||||||
"trailingComma": "es5",
|
"trailingComma": "es5",
|
||||||
"useTabs": false,
|
"useTabs": false
|
||||||
|
|
||||||
"overrides": [
|
|
||||||
{
|
|
||||||
files: ["tsconfig.json"],
|
|
||||||
options: {
|
|
||||||
parser: "json",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,12 @@ l10n/
|
|||||||
docs/
|
docs/
|
||||||
node_modules/
|
node_modules/
|
||||||
external/bcmaps/
|
external/bcmaps/
|
||||||
|
external/webL10n/
|
||||||
external/builder/fixtures/
|
external/builder/fixtures/
|
||||||
external/builder/fixtures_esprima/
|
external/builder/fixtures_esprima/
|
||||||
external/quickjs/
|
external/quickjs/
|
||||||
|
src/shared/cffStandardStrings.js
|
||||||
|
src/shared/fonts_utils.js
|
||||||
test/tmp/
|
test/tmp/
|
||||||
test/pdfs/
|
test/pdfs/
|
||||||
web/locale/
|
|
||||||
*~/
|
*~/
|
||||||
|
@ -6,12 +6,7 @@
|
|||||||
"rules": {
|
"rules": {
|
||||||
"prettier/prettier": true,
|
"prettier/prettier": true,
|
||||||
|
|
||||||
"alpha-value-notation": "number",
|
|
||||||
"block-no-empty": true,
|
"block-no-empty": true,
|
||||||
"color-function-notation": "modern",
|
|
||||||
"color-hex-length": "short",
|
|
||||||
"color-no-invalid-hex": true,
|
|
||||||
"declaration-block-no-duplicate-properties": true,
|
|
||||||
"declaration-block-no-redundant-longhand-properties": true,
|
"declaration-block-no-redundant-longhand-properties": true,
|
||||||
"declaration-property-value-disallowed-list": {
|
"declaration-property-value-disallowed-list": {
|
||||||
"float": ["inline-start", "inline-end"]
|
"float": ["inline-start", "inline-end"]
|
||||||
|
15
README.md
15
README.md
@ -38,8 +38,6 @@ PDF.js is built into version 19+ of Firefox.
|
|||||||
|
|
||||||
#### Chrome
|
#### Chrome
|
||||||
|
|
||||||
+ The official extension for Chrome can be installed from the [Chrome Web Store](https://chrome.google.com/webstore/detail/pdf-viewer/oemmndcbldboiebfnladdacbdfmadadm).
|
|
||||||
*This extension is maintained by [@Rob--W](https://github.com/Rob--W).*
|
|
||||||
+ Build Your Own - Get the code as explained below and issue `gulp chromium`. Then open
|
+ Build Your Own - Get the code as explained below and issue `gulp chromium`. Then open
|
||||||
Chrome, go to `Tools > Extension` and load the (unpackaged) extension from the
|
Chrome, go to `Tools > Extension` and load the (unpackaged) extension from the
|
||||||
directory `build/chromium`.
|
directory `build/chromium`.
|
||||||
@ -55,17 +53,12 @@ Next, install Node.js via the [official package](https://nodejs.org) or via
|
|||||||
[nvm](https://github.com/creationix/nvm). You need to install the gulp package
|
[nvm](https://github.com/creationix/nvm). You need to install the gulp package
|
||||||
globally (see also [gulp's getting started](https://github.com/gulpjs/gulp/tree/master/docs/getting-started)):
|
globally (see also [gulp's getting started](https://github.com/gulpjs/gulp/tree/master/docs/getting-started)):
|
||||||
|
|
||||||
$ npm install -g gulp-cli@^2.3.0
|
$ npm install -g gulp-cli
|
||||||
|
|
||||||
If you prefer to not install `gulp-cli` globally, you have to prefix all the `gulp` commands with `npx` (for example, `npx gulp server` instead of `gulp server`).
|
|
||||||
|
|
||||||
If everything worked out, install all dependencies for PDF.js:
|
If everything worked out, install all dependencies for PDF.js:
|
||||||
|
|
||||||
$ npm install
|
$ npm install
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> On MacOS M1/M2 you may see some `node-gyp`-related errors when running `npm install`. This is because one of our dependencies, `"canvas"`, does not provide pre-built binaries for this platform and instead `npm` will try to build it from source. Please make sure to first install the necessary native dependencies using `brew`: https://github.com/Automattic/node-canvas#compiling.
|
|
||||||
|
|
||||||
Finally, you need to start a local web server as some browsers do not allow opening
|
Finally, you need to start a local web server as some browsers do not allow opening
|
||||||
PDF files using a `file://` URL. Run:
|
PDF files using a `file://` URL. Run:
|
||||||
|
|
||||||
@ -75,7 +68,7 @@ and then you can open:
|
|||||||
|
|
||||||
+ http://localhost:8888/web/viewer.html
|
+ http://localhost:8888/web/viewer.html
|
||||||
|
|
||||||
Please keep in mind that this assumes the latest version of Mozilla Firefox; refer to [Building PDF.js](https://github.com/mozilla/pdf.js/blob/master/README.md#building-pdfjs) for non-development usage of the PDF.js library.
|
Please keep in mind that this requires a modern and fully up-to-date browser; refer to [Building PDF.js](https://github.com/mozilla/pdf.js/blob/master/README.md#building-pdfjs) for non-development usage of the PDF.js library.
|
||||||
|
|
||||||
It is also possible to view all test PDF files on the right side by opening:
|
It is also possible to view all test PDF files on the right side by opening:
|
||||||
|
|
||||||
@ -144,3 +137,7 @@ Talk to us on Matrix:
|
|||||||
File an issue:
|
File an issue:
|
||||||
|
|
||||||
+ https://github.com/mozilla/pdf.js/issues/new
|
+ https://github.com/mozilla/pdf.js/issues/new
|
||||||
|
|
||||||
|
Follow us on Twitter: @pdfjs
|
||||||
|
|
||||||
|
+ https://twitter.com/pdfjs
|
||||||
|
@ -83,17 +83,17 @@ var scaledViewport = page.getViewport({ scale: scale, });
|
|||||||
The example demonstrates how promises can be used to handle errors during loading.
|
The example demonstrates how promises can be used to handle errors during loading.
|
||||||
It also demonstrates how to wait until a page is loaded and rendered.
|
It also demonstrates how to wait until a page is loaded and rendered.
|
||||||
|
|
||||||
<script async src="//jsfiddle.net/pdfjs/9engc9mw/embed/html,css,result/"></script>
|
<script async src="//jsfiddle.net/pdfjs/9engc9mw/embed/js,html,css,result/"></script>
|
||||||
|
|
||||||
### Hello World using base64 encoded PDF
|
### Hello World using base64 encoded PDF
|
||||||
|
|
||||||
The PDF.js can accept any decoded base64 data as an array.
|
The PDF.js can accept any decoded base64 data as an array.
|
||||||
|
|
||||||
<script async src="//jsfiddle.net/pdfjs/cq0asLqz/embed/html,css,result/"></script>
|
<script async src="//jsfiddle.net/pdfjs/cq0asLqz/embed/js,html,css,result/"></script>
|
||||||
|
|
||||||
### Previous/Next example
|
### Previous/Next example
|
||||||
|
|
||||||
The same canvas cannot be used to perform to draw two pages at the same time --
|
The same canvas cannot be used to perform to draw two pages at the same time --
|
||||||
the example demonstrates how to wait on previous operation to be complete.
|
the example demonstrates how to wait on previous operation to be complete.
|
||||||
|
|
||||||
<script async src="//jsfiddle.net/pdfjs/wagvs9Lf/embed/html,css,result/"></script>
|
<script async src="//jsfiddle.net/pdfjs/wagvs9Lf/embed/js,html,css,result/"></script>
|
||||||
|
@ -31,13 +31,13 @@ limitations under the License.
|
|||||||
|
|
||||||
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body tabindex="1">
|
<body tabindex="1">
|
||||||
<div id="pageContainer" class="pdfViewer singlePageView"></div>
|
<div id="pageContainer" class="pdfViewer singlePageView"></div>
|
||||||
|
|
||||||
<script src="pageviewer.mjs" type="module"></script>
|
<script src="pageviewer.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
89
examples/components/pageviewer.js
Normal file
89
examples/components/pageviewer.js
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/* Copyright 2014 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";
|
||||||
|
|
||||||
|
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFPageView) {
|
||||||
|
// eslint-disable-next-line no-alert
|
||||||
|
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
||||||
|
}
|
||||||
|
|
||||||
|
// The workerSrc property shall be specified.
|
||||||
|
//
|
||||||
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
|
"../../node_modules/pdfjs-dist/build/pdf.worker.js";
|
||||||
|
|
||||||
|
// Some PDFs need external cmaps.
|
||||||
|
//
|
||||||
|
const CMAP_URL = "../../node_modules/pdfjs-dist/cmaps/";
|
||||||
|
const CMAP_PACKED = true;
|
||||||
|
|
||||||
|
const DEFAULT_URL = "../../web/compressed.tracemonkey-pldi-09.pdf";
|
||||||
|
const PAGE_TO_VIEW = 1;
|
||||||
|
const SCALE = 1.0;
|
||||||
|
|
||||||
|
const ENABLE_XFA = true;
|
||||||
|
|
||||||
|
const container = document.getElementById("pageContainer");
|
||||||
|
|
||||||
|
const eventBus = new pdfjsViewer.EventBus();
|
||||||
|
|
||||||
|
// Loading document.
|
||||||
|
const loadingTask = pdfjsLib.getDocument({
|
||||||
|
url: DEFAULT_URL,
|
||||||
|
cMapUrl: CMAP_URL,
|
||||||
|
cMapPacked: CMAP_PACKED,
|
||||||
|
enableXfa: ENABLE_XFA,
|
||||||
|
});
|
||||||
|
(async function () {
|
||||||
|
const pdfDocument = await loadingTask.promise;
|
||||||
|
// Document loaded, retrieving the page.
|
||||||
|
const pdfPage = await pdfDocument.getPage(PAGE_TO_VIEW);
|
||||||
|
|
||||||
|
const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(pdfjsLib.version);
|
||||||
|
if (match && (match[1] | 0) >= 3 && (match[2] | 0) >= 2) {
|
||||||
|
// Creating the page view with default parameters.
|
||||||
|
const pdfPageView = new pdfjsViewer.PDFPageView({
|
||||||
|
container,
|
||||||
|
id: PAGE_TO_VIEW,
|
||||||
|
scale: SCALE,
|
||||||
|
defaultViewport: pdfPage.getViewport({ scale: SCALE }),
|
||||||
|
eventBus,
|
||||||
|
});
|
||||||
|
// Associate the actual page with the view, and draw it.
|
||||||
|
pdfPageView.setPdfPage(pdfPage);
|
||||||
|
return pdfPageView.draw();
|
||||||
|
}
|
||||||
|
// Creating the page view with default parameters.
|
||||||
|
const pdfPageView = new pdfjsViewer.PDFPageView({
|
||||||
|
container,
|
||||||
|
id: PAGE_TO_VIEW,
|
||||||
|
scale: SCALE,
|
||||||
|
defaultViewport: pdfPage.getViewport({ scale: SCALE }),
|
||||||
|
eventBus,
|
||||||
|
// We can enable text/annotation/xfa/struct-layers, as needed.
|
||||||
|
textLayerFactory: !pdfDocument.isPureXfa
|
||||||
|
? new pdfjsViewer.DefaultTextLayerFactory()
|
||||||
|
: null,
|
||||||
|
annotationLayerFactory: new pdfjsViewer.DefaultAnnotationLayerFactory(),
|
||||||
|
xfaLayerFactory: pdfDocument.isPureXfa
|
||||||
|
? new pdfjsViewer.DefaultXfaLayerFactory()
|
||||||
|
: null,
|
||||||
|
structTreeLayerFactory: new pdfjsViewer.DefaultStructTreeLayerFactory(),
|
||||||
|
});
|
||||||
|
// Associate the actual page with the view, and draw it.
|
||||||
|
pdfPageView.setPdfPage(pdfPage);
|
||||||
|
return pdfPageView.draw();
|
||||||
|
})();
|
@ -1,63 +0,0 @@
|
|||||||
/* Copyright 2014 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFPageView) {
|
|
||||||
// eslint-disable-next-line no-alert
|
|
||||||
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
|
||||||
}
|
|
||||||
|
|
||||||
// The workerSrc property shall be specified.
|
|
||||||
//
|
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.worker.mjs";
|
|
||||||
|
|
||||||
// Some PDFs need external cmaps.
|
|
||||||
//
|
|
||||||
const CMAP_URL = "../../node_modules/pdfjs-dist/cmaps/";
|
|
||||||
const CMAP_PACKED = true;
|
|
||||||
|
|
||||||
const DEFAULT_URL = "../../web/compressed.tracemonkey-pldi-09.pdf";
|
|
||||||
const PAGE_TO_VIEW = 1;
|
|
||||||
const SCALE = 1.0;
|
|
||||||
|
|
||||||
const ENABLE_XFA = true;
|
|
||||||
|
|
||||||
const container = document.getElementById("pageContainer");
|
|
||||||
|
|
||||||
const eventBus = new pdfjsViewer.EventBus();
|
|
||||||
|
|
||||||
// Loading document.
|
|
||||||
const loadingTask = pdfjsLib.getDocument({
|
|
||||||
url: DEFAULT_URL,
|
|
||||||
cMapUrl: CMAP_URL,
|
|
||||||
cMapPacked: CMAP_PACKED,
|
|
||||||
enableXfa: ENABLE_XFA,
|
|
||||||
});
|
|
||||||
|
|
||||||
const pdfDocument = await loadingTask.promise;
|
|
||||||
// Document loaded, retrieving the page.
|
|
||||||
const pdfPage = await pdfDocument.getPage(PAGE_TO_VIEW);
|
|
||||||
|
|
||||||
// Creating the page view with default parameters.
|
|
||||||
const pdfPageView = new pdfjsViewer.PDFPageView({
|
|
||||||
container,
|
|
||||||
id: PAGE_TO_VIEW,
|
|
||||||
scale: SCALE,
|
|
||||||
defaultViewport: pdfPage.getViewport({ scale: SCALE }),
|
|
||||||
eventBus,
|
|
||||||
});
|
|
||||||
// Associate the actual page with the view, and draw it.
|
|
||||||
pdfPageView.setPdfPage(pdfPage);
|
|
||||||
pdfPageView.draw();
|
|
@ -37,8 +37,8 @@ limitations under the License.
|
|||||||
|
|
||||||
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body tabindex="1">
|
<body tabindex="1">
|
||||||
@ -46,6 +46,6 @@ limitations under the License.
|
|||||||
<div id="viewer" class="pdfViewer"></div>
|
<div id="viewer" class="pdfViewer"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="simpleviewer.mjs" type="module"></script>
|
<script src="simpleviewer.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFViewer) {
|
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFViewer) {
|
||||||
// eslint-disable-next-line no-alert
|
// eslint-disable-next-line no-alert
|
||||||
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
||||||
@ -21,7 +23,7 @@ if (!pdfjsLib.getDocument || !pdfjsViewer.PDFViewer) {
|
|||||||
// The workerSrc property shall be specified.
|
// The workerSrc property shall be specified.
|
||||||
//
|
//
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.worker.mjs";
|
"../../node_modules/pdfjs-dist/build/pdf.worker.js";
|
||||||
|
|
||||||
// Some PDFs need external cmaps.
|
// Some PDFs need external cmaps.
|
||||||
//
|
//
|
||||||
@ -35,10 +37,7 @@ const DEFAULT_URL = "../../web/compressed.tracemonkey-pldi-09.pdf";
|
|||||||
const ENABLE_XFA = true;
|
const ENABLE_XFA = true;
|
||||||
const SEARCH_FOR = ""; // try "Mozilla";
|
const SEARCH_FOR = ""; // try "Mozilla";
|
||||||
|
|
||||||
const SANDBOX_BUNDLE_SRC = new URL(
|
const SANDBOX_BUNDLE_SRC = "../../node_modules/pdfjs-dist/build/pdf.sandbox.js";
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.sandbox.mjs",
|
|
||||||
window.location
|
|
||||||
);
|
|
||||||
|
|
||||||
const container = document.getElementById("viewerContainer");
|
const container = document.getElementById("viewerContainer");
|
||||||
|
|
||||||
@ -88,10 +87,11 @@ const loadingTask = pdfjsLib.getDocument({
|
|||||||
cMapPacked: CMAP_PACKED,
|
cMapPacked: CMAP_PACKED,
|
||||||
enableXfa: ENABLE_XFA,
|
enableXfa: ENABLE_XFA,
|
||||||
});
|
});
|
||||||
|
(async function () {
|
||||||
|
const pdfDocument = await loadingTask.promise;
|
||||||
|
// Document loaded, specifying document for the viewer and
|
||||||
|
// the (optional) linkService.
|
||||||
|
pdfViewer.setDocument(pdfDocument);
|
||||||
|
|
||||||
const pdfDocument = await loadingTask.promise;
|
pdfLinkService.setDocument(pdfDocument, null);
|
||||||
// Document loaded, specifying document for the viewer and
|
})();
|
||||||
// the (optional) linkService.
|
|
||||||
pdfViewer.setDocument(pdfDocument);
|
|
||||||
|
|
||||||
pdfLinkService.setDocument(pdfDocument, null);
|
|
@ -37,8 +37,8 @@ limitations under the License.
|
|||||||
|
|
||||||
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body tabindex="1">
|
<body tabindex="1">
|
||||||
@ -46,6 +46,6 @@ limitations under the License.
|
|||||||
<div id="viewer" class="pdfViewer"></div>
|
<div id="viewer" class="pdfViewer"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="singlepageviewer.mjs" type="module"></script>
|
<script src="singlepageviewer.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFSinglePageViewer) {
|
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFSinglePageViewer) {
|
||||||
// eslint-disable-next-line no-alert
|
// eslint-disable-next-line no-alert
|
||||||
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
||||||
@ -21,7 +23,7 @@ if (!pdfjsLib.getDocument || !pdfjsViewer.PDFSinglePageViewer) {
|
|||||||
// The workerSrc property shall be specified.
|
// The workerSrc property shall be specified.
|
||||||
//
|
//
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.worker.mjs";
|
"../../node_modules/pdfjs-dist/build/pdf.worker.js";
|
||||||
|
|
||||||
// Some PDFs need external cmaps.
|
// Some PDFs need external cmaps.
|
||||||
//
|
//
|
||||||
@ -35,10 +37,7 @@ const DEFAULT_URL = "../../web/compressed.tracemonkey-pldi-09.pdf";
|
|||||||
const ENABLE_XFA = true;
|
const ENABLE_XFA = true;
|
||||||
const SEARCH_FOR = ""; // try "Mozilla";
|
const SEARCH_FOR = ""; // try "Mozilla";
|
||||||
|
|
||||||
const SANDBOX_BUNDLE_SRC = new URL(
|
const SANDBOX_BUNDLE_SRC = "../../node_modules/pdfjs-dist/build/pdf.sandbox.js";
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.sandbox.mjs",
|
|
||||||
window.location
|
|
||||||
);
|
|
||||||
|
|
||||||
const container = document.getElementById("viewerContainer");
|
const container = document.getElementById("viewerContainer");
|
||||||
|
|
||||||
@ -88,10 +87,10 @@ const loadingTask = pdfjsLib.getDocument({
|
|||||||
cMapPacked: CMAP_PACKED,
|
cMapPacked: CMAP_PACKED,
|
||||||
enableXfa: ENABLE_XFA,
|
enableXfa: ENABLE_XFA,
|
||||||
});
|
});
|
||||||
|
loadingTask.promise.then(function (pdfDocument) {
|
||||||
|
// Document loaded, specifying document for the viewer and
|
||||||
|
// the (optional) linkService.
|
||||||
|
pdfSinglePageViewer.setDocument(pdfDocument);
|
||||||
|
|
||||||
const pdfDocument = await loadingTask.promise;
|
pdfLinkService.setDocument(pdfDocument, null);
|
||||||
// Document loaded, specifying document for the viewer and
|
});
|
||||||
// the (optional) linkService.
|
|
||||||
pdfSinglePageViewer.setDocument(pdfDocument);
|
|
||||||
|
|
||||||
pdfLinkService.setDocument(pdfDocument, null);
|
|
@ -29,12 +29,12 @@ limitations under the License.
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/image_decoders/pdf.image_decoders.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/image_decoders/pdf.image_decoders.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body tabindex="1">
|
<body tabindex="1">
|
||||||
<canvas id="jpegCanvas" width="0" height="0"></canvas>
|
<canvas id="jpegCanvas" width="0" height="0"></canvas>
|
||||||
|
|
||||||
<script src="jpeg_viewer.mjs" type="module"></script>
|
<script src="jpeg_viewer.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
63
examples/image_decoders/jpeg_viewer.js
Normal file
63
examples/image_decoders/jpeg_viewer.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* Copyright 2018 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";
|
||||||
|
|
||||||
|
if (!pdfjsImageDecoders.JpegImage) {
|
||||||
|
// eslint-disable-next-line no-alert
|
||||||
|
alert("Please build the pdfjs-dist library using `gulp dist-install`");
|
||||||
|
}
|
||||||
|
|
||||||
|
const JPEG_IMAGE = "fish.jpg";
|
||||||
|
|
||||||
|
const jpegCanvas = document.getElementById("jpegCanvas");
|
||||||
|
const jpegCtx = jpegCanvas.getContext("2d");
|
||||||
|
|
||||||
|
(async function () {
|
||||||
|
// Load the image data, and convert it to a Uint8Array.
|
||||||
|
//
|
||||||
|
const response = await fetch(JPEG_IMAGE);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(response.statusText);
|
||||||
|
}
|
||||||
|
const typedArrayImage = new Uint8Array(await response.arrayBuffer());
|
||||||
|
|
||||||
|
// Parse the image data using `JpegImage`.
|
||||||
|
//
|
||||||
|
const jpegImage = new pdfjsImageDecoders.JpegImage();
|
||||||
|
jpegImage.parse(typedArrayImage);
|
||||||
|
|
||||||
|
const width = jpegImage.width,
|
||||||
|
height = jpegImage.height;
|
||||||
|
const jpegData = jpegImage.getData({
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
forceRGB: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Render the JPEG image on a <canvas>.
|
||||||
|
//
|
||||||
|
const imageData = jpegCtx.createImageData(width, height);
|
||||||
|
const imageBytes = imageData.data;
|
||||||
|
for (let j = 0, k = 0, jj = width * height * 4; j < jj; ) {
|
||||||
|
imageBytes[j++] = jpegData[k++];
|
||||||
|
imageBytes[j++] = jpegData[k++];
|
||||||
|
imageBytes[j++] = jpegData[k++];
|
||||||
|
imageBytes[j++] = 255;
|
||||||
|
}
|
||||||
|
jpegCanvas.width = width;
|
||||||
|
jpegCanvas.height = height;
|
||||||
|
jpegCtx.putImageData(imageData, 0, 0);
|
||||||
|
})();
|
@ -1,59 +0,0 @@
|
|||||||
/* Copyright 2018 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!pdfjsImageDecoders.JpegImage) {
|
|
||||||
// eslint-disable-next-line no-alert
|
|
||||||
alert("Please build the pdfjs-dist library using `gulp dist-install`");
|
|
||||||
}
|
|
||||||
|
|
||||||
const JPEG_IMAGE = "fish.jpg";
|
|
||||||
|
|
||||||
const jpegCanvas = document.getElementById("jpegCanvas");
|
|
||||||
const jpegCtx = jpegCanvas.getContext("2d");
|
|
||||||
|
|
||||||
// Load the image data, and convert it to a Uint8Array.
|
|
||||||
//
|
|
||||||
const response = await fetch(JPEG_IMAGE);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(response.statusText);
|
|
||||||
}
|
|
||||||
const typedArrayImage = new Uint8Array(await response.arrayBuffer());
|
|
||||||
|
|
||||||
// Parse the image data using `JpegImage`.
|
|
||||||
//
|
|
||||||
const jpegImage = new pdfjsImageDecoders.JpegImage();
|
|
||||||
jpegImage.parse(typedArrayImage);
|
|
||||||
|
|
||||||
const width = jpegImage.width,
|
|
||||||
height = jpegImage.height;
|
|
||||||
const jpegData = jpegImage.getData({
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
forceRGB: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Render the JPEG image on a <canvas>.
|
|
||||||
//
|
|
||||||
const imageData = jpegCtx.createImageData(width, height);
|
|
||||||
const imageBytes = imageData.data;
|
|
||||||
for (let j = 0, k = 0, jj = width * height * 4; j < jj; ) {
|
|
||||||
imageBytes[j++] = jpegData[k++];
|
|
||||||
imageBytes[j++] = jpegData[k++];
|
|
||||||
imageBytes[j++] = jpegData[k++];
|
|
||||||
imageBytes[j++] = 255;
|
|
||||||
}
|
|
||||||
jpegCanvas.width = width;
|
|
||||||
jpegCanvas.height = height;
|
|
||||||
jpegCtx.putImageData(imageData, 0, 0);
|
|
@ -10,9 +10,9 @@
|
|||||||
|
|
||||||
<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>
|
<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
|
|
||||||
<script id="script" type="module">
|
<script id="script">
|
||||||
//
|
//
|
||||||
// If absolute URL from the remote server is provided, configure the CORS
|
// If absolute URL from the remote server is provided, configure the CORS
|
||||||
// header on that server.
|
// header on that server.
|
||||||
@ -23,46 +23,48 @@
|
|||||||
// The workerSrc property shall be specified.
|
// The workerSrc property shall be specified.
|
||||||
//
|
//
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
'../../node_modules/pdfjs-dist/build/pdf.worker.mjs';
|
'../../node_modules/pdfjs-dist/build/pdf.worker.js';
|
||||||
|
|
||||||
//
|
//
|
||||||
// Asynchronous download PDF
|
// Asynchronous download PDF
|
||||||
//
|
//
|
||||||
const loadingTask = pdfjsLib.getDocument(url);
|
const loadingTask = pdfjsLib.getDocument(url);
|
||||||
const pdf = await loadingTask.promise;
|
(async () => {
|
||||||
//
|
const pdf = await loadingTask.promise;
|
||||||
// Fetch the first page
|
//
|
||||||
//
|
// Fetch the first page
|
||||||
const page = await pdf.getPage(1);
|
//
|
||||||
const scale = 1.5;
|
const page = await pdf.getPage(1);
|
||||||
const viewport = page.getViewport({ scale });
|
const scale = 1.5;
|
||||||
// Support HiDPI-screens.
|
const viewport = page.getViewport({ scale });
|
||||||
const outputScale = window.devicePixelRatio || 1;
|
// Support HiDPI-screens.
|
||||||
|
const outputScale = window.devicePixelRatio || 1;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Prepare canvas using PDF page dimensions
|
// Prepare canvas using PDF page dimensions
|
||||||
//
|
//
|
||||||
const canvas = document.getElementById("the-canvas");
|
const canvas = document.getElementById("the-canvas");
|
||||||
const context = canvas.getContext("2d");
|
const context = canvas.getContext("2d");
|
||||||
|
|
||||||
canvas.width = Math.floor(viewport.width * outputScale);
|
canvas.width = Math.floor(viewport.width * outputScale);
|
||||||
canvas.height = Math.floor(viewport.height * outputScale);
|
canvas.height = Math.floor(viewport.height * outputScale);
|
||||||
canvas.style.width = Math.floor(viewport.width) + "px";
|
canvas.style.width = Math.floor(viewport.width) + "px";
|
||||||
canvas.style.height = Math.floor(viewport.height) + "px";
|
canvas.style.height = Math.floor(viewport.height) + "px";
|
||||||
|
|
||||||
const transform = outputScale !== 1
|
const transform = outputScale !== 1
|
||||||
? [outputScale, 0, 0, outputScale, 0, 0]
|
? [outputScale, 0, 0, outputScale, 0, 0]
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render PDF page into canvas context
|
// Render PDF page into canvas context
|
||||||
//
|
//
|
||||||
const renderContext = {
|
const renderContext = {
|
||||||
canvasContext: context,
|
canvasContext: context,
|
||||||
transform,
|
transform,
|
||||||
viewport,
|
viewport,
|
||||||
};
|
};
|
||||||
page.render(renderContext);
|
page.render(renderContext);
|
||||||
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
@ -10,9 +10,9 @@
|
|||||||
|
|
||||||
<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>
|
<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
|
|
||||||
<script id="script" type="module">
|
<script id="script">
|
||||||
// atob() is used to convert base64 encoded PDF to binary-like data.
|
// atob() is used to convert base64 encoded PDF to binary-like data.
|
||||||
// (See also https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/
|
// (See also https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/
|
||||||
// Base64_encoding_and_decoding.)
|
// Base64_encoding_and_decoding.)
|
||||||
@ -35,39 +35,41 @@
|
|||||||
// The workerSrc property shall be specified.
|
// The workerSrc property shall be specified.
|
||||||
//
|
//
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
'../../node_modules/pdfjs-dist/build/pdf.worker.mjs';
|
'../../node_modules/pdfjs-dist/build/pdf.worker.js';
|
||||||
|
|
||||||
// Opening PDF by passing its binary data as a string. It is still preferable
|
// Opening PDF by passing its binary data as a string. It is still preferable
|
||||||
// to use Uint8Array, but string or array-like structure will work too.
|
// to use Uint8Array, but string or array-like structure will work too.
|
||||||
var loadingTask = pdfjsLib.getDocument({ data: pdfData, });
|
var loadingTask = pdfjsLib.getDocument({ data: pdfData, });
|
||||||
var pdf = await loadingTask.promise;
|
(async function() {
|
||||||
// Fetch the first page.
|
var pdf = await loadingTask.promise;
|
||||||
var page = await pdf.getPage(1);
|
// Fetch the first page.
|
||||||
var scale = 1.5;
|
var page = await pdf.getPage(1);
|
||||||
var viewport = page.getViewport({ scale: scale, });
|
var scale = 1.5;
|
||||||
// Support HiDPI-screens.
|
var viewport = page.getViewport({ scale: scale, });
|
||||||
var outputScale = window.devicePixelRatio || 1;
|
// Support HiDPI-screens.
|
||||||
|
var outputScale = window.devicePixelRatio || 1;
|
||||||
|
|
||||||
// Prepare canvas using PDF page dimensions.
|
// Prepare canvas using PDF page dimensions.
|
||||||
var canvas = document.getElementById('the-canvas');
|
var canvas = document.getElementById('the-canvas');
|
||||||
var context = canvas.getContext('2d');
|
var context = canvas.getContext('2d');
|
||||||
|
|
||||||
canvas.width = Math.floor(viewport.width * outputScale);
|
canvas.width = Math.floor(viewport.width * outputScale);
|
||||||
canvas.height = Math.floor(viewport.height * outputScale);
|
canvas.height = Math.floor(viewport.height * outputScale);
|
||||||
canvas.style.width = Math.floor(viewport.width) + "px";
|
canvas.style.width = Math.floor(viewport.width) + "px";
|
||||||
canvas.style.height = Math.floor(viewport.height) + "px";
|
canvas.style.height = Math.floor(viewport.height) + "px";
|
||||||
|
|
||||||
var transform = outputScale !== 1
|
var transform = outputScale !== 1
|
||||||
? [outputScale, 0, 0, outputScale, 0, 0]
|
? [outputScale, 0, 0, outputScale, 0, 0]
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
// Render PDF page into canvas context.
|
// Render PDF page into canvas context.
|
||||||
var renderContext = {
|
var renderContext = {
|
||||||
canvasContext: context,
|
canvasContext: context,
|
||||||
transform,
|
transform,
|
||||||
viewport,
|
viewport,
|
||||||
};
|
};
|
||||||
page.render(renderContext);
|
page.render(renderContext);
|
||||||
|
})();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>
|
<canvas id="the-canvas" style="border: 1px solid black; direction: ltr;"></canvas>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
|
|
||||||
<script id="script" type="module">
|
<script id="script">
|
||||||
//
|
//
|
||||||
// If absolute URL from the remote server is provided, configure the CORS
|
// If absolute URL from the remote server is provided, configure the CORS
|
||||||
// header on that server.
|
// header on that server.
|
||||||
@ -34,7 +34,7 @@
|
|||||||
// shall be specified.
|
// shall be specified.
|
||||||
//
|
//
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
'../../node_modules/pdfjs-dist/build/pdf.worker.mjs';
|
'../../node_modules/pdfjs-dist/build/pdf.worker.js';
|
||||||
|
|
||||||
var pdfDoc = null,
|
var pdfDoc = null,
|
||||||
pageNum = 1,
|
pageNum = 1,
|
||||||
@ -128,11 +128,13 @@
|
|||||||
* Asynchronously downloads PDF.
|
* Asynchronously downloads PDF.
|
||||||
*/
|
*/
|
||||||
var loadingTask = pdfjsLib.getDocument(url);
|
var loadingTask = pdfjsLib.getDocument(url);
|
||||||
pdfDoc = await loadingTask.promise;
|
loadingTask.promise.then(function(pdfDoc_) {
|
||||||
document.getElementById('page_count').textContent = pdfDoc.numPages;
|
pdfDoc = pdfDoc_;
|
||||||
|
document.getElementById('page_count').textContent = pdfDoc.numPages;
|
||||||
|
|
||||||
// Initial/first page rendering
|
// Initial/first page rendering
|
||||||
renderPage(pageNum);
|
renderPage(pageNum);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
@ -26,12 +26,12 @@ html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
header {
|
header {
|
||||||
background-color: rgb(244 244 244 / 1);
|
background-color: rgba(244, 244, 244, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
header h1 {
|
header h1 {
|
||||||
border-bottom: 1px solid rgb(216 216 216 / 1);
|
border-bottom: 1px solid rgba(216, 216, 216, 1);
|
||||||
color: rgb(133 133 133 / 1);
|
color: rgba(133, 133, 133, 1);
|
||||||
font-size: 23px;
|
font-size: 23px;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -44,7 +44,7 @@ header h1 {
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
background: url(images/document_bg.png);
|
background: url(images/document_bg.png);
|
||||||
color: rgb(255 255 255 / 1);
|
color: rgba(255, 255, 255, 1);
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@ -71,7 +71,7 @@ footer {
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
box-shadow: 0 -0.2rem 0.5rem rgb(50 50 50 / 0.75);
|
box-shadow: 0 -0.2rem 0.5rem rgba(50, 50, 50, 0.75);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toolbarButton {
|
.toolbarButton {
|
||||||
@ -81,7 +81,7 @@ footer {
|
|||||||
border-width: 0;
|
border-width: 0;
|
||||||
background-position: center center;
|
background-position: center center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-color: rgb(0 0 0 / 0);
|
background-color: rgba(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.toolbarButton.pageUp {
|
.toolbarButton.pageUp {
|
||||||
@ -110,9 +110,9 @@ footer {
|
|||||||
left: 36%;
|
left: 36%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border: 0;
|
border: 0;
|
||||||
background-color: rgb(0 0 0 / 0);
|
background-color: rgba(0, 0, 0, 0);
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
color: rgb(255 255 255 / 1);
|
color: rgba(255, 255, 255, 1);
|
||||||
background-image: url(images/div_line_left.png),
|
background-image: url(images/div_line_left.png),
|
||||||
url(images/div_line_right.png);
|
url(images/div_line_right.png);
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
@ -190,8 +190,8 @@ canvas {
|
|||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 0.6rem;
|
height: 0.6rem;
|
||||||
background-color: rgb(51 51 51 / 1);
|
background-color: rgba(51, 51, 51, 1);
|
||||||
border-bottom: 1px solid rgb(51 51 51 / 1);
|
border-bottom: 1px solid rgba(51, 51, 51, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#loadingBar .progress {
|
#loadingBar .progress {
|
||||||
@ -201,7 +201,7 @@ canvas {
|
|||||||
transform: scaleX(var(--progressBar-percent));
|
transform: scaleX(var(--progressBar-percent));
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: rgb(221 221 221 / 1);
|
background-color: rgba(221, 221, 221, 1);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
transition: transform 200ms;
|
transition: transform 200ms;
|
||||||
}
|
}
|
||||||
@ -220,7 +220,7 @@ canvas {
|
|||||||
|
|
||||||
#loadingBar.indeterminate .progress {
|
#loadingBar.indeterminate .progress {
|
||||||
transform: none;
|
transform: none;
|
||||||
background-color: rgb(153 153 153 / 1);
|
background-color: rgba(153, 153, 153, 1);
|
||||||
transition: none;
|
transition: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,11 +232,39 @@ canvas {
|
|||||||
width: 5rem;
|
width: 5rem;
|
||||||
background-image: linear-gradient(
|
background-image: linear-gradient(
|
||||||
to right,
|
to right,
|
||||||
rgb(153 153 153 / 1) 0%,
|
rgba(153, 153, 153, 1) 0%,
|
||||||
rgb(255 255 255 / 1) 50%,
|
rgba(255, 255, 255, 1) 50%,
|
||||||
rgb(153 153 153 / 1) 100%
|
rgba(153, 153, 153, 1) 100%
|
||||||
);
|
);
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
animation: progressIndeterminate 2s linear infinite;
|
animation: progressIndeterminate 2s linear infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#errorWrapper {
|
||||||
|
background: none repeat scroll 0 0 rgba(255, 85, 85, 1);
|
||||||
|
color: rgba(255, 255, 255, 1);
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 3.2rem;
|
||||||
|
z-index: 1000;
|
||||||
|
padding: 0.3rem;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#errorMessageLeft {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#errorMessageRight {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#errorMoreInfo {
|
||||||
|
background-color: rgba(255, 255, 255, 1);
|
||||||
|
color: rgba(0, 0, 0, 1);
|
||||||
|
padding: 0.3rem;
|
||||||
|
margin: 0.3rem;
|
||||||
|
width: 98%;
|
||||||
|
}
|
||||||
|
@ -24,8 +24,8 @@ limitations under the License.
|
|||||||
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
<link rel="stylesheet" href="../../node_modules/pdfjs-dist/web/pdf_viewer.css">
|
||||||
<link rel="stylesheet" type="text/css" href="viewer.css">
|
<link rel="stylesheet" type="text/css" href="viewer.css">
|
||||||
|
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/web/pdf_viewer.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@ -42,6 +42,25 @@ limitations under the License.
|
|||||||
<div class="glimmer"></div>
|
<div class="glimmer"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="errorWrapper" hidden="true">
|
||||||
|
<div id="errorMessageLeft">
|
||||||
|
<span id="errorMessage"></span>
|
||||||
|
<button id="errorShowMore">
|
||||||
|
More Information
|
||||||
|
</button>
|
||||||
|
<button id="errorShowLess">
|
||||||
|
Less Information
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div id="errorMessageRight">
|
||||||
|
<button id="errorClose">
|
||||||
|
Close
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="clearBoth"></div>
|
||||||
|
<textarea id="errorMoreInfo" hidden="true" readonly="readonly"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<button class="toolbarButton pageUp" title="Previous Page" id="previous"></button>
|
<button class="toolbarButton pageUp" title="Previous Page" id="previous"></button>
|
||||||
<button class="toolbarButton pageDown" title="Next Page" id="next"></button>
|
<button class="toolbarButton pageDown" title="Next Page" id="next"></button>
|
||||||
@ -52,6 +71,6 @@ limitations under the License.
|
|||||||
<button class="toolbarButton zoomIn" title="Zoom In" id="zoomIn"></button>
|
<button class="toolbarButton zoomIn" title="Zoom In" id="zoomIn"></button>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script src="viewer.mjs" type="module"></script>
|
<script src="viewer.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -13,19 +13,21 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFViewer) {
|
if (!pdfjsLib.getDocument || !pdfjsViewer.PDFViewer) {
|
||||||
// eslint-disable-next-line no-alert
|
// eslint-disable-next-line no-alert
|
||||||
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
alert("Please build the pdfjs-dist library using\n `gulp dist-install`");
|
||||||
}
|
}
|
||||||
|
|
||||||
const MAX_CANVAS_PIXELS = 0; // CSS-only zooming.
|
const USE_ONLY_CSS_ZOOM = true;
|
||||||
const TEXT_LAYER_MODE = 0; // DISABLE
|
const TEXT_LAYER_MODE = 0; // DISABLE
|
||||||
const MAX_IMAGE_SIZE = 1024 * 1024;
|
const MAX_IMAGE_SIZE = 1024 * 1024;
|
||||||
const CMAP_URL = "../../node_modules/pdfjs-dist/cmaps/";
|
const CMAP_URL = "../../node_modules/pdfjs-dist/cmaps/";
|
||||||
const CMAP_PACKED = true;
|
const CMAP_PACKED = true;
|
||||||
|
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.worker.mjs";
|
"../../node_modules/pdfjs-dist/build/pdf.worker.js";
|
||||||
|
|
||||||
const DEFAULT_URL = "../../web/compressed.tracemonkey-pldi-09.pdf";
|
const DEFAULT_URL = "../../web/compressed.tracemonkey-pldi-09.pdf";
|
||||||
const DEFAULT_SCALE_DELTA = 1.1;
|
const DEFAULT_SCALE_DELTA = 1.1;
|
||||||
@ -87,17 +89,41 @@ const PDFViewerApplication = {
|
|||||||
self.loadingBar.hide();
|
self.loadingBar.hide();
|
||||||
self.setTitleUsingMetadata(pdfDocument);
|
self.setTitleUsingMetadata(pdfDocument);
|
||||||
},
|
},
|
||||||
function (reason) {
|
function (exception) {
|
||||||
let key = "pdfjs-loading-error";
|
const message = exception && exception.message;
|
||||||
if (reason instanceof pdfjsLib.InvalidPDFException) {
|
const l10n = self.l10n;
|
||||||
key = "pdfjs-invalid-file-error";
|
let loadingErrorMessage;
|
||||||
} else if (reason instanceof pdfjsLib.MissingPDFException) {
|
|
||||||
key = "pdfjs-missing-file-error";
|
if (exception instanceof pdfjsLib.InvalidPDFException) {
|
||||||
} else if (reason instanceof pdfjsLib.UnexpectedResponseException) {
|
// change error message also for other builds
|
||||||
key = "pdfjs-unexpected-response-error";
|
loadingErrorMessage = l10n.get(
|
||||||
|
"invalid_file_error",
|
||||||
|
null,
|
||||||
|
"Invalid or corrupted PDF file."
|
||||||
|
);
|
||||||
|
} else if (exception instanceof pdfjsLib.MissingPDFException) {
|
||||||
|
// special message for missing PDFs
|
||||||
|
loadingErrorMessage = l10n.get(
|
||||||
|
"missing_file_error",
|
||||||
|
null,
|
||||||
|
"Missing PDF file."
|
||||||
|
);
|
||||||
|
} else if (exception instanceof pdfjsLib.UnexpectedResponseException) {
|
||||||
|
loadingErrorMessage = l10n.get(
|
||||||
|
"unexpected_response_error",
|
||||||
|
null,
|
||||||
|
"Unexpected server response."
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
loadingErrorMessage = l10n.get(
|
||||||
|
"loading_error",
|
||||||
|
null,
|
||||||
|
"An error occurred while loading the PDF."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
self.l10n.get(key).then(msg => {
|
|
||||||
self.error(msg, { message: reason?.message });
|
loadingErrorMessage.then(function (msg) {
|
||||||
|
self.error(msg, { message });
|
||||||
});
|
});
|
||||||
self.loadingBar.hide();
|
self.loadingBar.hide();
|
||||||
}
|
}
|
||||||
@ -110,6 +136,9 @@ const PDFViewerApplication = {
|
|||||||
* destruction is completed.
|
* destruction is completed.
|
||||||
*/
|
*/
|
||||||
close() {
|
close() {
|
||||||
|
const errorWrapper = document.getElementById("errorWrapper");
|
||||||
|
errorWrapper.hidden = true;
|
||||||
|
|
||||||
if (!this.pdfLoadingTask) {
|
if (!this.pdfLoadingTask) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
@ -145,7 +174,7 @@ const PDFViewerApplication = {
|
|||||||
let title = pdfjsLib.getFilenameFromUrl(url) || url;
|
let title = pdfjsLib.getFilenameFromUrl(url) || url;
|
||||||
try {
|
try {
|
||||||
title = decodeURIComponent(title);
|
title = decodeURIComponent(title);
|
||||||
} catch {
|
} catch (e) {
|
||||||
// decodeURIComponent may throw URIError,
|
// decodeURIComponent may throw URIError,
|
||||||
// fall back to using the unprocessed url in that case
|
// fall back to using the unprocessed url in that case
|
||||||
}
|
}
|
||||||
@ -202,25 +231,79 @@ const PDFViewerApplication = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
error: function pdfViewError(message, moreInfo) {
|
error: function pdfViewError(message, moreInfo) {
|
||||||
|
const l10n = this.l10n;
|
||||||
const moreInfoText = [
|
const moreInfoText = [
|
||||||
`PDF.js v${pdfjsLib.version || "?"} (build: ${pdfjsLib.build || "?"})`,
|
l10n.get(
|
||||||
|
"error_version_info",
|
||||||
|
{ version: pdfjsLib.version || "?", build: pdfjsLib.build || "?" },
|
||||||
|
"PDF.js v{{version}} (build: {{build}})"
|
||||||
|
),
|
||||||
];
|
];
|
||||||
if (moreInfo) {
|
|
||||||
moreInfoText.push(`Message: ${moreInfo.message}`);
|
|
||||||
|
|
||||||
|
if (moreInfo) {
|
||||||
|
moreInfoText.push(
|
||||||
|
l10n.get(
|
||||||
|
"error_message",
|
||||||
|
{ message: moreInfo.message },
|
||||||
|
"Message: {{message}}"
|
||||||
|
)
|
||||||
|
);
|
||||||
if (moreInfo.stack) {
|
if (moreInfo.stack) {
|
||||||
moreInfoText.push(`Stack: ${moreInfo.stack}`);
|
moreInfoText.push(
|
||||||
|
l10n.get("error_stack", { stack: moreInfo.stack }, "Stack: {{stack}}")
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
if (moreInfo.filename) {
|
if (moreInfo.filename) {
|
||||||
moreInfoText.push(`File: ${moreInfo.filename}`);
|
moreInfoText.push(
|
||||||
|
l10n.get(
|
||||||
|
"error_file",
|
||||||
|
{ file: moreInfo.filename },
|
||||||
|
"File: {{file}}"
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (moreInfo.lineNumber) {
|
if (moreInfo.lineNumber) {
|
||||||
moreInfoText.push(`Line: ${moreInfo.lineNumber}`);
|
moreInfoText.push(
|
||||||
|
l10n.get(
|
||||||
|
"error_line",
|
||||||
|
{ line: moreInfo.lineNumber },
|
||||||
|
"Line: {{line}}"
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.error(`${message}\n\n${moreInfoText.join("\n")}`);
|
const errorWrapper = document.getElementById("errorWrapper");
|
||||||
|
errorWrapper.hidden = false;
|
||||||
|
|
||||||
|
const errorMessage = document.getElementById("errorMessage");
|
||||||
|
errorMessage.textContent = message;
|
||||||
|
|
||||||
|
const closeButton = document.getElementById("errorClose");
|
||||||
|
closeButton.onclick = function () {
|
||||||
|
errorWrapper.hidden = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const errorMoreInfo = document.getElementById("errorMoreInfo");
|
||||||
|
const moreInfoButton = document.getElementById("errorShowMore");
|
||||||
|
const lessInfoButton = document.getElementById("errorShowLess");
|
||||||
|
moreInfoButton.onclick = function () {
|
||||||
|
errorMoreInfo.hidden = false;
|
||||||
|
moreInfoButton.hidden = true;
|
||||||
|
lessInfoButton.hidden = false;
|
||||||
|
errorMoreInfo.style.height = errorMoreInfo.scrollHeight + "px";
|
||||||
|
};
|
||||||
|
lessInfoButton.onclick = function () {
|
||||||
|
errorMoreInfo.hidden = true;
|
||||||
|
moreInfoButton.hidden = false;
|
||||||
|
lessInfoButton.hidden = true;
|
||||||
|
};
|
||||||
|
moreInfoButton.hidden = false;
|
||||||
|
lessInfoButton.hidden = true;
|
||||||
|
Promise.all(moreInfoText).then(function (parts) {
|
||||||
|
errorMoreInfo.value = parts.join("\n");
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
progress: function pdfViewProgress(level) {
|
progress: function pdfViewProgress(level) {
|
||||||
@ -272,7 +355,7 @@ const PDFViewerApplication = {
|
|||||||
});
|
});
|
||||||
this.pdfLinkService = linkService;
|
this.pdfLinkService = linkService;
|
||||||
|
|
||||||
this.l10n = new pdfjsViewer.GenericL10n();
|
this.l10n = pdfjsViewer.NullL10n;
|
||||||
|
|
||||||
const container = document.getElementById("viewerContainer");
|
const container = document.getElementById("viewerContainer");
|
||||||
const pdfViewer = new pdfjsViewer.PDFViewer({
|
const pdfViewer = new pdfjsViewer.PDFViewer({
|
||||||
@ -280,7 +363,7 @@ const PDFViewerApplication = {
|
|||||||
eventBus,
|
eventBus,
|
||||||
linkService,
|
linkService,
|
||||||
l10n: this.l10n,
|
l10n: this.l10n,
|
||||||
maxCanvasPixels: MAX_CANVAS_PIXELS,
|
useOnlyCssZoom: USE_ONLY_CSS_ZOOM,
|
||||||
textLayerMode: TEXT_LAYER_MODE,
|
textLayerMode: TEXT_LAYER_MODE,
|
||||||
});
|
});
|
||||||
this.pdfViewer = pdfViewer;
|
this.pdfViewer = pdfViewer;
|
285
examples/node/domstubs.js
Normal file
285
examples/node/domstubs.js
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
function xmlEncode(s) {
|
||||||
|
let i = 0,
|
||||||
|
ch;
|
||||||
|
s = String(s);
|
||||||
|
while (
|
||||||
|
i < s.length &&
|
||||||
|
(ch = s[i]) !== "&" &&
|
||||||
|
ch !== "<" &&
|
||||||
|
ch !== '"' &&
|
||||||
|
ch !== "\n" &&
|
||||||
|
ch !== "\r" &&
|
||||||
|
ch !== "\t"
|
||||||
|
) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i >= s.length) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
let buf = s.substring(0, i);
|
||||||
|
while (i < s.length) {
|
||||||
|
ch = s[i++];
|
||||||
|
switch (ch) {
|
||||||
|
case "&":
|
||||||
|
buf += "&";
|
||||||
|
break;
|
||||||
|
case "<":
|
||||||
|
buf += "<";
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
buf += """;
|
||||||
|
break;
|
||||||
|
case "\n":
|
||||||
|
buf += "
";
|
||||||
|
break;
|
||||||
|
case "\r":
|
||||||
|
buf += "
";
|
||||||
|
break;
|
||||||
|
case "\t":
|
||||||
|
buf += "	";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
buf += ch;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DOMElement(name) {
|
||||||
|
this.nodeName = name;
|
||||||
|
this.childNodes = [];
|
||||||
|
this.attributes = {};
|
||||||
|
this.textContent = "";
|
||||||
|
|
||||||
|
if (name === "style") {
|
||||||
|
this.sheet = {
|
||||||
|
cssRules: [],
|
||||||
|
insertRule(rule) {
|
||||||
|
this.cssRules.push(rule);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DOMElement.prototype = {
|
||||||
|
getAttribute: function DOMElement_getAttribute(name) {
|
||||||
|
if (name in this.attributes) {
|
||||||
|
return this.attributes[name];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
getAttributeNS: function DOMElement_getAttributeNS(NS, name) {
|
||||||
|
// Fast path
|
||||||
|
if (name in this.attributes) {
|
||||||
|
return this.attributes[name];
|
||||||
|
}
|
||||||
|
// Slow path - used by test/unit/display_svg_spec.js
|
||||||
|
// Assuming that there is only one matching attribute for a given name,
|
||||||
|
// across all namespaces.
|
||||||
|
if (NS) {
|
||||||
|
const suffix = ":" + name;
|
||||||
|
for (const fullName in this.attributes) {
|
||||||
|
if (fullName.slice(-suffix.length) === suffix) {
|
||||||
|
return this.attributes[fullName];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
setAttribute: function DOMElement_setAttribute(name, value) {
|
||||||
|
this.attributes[name] = value || "";
|
||||||
|
},
|
||||||
|
|
||||||
|
setAttributeNS: function DOMElement_setAttributeNS(NS, name, value) {
|
||||||
|
this.setAttribute(name, value);
|
||||||
|
},
|
||||||
|
|
||||||
|
append: function DOMElement_append(...elements) {
|
||||||
|
const childNodes = this.childNodes;
|
||||||
|
for (const element of elements) {
|
||||||
|
if (!childNodes.includes(element)) {
|
||||||
|
childNodes.push(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
appendChild: function DOMElement_appendChild(element) {
|
||||||
|
const childNodes = this.childNodes;
|
||||||
|
if (!childNodes.includes(element)) {
|
||||||
|
childNodes.push(element);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
hasChildNodes: function DOMElement_hasChildNodes() {
|
||||||
|
return this.childNodes.length !== 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
cloneNode: function DOMElement_cloneNode() {
|
||||||
|
const newNode = new DOMElement(this.nodeName);
|
||||||
|
newNode.childNodes = this.childNodes;
|
||||||
|
newNode.attributes = this.attributes;
|
||||||
|
newNode.textContent = this.textContent;
|
||||||
|
return newNode;
|
||||||
|
},
|
||||||
|
|
||||||
|
// This method is offered for convenience. It is recommended to directly use
|
||||||
|
// getSerializer because that allows you to process the chunks as they come
|
||||||
|
// instead of requiring the whole image to fit in memory.
|
||||||
|
toString: function DOMElement_toString() {
|
||||||
|
const buf = [];
|
||||||
|
const serializer = this.getSerializer();
|
||||||
|
let chunk;
|
||||||
|
while ((chunk = serializer.getNext()) !== null) {
|
||||||
|
buf.push(chunk);
|
||||||
|
}
|
||||||
|
return buf.join("");
|
||||||
|
},
|
||||||
|
|
||||||
|
getSerializer: function DOMElement_getSerializer() {
|
||||||
|
return new DOMElementSerializer(this);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function DOMElementSerializer(node) {
|
||||||
|
this._node = node;
|
||||||
|
this._state = 0;
|
||||||
|
this._loopIndex = 0;
|
||||||
|
this._attributeKeys = null;
|
||||||
|
this._childSerializer = null;
|
||||||
|
}
|
||||||
|
DOMElementSerializer.prototype = {
|
||||||
|
/**
|
||||||
|
* Yields the next chunk in the serialization of the element.
|
||||||
|
*
|
||||||
|
* @returns {string|null} null if the element has fully been serialized.
|
||||||
|
*/
|
||||||
|
getNext: function DOMElementSerializer_getNext() {
|
||||||
|
const node = this._node;
|
||||||
|
switch (this._state) {
|
||||||
|
case 0: // Start opening tag.
|
||||||
|
++this._state;
|
||||||
|
return "<" + node.nodeName;
|
||||||
|
case 1: // Add SVG namespace if this is the root element.
|
||||||
|
++this._state;
|
||||||
|
if (node.nodeName === "svg:svg") {
|
||||||
|
return (
|
||||||
|
' xmlns:xlink="http://www.w3.org/1999/xlink"' +
|
||||||
|
' xmlns:svg="http://www.w3.org/2000/svg"'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/* falls through */
|
||||||
|
case 2: // Initialize variables for looping over attributes.
|
||||||
|
++this._state;
|
||||||
|
this._loopIndex = 0;
|
||||||
|
this._attributeKeys = Object.keys(node.attributes);
|
||||||
|
/* falls through */
|
||||||
|
case 3: // Serialize any attributes and end opening tag.
|
||||||
|
if (this._loopIndex < this._attributeKeys.length) {
|
||||||
|
const name = this._attributeKeys[this._loopIndex++];
|
||||||
|
return " " + name + '="' + xmlEncode(node.attributes[name]) + '"';
|
||||||
|
}
|
||||||
|
++this._state;
|
||||||
|
return ">";
|
||||||
|
case 4: // Serialize textContent for tspan/style elements.
|
||||||
|
if (node.nodeName === "svg:tspan" || node.nodeName === "svg:style") {
|
||||||
|
this._state = 6;
|
||||||
|
return xmlEncode(node.textContent);
|
||||||
|
}
|
||||||
|
++this._state;
|
||||||
|
this._loopIndex = 0;
|
||||||
|
/* falls through */
|
||||||
|
case 5: // Serialize child nodes (only for non-tspan/style elements).
|
||||||
|
while (true) {
|
||||||
|
const value =
|
||||||
|
this._childSerializer && this._childSerializer.getNext();
|
||||||
|
if (value !== null) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
const nextChild = node.childNodes[this._loopIndex++];
|
||||||
|
if (nextChild) {
|
||||||
|
this._childSerializer = new DOMElementSerializer(nextChild);
|
||||||
|
} else {
|
||||||
|
this._childSerializer = null;
|
||||||
|
++this._state;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* falls through */
|
||||||
|
case 6: // Ending tag.
|
||||||
|
++this._state;
|
||||||
|
return "</" + node.nodeName + ">";
|
||||||
|
case 7: // Done.
|
||||||
|
return null;
|
||||||
|
default:
|
||||||
|
throw new Error("Unexpected serialization state: " + this._state);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const document = {
|
||||||
|
childNodes: [],
|
||||||
|
|
||||||
|
get currentScript() {
|
||||||
|
return { src: "" };
|
||||||
|
},
|
||||||
|
|
||||||
|
get documentElement() {
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
createElementNS(NS, element) {
|
||||||
|
const elObject = new DOMElement(element);
|
||||||
|
return elObject;
|
||||||
|
},
|
||||||
|
|
||||||
|
createElement(element) {
|
||||||
|
return this.createElementNS("", element);
|
||||||
|
},
|
||||||
|
|
||||||
|
getElementsByTagName(element) {
|
||||||
|
if (element === "head") {
|
||||||
|
return [this.head || (this.head = new DOMElement("head"))];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function Image() {
|
||||||
|
this._src = null;
|
||||||
|
this.onload = null;
|
||||||
|
}
|
||||||
|
Image.prototype = {
|
||||||
|
get src() {
|
||||||
|
return this._src;
|
||||||
|
},
|
||||||
|
set src(value) {
|
||||||
|
this._src = value;
|
||||||
|
if (this.onload) {
|
||||||
|
this.onload();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.document = document;
|
||||||
|
exports.Image = Image;
|
||||||
|
|
||||||
|
const exported_symbols = Object.keys(exports);
|
||||||
|
|
||||||
|
exports.setStubs = function (namespace) {
|
||||||
|
exported_symbols.forEach(function (key) {
|
||||||
|
console.assert(!(key in namespace), "property should not be set: " + key);
|
||||||
|
namespace[key] = exports[key];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
exports.unsetStubs = function (namespace) {
|
||||||
|
exported_symbols.forEach(function (key) {
|
||||||
|
console.assert(key in namespace, "property should be set: " + key);
|
||||||
|
delete namespace[key];
|
||||||
|
});
|
||||||
|
};
|
@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
// Run `gulp dist-install` to generate 'pdfjs-dist' npm package files.
|
// Run `gulp dist-install` to generate 'pdfjs-dist' npm package files.
|
||||||
import { getDocument } from "pdfjs-dist/legacy/build/pdf.mjs";
|
const pdfjsLib = require("pdfjs-dist/legacy/build/pdf.js");
|
||||||
|
|
||||||
// Loading file from file system into typed array
|
// Loading file from file system into typed array
|
||||||
const pdfPath =
|
const pdfPath =
|
||||||
@ -14,7 +14,7 @@ const pdfPath =
|
|||||||
|
|
||||||
// Will be using promises to load document, pages and misc data instead of
|
// Will be using promises to load document, pages and misc data instead of
|
||||||
// callback.
|
// callback.
|
||||||
const loadingTask = getDocument(pdfPath);
|
const loadingTask = pdfjsLib.getDocument(pdfPath);
|
||||||
loadingTask.promise
|
loadingTask.promise
|
||||||
.then(function (doc) {
|
.then(function (doc) {
|
||||||
const numPages = doc.numPages;
|
const numPages = doc.numPages;
|
@ -13,13 +13,13 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { strict as assert } from "assert";
|
const Canvas = require("canvas");
|
||||||
import Canvas from "canvas";
|
const assert = require("assert").strict;
|
||||||
import fs from "fs";
|
const fs = require("fs");
|
||||||
import { getDocument } from "pdfjs-dist/legacy/build/pdf.mjs";
|
|
||||||
|
|
||||||
class NodeCanvasFactory {
|
function NodeCanvasFactory() {}
|
||||||
create(width, height) {
|
NodeCanvasFactory.prototype = {
|
||||||
|
create: function NodeCanvasFactory_create(width, height) {
|
||||||
assert(width > 0 && height > 0, "Invalid canvas size");
|
assert(width > 0 && height > 0, "Invalid canvas size");
|
||||||
const canvas = Canvas.createCanvas(width, height);
|
const canvas = Canvas.createCanvas(width, height);
|
||||||
const context = canvas.getContext("2d");
|
const context = canvas.getContext("2d");
|
||||||
@ -27,16 +27,16 @@ class NodeCanvasFactory {
|
|||||||
canvas,
|
canvas,
|
||||||
context,
|
context,
|
||||||
};
|
};
|
||||||
}
|
},
|
||||||
|
|
||||||
reset(canvasAndContext, width, height) {
|
reset: function NodeCanvasFactory_reset(canvasAndContext, width, height) {
|
||||||
assert(canvasAndContext.canvas, "Canvas is not specified");
|
assert(canvasAndContext.canvas, "Canvas is not specified");
|
||||||
assert(width > 0 && height > 0, "Invalid canvas size");
|
assert(width > 0 && height > 0, "Invalid canvas size");
|
||||||
canvasAndContext.canvas.width = width;
|
canvasAndContext.canvas.width = width;
|
||||||
canvasAndContext.canvas.height = height;
|
canvasAndContext.canvas.height = height;
|
||||||
}
|
},
|
||||||
|
|
||||||
destroy(canvasAndContext) {
|
destroy: function NodeCanvasFactory_destroy(canvasAndContext) {
|
||||||
assert(canvasAndContext.canvas, "Canvas is not specified");
|
assert(canvasAndContext.canvas, "Canvas is not specified");
|
||||||
|
|
||||||
// Zeroing the width and height cause Firefox to release graphics
|
// Zeroing the width and height cause Firefox to release graphics
|
||||||
@ -45,8 +45,10 @@ class NodeCanvasFactory {
|
|||||||
canvasAndContext.canvas.height = 0;
|
canvasAndContext.canvas.height = 0;
|
||||||
canvasAndContext.canvas = null;
|
canvasAndContext.canvas = null;
|
||||||
canvasAndContext.context = null;
|
canvasAndContext.context = null;
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
|
|
||||||
|
const pdfjsLib = require("pdfjs-dist/legacy/build/pdf.js");
|
||||||
|
|
||||||
// Some PDFs need external cmaps.
|
// Some PDFs need external cmaps.
|
||||||
const CMAP_URL = "../../../node_modules/pdfjs-dist/cmaps/";
|
const CMAP_URL = "../../../node_modules/pdfjs-dist/cmaps/";
|
||||||
@ -64,7 +66,7 @@ const pdfPath =
|
|||||||
const data = new Uint8Array(fs.readFileSync(pdfPath));
|
const data = new Uint8Array(fs.readFileSync(pdfPath));
|
||||||
|
|
||||||
// Load the PDF file.
|
// Load the PDF file.
|
||||||
const loadingTask = getDocument({
|
const loadingTask = pdfjsLib.getDocument({
|
||||||
data,
|
data,
|
||||||
cMapUrl: CMAP_URL,
|
cMapUrl: CMAP_URL,
|
||||||
cMapPacked: CMAP_PACKED,
|
cMapPacked: CMAP_PACKED,
|
||||||
@ -72,35 +74,39 @@ const loadingTask = getDocument({
|
|||||||
canvasFactory,
|
canvasFactory,
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
(async function () {
|
||||||
const pdfDocument = await loadingTask.promise;
|
try {
|
||||||
console.log("# PDF document loaded.");
|
const pdfDocument = await loadingTask.promise;
|
||||||
// Get the first page.
|
console.log("# PDF document loaded.");
|
||||||
const page = await pdfDocument.getPage(1);
|
// Get the first page.
|
||||||
// Render the page on a Node canvas with 100% scale.
|
const page = await pdfDocument.getPage(1);
|
||||||
const viewport = page.getViewport({ scale: 1.0 });
|
// Render the page on a Node canvas with 100% scale.
|
||||||
const canvasAndContext = canvasFactory.create(
|
const viewport = page.getViewport({ scale: 1.0 });
|
||||||
viewport.width,
|
const canvasAndContext = canvasFactory.create(
|
||||||
viewport.height
|
viewport.width,
|
||||||
);
|
viewport.height
|
||||||
const renderContext = {
|
);
|
||||||
canvasContext: canvasAndContext.context,
|
const renderContext = {
|
||||||
viewport,
|
canvasContext: canvasAndContext.context,
|
||||||
};
|
viewport,
|
||||||
|
};
|
||||||
|
|
||||||
const renderTask = page.render(renderContext);
|
const renderTask = page.render(renderContext);
|
||||||
await renderTask.promise;
|
await renderTask.promise;
|
||||||
// Convert the canvas to an image buffer.
|
// Convert the canvas to an image buffer.
|
||||||
const image = canvasAndContext.canvas.toBuffer();
|
const image = canvasAndContext.canvas.toBuffer();
|
||||||
fs.writeFile("output.png", image, function (error) {
|
fs.writeFile("output.png", image, function (error) {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.error("Error: " + error);
|
console.error("Error: " + error);
|
||||||
} else {
|
} else {
|
||||||
console.log("Finished converting first page of PDF file to a PNG image.");
|
console.log(
|
||||||
}
|
"Finished converting first page of PDF file to a PNG image."
|
||||||
});
|
);
|
||||||
// Release page resources.
|
}
|
||||||
page.cleanup();
|
});
|
||||||
} catch (reason) {
|
// Release page resources.
|
||||||
console.log(reason);
|
page.cleanup();
|
||||||
}
|
} catch (reason) {
|
||||||
|
console.log(reason);
|
||||||
|
}
|
||||||
|
})();
|
128
examples/node/pdf2svg.js
Normal file
128
examples/node/pdf2svg.js
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
//
|
||||||
|
// Node tool to dump SVG output into a file.
|
||||||
|
//
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const util = require("util");
|
||||||
|
const path = require("path");
|
||||||
|
const stream = require("stream");
|
||||||
|
|
||||||
|
// HACK few hacks to let PDF.js be loaded not as a module in global space.
|
||||||
|
require("./domstubs.js").setStubs(global);
|
||||||
|
|
||||||
|
// Run `gulp dist-install` to generate 'pdfjs-dist' npm package files.
|
||||||
|
const pdfjsLib = require("pdfjs-dist/legacy/build/pdf.js");
|
||||||
|
|
||||||
|
// Some PDFs need external cmaps.
|
||||||
|
const CMAP_URL = "../../node_modules/pdfjs-dist/cmaps/";
|
||||||
|
const CMAP_PACKED = true;
|
||||||
|
|
||||||
|
// Loading file from file system into typed array
|
||||||
|
const pdfPath =
|
||||||
|
process.argv[2] || "../../web/compressed.tracemonkey-pldi-09.pdf";
|
||||||
|
const data = new Uint8Array(fs.readFileSync(pdfPath));
|
||||||
|
|
||||||
|
const outputDirectory = "./svgdump";
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Note: This creates a directory only one level deep. If you want to create
|
||||||
|
// multiple subdirectories on the fly, use the mkdirp module from npm.
|
||||||
|
fs.mkdirSync(outputDirectory);
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code !== "EEXIST") {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dumps svg outputs to a folder called svgdump
|
||||||
|
function getFilePathForPage(pageNum) {
|
||||||
|
const name = path.basename(pdfPath, path.extname(pdfPath));
|
||||||
|
return path.join(outputDirectory, `${name}-${pageNum}.svg`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A readable stream which offers a stream representing the serialization of a
|
||||||
|
* given DOM element (as defined by domstubs.js).
|
||||||
|
*
|
||||||
|
* @param {object} options
|
||||||
|
* @param {DOMElement} options.svgElement The element to serialize
|
||||||
|
*/
|
||||||
|
function ReadableSVGStream(options) {
|
||||||
|
if (!(this instanceof ReadableSVGStream)) {
|
||||||
|
return new ReadableSVGStream(options);
|
||||||
|
}
|
||||||
|
stream.Readable.call(this, options);
|
||||||
|
this.serializer = options.svgElement.getSerializer();
|
||||||
|
}
|
||||||
|
util.inherits(ReadableSVGStream, stream.Readable);
|
||||||
|
// Implements https://nodejs.org/api/stream.html#stream_readable_read_size_1
|
||||||
|
ReadableSVGStream.prototype._read = function () {
|
||||||
|
let chunk;
|
||||||
|
while ((chunk = this.serializer.getNext()) !== null) {
|
||||||
|
if (!this.push(chunk)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.push(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Streams the SVG element to the given file path.
|
||||||
|
function writeSvgToFile(svgElement, filePath) {
|
||||||
|
let readableSvgStream = new ReadableSVGStream({
|
||||||
|
svgElement,
|
||||||
|
});
|
||||||
|
const writableStream = fs.createWriteStream(filePath);
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
readableSvgStream.once("error", reject);
|
||||||
|
writableStream.once("error", reject);
|
||||||
|
writableStream.once("finish", resolve);
|
||||||
|
readableSvgStream.pipe(writableStream);
|
||||||
|
}).catch(function (err) {
|
||||||
|
readableSvgStream = null; // Explicitly null because of v8 bug 6512.
|
||||||
|
writableStream.end();
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Will be using async/await to load document, pages and misc data.
|
||||||
|
const loadingTask = pdfjsLib.getDocument({
|
||||||
|
data,
|
||||||
|
cMapUrl: CMAP_URL,
|
||||||
|
cMapPacked: CMAP_PACKED,
|
||||||
|
fontExtraProperties: true,
|
||||||
|
});
|
||||||
|
(async function () {
|
||||||
|
const doc = await loadingTask.promise;
|
||||||
|
const numPages = doc.numPages;
|
||||||
|
console.log("# Document Loaded");
|
||||||
|
console.log(`Number of Pages: ${numPages}`);
|
||||||
|
console.log();
|
||||||
|
|
||||||
|
for (let pageNum = 1; pageNum <= numPages; pageNum++) {
|
||||||
|
try {
|
||||||
|
const page = await doc.getPage(pageNum);
|
||||||
|
console.log(`# Page ${pageNum}`);
|
||||||
|
const viewport = page.getViewport({ scale: 1.0 });
|
||||||
|
console.log(`Size: ${viewport.width}x${viewport.height}`);
|
||||||
|
console.log();
|
||||||
|
|
||||||
|
const opList = await page.getOperatorList();
|
||||||
|
const svgGfx = new pdfjsLib.SVGGraphics(
|
||||||
|
page.commonObjs,
|
||||||
|
page.objs,
|
||||||
|
/* forceDataSchema = */ true
|
||||||
|
);
|
||||||
|
svgGfx.embedFonts = true;
|
||||||
|
const svg = await svgGfx.getSVG(opList, viewport);
|
||||||
|
await writeSvgToFile(svg, getFilePathForPage(pageNum));
|
||||||
|
// Release page resources.
|
||||||
|
page.cleanup();
|
||||||
|
} catch (err) {
|
||||||
|
console.log(`Error: ${err}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("# End of Document");
|
||||||
|
})();
|
@ -3,8 +3,8 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Text-only PDF.js example</title>
|
<title>Text-only PDF.js example</title>
|
||||||
<script src="../../node_modules/pdfjs-dist/build/pdf.mjs" type="module"></script>
|
<script src="../../node_modules/pdfjs-dist/build/pdf.js"></script>
|
||||||
<script src="pdf2svg.mjs" type="module"></script>
|
<script src="pdf2svg.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<p>Text-only PDF.js example</p>
|
<p>Text-only PDF.js example</p>
|
||||||
|
@ -19,7 +19,7 @@ const PAGE_SCALE = 1.5;
|
|||||||
const SVG_NS = "http://www.w3.org/2000/svg";
|
const SVG_NS = "http://www.w3.org/2000/svg";
|
||||||
|
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
"../../node_modules/pdfjs-dist/build/pdf.worker.mjs";
|
"../../node_modules/pdfjs-dist/build/pdf.worker.js";
|
||||||
|
|
||||||
function buildSVG(viewport, textContent) {
|
function buildSVG(viewport, textContent) {
|
||||||
// Building SVG with size of the viewport (for simplicity)
|
// Building SVG with size of the viewport (for simplicity)
|
@ -27,7 +27,9 @@ otherwise the build is not guaranteed to work correctly.
|
|||||||
## Worker loading
|
## Worker loading
|
||||||
|
|
||||||
If you are getting the `Setting up fake worker` warning, make sure you are
|
If you are getting the `Setting up fake worker` warning, make sure you are
|
||||||
importing `pdfjs-dist/webpack.mjs` which is the zero-configuration method for
|
importing `pdfjs-dist/webpack` which is the zero-configuration method for
|
||||||
Webpack users. Installing `worker-loader` is no longer necessary.
|
Webpack users. Installing `worker-loader` is no longer necessary.
|
||||||
|
|
||||||
import * as pdfjsLib from 'pdfjs-dist/webpack.mjs';
|
import * as pdfjsLib from 'pdfjs-dist/webpack';
|
||||||
|
|
||||||
|
For a full working example refer to [this repository](https://github.com/yurydelendik/pdfjs-react).
|
||||||
|
35
examples/webpack/main.js
Normal file
35
examples/webpack/main.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Any copyright is dedicated to the Public Domain.
|
||||||
|
// http://creativecommons.org/licenses/publicdomain/
|
||||||
|
|
||||||
|
// Hello world example for webpack.
|
||||||
|
|
||||||
|
const pdfjsLib = require("pdfjs-dist");
|
||||||
|
|
||||||
|
const pdfPath = "../learning/helloworld.pdf";
|
||||||
|
|
||||||
|
// Setting worker path to worker bundle.
|
||||||
|
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
||||||
|
"../../build/webpack/pdf.worker.bundle.js";
|
||||||
|
|
||||||
|
// Loading a document.
|
||||||
|
const loadingTask = pdfjsLib.getDocument(pdfPath);
|
||||||
|
loadingTask.promise
|
||||||
|
.then(function (pdfDocument) {
|
||||||
|
// Request a first page
|
||||||
|
return pdfDocument.getPage(1).then(function (pdfPage) {
|
||||||
|
// Display page on the existing canvas with 100% scale.
|
||||||
|
const viewport = pdfPage.getViewport({ scale: 1.0 });
|
||||||
|
const canvas = document.getElementById("theCanvas");
|
||||||
|
canvas.width = viewport.width;
|
||||||
|
canvas.height = viewport.height;
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
const renderTask = pdfPage.render({
|
||||||
|
canvasContext: ctx,
|
||||||
|
viewport,
|
||||||
|
});
|
||||||
|
return renderTask.promise;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(function (reason) {
|
||||||
|
console.error("Error: " + reason);
|
||||||
|
});
|
@ -1,29 +0,0 @@
|
|||||||
// Any copyright is dedicated to the Public Domain.
|
|
||||||
// http://creativecommons.org/licenses/publicdomain/
|
|
||||||
|
|
||||||
// Hello world example for webpack.
|
|
||||||
|
|
||||||
import * as pdfjsLib from "pdfjs-dist";
|
|
||||||
|
|
||||||
const pdfPath = "../learning/helloworld.pdf";
|
|
||||||
|
|
||||||
// Setting worker path to worker bundle.
|
|
||||||
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
|
||||||
"../../build/webpack/pdf.worker.bundle.js";
|
|
||||||
|
|
||||||
// Loading a document.
|
|
||||||
const loadingTask = pdfjsLib.getDocument(pdfPath);
|
|
||||||
const pdfDocument = await loadingTask.promise;
|
|
||||||
// Request a first page
|
|
||||||
const pdfPage = await pdfDocument.getPage(1);
|
|
||||||
// Display page on the existing canvas with 100% scale.
|
|
||||||
const viewport = pdfPage.getViewport({ scale: 1.0 });
|
|
||||||
const canvas = document.getElementById("theCanvas");
|
|
||||||
canvas.width = viewport.width;
|
|
||||||
canvas.height = viewport.height;
|
|
||||||
const ctx = canvas.getContext("2d");
|
|
||||||
const renderTask = pdfPage.render({
|
|
||||||
canvasContext: ctx,
|
|
||||||
viewport,
|
|
||||||
});
|
|
||||||
await renderTask.promise;
|
|
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "webpack-pdf.js-example",
|
"name": "webpack-pdf.js-example",
|
||||||
"version": "0.2.0",
|
"version": "0.1.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "webpack"
|
"build": "webpack"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"webpack": "^5.89.0",
|
"webpack": "^5.11.1",
|
||||||
"webpack-cli": "^5.1.4",
|
"webpack-cli": "^4.3.1",
|
||||||
"pdfjs-dist": "../../node_modules/pdfjs-dist"
|
"pdfjs-dist": "../../node_modules/pdfjs-dist"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
/* eslint-disable import/no-commonjs */
|
|
||||||
|
|
||||||
const webpack = require("webpack"); // eslint-disable-line no-unused-vars
|
const webpack = require("webpack"); // eslint-disable-line no-unused-vars
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
context: __dirname,
|
context: __dirname,
|
||||||
entry: {
|
entry: {
|
||||||
main: "./main.mjs",
|
main: "./main.js",
|
||||||
"pdf.worker": "pdfjs-dist/build/pdf.worker.mjs",
|
"pdf.worker": "pdfjs-dist/build/pdf.worker.entry",
|
||||||
},
|
},
|
||||||
mode: "none",
|
mode: "none",
|
||||||
output: {
|
output: {
|
||||||
|
@ -22,7 +22,11 @@ function getViewerURL(pdf_url) {
|
|||||||
return VIEWER_URL + "?file=" + encodeURIComponent(pdf_url);
|
return VIEWER_URL + "?file=" + encodeURIComponent(pdf_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener("animationstart", onAnimationStart, true);
|
if (CSS.supports("animation", "0s")) {
|
||||||
|
document.addEventListener("animationstart", onAnimationStart, true);
|
||||||
|
} else {
|
||||||
|
document.addEventListener("webkitAnimationStart", onAnimationStart, true);
|
||||||
|
}
|
||||||
|
|
||||||
function onAnimationStart(event) {
|
function onAnimationStart(event) {
|
||||||
if (event.animationName === "pdfjs-detected-object-or-embed") {
|
if (event.animationName === "pdfjs-detected-object-or-embed") {
|
||||||
@ -128,12 +132,8 @@ function updateEmbedElement(elem) {
|
|||||||
}
|
}
|
||||||
elem.type = "text/html";
|
elem.type = "text/html";
|
||||||
elem.src = getEmbeddedViewerURL(elem.src);
|
elem.src = getEmbeddedViewerURL(elem.src);
|
||||||
|
|
||||||
if (parentNode) {
|
if (parentNode) {
|
||||||
// Suppress linter warning: insertBefore is preferable to
|
nextSibling.before(elem);
|
||||||
// nextSibling.before(elem) because nextSibling may be null.
|
|
||||||
// eslint-disable-next-line unicorn/prefer-modern-dom-apis
|
|
||||||
parentNode.insertBefore(elem, nextSibling);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
/**
|
/**
|
||||||
* Detect creation of <embed> and <object> tags.
|
* Detect creation of <embed> and <object> tags.
|
||||||
*/
|
*/
|
||||||
|
@-webkit-keyframes pdfjs-detected-object-or-embed {
|
||||||
|
from {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
}
|
||||||
@keyframes pdfjs-detected-object-or-embed {
|
@keyframes pdfjs-detected-object-or-embed {
|
||||||
from {
|
from {
|
||||||
/* empty */
|
/* empty */
|
||||||
@ -8,6 +13,9 @@
|
|||||||
}
|
}
|
||||||
object,
|
object,
|
||||||
embed {
|
embed {
|
||||||
|
-webkit-animation-delay: 0s !important;
|
||||||
|
-webkit-animation-name: pdfjs-detected-object-or-embed !important;
|
||||||
|
-webkit-animation-play-state: running !important;
|
||||||
animation-delay: 0s !important;
|
animation-delay: 0s !important;
|
||||||
animation-name: pdfjs-detected-object-or-embed !important;
|
animation-name: pdfjs-detected-object-or-embed !important;
|
||||||
animation-play-state: running !important;
|
animation-play-state: running !important;
|
||||||
|
@ -47,7 +47,7 @@ limitations under the License.
|
|||||||
}
|
}
|
||||||
var scheme = url.slice(0, schemeIndex).toLowerCase();
|
var scheme = url.slice(0, schemeIndex).toLowerCase();
|
||||||
if (schemes.includes(scheme)) {
|
if (schemes.includes(scheme)) {
|
||||||
url = url.split("#", 1)[0];
|
url = url.split("#")[0];
|
||||||
if (url.charAt(schemeIndex) === ":") {
|
if (url.charAt(schemeIndex) === ":") {
|
||||||
url = encodeURIComponent(url);
|
url = encodeURIComponent(url);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"minimum_chrome_version": "88",
|
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "PDF Viewer",
|
"name": "PDF Viewer",
|
||||||
"version": "PDFJSSCRIPT_VERSION",
|
"version": "PDFJSSCRIPT_VERSION",
|
||||||
@ -11,30 +10,32 @@
|
|||||||
},
|
},
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"fileBrowserHandler",
|
"fileBrowserHandler",
|
||||||
"webRequest",
|
"webRequest", "webRequestBlocking",
|
||||||
"webRequestBlocking",
|
|
||||||
"<all_urls>",
|
"<all_urls>",
|
||||||
"tabs",
|
"tabs",
|
||||||
"webNavigation",
|
"webNavigation",
|
||||||
"storage"
|
"storage"
|
||||||
],
|
],
|
||||||
"content_scripts": [
|
"content_scripts": [{
|
||||||
{
|
"matches": [
|
||||||
"matches": ["http://*/*", "https://*/*", "ftp://*/*", "file://*/*"],
|
"http://*/*",
|
||||||
"run_at": "document_start",
|
"https://*/*",
|
||||||
"all_frames": true,
|
"ftp://*/*",
|
||||||
"css": ["contentstyle.css"],
|
"file://*/*"
|
||||||
"js": ["contentscript.js"]
|
],
|
||||||
}
|
"run_at": "document_start",
|
||||||
],
|
"all_frames": true,
|
||||||
|
"css": ["contentstyle.css"],
|
||||||
|
"js": ["contentscript.js"]
|
||||||
|
}],
|
||||||
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
|
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
|
||||||
"file_browser_handlers": [
|
"file_browser_handlers": [{
|
||||||
{
|
"id": "open-as-pdf",
|
||||||
"id": "open-as-pdf",
|
"default_title": "Open with PDF Viewer",
|
||||||
"default_title": "Open with PDF Viewer",
|
"file_filters": [
|
||||||
"file_filters": ["filesystem:*.pdf"]
|
"filesystem:*.pdf"
|
||||||
}
|
]
|
||||||
],
|
}],
|
||||||
"storage": {
|
"storage": {
|
||||||
"managed_schema": "preferences_schema.json"
|
"managed_schema": "preferences_schema.json"
|
||||||
},
|
},
|
||||||
|
@ -20,15 +20,7 @@ limitations under the License.
|
|||||||
var VIEWER_URL = chrome.extension.getURL("content/web/viewer.html");
|
var VIEWER_URL = chrome.extension.getURL("content/web/viewer.html");
|
||||||
|
|
||||||
function getViewerURL(pdf_url) {
|
function getViewerURL(pdf_url) {
|
||||||
// |pdf_url| may contain a fragment such as "#page=2". That should be passed
|
return VIEWER_URL + "?file=" + encodeURIComponent(pdf_url);
|
||||||
// as a fragment to the viewer, not encoded in pdf_url.
|
|
||||||
var hash = "";
|
|
||||||
var i = pdf_url.indexOf("#");
|
|
||||||
if (i > 0) {
|
|
||||||
hash = pdf_url.slice(i);
|
|
||||||
pdf_url = pdf_url.slice(0, i);
|
|
||||||
}
|
|
||||||
return VIEWER_URL + "?file=" + encodeURIComponent(pdf_url) + hash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,7 +154,19 @@ chrome.webRequest.onBeforeRequest.addListener(
|
|||||||
return { redirectUrl: viewerUrl };
|
return { redirectUrl: viewerUrl };
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
urls: ["file://*/*.pdf", "file://*/*.PDF"],
|
urls: [
|
||||||
|
"file://*/*.pdf",
|
||||||
|
"file://*/*.PDF",
|
||||||
|
...// Duck-typing: MediaError.prototype.message was added in Chrome 59.
|
||||||
|
(MediaError.prototype.hasOwnProperty("message")
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
// Note: Chrome 59 has disabled ftp resource loading by default:
|
||||||
|
// https://www.chromestatus.com/feature/5709390967472128
|
||||||
|
"ftp://*/*.pdf",
|
||||||
|
"ftp://*/*.PDF",
|
||||||
|
]),
|
||||||
|
],
|
||||||
types: ["main_frame", "sub_frame"],
|
types: ["main_frame", "sub_frame"],
|
||||||
},
|
},
|
||||||
["blocking"]
|
["blocking"]
|
||||||
@ -248,3 +252,10 @@ chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
|
|||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Remove keys from storage that were once part of the deleted feature-detect.js
|
||||||
|
chrome.storage.local.remove([
|
||||||
|
"featureDetectLastUA",
|
||||||
|
"webRequestRedirectUrl",
|
||||||
|
"extensionSupportsFTP",
|
||||||
|
]);
|
||||||
|
@ -5,7 +5,11 @@
|
|||||||
"title": "Theme",
|
"title": "Theme",
|
||||||
"description": "The theme to use.\n0 = Use system theme.\n1 = Light theme.\n2 = Dark theme.",
|
"description": "The theme to use.\n0 = Use system theme.\n1 = Light theme.\n2 = Dark theme.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [0, 1, 2],
|
"enum": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
"default": 2
|
"default": 2
|
||||||
},
|
},
|
||||||
"showPreviousViewOnLoad": {
|
"showPreviousViewOnLoad": {
|
||||||
@ -17,7 +21,11 @@
|
|||||||
"title": "View position on load",
|
"title": "View position on load",
|
||||||
"description": "The position in the document upon load.\n -1 = Default (uses OpenAction if available, otherwise equal to `viewOnLoad = 0`).\n 0 = The last viewed page/position.\n 1 = The initial page/position.",
|
"description": "The position in the document upon load.\n -1 = Default (uses OpenAction if available, otherwise equal to `viewOnLoad = 0`).\n 0 = The last viewed page/position.\n 1 = The initial page/position.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [-1, 0, 1],
|
"enum": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
"default": 0
|
"default": 0
|
||||||
},
|
},
|
||||||
"defaultZoomDelay": {
|
"defaultZoomDelay": {
|
||||||
@ -37,7 +45,13 @@
|
|||||||
"title": "Sidebar state on load",
|
"title": "Sidebar state on load",
|
||||||
"description": "Controls the state of the sidebar upon load.\n -1 = Default (uses PageMode if available, otherwise the last position if available/enabled).\n 0 = Do not show sidebar.\n 1 = Show thumbnails in sidebar.\n 2 = Show document outline in sidebar.\n 3 = Show attachments in sidebar.",
|
"description": "Controls the state of the sidebar upon load.\n -1 = Default (uses PageMode if available, otherwise the last position if available/enabled).\n 0 = Do not show sidebar.\n 1 = Show thumbnails in sidebar.\n 2 = Show document outline in sidebar.\n 3 = Show attachments in sidebar.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [-1, 0, 1, 2, 3],
|
"enum": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
"default": -1
|
"default": -1
|
||||||
},
|
},
|
||||||
"enableHandToolOnLoad": {
|
"enableHandToolOnLoad": {
|
||||||
@ -45,15 +59,14 @@
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
"enableML": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": false
|
|
||||||
},
|
|
||||||
"cursorToolOnLoad": {
|
"cursorToolOnLoad": {
|
||||||
"title": "Cursor tool on load",
|
"title": "Cursor tool on load",
|
||||||
"description": "The cursor tool that is enabled upon load.\n 0 = Text selection tool.\n 1 = Hand tool.",
|
"description": "The cursor tool that is enabled upon load.\n 0 = Text selection tool.\n 1 = Hand tool.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [0, 1],
|
"enum": [
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
"default": 0
|
"default": 0
|
||||||
},
|
},
|
||||||
"pdfBugEnabled": {
|
"pdfBugEnabled": {
|
||||||
@ -68,22 +81,6 @@
|
|||||||
"description": "Whether to allow execution of active content (JavaScript) by PDF files.",
|
"description": "Whether to allow execution of active content (JavaScript) by PDF files.",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
"enableHighlightEditor": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": false
|
|
||||||
},
|
|
||||||
"enableHighlightFloatingButton": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": false
|
|
||||||
},
|
|
||||||
"highlightEditorColors": {
|
|
||||||
"type": "string",
|
|
||||||
"default": "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F"
|
|
||||||
},
|
|
||||||
"enableStampEditor": {
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true
|
|
||||||
},
|
|
||||||
"disableRange": {
|
"disableRange": {
|
||||||
"title": "Disable range requests",
|
"title": "Disable range requests",
|
||||||
"description": "Whether to disable range requests (not recommended).",
|
"description": "Whether to disable range requests (not recommended).",
|
||||||
@ -115,14 +112,27 @@
|
|||||||
"title": "Text layer mode",
|
"title": "Text layer mode",
|
||||||
"description": "Controls if the text layer is enabled, and the selection mode that is used.\n 0 = Disabled.\n 1 = Enabled.",
|
"description": "Controls if the text layer is enabled, and the selection mode that is used.\n 0 = Disabled.\n 1 = Enabled.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [0, 1],
|
"enum": [
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
"default": 1
|
"default": 1
|
||||||
},
|
},
|
||||||
|
"useOnlyCssZoom": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"externalLinkTarget": {
|
"externalLinkTarget": {
|
||||||
"title": "External links target window",
|
"title": "External links target window",
|
||||||
"description": "Controls how external links will be opened.\n 0 = default.\n 1 = replaces current window.\n 2 = new window/tab.\n 3 = parent.\n 4 = in top window.",
|
"description": "Controls how external links will be opened.\n 0 = default.\n 1 = replaces current window.\n 2 = new window/tab.\n 3 = parent.\n 4 = in top window.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [0, 1, 2, 3, 4],
|
"enum": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4
|
||||||
|
],
|
||||||
"default": 0
|
"default": 0
|
||||||
},
|
},
|
||||||
"disablePageLabels": {
|
"disablePageLabels": {
|
||||||
@ -142,12 +152,22 @@
|
|||||||
},
|
},
|
||||||
"annotationMode": {
|
"annotationMode": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [0, 1, 2, 3],
|
"enum": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
"default": 2
|
"default": 2
|
||||||
},
|
},
|
||||||
"annotationEditorMode": {
|
"annotationEditorMode": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [-1, 0, 3, 15],
|
"enum": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
15
|
||||||
|
],
|
||||||
"default": 0
|
"default": 0
|
||||||
},
|
},
|
||||||
"enablePermissions": {
|
"enablePermissions": {
|
||||||
@ -178,14 +198,25 @@
|
|||||||
"title": "Scroll mode on load",
|
"title": "Scroll mode on load",
|
||||||
"description": "Controls how the viewer scrolls upon load.\n -1 = Default (uses the last position if available/enabled).\n 3 = Page scrolling.\n 0 = Vertical scrolling.\n 1 = Horizontal scrolling.\n 2 = Wrapped scrolling.",
|
"description": "Controls how the viewer scrolls upon load.\n -1 = Default (uses the last position if available/enabled).\n 3 = Page scrolling.\n 0 = Vertical scrolling.\n 1 = Horizontal scrolling.\n 2 = Wrapped scrolling.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [-1, 0, 1, 2, 3],
|
"enum": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
"default": -1
|
"default": -1
|
||||||
},
|
},
|
||||||
"spreadModeOnLoad": {
|
"spreadModeOnLoad": {
|
||||||
"title": "Spread mode on load",
|
"title": "Spread mode on load",
|
||||||
"description": "Whether the viewer should join pages into spreads upon load.\n -1 = Default (uses the last position if available/enabled).\n 0 = No spreads.\n 1 = Odd spreads.\n 2 = Even spreads.",
|
"description": "Whether the viewer should join pages into spreads upon load.\n -1 = Default (uses the last position if available/enabled).\n 0 = No spreads.\n 1 = Odd spreads.\n 2 = Even spreads.",
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"enum": [-1, 0, 1, 2],
|
"enum": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
"default": -1
|
"default": -1
|
||||||
},
|
},
|
||||||
"forcePageColors": {
|
"forcePageColors": {
|
||||||
|
@ -42,18 +42,30 @@ var g_requestHeaders = {};
|
|||||||
// g_referrers[tabId][frameId] = referrer of PDF frame.
|
// g_referrers[tabId][frameId] = referrer of PDF frame.
|
||||||
var g_referrers = {};
|
var g_referrers = {};
|
||||||
|
|
||||||
|
var extraInfoSpecWithHeaders; // = ['requestHeaders', 'extraHeaders']
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
var requestFilter = {
|
var requestFilter = {
|
||||||
urls: ["*://*/*"],
|
urls: ["*://*/*"],
|
||||||
types: ["main_frame", "sub_frame"],
|
types: ["main_frame", "sub_frame"],
|
||||||
};
|
};
|
||||||
chrome.webRequest.onSendHeaders.addListener(
|
function registerListener(extraInfoSpec) {
|
||||||
function (details) {
|
extraInfoSpecWithHeaders = extraInfoSpec;
|
||||||
g_requestHeaders[details.requestId] = details.requestHeaders;
|
// May throw if the given extraInfoSpec is unsupported.
|
||||||
},
|
chrome.webRequest.onSendHeaders.addListener(
|
||||||
requestFilter,
|
function (details) {
|
||||||
["requestHeaders", "extraHeaders"]
|
g_requestHeaders[details.requestId] = details.requestHeaders;
|
||||||
);
|
},
|
||||||
|
requestFilter,
|
||||||
|
extraInfoSpec
|
||||||
|
);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
registerListener(["requestHeaders", "extraHeaders"]);
|
||||||
|
} catch (e) {
|
||||||
|
// "extraHeaders" is not supported in Chrome 71 and earlier.
|
||||||
|
registerListener(["requestHeaders"]);
|
||||||
|
}
|
||||||
chrome.webRequest.onBeforeRedirect.addListener(forgetHeaders, requestFilter);
|
chrome.webRequest.onBeforeRedirect.addListener(forgetHeaders, requestFilter);
|
||||||
chrome.webRequest.onCompleted.addListener(forgetHeaders, requestFilter);
|
chrome.webRequest.onCompleted.addListener(forgetHeaders, requestFilter);
|
||||||
chrome.webRequest.onErrorOccurred.addListener(forgetHeaders, requestFilter);
|
chrome.webRequest.onErrorOccurred.addListener(forgetHeaders, requestFilter);
|
||||||
@ -114,7 +126,7 @@ chrome.runtime.onConnect.addListener(function onReceivePort(port) {
|
|||||||
types: ["xmlhttprequest"],
|
types: ["xmlhttprequest"],
|
||||||
tabId,
|
tabId,
|
||||||
},
|
},
|
||||||
["blocking", "requestHeaders", "extraHeaders"]
|
["blocking", ...extraInfoSpecWithHeaders]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// Acknowledge the message, and include the latest referer for this frame.
|
// Acknowledge the message, and include the latest referer for this frame.
|
||||||
|
@ -70,20 +70,29 @@ limitations under the License.
|
|||||||
|
|
||||||
var deduplication_id = getDeduplicationId(wasUpdated);
|
var deduplication_id = getDeduplicationId(wasUpdated);
|
||||||
var extension_version = chrome.runtime.getManifest().version;
|
var extension_version = chrome.runtime.getManifest().version;
|
||||||
fetch(LOG_URL, {
|
if (window.Request && "mode" in Request.prototype) {
|
||||||
method: "POST",
|
// fetch is supported in extensions since Chrome 42 (though the above
|
||||||
headers: new Headers({
|
// feature-detection method detects Chrome 43+).
|
||||||
"Deduplication-Id": deduplication_id,
|
// Unlike XMLHttpRequest, fetch omits credentials such as cookies in the
|
||||||
"Extension-Version": extension_version,
|
// requests, which guarantees that the server cannot track the client
|
||||||
}),
|
// via HTTP cookies.
|
||||||
// Set mode=cors so that the above custom headers are included in the
|
fetch(LOG_URL, {
|
||||||
// request.
|
method: "POST",
|
||||||
mode: "cors",
|
headers: new Headers({
|
||||||
// Omits credentials such as cookies in the requests, which guarantees
|
"Deduplication-Id": deduplication_id,
|
||||||
// that the server cannot track the client via HTTP cookies.
|
"Extension-Version": extension_version,
|
||||||
credentials: "omit",
|
}),
|
||||||
cache: "no-store",
|
// Set mode=cors so that the above custom headers are included in the
|
||||||
});
|
// request.
|
||||||
|
mode: "cors",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var x = new XMLHttpRequest();
|
||||||
|
x.open("POST", LOG_URL);
|
||||||
|
x.setRequestHeader("Deduplication-Id", deduplication_id);
|
||||||
|
x.setRequestHeader("Extension-Version", extension_version);
|
||||||
|
x.send();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,11 +6,18 @@
|
|||||||
"plugin:mozilla/recommended",
|
"plugin:mozilla/recommended",
|
||||||
],
|
],
|
||||||
|
|
||||||
|
"parserOptions": {
|
||||||
|
"sourceType": "script",
|
||||||
|
},
|
||||||
|
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"mozilla"
|
"mozilla"
|
||||||
],
|
],
|
||||||
|
|
||||||
"rules": {
|
"rules": {
|
||||||
|
// Items different from the mozilla/recommended configuration.
|
||||||
|
"no-var": "off",
|
||||||
|
|
||||||
// Other rules mozilla/recommended hasn't enabled yet.
|
// Other rules mozilla/recommended hasn't enabled yet.
|
||||||
"no-shadow": "error",
|
"no-shadow": "error",
|
||||||
"arrow-body-style": ["error", "as-needed"],
|
"arrow-body-style": ["error", "as-needed"],
|
||||||
|
133
extensions/firefox/tools/l10n.js
Normal file
133
extensions/firefox/tools/l10n.js
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Small subset of the webL10n API by Fabien Cazenave for PDF.js extension.
|
||||||
|
(function (window) {
|
||||||
|
let gL10nData = null;
|
||||||
|
let gLanguage = "";
|
||||||
|
let gExternalLocalizerServices = null;
|
||||||
|
let gReadyState = "loading";
|
||||||
|
|
||||||
|
// fetch an l10n objects
|
||||||
|
function getL10nData(key) {
|
||||||
|
gL10nData ||= gExternalLocalizerServices.getStrings();
|
||||||
|
|
||||||
|
const data = gL10nData?.[key];
|
||||||
|
if (!data) {
|
||||||
|
console.warn("[l10n] #" + key + " missing for [" + gLanguage + "]");
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace {{arguments}} with their values
|
||||||
|
function substArguments(text, args) {
|
||||||
|
if (!args) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
return text.replaceAll(/\{\{\s*(\w+)\s*\}\}/g, function (all, name) {
|
||||||
|
return name in args ? args[name] : "{{" + name + "}}";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate a string
|
||||||
|
function translateString(key, args, fallback) {
|
||||||
|
var i = key.lastIndexOf(".");
|
||||||
|
var name, property;
|
||||||
|
if (i >= 0) {
|
||||||
|
name = key.substring(0, i);
|
||||||
|
property = key.substring(i + 1);
|
||||||
|
} else {
|
||||||
|
name = key;
|
||||||
|
property = "textContent";
|
||||||
|
}
|
||||||
|
var data = getL10nData(name);
|
||||||
|
var value = (data && data[property]) || fallback;
|
||||||
|
if (!value) {
|
||||||
|
return "{{" + key + "}}";
|
||||||
|
}
|
||||||
|
return substArguments(value, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate an HTML element
|
||||||
|
function translateElement(element) {
|
||||||
|
if (!element || !element.dataset) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the related l10n object
|
||||||
|
var key = element.dataset.l10nId;
|
||||||
|
var data = getL10nData(key);
|
||||||
|
if (!data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get arguments (if any)
|
||||||
|
// TODO: more flexible parser?
|
||||||
|
var args;
|
||||||
|
if (element.dataset.l10nArgs) {
|
||||||
|
try {
|
||||||
|
args = JSON.parse(element.dataset.l10nArgs);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("[l10n] could not parse arguments for #" + key + "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate element
|
||||||
|
// TODO: security check?
|
||||||
|
for (var k in data) {
|
||||||
|
element[k] = substArguments(data[k], args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate an HTML subtree
|
||||||
|
function translateFragment(element) {
|
||||||
|
element = element || document.querySelector("html");
|
||||||
|
|
||||||
|
// check all translatable children (= w/ a `data-l10n-id' attribute)
|
||||||
|
var children = element.querySelectorAll("*[data-l10n-id]");
|
||||||
|
var elementCount = children.length;
|
||||||
|
for (var i = 0; i < elementCount; i++) {
|
||||||
|
translateElement(children[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate element itself if necessary
|
||||||
|
if (element.dataset.l10nId) {
|
||||||
|
translateElement(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public API
|
||||||
|
document.mozL10n = {
|
||||||
|
// get a localized string
|
||||||
|
get: translateString,
|
||||||
|
|
||||||
|
// get the document language
|
||||||
|
getLanguage() {
|
||||||
|
return gLanguage;
|
||||||
|
},
|
||||||
|
|
||||||
|
// get the direction (ltr|rtl) of the current language
|
||||||
|
getDirection() {
|
||||||
|
// http://www.w3.org/International/questions/qa-scripts
|
||||||
|
// Arabic, Hebrew, Farsi, Pashto, Urdu
|
||||||
|
var rtlList = ["ar", "he", "fa", "ps", "ur"];
|
||||||
|
|
||||||
|
// use the short language code for "full" codes like 'ar-sa' (issue 5440)
|
||||||
|
var shortCode = gLanguage.split("-")[0];
|
||||||
|
|
||||||
|
return rtlList.includes(shortCode) ? "rtl" : "ltr";
|
||||||
|
},
|
||||||
|
|
||||||
|
getReadyState() {
|
||||||
|
return gReadyState;
|
||||||
|
},
|
||||||
|
|
||||||
|
setExternalLocalizerServices(externalLocalizerServices) {
|
||||||
|
gExternalLocalizerServices = externalLocalizerServices;
|
||||||
|
gLanguage = gExternalLocalizerServices.getLocale();
|
||||||
|
gReadyState = "complete";
|
||||||
|
},
|
||||||
|
|
||||||
|
// translate an element or document fragment
|
||||||
|
translate: translateFragment,
|
||||||
|
};
|
||||||
|
})(this);
|
253
external/builder/babel-plugin-pdfjs-preprocessor.mjs
vendored
253
external/builder/babel-plugin-pdfjs-preprocessor.mjs
vendored
@ -1,253 +0,0 @@
|
|||||||
import { types as t, transformSync } from "@babel/core";
|
|
||||||
import fs from "fs";
|
|
||||||
import { join as joinPaths } from "path";
|
|
||||||
import vm from "vm";
|
|
||||||
|
|
||||||
const PDFJS_PREPROCESSOR_NAME = "PDFJSDev";
|
|
||||||
const ROOT_PREFIX = "$ROOT/";
|
|
||||||
|
|
||||||
function isPDFJSPreprocessor(obj) {
|
|
||||||
return obj.type === "Identifier" && obj.name === PDFJS_PREPROCESSOR_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
function evalWithDefines(code, defines) {
|
|
||||||
if (!code || !code.trim()) {
|
|
||||||
throw new Error("No JavaScript expression given");
|
|
||||||
}
|
|
||||||
return vm.runInNewContext(code, defines, { displayErrors: false });
|
|
||||||
}
|
|
||||||
|
|
||||||
function handlePreprocessorAction(ctx, actionName, args, path) {
|
|
||||||
try {
|
|
||||||
const arg = args[0];
|
|
||||||
switch (actionName) {
|
|
||||||
case "test":
|
|
||||||
if (!t.isStringLiteral(arg)) {
|
|
||||||
throw new Error("No code for testing is given");
|
|
||||||
}
|
|
||||||
return !!evalWithDefines(arg.value, ctx.defines);
|
|
||||||
case "eval":
|
|
||||||
if (!t.isStringLiteral(arg)) {
|
|
||||||
throw new Error("No code for eval is given");
|
|
||||||
}
|
|
||||||
const result = evalWithDefines(arg.value, ctx.defines);
|
|
||||||
if (
|
|
||||||
typeof result === "boolean" ||
|
|
||||||
typeof result === "string" ||
|
|
||||||
typeof result === "number" ||
|
|
||||||
typeof result === "object"
|
|
||||||
) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "json":
|
|
||||||
if (!t.isStringLiteral(arg)) {
|
|
||||||
throw new Error("Path to JSON is not provided");
|
|
||||||
}
|
|
||||||
let jsonPath = arg.value;
|
|
||||||
if (jsonPath.startsWith(ROOT_PREFIX)) {
|
|
||||||
jsonPath = joinPaths(
|
|
||||||
ctx.rootPath,
|
|
||||||
jsonPath.substring(ROOT_PREFIX.length)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return JSON.parse(fs.readFileSync(jsonPath, "utf8"));
|
|
||||||
}
|
|
||||||
throw new Error("Unsupported action");
|
|
||||||
} catch (e) {
|
|
||||||
throw path.buildCodeFrameError(
|
|
||||||
"Could not process " +
|
|
||||||
PDFJS_PREPROCESSOR_NAME +
|
|
||||||
"." +
|
|
||||||
actionName +
|
|
||||||
": " +
|
|
||||||
e.message
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function babelPluginPDFJSPreprocessor(babel, ctx) {
|
|
||||||
return {
|
|
||||||
name: "babel-plugin-pdfjs-preprocessor",
|
|
||||||
manipulateOptions({ parserOpts }) {
|
|
||||||
parserOpts.attachComment = false;
|
|
||||||
},
|
|
||||||
visitor: {
|
|
||||||
"ExportNamedDeclaration|ImportDeclaration": ({ node }) => {
|
|
||||||
if (node.source && ctx.map?.[node.source.value]) {
|
|
||||||
node.source.value = ctx.map[node.source.value];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"IfStatement|ConditionalExpression": {
|
|
||||||
exit(path) {
|
|
||||||
const { node } = path;
|
|
||||||
if (t.isBooleanLiteral(node.test)) {
|
|
||||||
// if (true) stmt1; => stmt1
|
|
||||||
// if (false) stmt1; else stmt2; => stmt2
|
|
||||||
if (node.test.value === true) {
|
|
||||||
path.replaceWith(node.consequent);
|
|
||||||
} else if (node.alternate) {
|
|
||||||
path.replaceWith(node.alternate);
|
|
||||||
} else {
|
|
||||||
path.remove(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
UnaryExpression: {
|
|
||||||
exit(path) {
|
|
||||||
const { node } = path;
|
|
||||||
if (
|
|
||||||
node.operator === "typeof" &&
|
|
||||||
isPDFJSPreprocessor(node.argument)
|
|
||||||
) {
|
|
||||||
// typeof PDFJSDev => 'object'
|
|
||||||
path.replaceWith(t.stringLiteral("object"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (node.operator === "!" && t.isBooleanLiteral(node.argument)) {
|
|
||||||
// !true => false, !false => true
|
|
||||||
path.replaceWith(t.booleanLiteral(!node.argument.value));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
LogicalExpression: {
|
|
||||||
exit(path) {
|
|
||||||
const { node } = path;
|
|
||||||
if (!t.isBooleanLiteral(node.left)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (node.operator) {
|
|
||||||
case "&&":
|
|
||||||
// true && expr => expr
|
|
||||||
// false && expr => false
|
|
||||||
path.replaceWith(
|
|
||||||
node.left.value === true ? node.right : node.left
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
case "||":
|
|
||||||
// true || expr => true
|
|
||||||
// false || expr => expr
|
|
||||||
path.replaceWith(
|
|
||||||
node.left.value === true ? node.left : node.right
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
BinaryExpression: {
|
|
||||||
exit(path) {
|
|
||||||
const { node } = path;
|
|
||||||
switch (node.operator) {
|
|
||||||
case "==":
|
|
||||||
case "===":
|
|
||||||
case "!=":
|
|
||||||
case "!==":
|
|
||||||
if (t.isLiteral(node.left) && t.isLiteral(node.right)) {
|
|
||||||
// folding == and != check that can be statically evaluated
|
|
||||||
const { confident, value } = path.evaluate();
|
|
||||||
if (confident) {
|
|
||||||
path.replaceWith(t.booleanLiteral(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
CallExpression(path) {
|
|
||||||
const { node } = path;
|
|
||||||
if (
|
|
||||||
t.isMemberExpression(node.callee) &&
|
|
||||||
isPDFJSPreprocessor(node.callee.object) &&
|
|
||||||
t.isIdentifier(node.callee.property) &&
|
|
||||||
!node.callee.computed
|
|
||||||
) {
|
|
||||||
// PDFJSDev.xxxx(arg1, arg2, ...) => transform
|
|
||||||
const action = node.callee.property.name;
|
|
||||||
const result = handlePreprocessorAction(
|
|
||||||
ctx,
|
|
||||||
action,
|
|
||||||
node.arguments,
|
|
||||||
path
|
|
||||||
);
|
|
||||||
path.replaceWith(t.inherits(t.valueToNode(result), path.node));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (t.isIdentifier(node.callee, { name: "__non_webpack_import__" })) {
|
|
||||||
if (node.arguments.length !== 1) {
|
|
||||||
throw new Error("Invalid `__non_webpack_import__` usage.");
|
|
||||||
}
|
|
||||||
// Replace it with a standard `import`-call and
|
|
||||||
// ensure that Webpack will leave it alone.
|
|
||||||
const source = node.arguments[0];
|
|
||||||
source.leadingComments = [
|
|
||||||
{
|
|
||||||
type: "CommentBlock",
|
|
||||||
value: "webpackIgnore: true",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
path.replaceWith(t.importExpression(source));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
BlockStatement: {
|
|
||||||
// Visit node in post-order so that recursive flattening
|
|
||||||
// of blocks works correctly.
|
|
||||||
exit(path) {
|
|
||||||
const { node } = path;
|
|
||||||
|
|
||||||
let subExpressionIndex = 0;
|
|
||||||
while (subExpressionIndex < node.body.length) {
|
|
||||||
switch (node.body[subExpressionIndex].type) {
|
|
||||||
case "EmptyStatement":
|
|
||||||
// Removing empty statements from the blocks.
|
|
||||||
node.body.splice(subExpressionIndex, 1);
|
|
||||||
continue;
|
|
||||||
case "BlockStatement":
|
|
||||||
// Block statements inside a block are flattened
|
|
||||||
// into the parent one.
|
|
||||||
const subChildren = node.body[subExpressionIndex].body;
|
|
||||||
node.body.splice(subExpressionIndex, 1, ...subChildren);
|
|
||||||
subExpressionIndex += Math.max(subChildren.length - 1, 0);
|
|
||||||
continue;
|
|
||||||
case "ReturnStatement":
|
|
||||||
case "ThrowStatement":
|
|
||||||
// Removing dead code after return or throw.
|
|
||||||
node.body.splice(
|
|
||||||
subExpressionIndex + 1,
|
|
||||||
node.body.length - subExpressionIndex - 1
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
subExpressionIndex++;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Function: {
|
|
||||||
exit(path) {
|
|
||||||
if (!t.isBlockStatement(path.node.body)) {
|
|
||||||
// Arrow function with expression body
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { body } = path.node.body;
|
|
||||||
if (
|
|
||||||
body.length > 0 &&
|
|
||||||
t.isReturnStatement(body.at(-1), { argument: null })
|
|
||||||
) {
|
|
||||||
// Function body ends with return without arg -- removing it.
|
|
||||||
body.pop();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function preprocessPDFJSCode(ctx, content) {
|
|
||||||
return transformSync(content, {
|
|
||||||
configFile: false,
|
|
||||||
plugins: [[babelPluginPDFJSPreprocessor, ctx]],
|
|
||||||
}).code;
|
|
||||||
}
|
|
||||||
|
|
||||||
export { babelPluginPDFJSPreprocessor, preprocessPDFJSCode };
|
|
@ -1,6 +1,8 @@
|
|||||||
import fs from "fs";
|
"use strict";
|
||||||
import path from "path";
|
|
||||||
import vm from "vm";
|
const fs = require("fs"),
|
||||||
|
path = require("path"),
|
||||||
|
vm = require("vm");
|
||||||
|
|
||||||
const AllWhitespaceRegexp = /^\s+$/g;
|
const AllWhitespaceRegexp = /^\s+$/g;
|
||||||
|
|
||||||
@ -42,12 +44,6 @@ function preprocess(inFilename, outFilename, defines) {
|
|||||||
return content.replaceAll(
|
return content.replaceAll(
|
||||||
/^\s*@import\s+url\(([^)]+)\);\s*$/gm,
|
/^\s*@import\s+url\(([^)]+)\);\s*$/gm,
|
||||||
function (all, url) {
|
function (all, url) {
|
||||||
if (defines.GECKOVIEW) {
|
|
||||||
switch (url) {
|
|
||||||
case "annotation_editor_layer_builder.css":
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const file = path.join(path.dirname(baseUrl), url);
|
const file = path.join(path.dirname(baseUrl), url);
|
||||||
const imported = fs.readFileSync(file, "utf8").toString();
|
const imported = fs.readFileSync(file, "utf8").toString();
|
||||||
return expandCssImports(imported, file);
|
return expandCssImports(imported, file);
|
||||||
@ -204,19 +200,21 @@ function preprocess(inFilename, outFilename, defines) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (state === STATE_NONE) {
|
} else {
|
||||||
writeLine(line);
|
if (state === STATE_NONE) {
|
||||||
} else if (
|
writeLine(line);
|
||||||
(state === STATE_IF_TRUE || state === STATE_ELSE_TRUE) &&
|
} else if (
|
||||||
!stack.includes(STATE_IF_FALSE) &&
|
(state === STATE_IF_TRUE || state === STATE_ELSE_TRUE) &&
|
||||||
!stack.includes(STATE_ELSE_FALSE)
|
!stack.includes(STATE_IF_FALSE) &&
|
||||||
) {
|
!stack.includes(STATE_ELSE_FALSE)
|
||||||
writeLine(
|
) {
|
||||||
line
|
writeLine(
|
||||||
.replaceAll(/^\/\/|^<!--/g, " ")
|
line
|
||||||
.replaceAll(/(^\s*)\/\*/g, "$1 ")
|
.replaceAll(/^\/\/|^<!--/g, " ")
|
||||||
.replaceAll(/\*\/$|-->$/g, "")
|
.replaceAll(/(^\s*)\/\*/g, "$1 ")
|
||||||
);
|
.replaceAll(/\*\/$|-->$/g, "")
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (state !== STATE_NONE || stack.length !== 0) {
|
if (state !== STATE_NONE || stack.length !== 0) {
|
||||||
@ -228,5 +226,20 @@ function preprocess(inFilename, outFilename, defines) {
|
|||||||
fs.writeFileSync(outFilename, out.join("\n"));
|
fs.writeFileSync(outFilename, out.join("\n"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
exports.preprocess = preprocess;
|
||||||
|
|
||||||
export { preprocess };
|
/**
|
||||||
|
* Merge two defines arrays. Values in the second param will override values in
|
||||||
|
* the first.
|
||||||
|
*/
|
||||||
|
function merge(defaults, defines) {
|
||||||
|
const ret = Object.create(null);
|
||||||
|
for (const key in defaults) {
|
||||||
|
ret[key] = defaults[key];
|
||||||
|
}
|
||||||
|
for (const key in defines) {
|
||||||
|
ret[key] = defines[key];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
exports.merge = merge;
|
@ -1,10 +1,10 @@
|
|||||||
function test() {
|
function test() {
|
||||||
"test";
|
"test";
|
||||||
"1";
|
"1";
|
||||||
"2";
|
"2";
|
||||||
"3";
|
"3";
|
||||||
if ("test") {
|
if ("test") {
|
||||||
"5";
|
"5";
|
||||||
}
|
}
|
||||||
"4";
|
"4";
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
function f1() {
|
function f1() {
|
||||||
"1";
|
"1";
|
||||||
"2";
|
"2";
|
||||||
}
|
}
|
||||||
function f2() {
|
function f2() {
|
||||||
"1";
|
"1";
|
||||||
"2";
|
"2";
|
||||||
}
|
}
|
||||||
function f3() {
|
function f3() {
|
||||||
if ("1") {
|
if ("1") {
|
||||||
"1";
|
"1";
|
||||||
}
|
}
|
||||||
"2";
|
"2";
|
||||||
if ("3") {
|
if ("3") {
|
||||||
"4";
|
"4";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,6 @@ var i = true;
|
|||||||
var j = false;
|
var j = false;
|
||||||
var k = false;
|
var k = false;
|
||||||
var l = true;
|
var l = true;
|
||||||
var m = false;
|
var m = '1' === true;
|
||||||
var n = false;
|
var n = false;
|
||||||
var o = true;
|
var o = true;
|
||||||
|
@ -1,21 +1,13 @@
|
|||||||
function f1() {}
|
function f1() {
|
||||||
|
}
|
||||||
function f2() {
|
function f2() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
function f3() {
|
function f3() {
|
||||||
var i = 0;
|
var i = 0;
|
||||||
throw "test";
|
throw "test";
|
||||||
}
|
}
|
||||||
function f4() {
|
function f4() {
|
||||||
var i = 0;
|
var i = 0;
|
||||||
}
|
}
|
||||||
var obj = {
|
|
||||||
method1() {},
|
|
||||||
method2() {}
|
|
||||||
};
|
|
||||||
class C {
|
|
||||||
method1() {}
|
|
||||||
method2() {}
|
|
||||||
}
|
|
||||||
var arrow1 = () => {};
|
|
||||||
var arrow2 = () => {};
|
|
||||||
|
12
external/builder/fixtures_esprima/deadcode.js
vendored
12
external/builder/fixtures_esprima/deadcode.js
vendored
@ -23,15 +23,3 @@ function f4() {
|
|||||||
var j = 0;
|
var j = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var obj = {
|
|
||||||
method1() { return; var i = 0; },
|
|
||||||
method2() { return; },
|
|
||||||
};
|
|
||||||
|
|
||||||
class C {
|
|
||||||
method1() { return; var i = 0; }
|
|
||||||
method2() { return; }
|
|
||||||
}
|
|
||||||
|
|
||||||
var arrow1 = () => { return; var i = 0; };
|
|
||||||
var arrow2 = () => { return; };
|
|
||||||
|
@ -3,19 +3,11 @@ var b = true;
|
|||||||
var c = true;
|
var c = true;
|
||||||
var d = false;
|
var d = false;
|
||||||
var e = true;
|
var e = true;
|
||||||
var f = "text";
|
var f = 'text';
|
||||||
var g = {
|
var g = {
|
||||||
obj: {
|
"obj": { "i": 1 },
|
||||||
i: 1
|
"j": 2
|
||||||
},
|
|
||||||
j: 2
|
|
||||||
};
|
|
||||||
var h = {
|
|
||||||
test: "test"
|
|
||||||
};
|
};
|
||||||
|
var h = { 'test': 'test' };
|
||||||
var i = '0';
|
var i = '0';
|
||||||
var j = {
|
var j = { "i": 1 };
|
||||||
i: 1
|
|
||||||
};
|
|
||||||
var k = false;
|
|
||||||
var l = true;
|
|
||||||
|
2
external/builder/fixtures_esprima/evals.js
vendored
2
external/builder/fixtures_esprima/evals.js
vendored
@ -8,5 +8,3 @@ var g = PDFJSDev.eval('OBJ');
|
|||||||
var h = PDFJSDev.json('$ROOT/external/builder/fixtures_esprima/evals.json');
|
var h = PDFJSDev.json('$ROOT/external/builder/fixtures_esprima/evals.json');
|
||||||
var i = typeof PDFJSDev === 'undefined' ? PDFJSDev.eval('FALSE') : '0';
|
var i = typeof PDFJSDev === 'undefined' ? PDFJSDev.eval('FALSE') : '0';
|
||||||
var j = typeof PDFJSDev !== 'undefined' ? PDFJSDev.eval('OBJ.obj') : '0';
|
var j = typeof PDFJSDev !== 'undefined' ? PDFJSDev.eval('OBJ.obj') : '0';
|
||||||
var k = !PDFJSDev.test('TRUE');
|
|
||||||
var l = !PDFJSDev.test('FALSE');
|
|
||||||
|
2
external/builder/fixtures_esprima/evals.json
vendored
2
external/builder/fixtures_esprima/evals.json
vendored
@ -1 +1 @@
|
|||||||
{ "test": "test" }
|
{ 'test': 'test' }
|
@ -1,18 +1,17 @@
|
|||||||
if ('test') {
|
if ('test') {
|
||||||
"1";
|
"1";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
"1";
|
"1";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
"1";
|
"1";
|
||||||
}
|
}
|
||||||
|
;
|
||||||
{
|
{
|
||||||
"2";
|
"2";
|
||||||
}
|
}
|
||||||
|
;
|
||||||
if ('1') {
|
if ('1') {
|
||||||
"1";
|
"1";
|
||||||
}
|
|
||||||
function f1() {
|
|
||||||
"1";
|
|
||||||
}
|
}
|
||||||
|
9
external/builder/fixtures_esprima/ifs.js
vendored
9
external/builder/fixtures_esprima/ifs.js
vendored
@ -23,12 +23,3 @@ if (true && false) {
|
|||||||
if (true && false || '1') {
|
if (true && false || '1') {
|
||||||
"1";
|
"1";
|
||||||
}
|
}
|
||||||
|
|
||||||
function f1() {
|
|
||||||
if (true) {
|
|
||||||
"1";
|
|
||||||
}
|
|
||||||
if (false) {
|
|
||||||
"2";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
import { Test } from "import-name";
|
import { Test } from 'import-name';
|
||||||
import { Test2 } from './non-alias';
|
import { Test2 } from './non-alias';
|
||||||
export { Test3 } from "import-name";
|
export {
|
||||||
await import( /*webpackIgnore: true*/"./non-alias");
|
Test3
|
||||||
|
} from 'import-name';
|
||||||
|
var Imp = require('import-name');
|
||||||
|
var Imp2 = require('./non-alias');
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { Test } from 'import-alias';
|
import { Test } from 'import-alias';
|
||||||
import { Test2 } from './non-alias';
|
import { Test2 } from './non-alias';
|
||||||
export { Test3 } from 'import-alias';
|
export { Test3 } from 'import-alias';
|
||||||
await __non_webpack_import__("./non-alias");
|
var Imp = require('import-alias');
|
||||||
|
var Imp2 = require('./non-alias');
|
||||||
|
349
external/builder/preprocessor2.js
vendored
Normal file
349
external/builder/preprocessor2.js
vendored
Normal file
@ -0,0 +1,349 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const acorn = require("acorn");
|
||||||
|
const escodegen = require("@javascript-obfuscator/escodegen");
|
||||||
|
const vm = require("vm");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
const PDFJS_PREPROCESSOR_NAME = "PDFJSDev";
|
||||||
|
const ROOT_PREFIX = "$ROOT/";
|
||||||
|
const ACORN_ECMA_VERSION = 2022;
|
||||||
|
|
||||||
|
function isLiteral(obj, value) {
|
||||||
|
return obj.type === "Literal" && obj.value === value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isPDFJSPreprocessor(obj) {
|
||||||
|
return obj.type === "Identifier" && obj.name === PDFJS_PREPROCESSOR_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
function evalWithDefines(code, defines, loc) {
|
||||||
|
if (!code || !code.trim()) {
|
||||||
|
throw new Error("No JavaScript expression given");
|
||||||
|
}
|
||||||
|
return vm.runInNewContext(code, defines, { displayErrors: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
function handlePreprocessorAction(ctx, actionName, args, loc) {
|
||||||
|
try {
|
||||||
|
let arg;
|
||||||
|
switch (actionName) {
|
||||||
|
case "test":
|
||||||
|
arg = args[0];
|
||||||
|
if (!arg || arg.type !== "Literal" || typeof arg.value !== "string") {
|
||||||
|
throw new Error("No code for testing is given");
|
||||||
|
}
|
||||||
|
const isTrue = !!evalWithDefines(arg.value, ctx.defines);
|
||||||
|
return { type: "Literal", value: isTrue, loc };
|
||||||
|
case "eval":
|
||||||
|
arg = args[0];
|
||||||
|
if (!arg || arg.type !== "Literal" || typeof arg.value !== "string") {
|
||||||
|
throw new Error("No code for eval is given");
|
||||||
|
}
|
||||||
|
const result = evalWithDefines(arg.value, ctx.defines);
|
||||||
|
if (
|
||||||
|
typeof result === "boolean" ||
|
||||||
|
typeof result === "string" ||
|
||||||
|
typeof result === "number"
|
||||||
|
) {
|
||||||
|
return { type: "Literal", value: result, loc };
|
||||||
|
}
|
||||||
|
if (typeof result === "object") {
|
||||||
|
const parsedObj = acorn.parse("(" + JSON.stringify(result) + ")", {
|
||||||
|
ecmaVersion: ACORN_ECMA_VERSION,
|
||||||
|
});
|
||||||
|
parsedObj.body[0].expression.loc = loc;
|
||||||
|
return parsedObj.body[0].expression;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "json":
|
||||||
|
arg = args[0];
|
||||||
|
if (!arg || arg.type !== "Literal" || typeof arg.value !== "string") {
|
||||||
|
throw new Error("Path to JSON is not provided");
|
||||||
|
}
|
||||||
|
let jsonPath = arg.value;
|
||||||
|
if (jsonPath.indexOf(ROOT_PREFIX) === 0) {
|
||||||
|
jsonPath = path.join(
|
||||||
|
ctx.rootPath,
|
||||||
|
jsonPath.substring(ROOT_PREFIX.length)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const jsonContent = fs.readFileSync(jsonPath).toString();
|
||||||
|
const parsedJSON = acorn.parse("(" + jsonContent + ")", {
|
||||||
|
ecmaVersion: ACORN_ECMA_VERSION,
|
||||||
|
});
|
||||||
|
parsedJSON.body[0].expression.loc = loc;
|
||||||
|
return parsedJSON.body[0].expression;
|
||||||
|
}
|
||||||
|
throw new Error("Unsupported action");
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error(
|
||||||
|
"Could not process " +
|
||||||
|
PDFJS_PREPROCESSOR_NAME +
|
||||||
|
"." +
|
||||||
|
actionName +
|
||||||
|
" at " +
|
||||||
|
JSON.stringify(loc) +
|
||||||
|
"\n" +
|
||||||
|
e.name +
|
||||||
|
": " +
|
||||||
|
e.message
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function postprocessNode(ctx, node) {
|
||||||
|
switch (node.type) {
|
||||||
|
case "ExportNamedDeclaration":
|
||||||
|
case "ImportDeclaration":
|
||||||
|
if (
|
||||||
|
node.source &&
|
||||||
|
node.source.type === "Literal" &&
|
||||||
|
ctx.map &&
|
||||||
|
ctx.map[node.source.value]
|
||||||
|
) {
|
||||||
|
const newValue = ctx.map[node.source.value];
|
||||||
|
node.source.value = node.source.raw = newValue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "IfStatement":
|
||||||
|
if (isLiteral(node.test, true)) {
|
||||||
|
// if (true) stmt1; => stmt1
|
||||||
|
return node.consequent;
|
||||||
|
} else if (isLiteral(node.test, false)) {
|
||||||
|
// if (false) stmt1; else stmt2; => stmt2
|
||||||
|
return node.alternate || { type: "EmptyStatement", loc: node.loc };
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "ConditionalExpression":
|
||||||
|
if (isLiteral(node.test, true)) {
|
||||||
|
// true ? stmt1 : stmt2 => stmt1
|
||||||
|
return node.consequent;
|
||||||
|
} else if (isLiteral(node.test, false)) {
|
||||||
|
// false ? stmt1 : stmt2 => stmt2
|
||||||
|
return node.alternate;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "UnaryExpression":
|
||||||
|
if (node.operator === "typeof" && isPDFJSPreprocessor(node.argument)) {
|
||||||
|
// typeof PDFJSDev => 'object'
|
||||||
|
return { type: "Literal", value: "object", loc: node.loc };
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
node.operator === "!" &&
|
||||||
|
node.argument.type === "Literal" &&
|
||||||
|
typeof node.argument.value === "boolean"
|
||||||
|
) {
|
||||||
|
// !true => false, !false => true
|
||||||
|
return { type: "Literal", value: !node.argument.value, loc: node.loc };
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "LogicalExpression":
|
||||||
|
switch (node.operator) {
|
||||||
|
case "&&":
|
||||||
|
if (isLiteral(node.left, true)) {
|
||||||
|
return node.right;
|
||||||
|
}
|
||||||
|
if (isLiteral(node.left, false)) {
|
||||||
|
return node.left;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "||":
|
||||||
|
if (isLiteral(node.left, true)) {
|
||||||
|
return node.left;
|
||||||
|
}
|
||||||
|
if (isLiteral(node.left, false)) {
|
||||||
|
return node.right;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "BinaryExpression":
|
||||||
|
switch (node.operator) {
|
||||||
|
case "==":
|
||||||
|
case "===":
|
||||||
|
case "!=":
|
||||||
|
case "!==":
|
||||||
|
if (
|
||||||
|
node.left.type === "Literal" &&
|
||||||
|
node.right.type === "Literal" &&
|
||||||
|
typeof node.left.value === typeof node.right.value
|
||||||
|
) {
|
||||||
|
// folding two literals == and != check
|
||||||
|
switch (typeof node.left.value) {
|
||||||
|
case "string":
|
||||||
|
case "boolean":
|
||||||
|
case "number":
|
||||||
|
const equal = node.left.value === node.right.value;
|
||||||
|
return {
|
||||||
|
type: "Literal",
|
||||||
|
value: (node.operator[0] === "=") === equal,
|
||||||
|
loc: node.loc,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "CallExpression":
|
||||||
|
if (
|
||||||
|
node.callee.type === "MemberExpression" &&
|
||||||
|
isPDFJSPreprocessor(node.callee.object) &&
|
||||||
|
node.callee.property.type === "Identifier"
|
||||||
|
) {
|
||||||
|
// PDFJSDev.xxxx(arg1, arg2, ...) => transform
|
||||||
|
const action = node.callee.property.name;
|
||||||
|
return handlePreprocessorAction(ctx, action, node.arguments, node.loc);
|
||||||
|
}
|
||||||
|
// require('string')
|
||||||
|
if (
|
||||||
|
node.callee.type === "Identifier" &&
|
||||||
|
node.callee.name === "require" &&
|
||||||
|
node.arguments.length === 1 &&
|
||||||
|
node.arguments[0].type === "Literal" &&
|
||||||
|
ctx.map &&
|
||||||
|
ctx.map[node.arguments[0].value]
|
||||||
|
) {
|
||||||
|
const requireName = node.arguments[0];
|
||||||
|
requireName.value = requireName.raw = ctx.map[requireName.value];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "BlockStatement":
|
||||||
|
let subExpressionIndex = 0;
|
||||||
|
while (subExpressionIndex < node.body.length) {
|
||||||
|
switch (node.body[subExpressionIndex].type) {
|
||||||
|
case "EmptyStatement":
|
||||||
|
// Removing empty statements from the blocks.
|
||||||
|
node.body.splice(subExpressionIndex, 1);
|
||||||
|
continue;
|
||||||
|
case "BlockStatement":
|
||||||
|
// Block statements inside a block are moved to the parent one.
|
||||||
|
const subChildren = node.body[subExpressionIndex].body;
|
||||||
|
Array.prototype.splice.apply(node.body, [
|
||||||
|
subExpressionIndex,
|
||||||
|
1,
|
||||||
|
...subChildren,
|
||||||
|
]);
|
||||||
|
subExpressionIndex += Math.max(subChildren.length - 1, 0);
|
||||||
|
continue;
|
||||||
|
case "ReturnStatement":
|
||||||
|
case "ThrowStatement":
|
||||||
|
// Removing dead code after return or throw.
|
||||||
|
node.body.splice(
|
||||||
|
subExpressionIndex + 1,
|
||||||
|
node.body.length - subExpressionIndex - 1
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
subExpressionIndex++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "FunctionDeclaration":
|
||||||
|
case "FunctionExpression":
|
||||||
|
const block = node.body;
|
||||||
|
if (
|
||||||
|
block.body.length > 0 &&
|
||||||
|
block.body.at(-1).type === "ReturnStatement" &&
|
||||||
|
!block.body.at(-1).argument
|
||||||
|
) {
|
||||||
|
// Function body ends with return without arg -- removing it.
|
||||||
|
block.body.pop();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fixComments(ctx, node) {
|
||||||
|
if (!ctx.saveComments) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Fixes double comments in the escodegen output.
|
||||||
|
delete node.trailingComments;
|
||||||
|
// Removes ESLint and other service comments.
|
||||||
|
if (node.leadingComments) {
|
||||||
|
const CopyrightRegExp = /\bcopyright\b/i;
|
||||||
|
const BlockCommentRegExp = /^\s*(globals|eslint|falls through)\b/;
|
||||||
|
const LineCommentRegExp = /^\s*eslint\b/;
|
||||||
|
|
||||||
|
let i = 0;
|
||||||
|
while (i < node.leadingComments.length) {
|
||||||
|
const type = node.leadingComments[i].type;
|
||||||
|
const value = node.leadingComments[i].value;
|
||||||
|
|
||||||
|
if (ctx.saveComments === "copyright") {
|
||||||
|
// Remove all comments, except Copyright notices and License headers.
|
||||||
|
if (!(type === "Block" && CopyrightRegExp.test(value))) {
|
||||||
|
node.leadingComments.splice(i, 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
(type === "Block" && BlockCommentRegExp.test(value)) ||
|
||||||
|
(type === "Line" && LineCommentRegExp.test(value))
|
||||||
|
) {
|
||||||
|
node.leadingComments.splice(i, 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function traverseTree(ctx, node) {
|
||||||
|
// generic node processing
|
||||||
|
for (const i in node) {
|
||||||
|
const child = node[i];
|
||||||
|
if (typeof child === "object" && child !== null && child.type) {
|
||||||
|
const result = traverseTree(ctx, child);
|
||||||
|
if (result !== child) {
|
||||||
|
node[i] = result;
|
||||||
|
}
|
||||||
|
} else if (Array.isArray(child)) {
|
||||||
|
child.forEach(function (childItem, index) {
|
||||||
|
if (
|
||||||
|
typeof childItem === "object" &&
|
||||||
|
childItem !== null &&
|
||||||
|
childItem.type
|
||||||
|
) {
|
||||||
|
const result = traverseTree(ctx, childItem);
|
||||||
|
if (result !== childItem) {
|
||||||
|
child[index] = result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node = postprocessNode(ctx, node) || node;
|
||||||
|
|
||||||
|
fixComments(ctx, node);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
function preprocessPDFJSCode(ctx, code) {
|
||||||
|
const format = ctx.format || {
|
||||||
|
indent: {
|
||||||
|
style: " ",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const parseOptions = {
|
||||||
|
ecmaVersion: ACORN_ECMA_VERSION,
|
||||||
|
locations: true,
|
||||||
|
sourceFile: ctx.sourceFile,
|
||||||
|
sourceType: "module",
|
||||||
|
};
|
||||||
|
const codegenOptions = {
|
||||||
|
format,
|
||||||
|
parse(input) {
|
||||||
|
return acorn.parse(input, { ecmaVersion: ACORN_ECMA_VERSION });
|
||||||
|
},
|
||||||
|
sourceMap: ctx.sourceMap,
|
||||||
|
sourceMapWithCode: ctx.sourceMap,
|
||||||
|
};
|
||||||
|
const syntax = acorn.parse(code, parseOptions);
|
||||||
|
traverseTree(ctx, syntax);
|
||||||
|
return escodegen.generate(syntax, codegenOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.preprocessPDFJSCode = preprocessPDFJSCode;
|
@ -1,9 +1,8 @@
|
|||||||
import * as builder from "./builder.mjs";
|
"use strict";
|
||||||
import { fileURLToPath } from "url";
|
|
||||||
import fs from "fs";
|
|
||||||
import path from "path";
|
|
||||||
|
|
||||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
const builder = require("./builder.js");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
let errors = 0;
|
let errors = 0;
|
||||||
|
|
||||||
@ -42,12 +41,6 @@ files.forEach(function (expectationFilename) {
|
|||||||
if (out !== expectation) {
|
if (out !== expectation) {
|
||||||
errors++;
|
errors++;
|
||||||
|
|
||||||
// Allow regenerating the expected output using
|
|
||||||
// OVERWRITE=true node ./external/builder/test-fixtures.mjs
|
|
||||||
if (process.env.OVERWRITE) {
|
|
||||||
fs.writeFileSync(expectationFilename, out + "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Assertion failed for " + inFilename);
|
console.log("Assertion failed for " + inFilename);
|
||||||
console.log("--------------------------------------------------");
|
console.log("--------------------------------------------------");
|
||||||
console.log("EXPECTED:");
|
console.log("EXPECTED:");
|
@ -1,9 +1,8 @@
|
|||||||
import { fileURLToPath } from "url";
|
"use strict";
|
||||||
import fs from "fs";
|
|
||||||
import path from "path";
|
|
||||||
import { preprocessPDFJSCode } from "./babel-plugin-pdfjs-preprocessor.mjs";
|
|
||||||
|
|
||||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
const p2 = require("./preprocessor2.js");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
let errors = 0;
|
let errors = 0;
|
||||||
|
|
||||||
@ -41,19 +40,13 @@ files.forEach(function (expectationFilename) {
|
|||||||
};
|
};
|
||||||
let out;
|
let out;
|
||||||
try {
|
try {
|
||||||
out = preprocessPDFJSCode(ctx, input);
|
out = p2.preprocessPDFJSCode(ctx, input);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
out = ("Error: " + e.message).replaceAll(/^/gm, "//");
|
out = ("Error: " + e.message).replaceAll(/^/gm, "//");
|
||||||
}
|
}
|
||||||
if (out !== expectation) {
|
if (out !== expectation) {
|
||||||
errors++;
|
errors++;
|
||||||
|
|
||||||
// Allow regenerating the expected output using
|
|
||||||
// OVERWRITE=true node ./external/builder/test-fixtures_esprima.mjs
|
|
||||||
if (process.env.OVERWRITE) {
|
|
||||||
fs.writeFileSync(expectationFilename, out + "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Assertion failed for " + inFilename);
|
console.log("Assertion failed for " + inFilename);
|
||||||
console.log("--------------------------------------------------");
|
console.log("--------------------------------------------------");
|
||||||
console.log("EXPECTED:");
|
console.log("EXPECTED:");
|
@ -13,10 +13,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import fs from "fs";
|
const fs = require("fs");
|
||||||
import { optimizeCMap } from "./optimize.mjs";
|
const path = require("path");
|
||||||
import { parseAdobeCMap } from "./parse.mjs";
|
const parseAdobeCMap = require("./parse.js").parseAdobeCMap;
|
||||||
import path from "path";
|
const optimizeCMap = require("./optimize.js").optimizeCMap;
|
||||||
|
|
||||||
function compressCmap(srcPath, destPath, verify) {
|
function compressCmap(srcPath, destPath, verify) {
|
||||||
const content = fs.readFileSync(srcPath).toString();
|
const content = fs.readFileSync(srcPath).toString();
|
||||||
@ -469,7 +469,7 @@ function incHex(a) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
function compressCmaps(src, dest, verify) {
|
exports.compressCmaps = function (src, dest, verify) {
|
||||||
const files = fs.readdirSync(src).filter(function (fn) {
|
const files = fs.readdirSync(src).filter(function (fn) {
|
||||||
return !fn.includes("."); // skipping files with the extension
|
return !fn.includes("."); // skipping files with the extension
|
||||||
});
|
});
|
||||||
@ -489,6 +489,4 @@ function compressCmaps(src, dest, verify) {
|
|||||||
"%"
|
"%"
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
export { compressCmaps };
|
|
@ -13,7 +13,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function optimizeCMap(data) {
|
exports.optimizeCMap = function (data) {
|
||||||
let i = 1;
|
let i = 1;
|
||||||
while (i < data.body.length) {
|
while (i < data.body.length) {
|
||||||
if (data.body[i - 1].type === data.body[i].type) {
|
if (data.body[i - 1].type === data.body[i].type) {
|
||||||
@ -206,7 +206,7 @@ function optimizeCMap(data) {
|
|||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
function incHex(a) {
|
function incHex(a) {
|
||||||
let c = 1,
|
let c = 1,
|
||||||
@ -223,5 +223,3 @@ function incHex(a) {
|
|||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { optimizeCMap };
|
|
@ -13,7 +13,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function parseAdobeCMap(content) {
|
exports.parseAdobeCMap = function (content) {
|
||||||
let m = /(\bbegincmap\b[\s\S]*?)\bendcmap\b/.exec(content);
|
let m = /(\bbegincmap\b[\s\S]*?)\bendcmap\b/.exec(content);
|
||||||
if (!m) {
|
if (!m) {
|
||||||
throw new Error("cmap was not found");
|
throw new Error("cmap was not found");
|
||||||
@ -100,6 +100,4 @@ function parseAdobeCMap(content) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
};
|
||||||
|
|
||||||
export { parseAdobeCMap };
|
|
1
external/dist/legacy/web/pdf_viewer.d.mts
vendored
1
external/dist/legacy/web/pdf_viewer.d.mts
vendored
@ -1 +0,0 @@
|
|||||||
export * from "../../types/web/pdf_viewer.component.js";
|
|
1
external/dist/legacy/web/pdf_viewer.d.ts
vendored
Normal file
1
external/dist/legacy/web/pdf_viewer.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from "../../types/web/pdf_viewer.component";
|
1
external/dist/web/pdf_viewer.d.mts
vendored
1
external/dist/web/pdf_viewer.d.mts
vendored
@ -1 +0,0 @@
|
|||||||
export * from "../types/web/pdf_viewer.component.js";
|
|
1
external/dist/web/pdf_viewer.d.ts
vendored
Normal file
1
external/dist/web/pdf_viewer.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from "../types/web/pdf_viewer.component";
|
@ -12,15 +12,15 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/* eslint-disable import/no-unresolved */
|
|
||||||
|
|
||||||
import { GlobalWorkerOptions } from "./build/pdf.mjs";
|
"use strict";
|
||||||
|
|
||||||
|
const pdfjs = require("./build/pdf.js");
|
||||||
|
|
||||||
if (typeof window !== "undefined" && "Worker" in window) {
|
if (typeof window !== "undefined" && "Worker" in window) {
|
||||||
GlobalWorkerOptions.workerPort = new Worker(
|
pdfjs.GlobalWorkerOptions.workerPort = new Worker(
|
||||||
new URL("./build/pdf.worker.mjs", import.meta.url),
|
new URL("./build/pdf.worker.js", import.meta.url)
|
||||||
{ type: "module" }
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export * from "./build/pdf.mjs";
|
module.exports = pdfjs;
|
151
external/importL10n/locales.js
vendored
Normal file
151
external/importL10n/locales.js
vendored
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/* Copyright 2012 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";
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const https = require("https");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
// Fetches all languages that have an *active* translation in mozilla-central.
|
||||||
|
// This is used in gulpfile.js for the `importl10n` command.
|
||||||
|
|
||||||
|
const DEFAULT_LOCALE = "en-US";
|
||||||
|
|
||||||
|
const EXCLUDE_LANG_CODES = ["ca-valencia", "ja-JP-mac"];
|
||||||
|
|
||||||
|
function normalizeText(s) {
|
||||||
|
return s.replaceAll(/\r\n?/g, "\n").replaceAll("\uFEFF", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadLanguageCodes() {
|
||||||
|
console.log("Downloading language codes...\n");
|
||||||
|
|
||||||
|
const ALL_LOCALES =
|
||||||
|
"https://hg.mozilla.org/mozilla-central/raw-file/tip/browser/locales/all-locales";
|
||||||
|
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
https.get(ALL_LOCALES, function (response) {
|
||||||
|
if (response.statusCode === 200) {
|
||||||
|
let content = "";
|
||||||
|
response.setEncoding("utf8");
|
||||||
|
response.on("data", function (chunk) {
|
||||||
|
content += chunk;
|
||||||
|
});
|
||||||
|
response.on("end", function () {
|
||||||
|
content = content.trim(); // Remove any leading/trailing white-space.
|
||||||
|
const langCodes = normalizeText(content).split("\n");
|
||||||
|
// Remove all locales that we don't want to download below.
|
||||||
|
for (const langCode of [DEFAULT_LOCALE, ...EXCLUDE_LANG_CODES]) {
|
||||||
|
const i = langCodes.indexOf(langCode);
|
||||||
|
if (i > -1) {
|
||||||
|
langCodes.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve(langCodes);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
resolve([]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadLanguageFiles(root, langCode) {
|
||||||
|
console.log("Downloading " + langCode + "...");
|
||||||
|
|
||||||
|
// Constants for constructing the URLs. Translations are taken from the
|
||||||
|
// Nightly channel as those are the most recent ones.
|
||||||
|
const MOZ_CENTRAL_ROOT = "https://hg.mozilla.org/l10n-central/";
|
||||||
|
const MOZ_CENTRAL_PDFJS_DIR = "/raw-file/default/browser/pdfviewer/";
|
||||||
|
|
||||||
|
// Defines which files to download for each language.
|
||||||
|
const files = ["viewer.properties"];
|
||||||
|
let downloadsLeft = files.length;
|
||||||
|
|
||||||
|
const outputDir = path.join(root, langCode);
|
||||||
|
if (!fs.existsSync(outputDir)) {
|
||||||
|
fs.mkdirSync(outputDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
// Download the necessary files for this language.
|
||||||
|
files.forEach(function (fileName) {
|
||||||
|
const outputPath = path.join(outputDir, fileName);
|
||||||
|
const url =
|
||||||
|
MOZ_CENTRAL_ROOT + langCode + MOZ_CENTRAL_PDFJS_DIR + fileName;
|
||||||
|
|
||||||
|
https.get(url, function (response) {
|
||||||
|
// Not all files exist for each language. Files without translations
|
||||||
|
// have been removed (https://bugzilla.mozilla.org/show_bug.cgi?id=1443175).
|
||||||
|
if (response.statusCode === 200) {
|
||||||
|
let content = "";
|
||||||
|
response.setEncoding("utf8");
|
||||||
|
response.on("data", function (chunk) {
|
||||||
|
content += chunk;
|
||||||
|
});
|
||||||
|
response.on("end", function () {
|
||||||
|
fs.writeFileSync(outputPath, normalizeText(content), "utf8");
|
||||||
|
if (--downloadsLeft === 0) {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (--downloadsLeft === 0) {
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadL10n(root, callback) {
|
||||||
|
const langCodes = await downloadLanguageCodes();
|
||||||
|
|
||||||
|
for (const langCode of langCodes) {
|
||||||
|
if (!langCode) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
await downloadLanguageFiles(root, langCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
const removeCodes = [];
|
||||||
|
for (const entry of fs.readdirSync(root)) {
|
||||||
|
const dirPath = path.join(root, entry),
|
||||||
|
stat = fs.lstatSync(dirPath);
|
||||||
|
|
||||||
|
if (
|
||||||
|
stat.isDirectory() &&
|
||||||
|
entry !== DEFAULT_LOCALE &&
|
||||||
|
!langCodes.includes(entry)
|
||||||
|
) {
|
||||||
|
removeCodes.push(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (removeCodes.length) {
|
||||||
|
console.log(
|
||||||
|
"\nConsider removing the following unmaintained locales:\n" +
|
||||||
|
removeCodes.join(", ") +
|
||||||
|
"\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.downloadL10n = downloadL10n;
|
115
external/importL10n/locales.mjs
vendored
115
external/importL10n/locales.mjs
vendored
@ -1,115 +0,0 @@
|
|||||||
/* Copyright 2012 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import fs from "fs";
|
|
||||||
import path from "path";
|
|
||||||
|
|
||||||
// Fetches all languages that have an *active* translation in mozilla-central.
|
|
||||||
// This is used in gulpfile.js for the `importl10n` command.
|
|
||||||
|
|
||||||
const DEFAULT_LOCALE = "en-US";
|
|
||||||
|
|
||||||
const EXCLUDE_LANG_CODES = new Set(["ca-valencia", "ja-JP-mac"]);
|
|
||||||
|
|
||||||
function normalizeText(s) {
|
|
||||||
return s.replaceAll(/\r\n?/g, "\n").replaceAll("\uFEFF", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
async function downloadLanguageCodes() {
|
|
||||||
console.log("Downloading language codes...\n");
|
|
||||||
|
|
||||||
const ALL_LOCALES =
|
|
||||||
"https://hg.mozilla.org/mozilla-central/raw-file/tip/browser/locales/all-locales";
|
|
||||||
|
|
||||||
const response = await fetch(ALL_LOCALES);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(response.statusText);
|
|
||||||
}
|
|
||||||
const content = await response.text();
|
|
||||||
|
|
||||||
// Remove any leading/trailing white-space.
|
|
||||||
const langCodes = normalizeText(content.trim()).split("\n");
|
|
||||||
// Remove all locales that we don't want to download below.
|
|
||||||
return langCodes.filter(
|
|
||||||
langCode => langCode !== DEFAULT_LOCALE && !EXCLUDE_LANG_CODES.has(langCode)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function downloadLanguageFiles(root, langCode) {
|
|
||||||
console.log(`Downloading ${langCode}...`);
|
|
||||||
|
|
||||||
// Constants for constructing the URLs. Translations are taken from the
|
|
||||||
// Nightly channel as those are the most recent ones.
|
|
||||||
const MOZ_CENTRAL_ROOT = "https://hg.mozilla.org/l10n-central/";
|
|
||||||
const MOZ_CENTRAL_PDFJS_DIR = "/raw-file/default/toolkit/toolkit/pdfviewer/";
|
|
||||||
|
|
||||||
// Defines which files to download for each language.
|
|
||||||
const files = ["viewer.ftl"];
|
|
||||||
|
|
||||||
const outputDir = path.join(root, langCode);
|
|
||||||
if (!fs.existsSync(outputDir)) {
|
|
||||||
fs.mkdirSync(outputDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Download the necessary files for this language.
|
|
||||||
for (const fileName of files) {
|
|
||||||
const outputPath = path.join(outputDir, fileName);
|
|
||||||
const url = MOZ_CENTRAL_ROOT + langCode + MOZ_CENTRAL_PDFJS_DIR + fileName;
|
|
||||||
|
|
||||||
const response = await fetch(url);
|
|
||||||
if (!response.ok) {
|
|
||||||
// Not all files exist for each language. Files without translations
|
|
||||||
// have been removed (https://bugzilla.mozilla.org/show_bug.cgi?id=1443175).
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const content = await response.text();
|
|
||||||
|
|
||||||
fs.writeFileSync(outputPath, normalizeText(content), "utf8");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function downloadL10n(root) {
|
|
||||||
const langCodes = await downloadLanguageCodes();
|
|
||||||
|
|
||||||
for (const langCode of langCodes) {
|
|
||||||
if (!langCode) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
await downloadLanguageFiles(root, langCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
const removeCodes = [];
|
|
||||||
for (const entry of fs.readdirSync(root)) {
|
|
||||||
const dirPath = path.join(root, entry),
|
|
||||||
stat = fs.lstatSync(dirPath);
|
|
||||||
|
|
||||||
if (
|
|
||||||
stat.isDirectory() &&
|
|
||||||
entry !== DEFAULT_LOCALE &&
|
|
||||||
!langCodes.includes(entry)
|
|
||||||
) {
|
|
||||||
removeCodes.push(entry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (removeCodes.length) {
|
|
||||||
console.log(
|
|
||||||
"\nConsider removing the following unmaintained locales:\n" +
|
|
||||||
removeCodes.join(", ") +
|
|
||||||
"\n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { downloadL10n };
|
|
49
external/quickjs/quickjs-eval.js
vendored
49
external/quickjs/quickjs-eval.js
vendored
File diff suppressed because one or more lines are too long
3
external/webL10n/README.md
vendored
Normal file
3
external/webL10n/README.md
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
The source code for the library can be found at
|
||||||
|
|
||||||
|
https://github.com/fabi1cazenave/webL10n
|
1029
external/webL10n/l10n.js
vendored
Normal file
1029
external/webL10n/l10n.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
43
external/webpack/pdfjsdev-loader.js
vendored
Normal file
43
external/webpack/pdfjsdev-loader.js
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* 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";
|
||||||
|
|
||||||
|
const preprocessor2 = require("../builder/preprocessor2.js");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
module.exports = function (source) {
|
||||||
|
// Options must be specified, ignoring request if not.
|
||||||
|
if (!this.query || typeof this.query !== "object") {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
this.cacheable();
|
||||||
|
|
||||||
|
const filePath = this.resourcePath;
|
||||||
|
const context = this.rootContext;
|
||||||
|
const sourcePath = path.relative(context, filePath).split(path.sep).join("/");
|
||||||
|
|
||||||
|
const ctx = Object.create(this.query);
|
||||||
|
ctx.sourceMap = true;
|
||||||
|
ctx.sourceFile = sourcePath;
|
||||||
|
|
||||||
|
const callback = this.callback;
|
||||||
|
const sourceAndMap = preprocessor2.preprocessPDFJSCode(ctx, source);
|
||||||
|
const map = sourceAndMap.map.toJSON();
|
||||||
|
// escodegen does not embed source -- setting map's sourcesContent.
|
||||||
|
map.sourcesContent = [source];
|
||||||
|
callback(null, sourceAndMap.code, map);
|
||||||
|
return undefined;
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
@ -1,225 +0,0 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
|
|
||||||
## Main toolbar buttons (tooltips and alt text for images)
|
|
||||||
|
|
||||||
pdfjs-previous-button =
|
|
||||||
.title = Pot buk mukato
|
|
||||||
pdfjs-previous-button-label = Mukato
|
|
||||||
pdfjs-next-button =
|
|
||||||
.title = Pot buk malubo
|
|
||||||
pdfjs-next-button-label = Malubo
|
|
||||||
# .title: Tooltip for the pageNumber input.
|
|
||||||
pdfjs-page-input =
|
|
||||||
.title = Pot buk
|
|
||||||
# Variables:
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
# This string follows an input field with the number of the page currently displayed.
|
|
||||||
pdfjs-of-pages = pi { $pagesCount }
|
|
||||||
# Variables:
|
|
||||||
# $pageNumber (Number) - the currently visible page
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
pdfjs-page-of-pages = ({ $pageNumber } me { $pagesCount })
|
|
||||||
pdfjs-zoom-out-button =
|
|
||||||
.title = Jwik Matidi
|
|
||||||
pdfjs-zoom-out-button-label = Jwik Matidi
|
|
||||||
pdfjs-zoom-in-button =
|
|
||||||
.title = Kwot Madit
|
|
||||||
pdfjs-zoom-in-button-label = Kwot Madit
|
|
||||||
pdfjs-zoom-select =
|
|
||||||
.title = Kwoti
|
|
||||||
pdfjs-presentation-mode-button =
|
|
||||||
.title = Lokke i kit me tyer
|
|
||||||
pdfjs-presentation-mode-button-label = Kit me tyer
|
|
||||||
pdfjs-open-file-button =
|
|
||||||
.title = Yab Pwail
|
|
||||||
pdfjs-open-file-button-label = Yab
|
|
||||||
pdfjs-print-button =
|
|
||||||
.title = Go
|
|
||||||
pdfjs-print-button-label = Go
|
|
||||||
|
|
||||||
## Secondary toolbar and context menu
|
|
||||||
|
|
||||||
pdfjs-tools-button =
|
|
||||||
.title = Gintic
|
|
||||||
pdfjs-tools-button-label = Gintic
|
|
||||||
pdfjs-first-page-button =
|
|
||||||
.title = Cit i pot buk mukwongo
|
|
||||||
pdfjs-first-page-button-label = Cit i pot buk mukwongo
|
|
||||||
pdfjs-last-page-button =
|
|
||||||
.title = Cit i pot buk magiko
|
|
||||||
pdfjs-last-page-button-label = Cit i pot buk magiko
|
|
||||||
pdfjs-page-rotate-cw-button =
|
|
||||||
.title = Wire i tung lacuc
|
|
||||||
pdfjs-page-rotate-cw-button-label = Wire i tung lacuc
|
|
||||||
pdfjs-page-rotate-ccw-button =
|
|
||||||
.title = Wire i tung lacam
|
|
||||||
pdfjs-page-rotate-ccw-button-label = Wire i tung lacam
|
|
||||||
pdfjs-cursor-text-select-tool-button =
|
|
||||||
.title = Cak gitic me yero coc
|
|
||||||
pdfjs-cursor-text-select-tool-button-label = Gitic me yero coc
|
|
||||||
pdfjs-cursor-hand-tool-button =
|
|
||||||
.title = Cak gitic me cing
|
|
||||||
pdfjs-cursor-hand-tool-button-label = Gitic cing
|
|
||||||
|
|
||||||
## Document properties dialog
|
|
||||||
|
|
||||||
pdfjs-document-properties-button =
|
|
||||||
.title = Jami me gin acoya…
|
|
||||||
pdfjs-document-properties-button-label = Jami me gin acoya…
|
|
||||||
pdfjs-document-properties-file-name = Nying pwail:
|
|
||||||
pdfjs-document-properties-file-size = Dit pa pwail:
|
|
||||||
# Variables:
|
|
||||||
# $size_kb (Number) - the PDF file size in kilobytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes)
|
|
||||||
# Variables:
|
|
||||||
# $size_mb (Number) - the PDF file size in megabytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes)
|
|
||||||
pdfjs-document-properties-title = Wiye:
|
|
||||||
pdfjs-document-properties-author = Ngat mucoyo:
|
|
||||||
pdfjs-document-properties-subject = Subjek:
|
|
||||||
pdfjs-document-properties-keywords = Lok mapire tek:
|
|
||||||
pdfjs-document-properties-creation-date = Nino dwe me cwec:
|
|
||||||
pdfjs-document-properties-modification-date = Nino dwe me yub:
|
|
||||||
# Variables:
|
|
||||||
# $date (Date) - the creation/modification date of the PDF file
|
|
||||||
# $time (Time) - the creation/modification time of the PDF file
|
|
||||||
pdfjs-document-properties-date-string = { $date }, { $time }
|
|
||||||
pdfjs-document-properties-creator = Lacwec:
|
|
||||||
pdfjs-document-properties-producer = Layub PDF:
|
|
||||||
pdfjs-document-properties-version = Kit PDF:
|
|
||||||
pdfjs-document-properties-page-count = Kwan me pot buk:
|
|
||||||
pdfjs-document-properties-page-size = Dit pa potbuk:
|
|
||||||
pdfjs-document-properties-page-size-unit-inches = i
|
|
||||||
pdfjs-document-properties-page-size-unit-millimeters = mm
|
|
||||||
pdfjs-document-properties-page-size-orientation-portrait = atir
|
|
||||||
pdfjs-document-properties-page-size-orientation-landscape = arii
|
|
||||||
pdfjs-document-properties-page-size-name-a-three = A3
|
|
||||||
pdfjs-document-properties-page-size-name-a-four = A4
|
|
||||||
pdfjs-document-properties-page-size-name-letter = Waraga
|
|
||||||
pdfjs-document-properties-page-size-name-legal = Cik
|
|
||||||
|
|
||||||
## Variables:
|
|
||||||
## $width (Number) - the width of the (current) page
|
|
||||||
## $height (Number) - the height of the (current) page
|
|
||||||
## $unit (String) - the unit of measurement of the (current) page
|
|
||||||
## $name (String) - the name of the (current) page
|
|
||||||
## $orientation (String) - the orientation of the (current) page
|
|
||||||
|
|
||||||
pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation })
|
|
||||||
pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation })
|
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
pdfjs-document-properties-linearized-yes = Eyo
|
|
||||||
pdfjs-document-properties-linearized-no = Pe
|
|
||||||
pdfjs-document-properties-close-button = Lor
|
|
||||||
|
|
||||||
## Print
|
|
||||||
|
|
||||||
pdfjs-print-progress-message = Yubo coc me agoya…
|
|
||||||
# Variables:
|
|
||||||
# $progress (Number) - percent value
|
|
||||||
pdfjs-print-progress-percent = { $progress }%
|
|
||||||
pdfjs-print-progress-close-button = Juki
|
|
||||||
pdfjs-printing-not-supported = Ciko: Layeny ma pe teno goyo liweng.
|
|
||||||
pdfjs-printing-not-ready = Ciko: PDF pe ocane weng me agoya.
|
|
||||||
|
|
||||||
## Tooltips and alt text for side panel toolbar buttons
|
|
||||||
|
|
||||||
pdfjs-toggle-sidebar-button =
|
|
||||||
.title = Lok gintic ma inget
|
|
||||||
pdfjs-toggle-sidebar-button-label = Lok gintic ma inget
|
|
||||||
pdfjs-document-outline-button =
|
|
||||||
.title = Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng)
|
|
||||||
pdfjs-document-outline-button-label = Pek pa gin acoya
|
|
||||||
pdfjs-attachments-button =
|
|
||||||
.title = Nyut twec
|
|
||||||
pdfjs-attachments-button-label = Twec
|
|
||||||
pdfjs-thumbs-button =
|
|
||||||
.title = Nyut cal
|
|
||||||
pdfjs-thumbs-button-label = Cal
|
|
||||||
pdfjs-findbar-button =
|
|
||||||
.title = Nong iye gin acoya
|
|
||||||
pdfjs-findbar-button-label = Nong
|
|
||||||
|
|
||||||
## Thumbnails panel item (tooltip and alt text for images)
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-title =
|
|
||||||
.title = Pot buk { $page }
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-canvas =
|
|
||||||
.aria-label = Cal me pot buk { $page }
|
|
||||||
|
|
||||||
## Find panel button title and messages
|
|
||||||
|
|
||||||
pdfjs-find-input =
|
|
||||||
.title = Nong
|
|
||||||
.placeholder = Nong i dokumen…
|
|
||||||
pdfjs-find-previous-button =
|
|
||||||
.title = Nong timme pa lok mukato
|
|
||||||
pdfjs-find-previous-button-label = Mukato
|
|
||||||
pdfjs-find-next-button =
|
|
||||||
.title = Nong timme pa lok malubo
|
|
||||||
pdfjs-find-next-button-label = Malubo
|
|
||||||
pdfjs-find-highlight-checkbox = Ket Lanyut I Weng
|
|
||||||
pdfjs-find-match-case-checkbox-label = Lok marwate
|
|
||||||
pdfjs-find-reached-top = Oo iwi gin acoya, omede ki i tere
|
|
||||||
pdfjs-find-reached-bottom = Oo i agiki me gin acoya, omede ki iwiye
|
|
||||||
pdfjs-find-not-found = Lok pe ononge
|
|
||||||
|
|
||||||
## Predefined zoom values
|
|
||||||
|
|
||||||
pdfjs-page-scale-width = Lac me iye pot buk
|
|
||||||
pdfjs-page-scale-fit = Porre me pot buk
|
|
||||||
pdfjs-page-scale-auto = Kwot pire kene
|
|
||||||
pdfjs-page-scale-actual = Dite kikome
|
|
||||||
# Variables:
|
|
||||||
# $scale (Number) - percent value for page scale
|
|
||||||
pdfjs-page-scale-percent = { $scale }%
|
|
||||||
|
|
||||||
## PDF page
|
|
||||||
|
|
||||||
|
|
||||||
## Loading indicator messages
|
|
||||||
|
|
||||||
pdfjs-loading-error = Bal otime kun cano PDF.
|
|
||||||
pdfjs-invalid-file-error = Pwail me PDF ma pe atir onyo obale woko.
|
|
||||||
pdfjs-missing-file-error = Pwail me PDF tye ka rem.
|
|
||||||
pdfjs-unexpected-response-error = Lagam mape kigeno pa lapok tic.
|
|
||||||
pdfjs-rendering-error = Bal otime i kare me nyuto pot buk.
|
|
||||||
|
|
||||||
## Annotations
|
|
||||||
|
|
||||||
# .alt: This is used as a tooltip.
|
|
||||||
# Variables:
|
|
||||||
# $type (String) - an annotation type from a list defined in the PDF spec
|
|
||||||
# (32000-1:2008 Table 169 – Annotation types).
|
|
||||||
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
|
||||||
pdfjs-text-annotation-type =
|
|
||||||
.alt = [{ $type } Lok angea manok]
|
|
||||||
|
|
||||||
## Password
|
|
||||||
|
|
||||||
pdfjs-password-label = Ket mung me donyo me yabo pwail me PDF man.
|
|
||||||
pdfjs-password-invalid = Mung me donyo pe atir. Tim ber i tem doki.
|
|
||||||
pdfjs-password-ok-button = OK
|
|
||||||
pdfjs-password-cancel-button = Juki
|
|
||||||
pdfjs-web-fonts-disabled = Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.
|
|
||||||
|
|
||||||
## Editing
|
|
||||||
|
|
||||||
|
|
||||||
## Alt-text dialog
|
|
||||||
|
|
||||||
|
|
||||||
## Editor resizers
|
|
||||||
## This is used in an aria label to help to understand the role of the resizer.
|
|
||||||
|
|
200
l10n/ach/viewer.properties
Normal file
200
l10n/ach/viewer.properties
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
# Copyright 2012 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.
|
||||||
|
|
||||||
|
# Main toolbar buttons (tooltips and alt text for images)
|
||||||
|
previous.title=Pot buk mukato
|
||||||
|
previous_label=Mukato
|
||||||
|
next.title=Pot buk malubo
|
||||||
|
next_label=Malubo
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
|
||||||
|
page.title=Pot buk
|
||||||
|
# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
|
||||||
|
# representing the total number of pages in the document.
|
||||||
|
of_pages=pi {{pagesCount}}
|
||||||
|
# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
|
||||||
|
# will be replaced by a number representing the currently visible page,
|
||||||
|
# respectively a number representing the total number of pages in the document.
|
||||||
|
page_of_pages=({{pageNumber}} me {{pagesCount}})
|
||||||
|
|
||||||
|
zoom_out.title=Jwik Matidi
|
||||||
|
zoom_out_label=Jwik Matidi
|
||||||
|
zoom_in.title=Kwot Madit
|
||||||
|
zoom_in_label=Kwot Madit
|
||||||
|
zoom.title=Kwoti
|
||||||
|
presentation_mode.title=Lokke i kit me tyer
|
||||||
|
presentation_mode_label=Kit me tyer
|
||||||
|
open_file.title=Yab Pwail
|
||||||
|
open_file_label=Yab
|
||||||
|
print.title=Go
|
||||||
|
print_label=Go
|
||||||
|
download.title=Gam
|
||||||
|
download_label=Gam
|
||||||
|
bookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen)
|
||||||
|
bookmark_label=Neno ma kombedi
|
||||||
|
|
||||||
|
# Secondary toolbar and context menu
|
||||||
|
tools.title=Gintic
|
||||||
|
tools_label=Gintic
|
||||||
|
first_page.title=Cit i pot buk mukwongo
|
||||||
|
first_page_label=Cit i pot buk mukwongo
|
||||||
|
last_page.title=Cit i pot buk magiko
|
||||||
|
last_page_label=Cit i pot buk magiko
|
||||||
|
page_rotate_cw.title=Wire i tung lacuc
|
||||||
|
page_rotate_cw_label=Wire i tung lacuc
|
||||||
|
page_rotate_ccw.title=Wire i tung lacam
|
||||||
|
page_rotate_ccw_label=Wire i tung lacam
|
||||||
|
|
||||||
|
cursor_text_select_tool.title=Cak gitic me yero coc
|
||||||
|
cursor_text_select_tool_label=Gitic me yero coc
|
||||||
|
cursor_hand_tool.title=Cak gitic me cing
|
||||||
|
cursor_hand_tool_label=Gitic cing
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Document properties dialog box
|
||||||
|
document_properties.title=Jami me gin acoya…
|
||||||
|
document_properties_label=Jami me gin acoya…
|
||||||
|
document_properties_file_name=Nying pwail:
|
||||||
|
document_properties_file_size=Dit pa pwail:
|
||||||
|
# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in kilobytes, respectively in bytes.
|
||||||
|
document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
|
||||||
|
# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in megabytes, respectively in bytes.
|
||||||
|
document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
|
||||||
|
document_properties_title=Wiye:
|
||||||
|
document_properties_author=Ngat mucoyo:
|
||||||
|
document_properties_subject=Subjek:
|
||||||
|
document_properties_keywords=Lok mapire tek:
|
||||||
|
document_properties_creation_date=Nino dwe me cwec:
|
||||||
|
document_properties_modification_date=Nino dwe me yub:
|
||||||
|
# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
|
||||||
|
# will be replaced by the creation/modification date, and time, of the PDF file.
|
||||||
|
document_properties_date_string={{date}}, {{time}}
|
||||||
|
document_properties_creator=Lacwec:
|
||||||
|
document_properties_producer=Layub PDF:
|
||||||
|
document_properties_version=Kit PDF:
|
||||||
|
document_properties_page_count=Kwan me pot buk:
|
||||||
|
document_properties_page_size=Dit pa potbuk:
|
||||||
|
document_properties_page_size_unit_inches=i
|
||||||
|
document_properties_page_size_unit_millimeters=mm
|
||||||
|
document_properties_page_size_orientation_portrait=atir
|
||||||
|
document_properties_page_size_orientation_landscape=arii
|
||||||
|
document_properties_page_size_name_a3=A3
|
||||||
|
document_properties_page_size_name_a4=A4
|
||||||
|
document_properties_page_size_name_letter=Waraga
|
||||||
|
document_properties_page_size_name_legal=Cik
|
||||||
|
# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
|
||||||
|
# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
|
||||||
|
# the size, respectively their unit of measurement and orientation, of the (current) page.
|
||||||
|
document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})
|
||||||
|
# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
|
||||||
|
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
|
||||||
|
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
|
||||||
|
document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})
|
||||||
|
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
|
||||||
|
# the document; usually called "Fast Web View" in English locales of Adobe software.
|
||||||
|
document_properties_linearized_yes=Eyo
|
||||||
|
document_properties_linearized_no=Pe
|
||||||
|
document_properties_close=Lor
|
||||||
|
|
||||||
|
print_progress_message=Yubo coc me agoya…
|
||||||
|
# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
|
||||||
|
# a numerical per cent value.
|
||||||
|
print_progress_percent={{progress}}%
|
||||||
|
print_progress_close=Juki
|
||||||
|
|
||||||
|
# Tooltips and alt text for side panel toolbar buttons
|
||||||
|
# (the _label strings are alt text for the buttons, the .title strings are
|
||||||
|
# tooltips)
|
||||||
|
toggle_sidebar.title=Lok gintic ma inget
|
||||||
|
toggle_sidebar_label=Lok gintic ma inget
|
||||||
|
document_outline.title=Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng)
|
||||||
|
document_outline_label=Pek pa gin acoya
|
||||||
|
attachments.title=Nyut twec
|
||||||
|
attachments_label=Twec
|
||||||
|
thumbs.title=Nyut cal
|
||||||
|
thumbs_label=Cal
|
||||||
|
findbar.title=Nong iye gin acoya
|
||||||
|
findbar_label=Nong
|
||||||
|
|
||||||
|
# Thumbnails panel item (tooltip and alt text for images)
|
||||||
|
# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_title=Pot buk {{page}}
|
||||||
|
# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_canvas=Cal me pot buk {{page}}
|
||||||
|
|
||||||
|
# Find panel button title and messages
|
||||||
|
find_input.title=Nong
|
||||||
|
find_input.placeholder=Nong i dokumen…
|
||||||
|
find_previous.title=Nong timme pa lok mukato
|
||||||
|
find_previous_label=Mukato
|
||||||
|
find_next.title=Nong timme pa lok malubo
|
||||||
|
find_next_label=Malubo
|
||||||
|
find_highlight=Wer weng
|
||||||
|
find_match_case_label=Lok marwate
|
||||||
|
find_reached_top=Oo iwi gin acoya, omede ki i tere
|
||||||
|
find_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye
|
||||||
|
find_not_found=Lok pe ononge
|
||||||
|
|
||||||
|
# Error panel labels
|
||||||
|
error_more_info=Ngec Mukene
|
||||||
|
error_less_info=Ngec Manok
|
||||||
|
error_close=Lor
|
||||||
|
# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
|
||||||
|
# replaced by the PDF.JS version and build ID.
|
||||||
|
error_version_info=PDF.js v{{version}} (build: {{build}})
|
||||||
|
# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
|
||||||
|
# english string describing the error.
|
||||||
|
error_message=Kwena: {{message}}
|
||||||
|
# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
|
||||||
|
# trace.
|
||||||
|
error_stack=Can kikore {{stack}}
|
||||||
|
# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
|
||||||
|
error_file=Pwail: {{file}}
|
||||||
|
# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
|
||||||
|
error_line=Rek: {{line}}
|
||||||
|
rendering_error=Bal otime i kare me nyuto pot buk.
|
||||||
|
|
||||||
|
# Predefined zoom values
|
||||||
|
page_scale_width=Lac me iye pot buk
|
||||||
|
page_scale_fit=Porre me pot buk
|
||||||
|
page_scale_auto=Kwot pire kene
|
||||||
|
page_scale_actual=Dite kikome
|
||||||
|
# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
|
||||||
|
# numerical scale value.
|
||||||
|
page_scale_percent={{scale}}%
|
||||||
|
|
||||||
|
loading_error=Bal otime kun cano PDF.
|
||||||
|
invalid_file_error=Pwail me PDF ma pe atir onyo obale woko.
|
||||||
|
missing_file_error=Pwail me PDF tye ka rem.
|
||||||
|
unexpected_response_error=Lagam mape kigeno pa lapok tic.
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
|
||||||
|
# "{{type}}" will be replaced with an annotation type from a list defined in
|
||||||
|
# the PDF spec (32000-1:2008 Table 169 – Annotation types).
|
||||||
|
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
||||||
|
text_annotation_type.alt=[{{type}} Lok angea manok]
|
||||||
|
password_label=Ket mung me donyo me yabo pwail me PDF man.
|
||||||
|
password_invalid=Mung me donyo pe atir. Tim ber i tem doki.
|
||||||
|
password_ok=OK
|
||||||
|
password_cancel=Juki
|
||||||
|
|
||||||
|
printing_not_supported=Ciko: Layeny ma pe teno goyo liweng.
|
||||||
|
printing_not_ready=Ciko: PDF pe ocane weng me agoya.
|
||||||
|
web_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.
|
||||||
|
|
@ -1,212 +0,0 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
|
|
||||||
## Main toolbar buttons (tooltips and alt text for images)
|
|
||||||
|
|
||||||
pdfjs-previous-button =
|
|
||||||
.title = Vorige bladsy
|
|
||||||
pdfjs-previous-button-label = Vorige
|
|
||||||
pdfjs-next-button =
|
|
||||||
.title = Volgende bladsy
|
|
||||||
pdfjs-next-button-label = Volgende
|
|
||||||
# .title: Tooltip for the pageNumber input.
|
|
||||||
pdfjs-page-input =
|
|
||||||
.title = Bladsy
|
|
||||||
# Variables:
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
# This string follows an input field with the number of the page currently displayed.
|
|
||||||
pdfjs-of-pages = van { $pagesCount }
|
|
||||||
# Variables:
|
|
||||||
# $pageNumber (Number) - the currently visible page
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
pdfjs-page-of-pages = ({ $pageNumber } van { $pagesCount })
|
|
||||||
pdfjs-zoom-out-button =
|
|
||||||
.title = Zoem uit
|
|
||||||
pdfjs-zoom-out-button-label = Zoem uit
|
|
||||||
pdfjs-zoom-in-button =
|
|
||||||
.title = Zoem in
|
|
||||||
pdfjs-zoom-in-button-label = Zoem in
|
|
||||||
pdfjs-zoom-select =
|
|
||||||
.title = Zoem
|
|
||||||
pdfjs-presentation-mode-button =
|
|
||||||
.title = Wissel na voorleggingsmodus
|
|
||||||
pdfjs-presentation-mode-button-label = Voorleggingsmodus
|
|
||||||
pdfjs-open-file-button =
|
|
||||||
.title = Open lêer
|
|
||||||
pdfjs-open-file-button-label = Open
|
|
||||||
pdfjs-print-button =
|
|
||||||
.title = Druk
|
|
||||||
pdfjs-print-button-label = Druk
|
|
||||||
|
|
||||||
## Secondary toolbar and context menu
|
|
||||||
|
|
||||||
pdfjs-tools-button =
|
|
||||||
.title = Nutsgoed
|
|
||||||
pdfjs-tools-button-label = Nutsgoed
|
|
||||||
pdfjs-first-page-button =
|
|
||||||
.title = Gaan na eerste bladsy
|
|
||||||
pdfjs-first-page-button-label = Gaan na eerste bladsy
|
|
||||||
pdfjs-last-page-button =
|
|
||||||
.title = Gaan na laaste bladsy
|
|
||||||
pdfjs-last-page-button-label = Gaan na laaste bladsy
|
|
||||||
pdfjs-page-rotate-cw-button =
|
|
||||||
.title = Roteer kloksgewys
|
|
||||||
pdfjs-page-rotate-cw-button-label = Roteer kloksgewys
|
|
||||||
pdfjs-page-rotate-ccw-button =
|
|
||||||
.title = Roteer anti-kloksgewys
|
|
||||||
pdfjs-page-rotate-ccw-button-label = Roteer anti-kloksgewys
|
|
||||||
pdfjs-cursor-text-select-tool-button =
|
|
||||||
.title = Aktiveer gereedskap om teks te merk
|
|
||||||
pdfjs-cursor-text-select-tool-button-label = Teksmerkgereedskap
|
|
||||||
pdfjs-cursor-hand-tool-button =
|
|
||||||
.title = Aktiveer handjie
|
|
||||||
pdfjs-cursor-hand-tool-button-label = Handjie
|
|
||||||
|
|
||||||
## Document properties dialog
|
|
||||||
|
|
||||||
pdfjs-document-properties-button =
|
|
||||||
.title = Dokumenteienskappe…
|
|
||||||
pdfjs-document-properties-button-label = Dokumenteienskappe…
|
|
||||||
pdfjs-document-properties-file-name = Lêernaam:
|
|
||||||
pdfjs-document-properties-file-size = Lêergrootte:
|
|
||||||
# Variables:
|
|
||||||
# $size_kb (Number) - the PDF file size in kilobytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-kb = { $size_kb } kG ({ $size_b } grepe)
|
|
||||||
# Variables:
|
|
||||||
# $size_mb (Number) - the PDF file size in megabytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-mb = { $size_mb } MG ({ $size_b } grepe)
|
|
||||||
pdfjs-document-properties-title = Titel:
|
|
||||||
pdfjs-document-properties-author = Outeur:
|
|
||||||
pdfjs-document-properties-subject = Onderwerp:
|
|
||||||
pdfjs-document-properties-keywords = Sleutelwoorde:
|
|
||||||
pdfjs-document-properties-creation-date = Skeppingsdatum:
|
|
||||||
pdfjs-document-properties-modification-date = Wysigingsdatum:
|
|
||||||
# Variables:
|
|
||||||
# $date (Date) - the creation/modification date of the PDF file
|
|
||||||
# $time (Time) - the creation/modification time of the PDF file
|
|
||||||
pdfjs-document-properties-date-string = { $date }, { $time }
|
|
||||||
pdfjs-document-properties-creator = Skepper:
|
|
||||||
pdfjs-document-properties-producer = PDF-vervaardiger:
|
|
||||||
pdfjs-document-properties-version = PDF-weergawe:
|
|
||||||
pdfjs-document-properties-page-count = Aantal bladsye:
|
|
||||||
|
|
||||||
## Variables:
|
|
||||||
## $width (Number) - the width of the (current) page
|
|
||||||
## $height (Number) - the height of the (current) page
|
|
||||||
## $unit (String) - the unit of measurement of the (current) page
|
|
||||||
## $name (String) - the name of the (current) page
|
|
||||||
## $orientation (String) - the orientation of the (current) page
|
|
||||||
|
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
pdfjs-document-properties-close-button = Sluit
|
|
||||||
|
|
||||||
## Print
|
|
||||||
|
|
||||||
pdfjs-print-progress-message = Berei tans dokument voor om te druk…
|
|
||||||
# Variables:
|
|
||||||
# $progress (Number) - percent value
|
|
||||||
pdfjs-print-progress-percent = { $progress }%
|
|
||||||
pdfjs-print-progress-close-button = Kanselleer
|
|
||||||
pdfjs-printing-not-supported = Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.
|
|
||||||
pdfjs-printing-not-ready = Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.
|
|
||||||
|
|
||||||
## Tooltips and alt text for side panel toolbar buttons
|
|
||||||
|
|
||||||
pdfjs-toggle-sidebar-button =
|
|
||||||
.title = Sypaneel aan/af
|
|
||||||
pdfjs-toggle-sidebar-button-label = Sypaneel aan/af
|
|
||||||
pdfjs-document-outline-button =
|
|
||||||
.title = Wys dokumentskema (dubbelklik om alle items oop/toe te vou)
|
|
||||||
pdfjs-document-outline-button-label = Dokumentoorsig
|
|
||||||
pdfjs-attachments-button =
|
|
||||||
.title = Wys aanhegsels
|
|
||||||
pdfjs-attachments-button-label = Aanhegsels
|
|
||||||
pdfjs-thumbs-button =
|
|
||||||
.title = Wys duimnaels
|
|
||||||
pdfjs-thumbs-button-label = Duimnaels
|
|
||||||
pdfjs-findbar-button =
|
|
||||||
.title = Soek in dokument
|
|
||||||
pdfjs-findbar-button-label = Vind
|
|
||||||
|
|
||||||
## Thumbnails panel item (tooltip and alt text for images)
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-title =
|
|
||||||
.title = Bladsy { $page }
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-canvas =
|
|
||||||
.aria-label = Duimnael van bladsy { $page }
|
|
||||||
|
|
||||||
## Find panel button title and messages
|
|
||||||
|
|
||||||
pdfjs-find-input =
|
|
||||||
.title = Vind
|
|
||||||
.placeholder = Soek in dokument…
|
|
||||||
pdfjs-find-previous-button =
|
|
||||||
.title = Vind die vorige voorkoms van die frase
|
|
||||||
pdfjs-find-previous-button-label = Vorige
|
|
||||||
pdfjs-find-next-button =
|
|
||||||
.title = Vind die volgende voorkoms van die frase
|
|
||||||
pdfjs-find-next-button-label = Volgende
|
|
||||||
pdfjs-find-highlight-checkbox = Verlig almal
|
|
||||||
pdfjs-find-match-case-checkbox-label = Kassensitief
|
|
||||||
pdfjs-find-reached-top = Bokant van dokument is bereik; gaan voort van onder af
|
|
||||||
pdfjs-find-reached-bottom = Einde van dokument is bereik; gaan voort van bo af
|
|
||||||
pdfjs-find-not-found = Frase nie gevind nie
|
|
||||||
|
|
||||||
## Predefined zoom values
|
|
||||||
|
|
||||||
pdfjs-page-scale-width = Bladsywydte
|
|
||||||
pdfjs-page-scale-fit = Pas bladsy
|
|
||||||
pdfjs-page-scale-auto = Outomatiese zoem
|
|
||||||
pdfjs-page-scale-actual = Werklike grootte
|
|
||||||
# Variables:
|
|
||||||
# $scale (Number) - percent value for page scale
|
|
||||||
pdfjs-page-scale-percent = { $scale }%
|
|
||||||
|
|
||||||
## PDF page
|
|
||||||
|
|
||||||
|
|
||||||
## Loading indicator messages
|
|
||||||
|
|
||||||
pdfjs-loading-error = 'n Fout het voorgekom met die laai van die PDF.
|
|
||||||
pdfjs-invalid-file-error = Ongeldige of korrupte PDF-lêer.
|
|
||||||
pdfjs-missing-file-error = PDF-lêer is weg.
|
|
||||||
pdfjs-unexpected-response-error = Onverwagse antwoord van bediener.
|
|
||||||
pdfjs-rendering-error = 'n Fout het voorgekom toe die bladsy weergegee is.
|
|
||||||
|
|
||||||
## Annotations
|
|
||||||
|
|
||||||
# .alt: This is used as a tooltip.
|
|
||||||
# Variables:
|
|
||||||
# $type (String) - an annotation type from a list defined in the PDF spec
|
|
||||||
# (32000-1:2008 Table 169 – Annotation types).
|
|
||||||
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
|
||||||
pdfjs-text-annotation-type =
|
|
||||||
.alt = [{ $type }-annotasie]
|
|
||||||
|
|
||||||
## Password
|
|
||||||
|
|
||||||
pdfjs-password-label = Gee die wagwoord om dié PDF-lêer mee te open.
|
|
||||||
pdfjs-password-invalid = Ongeldige wagwoord. Probeer gerus weer.
|
|
||||||
pdfjs-password-ok-button = OK
|
|
||||||
pdfjs-password-cancel-button = Kanselleer
|
|
||||||
pdfjs-web-fonts-disabled = Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.
|
|
||||||
|
|
||||||
## Editing
|
|
||||||
|
|
||||||
|
|
||||||
## Alt-text dialog
|
|
||||||
|
|
||||||
|
|
||||||
## Editor resizers
|
|
||||||
## This is used in an aria label to help to understand the role of the resizer.
|
|
||||||
|
|
177
l10n/af/viewer.properties
Normal file
177
l10n/af/viewer.properties
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
# Copyright 2012 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.
|
||||||
|
|
||||||
|
# Main toolbar buttons (tooltips and alt text for images)
|
||||||
|
previous.title=Vorige bladsy
|
||||||
|
previous_label=Vorige
|
||||||
|
next.title=Volgende bladsy
|
||||||
|
next_label=Volgende
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
|
||||||
|
page.title=Bladsy
|
||||||
|
# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
|
||||||
|
# representing the total number of pages in the document.
|
||||||
|
of_pages=van {{pagesCount}}
|
||||||
|
# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
|
||||||
|
# will be replaced by a number representing the currently visible page,
|
||||||
|
# respectively a number representing the total number of pages in the document.
|
||||||
|
page_of_pages=({{pageNumber}} van {{pagesCount}})
|
||||||
|
|
||||||
|
zoom_out.title=Zoem uit
|
||||||
|
zoom_out_label=Zoem uit
|
||||||
|
zoom_in.title=Zoem in
|
||||||
|
zoom_in_label=Zoem in
|
||||||
|
zoom.title=Zoem
|
||||||
|
presentation_mode.title=Wissel na voorleggingsmodus
|
||||||
|
presentation_mode_label=Voorleggingsmodus
|
||||||
|
open_file.title=Open lêer
|
||||||
|
open_file_label=Open
|
||||||
|
print.title=Druk
|
||||||
|
print_label=Druk
|
||||||
|
download.title=Laai af
|
||||||
|
download_label=Laai af
|
||||||
|
bookmark.title=Huidige aansig (kopieer of open in nuwe venster)
|
||||||
|
bookmark_label=Huidige aansig
|
||||||
|
|
||||||
|
# Secondary toolbar and context menu
|
||||||
|
tools.title=Nutsgoed
|
||||||
|
tools_label=Nutsgoed
|
||||||
|
first_page.title=Gaan na eerste bladsy
|
||||||
|
first_page_label=Gaan na eerste bladsy
|
||||||
|
last_page.title=Gaan na laaste bladsy
|
||||||
|
last_page_label=Gaan na laaste bladsy
|
||||||
|
page_rotate_cw.title=Roteer kloksgewys
|
||||||
|
page_rotate_cw_label=Roteer kloksgewys
|
||||||
|
page_rotate_ccw.title=Roteer anti-kloksgewys
|
||||||
|
page_rotate_ccw_label=Roteer anti-kloksgewys
|
||||||
|
|
||||||
|
cursor_text_select_tool.title=Aktiveer gereedskap om teks te merk
|
||||||
|
cursor_text_select_tool_label=Teksmerkgereedskap
|
||||||
|
cursor_hand_tool.title=Aktiveer handjie
|
||||||
|
cursor_hand_tool_label=Handjie
|
||||||
|
|
||||||
|
# Document properties dialog box
|
||||||
|
document_properties.title=Dokumenteienskappe…
|
||||||
|
document_properties_label=Dokumenteienskappe…
|
||||||
|
document_properties_file_name=Lêernaam:
|
||||||
|
document_properties_file_size=Lêergrootte:
|
||||||
|
# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in kilobytes, respectively in bytes.
|
||||||
|
document_properties_kb={{size_kb}} kG ({{size_b}} grepe)
|
||||||
|
# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in megabytes, respectively in bytes.
|
||||||
|
document_properties_mb={{size_mb}} MG ({{size_b}} grepe)
|
||||||
|
document_properties_title=Titel:
|
||||||
|
document_properties_author=Outeur:
|
||||||
|
document_properties_subject=Onderwerp:
|
||||||
|
document_properties_keywords=Sleutelwoorde:
|
||||||
|
document_properties_creation_date=Skeppingsdatum:
|
||||||
|
document_properties_modification_date=Wysigingsdatum:
|
||||||
|
# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
|
||||||
|
# will be replaced by the creation/modification date, and time, of the PDF file.
|
||||||
|
document_properties_date_string={{date}}, {{time}}
|
||||||
|
document_properties_creator=Skepper:
|
||||||
|
document_properties_producer=PDF-vervaardiger:
|
||||||
|
document_properties_version=PDF-weergawe:
|
||||||
|
document_properties_page_count=Aantal bladsye:
|
||||||
|
document_properties_close=Sluit
|
||||||
|
|
||||||
|
print_progress_message=Berei tans dokument voor om te druk…
|
||||||
|
# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
|
||||||
|
# a numerical per cent value.
|
||||||
|
print_progress_percent={{progress}}%
|
||||||
|
print_progress_close=Kanselleer
|
||||||
|
|
||||||
|
# Tooltips and alt text for side panel toolbar buttons
|
||||||
|
# (the _label strings are alt text for the buttons, the .title strings are
|
||||||
|
# tooltips)
|
||||||
|
toggle_sidebar.title=Sypaneel aan/af
|
||||||
|
toggle_sidebar_label=Sypaneel aan/af
|
||||||
|
document_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou)
|
||||||
|
document_outline_label=Dokumentoorsig
|
||||||
|
attachments.title=Wys aanhegsels
|
||||||
|
attachments_label=Aanhegsels
|
||||||
|
thumbs.title=Wys duimnaels
|
||||||
|
thumbs_label=Duimnaels
|
||||||
|
findbar.title=Soek in dokument
|
||||||
|
findbar_label=Vind
|
||||||
|
|
||||||
|
# Thumbnails panel item (tooltip and alt text for images)
|
||||||
|
# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_title=Bladsy {{page}}
|
||||||
|
# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_canvas=Duimnael van bladsy {{page}}
|
||||||
|
|
||||||
|
# Find panel button title and messages
|
||||||
|
find_input.title=Vind
|
||||||
|
find_input.placeholder=Soek in dokument…
|
||||||
|
find_previous.title=Vind die vorige voorkoms van die frase
|
||||||
|
find_previous_label=Vorige
|
||||||
|
find_next.title=Vind die volgende voorkoms van die frase
|
||||||
|
find_next_label=Volgende
|
||||||
|
find_highlight=Verlig almal
|
||||||
|
find_match_case_label=Kassensitief
|
||||||
|
find_reached_top=Bokant van dokument is bereik; gaan voort van onder af
|
||||||
|
find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af
|
||||||
|
find_not_found=Frase nie gevind nie
|
||||||
|
|
||||||
|
# Error panel labels
|
||||||
|
error_more_info=Meer inligting
|
||||||
|
error_less_info=Minder inligting
|
||||||
|
error_close=Sluit
|
||||||
|
# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
|
||||||
|
# replaced by the PDF.JS version and build ID.
|
||||||
|
error_version_info=PDF.js v{{version}} (ID: {{build}})
|
||||||
|
# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
|
||||||
|
# english string describing the error.
|
||||||
|
error_message=Boodskap: {{message}}
|
||||||
|
# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
|
||||||
|
# trace.
|
||||||
|
error_stack=Stapel: {{stack}}
|
||||||
|
# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
|
||||||
|
error_file=Lêer: {{file}}
|
||||||
|
# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
|
||||||
|
error_line=Lyn: {{line}}
|
||||||
|
rendering_error='n Fout het voorgekom toe die bladsy weergegee is.
|
||||||
|
|
||||||
|
# Predefined zoom values
|
||||||
|
page_scale_width=Bladsywydte
|
||||||
|
page_scale_fit=Pas bladsy
|
||||||
|
page_scale_auto=Outomatiese zoem
|
||||||
|
page_scale_actual=Werklike grootte
|
||||||
|
# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
|
||||||
|
# numerical scale value.
|
||||||
|
page_scale_percent={{scale}}%
|
||||||
|
|
||||||
|
loading_error='n Fout het voorgekom met die laai van die PDF.
|
||||||
|
invalid_file_error=Ongeldige of korrupte PDF-lêer.
|
||||||
|
missing_file_error=PDF-lêer is weg.
|
||||||
|
unexpected_response_error=Onverwagse antwoord van bediener.
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
|
||||||
|
# "{{type}}" will be replaced with an annotation type from a list defined in
|
||||||
|
# the PDF spec (32000-1:2008 Table 169 – Annotation types).
|
||||||
|
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
||||||
|
text_annotation_type.alt=[{{type}}-annotasie]
|
||||||
|
password_label=Gee die wagwoord om dié PDF-lêer mee te open.
|
||||||
|
password_invalid=Ongeldige wagwoord. Probeer gerus weer.
|
||||||
|
password_ok=OK
|
||||||
|
password_cancel=Kanselleer
|
||||||
|
|
||||||
|
printing_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.
|
||||||
|
printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.
|
||||||
|
web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.
|
||||||
|
|
@ -1,257 +0,0 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
|
|
||||||
## Main toolbar buttons (tooltips and alt text for images)
|
|
||||||
|
|
||||||
pdfjs-previous-button =
|
|
||||||
.title = Pachina anterior
|
|
||||||
pdfjs-previous-button-label = Anterior
|
|
||||||
pdfjs-next-button =
|
|
||||||
.title = Pachina siguient
|
|
||||||
pdfjs-next-button-label = Siguient
|
|
||||||
# .title: Tooltip for the pageNumber input.
|
|
||||||
pdfjs-page-input =
|
|
||||||
.title = Pachina
|
|
||||||
# Variables:
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
# This string follows an input field with the number of the page currently displayed.
|
|
||||||
pdfjs-of-pages = de { $pagesCount }
|
|
||||||
# Variables:
|
|
||||||
# $pageNumber (Number) - the currently visible page
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
pdfjs-page-of-pages = ({ $pageNumber } de { $pagesCount })
|
|
||||||
pdfjs-zoom-out-button =
|
|
||||||
.title = Achiquir
|
|
||||||
pdfjs-zoom-out-button-label = Achiquir
|
|
||||||
pdfjs-zoom-in-button =
|
|
||||||
.title = Agrandir
|
|
||||||
pdfjs-zoom-in-button-label = Agrandir
|
|
||||||
pdfjs-zoom-select =
|
|
||||||
.title = Grandaria
|
|
||||||
pdfjs-presentation-mode-button =
|
|
||||||
.title = Cambear t'o modo de presentación
|
|
||||||
pdfjs-presentation-mode-button-label = Modo de presentación
|
|
||||||
pdfjs-open-file-button =
|
|
||||||
.title = Ubrir o fichero
|
|
||||||
pdfjs-open-file-button-label = Ubrir
|
|
||||||
pdfjs-print-button =
|
|
||||||
.title = Imprentar
|
|
||||||
pdfjs-print-button-label = Imprentar
|
|
||||||
|
|
||||||
## Secondary toolbar and context menu
|
|
||||||
|
|
||||||
pdfjs-tools-button =
|
|
||||||
.title = Ferramientas
|
|
||||||
pdfjs-tools-button-label = Ferramientas
|
|
||||||
pdfjs-first-page-button =
|
|
||||||
.title = Ir ta la primer pachina
|
|
||||||
pdfjs-first-page-button-label = Ir ta la primer pachina
|
|
||||||
pdfjs-last-page-button =
|
|
||||||
.title = Ir ta la zaguer pachina
|
|
||||||
pdfjs-last-page-button-label = Ir ta la zaguer pachina
|
|
||||||
pdfjs-page-rotate-cw-button =
|
|
||||||
.title = Chirar enta la dreita
|
|
||||||
pdfjs-page-rotate-cw-button-label = Chira enta la dreita
|
|
||||||
pdfjs-page-rotate-ccw-button =
|
|
||||||
.title = Chirar enta la zurda
|
|
||||||
pdfjs-page-rotate-ccw-button-label = Chirar enta la zurda
|
|
||||||
pdfjs-cursor-text-select-tool-button =
|
|
||||||
.title = Activar la ferramienta de selección de texto
|
|
||||||
pdfjs-cursor-text-select-tool-button-label = Ferramienta de selección de texto
|
|
||||||
pdfjs-cursor-hand-tool-button =
|
|
||||||
.title = Activar la ferramienta man
|
|
||||||
pdfjs-cursor-hand-tool-button-label = Ferramienta man
|
|
||||||
pdfjs-scroll-vertical-button =
|
|
||||||
.title = Usar lo desplazamiento vertical
|
|
||||||
pdfjs-scroll-vertical-button-label = Desplazamiento vertical
|
|
||||||
pdfjs-scroll-horizontal-button =
|
|
||||||
.title = Usar lo desplazamiento horizontal
|
|
||||||
pdfjs-scroll-horizontal-button-label = Desplazamiento horizontal
|
|
||||||
pdfjs-scroll-wrapped-button =
|
|
||||||
.title = Activaar lo desplazamiento contino
|
|
||||||
pdfjs-scroll-wrapped-button-label = Desplazamiento contino
|
|
||||||
pdfjs-spread-none-button =
|
|
||||||
.title = No unir vistas de pachinas
|
|
||||||
pdfjs-spread-none-button-label = Una pachina nomás
|
|
||||||
pdfjs-spread-odd-button =
|
|
||||||
.title = Mostrar vista de pachinas, con as impars a la zurda
|
|
||||||
pdfjs-spread-odd-button-label = Doble pachina, impar a la zurda
|
|
||||||
pdfjs-spread-even-button =
|
|
||||||
.title = Amostrar vista de pachinas, con as pars a la zurda
|
|
||||||
pdfjs-spread-even-button-label = Doble pachina, para a la zurda
|
|
||||||
|
|
||||||
## Document properties dialog
|
|
||||||
|
|
||||||
pdfjs-document-properties-button =
|
|
||||||
.title = Propiedatz d'o documento...
|
|
||||||
pdfjs-document-properties-button-label = Propiedatz d'o documento...
|
|
||||||
pdfjs-document-properties-file-name = Nombre de fichero:
|
|
||||||
pdfjs-document-properties-file-size = Grandaria d'o fichero:
|
|
||||||
# Variables:
|
|
||||||
# $size_kb (Number) - the PDF file size in kilobytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes)
|
|
||||||
# Variables:
|
|
||||||
# $size_mb (Number) - the PDF file size in megabytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes)
|
|
||||||
pdfjs-document-properties-title = Titol:
|
|
||||||
pdfjs-document-properties-author = Autor:
|
|
||||||
pdfjs-document-properties-subject = Afer:
|
|
||||||
pdfjs-document-properties-keywords = Parolas clau:
|
|
||||||
pdfjs-document-properties-creation-date = Calendata de creyación:
|
|
||||||
pdfjs-document-properties-modification-date = Calendata de modificación:
|
|
||||||
# Variables:
|
|
||||||
# $date (Date) - the creation/modification date of the PDF file
|
|
||||||
# $time (Time) - the creation/modification time of the PDF file
|
|
||||||
pdfjs-document-properties-date-string = { $date }, { $time }
|
|
||||||
pdfjs-document-properties-creator = Creyador:
|
|
||||||
pdfjs-document-properties-producer = Creyador de PDF:
|
|
||||||
pdfjs-document-properties-version = Versión de PDF:
|
|
||||||
pdfjs-document-properties-page-count = Numero de pachinas:
|
|
||||||
pdfjs-document-properties-page-size = Mida de pachina:
|
|
||||||
pdfjs-document-properties-page-size-unit-inches = pulgadas
|
|
||||||
pdfjs-document-properties-page-size-unit-millimeters = mm
|
|
||||||
pdfjs-document-properties-page-size-orientation-portrait = vertical
|
|
||||||
pdfjs-document-properties-page-size-orientation-landscape = horizontal
|
|
||||||
pdfjs-document-properties-page-size-name-a-three = A3
|
|
||||||
pdfjs-document-properties-page-size-name-a-four = A4
|
|
||||||
pdfjs-document-properties-page-size-name-letter = Carta
|
|
||||||
pdfjs-document-properties-page-size-name-legal = Legal
|
|
||||||
|
|
||||||
## Variables:
|
|
||||||
## $width (Number) - the width of the (current) page
|
|
||||||
## $height (Number) - the height of the (current) page
|
|
||||||
## $unit (String) - the unit of measurement of the (current) page
|
|
||||||
## $name (String) - the name of the (current) page
|
|
||||||
## $orientation (String) - the orientation of the (current) page
|
|
||||||
|
|
||||||
pdfjs-document-properties-page-size-dimension-string = { $width } x { $height } { $unit } { $orientation }
|
|
||||||
pdfjs-document-properties-page-size-dimension-name-string = { $width } x { $height } { $unit } { $name }, { $orientation }
|
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
# The linearization status of the document; usually called "Fast Web View" in
|
|
||||||
# English locales of Adobe software.
|
|
||||||
pdfjs-document-properties-linearized = Vista web rapida:
|
|
||||||
pdfjs-document-properties-linearized-yes = Sí
|
|
||||||
pdfjs-document-properties-linearized-no = No
|
|
||||||
pdfjs-document-properties-close-button = Zarrar
|
|
||||||
|
|
||||||
## Print
|
|
||||||
|
|
||||||
pdfjs-print-progress-message = Se ye preparando la documentación pa imprentar…
|
|
||||||
# Variables:
|
|
||||||
# $progress (Number) - percent value
|
|
||||||
pdfjs-print-progress-percent = { $progress }%
|
|
||||||
pdfjs-print-progress-close-button = Cancelar
|
|
||||||
pdfjs-printing-not-supported = Pare cuenta: Iste navegador no maneya totalment as impresions.
|
|
||||||
pdfjs-printing-not-ready = Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.
|
|
||||||
|
|
||||||
## Tooltips and alt text for side panel toolbar buttons
|
|
||||||
|
|
||||||
pdfjs-toggle-sidebar-button =
|
|
||||||
.title = Amostrar u amagar a barra lateral
|
|
||||||
pdfjs-toggle-sidebar-notification-button =
|
|
||||||
.title = Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas)
|
|
||||||
pdfjs-toggle-sidebar-button-label = Amostrar a barra lateral
|
|
||||||
pdfjs-document-outline-button =
|
|
||||||
.title = Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)
|
|
||||||
pdfjs-document-outline-button-label = Esquema d'o documento
|
|
||||||
pdfjs-attachments-button =
|
|
||||||
.title = Amostrar os adchuntos
|
|
||||||
pdfjs-attachments-button-label = Adchuntos
|
|
||||||
pdfjs-layers-button =
|
|
||||||
.title = Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto)
|
|
||||||
pdfjs-layers-button-label = Capas
|
|
||||||
pdfjs-thumbs-button =
|
|
||||||
.title = Amostrar as miniaturas
|
|
||||||
pdfjs-thumbs-button-label = Miniaturas
|
|
||||||
pdfjs-findbar-button =
|
|
||||||
.title = Trobar en o documento
|
|
||||||
pdfjs-findbar-button-label = Trobar
|
|
||||||
pdfjs-additional-layers = Capas adicionals
|
|
||||||
|
|
||||||
## Thumbnails panel item (tooltip and alt text for images)
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-title =
|
|
||||||
.title = Pachina { $page }
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-canvas =
|
|
||||||
.aria-label = Miniatura d'a pachina { $page }
|
|
||||||
|
|
||||||
## Find panel button title and messages
|
|
||||||
|
|
||||||
pdfjs-find-input =
|
|
||||||
.title = Trobar
|
|
||||||
.placeholder = Trobar en o documento…
|
|
||||||
pdfjs-find-previous-button =
|
|
||||||
.title = Trobar l'anterior coincidencia d'a frase
|
|
||||||
pdfjs-find-previous-button-label = Anterior
|
|
||||||
pdfjs-find-next-button =
|
|
||||||
.title = Trobar a siguient coincidencia d'a frase
|
|
||||||
pdfjs-find-next-button-label = Siguient
|
|
||||||
pdfjs-find-highlight-checkbox = Resaltar-lo tot
|
|
||||||
pdfjs-find-match-case-checkbox-label = Coincidencia de mayusclas/minusclas
|
|
||||||
pdfjs-find-entire-word-checkbox-label = Parolas completas
|
|
||||||
pdfjs-find-reached-top = S'ha plegau a l'inicio d'o documento, se contina dende baixo
|
|
||||||
pdfjs-find-reached-bottom = S'ha plegau a la fin d'o documento, se contina dende alto
|
|
||||||
pdfjs-find-not-found = No s'ha trobau a frase
|
|
||||||
|
|
||||||
## Predefined zoom values
|
|
||||||
|
|
||||||
pdfjs-page-scale-width = Amplaria d'a pachina
|
|
||||||
pdfjs-page-scale-fit = Achuste d'a pachina
|
|
||||||
pdfjs-page-scale-auto = Grandaria automatica
|
|
||||||
pdfjs-page-scale-actual = Grandaria actual
|
|
||||||
# Variables:
|
|
||||||
# $scale (Number) - percent value for page scale
|
|
||||||
pdfjs-page-scale-percent = { $scale }%
|
|
||||||
|
|
||||||
## PDF page
|
|
||||||
|
|
||||||
|
|
||||||
## Loading indicator messages
|
|
||||||
|
|
||||||
pdfjs-loading-error = S'ha produciu una error en cargar o PDF.
|
|
||||||
pdfjs-invalid-file-error = O PDF no ye valido u ye estorbau.
|
|
||||||
pdfjs-missing-file-error = No i ha fichero PDF.
|
|
||||||
pdfjs-unexpected-response-error = Respuesta a lo servicio inasperada.
|
|
||||||
pdfjs-rendering-error = Ha ocurriu una error en renderizar a pachina.
|
|
||||||
|
|
||||||
## Annotations
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $date (Date) - the modification date of the annotation
|
|
||||||
# $time (Time) - the modification time of the annotation
|
|
||||||
pdfjs-annotation-date-string = { $date }, { $time }
|
|
||||||
# .alt: This is used as a tooltip.
|
|
||||||
# Variables:
|
|
||||||
# $type (String) - an annotation type from a list defined in the PDF spec
|
|
||||||
# (32000-1:2008 Table 169 – Annotation types).
|
|
||||||
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
|
||||||
pdfjs-text-annotation-type =
|
|
||||||
.alt = [Anotación { $type }]
|
|
||||||
|
|
||||||
## Password
|
|
||||||
|
|
||||||
pdfjs-password-label = Introduzca a clau ta ubrir iste fichero PDF.
|
|
||||||
pdfjs-password-invalid = Clau invalida. Torna a intentar-lo.
|
|
||||||
pdfjs-password-ok-button = Acceptar
|
|
||||||
pdfjs-password-cancel-button = Cancelar
|
|
||||||
pdfjs-web-fonts-disabled = As fuents web son desactivadas: no se puet incrustar fichers PDF.
|
|
||||||
|
|
||||||
## Editing
|
|
||||||
|
|
||||||
|
|
||||||
## Alt-text dialog
|
|
||||||
|
|
||||||
|
|
||||||
## Editor resizers
|
|
||||||
## This is used in an aria label to help to understand the role of the resizer.
|
|
||||||
|
|
243
l10n/an/viewer.properties
Normal file
243
l10n/an/viewer.properties
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
# Copyright 2012 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.
|
||||||
|
|
||||||
|
# Main toolbar buttons (tooltips and alt text for images)
|
||||||
|
previous.title=Pachina anterior
|
||||||
|
previous_label=Anterior
|
||||||
|
next.title=Pachina siguient
|
||||||
|
next_label=Siguient
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
|
||||||
|
page.title=Pachina
|
||||||
|
# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
|
||||||
|
# representing the total number of pages in the document.
|
||||||
|
of_pages=de {{pagesCount}}
|
||||||
|
# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
|
||||||
|
# will be replaced by a number representing the currently visible page,
|
||||||
|
# respectively a number representing the total number of pages in the document.
|
||||||
|
page_of_pages=({{pageNumber}} de {{pagesCount}})
|
||||||
|
|
||||||
|
zoom_out.title=Achiquir
|
||||||
|
zoom_out_label=Achiquir
|
||||||
|
zoom_in.title=Agrandir
|
||||||
|
zoom_in_label=Agrandir
|
||||||
|
zoom.title=Grandaria
|
||||||
|
presentation_mode.title=Cambear t'o modo de presentación
|
||||||
|
presentation_mode_label=Modo de presentación
|
||||||
|
open_file.title=Ubrir o fichero
|
||||||
|
open_file_label=Ubrir
|
||||||
|
print.title=Imprentar
|
||||||
|
print_label=Imprentar
|
||||||
|
download.title=Descargar
|
||||||
|
download_label=Descargar
|
||||||
|
bookmark.title=Vista actual (copiar u ubrir en una nueva finestra)
|
||||||
|
bookmark_label=Vista actual
|
||||||
|
|
||||||
|
# Secondary toolbar and context menu
|
||||||
|
tools.title=Ferramientas
|
||||||
|
tools_label=Ferramientas
|
||||||
|
first_page.title=Ir ta la primer pachina
|
||||||
|
first_page_label=Ir ta la primer pachina
|
||||||
|
last_page.title=Ir ta la zaguer pachina
|
||||||
|
last_page_label=Ir ta la zaguer pachina
|
||||||
|
page_rotate_cw.title=Chirar enta la dreita
|
||||||
|
page_rotate_cw_label=Chira enta la dreita
|
||||||
|
page_rotate_ccw.title=Chirar enta la zurda
|
||||||
|
page_rotate_ccw_label=Chirar enta la zurda
|
||||||
|
|
||||||
|
cursor_text_select_tool.title=Activar la ferramienta de selección de texto
|
||||||
|
cursor_text_select_tool_label=Ferramienta de selección de texto
|
||||||
|
cursor_hand_tool.title=Activar la ferramienta man
|
||||||
|
cursor_hand_tool_label=Ferramienta man
|
||||||
|
|
||||||
|
scroll_vertical.title=Usar lo desplazamiento vertical
|
||||||
|
scroll_vertical_label=Desplazamiento vertical
|
||||||
|
scroll_horizontal.title=Usar lo desplazamiento horizontal
|
||||||
|
scroll_horizontal_label=Desplazamiento horizontal
|
||||||
|
scroll_wrapped.title=Activaar lo desplazamiento contino
|
||||||
|
scroll_wrapped_label=Desplazamiento contino
|
||||||
|
|
||||||
|
spread_none.title=No unir vistas de pachinas
|
||||||
|
spread_none_label=Una pachina nomás
|
||||||
|
spread_odd.title=Mostrar vista de pachinas, con as impars a la zurda
|
||||||
|
spread_odd_label=Doble pachina, impar a la zurda
|
||||||
|
spread_even.title=Amostrar vista de pachinas, con as pars a la zurda
|
||||||
|
spread_even_label=Doble pachina, para a la zurda
|
||||||
|
|
||||||
|
# Document properties dialog box
|
||||||
|
document_properties.title=Propiedatz d'o documento...
|
||||||
|
document_properties_label=Propiedatz d'o documento...
|
||||||
|
document_properties_file_name=Nombre de fichero:
|
||||||
|
document_properties_file_size=Grandaria d'o fichero:
|
||||||
|
# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in kilobytes, respectively in bytes.
|
||||||
|
document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
|
||||||
|
# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in megabytes, respectively in bytes.
|
||||||
|
document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
|
||||||
|
document_properties_title=Titol:
|
||||||
|
document_properties_author=Autor:
|
||||||
|
document_properties_subject=Afer:
|
||||||
|
document_properties_keywords=Parolas clau:
|
||||||
|
document_properties_creation_date=Calendata de creyación:
|
||||||
|
document_properties_modification_date=Calendata de modificación:
|
||||||
|
# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
|
||||||
|
# will be replaced by the creation/modification date, and time, of the PDF file.
|
||||||
|
document_properties_date_string={{date}}, {{time}}
|
||||||
|
document_properties_creator=Creyador:
|
||||||
|
document_properties_producer=Creyador de PDF:
|
||||||
|
document_properties_version=Versión de PDF:
|
||||||
|
document_properties_page_count=Numero de pachinas:
|
||||||
|
document_properties_page_size=Mida de pachina:
|
||||||
|
document_properties_page_size_unit_inches=pulgadas
|
||||||
|
document_properties_page_size_unit_millimeters=mm
|
||||||
|
document_properties_page_size_orientation_portrait=vertical
|
||||||
|
document_properties_page_size_orientation_landscape=horizontal
|
||||||
|
document_properties_page_size_name_a3=A3
|
||||||
|
document_properties_page_size_name_a4=A4
|
||||||
|
document_properties_page_size_name_letter=Carta
|
||||||
|
document_properties_page_size_name_legal=Legal
|
||||||
|
# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
|
||||||
|
# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
|
||||||
|
# the size, respectively their unit of measurement and orientation, of the (current) page.
|
||||||
|
document_properties_page_size_dimension_string={{width}} x {{height}} {{unit}} {{orientation}}
|
||||||
|
# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
|
||||||
|
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
|
||||||
|
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
|
||||||
|
document_properties_page_size_dimension_name_string={{width}} x {{height}} {{unit}} {{name}}, {{orientation}}
|
||||||
|
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
|
||||||
|
# the document; usually called "Fast Web View" in English locales of Adobe software.
|
||||||
|
document_properties_linearized=Vista web rapida:
|
||||||
|
document_properties_linearized_yes=Sí
|
||||||
|
document_properties_linearized_no=No
|
||||||
|
document_properties_close=Zarrar
|
||||||
|
|
||||||
|
print_progress_message=Se ye preparando la documentación pa imprentar…
|
||||||
|
# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
|
||||||
|
# a numerical per cent value.
|
||||||
|
print_progress_percent={{progress}}%
|
||||||
|
print_progress_close=Cancelar
|
||||||
|
|
||||||
|
# Tooltips and alt text for side panel toolbar buttons
|
||||||
|
# (the _label strings are alt text for the buttons, the .title strings are
|
||||||
|
# tooltips)
|
||||||
|
toggle_sidebar.title=Amostrar u amagar a barra lateral
|
||||||
|
toggle_sidebar_notification2.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos/capas)
|
||||||
|
toggle_sidebar_label=Amostrar a barra lateral
|
||||||
|
document_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)
|
||||||
|
document_outline_label=Esquema d'o documento
|
||||||
|
attachments.title=Amostrar os adchuntos
|
||||||
|
attachments_label=Adchuntos
|
||||||
|
layers.title=Amostrar capas (doble clic para reiniciar totas las capas a lo estau per defecto)
|
||||||
|
layers_label=Capas
|
||||||
|
thumbs.title=Amostrar as miniaturas
|
||||||
|
thumbs_label=Miniaturas
|
||||||
|
findbar.title=Trobar en o documento
|
||||||
|
findbar_label=Trobar
|
||||||
|
|
||||||
|
additional_layers=Capas adicionals
|
||||||
|
# Thumbnails panel item (tooltip and alt text for images)
|
||||||
|
# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_title=Pachina {{page}}
|
||||||
|
# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_canvas=Miniatura d'a pachina {{page}}
|
||||||
|
|
||||||
|
# Find panel button title and messages
|
||||||
|
find_input.title=Trobar
|
||||||
|
find_input.placeholder=Trobar en o documento…
|
||||||
|
find_previous.title=Trobar l'anterior coincidencia d'a frase
|
||||||
|
find_previous_label=Anterior
|
||||||
|
find_next.title=Trobar a siguient coincidencia d'a frase
|
||||||
|
find_next_label=Siguient
|
||||||
|
find_highlight=Resaltar-lo tot
|
||||||
|
find_match_case_label=Coincidencia de mayusclas/minusclas
|
||||||
|
find_entire_word_label=Parolas completas
|
||||||
|
find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo
|
||||||
|
find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto
|
||||||
|
# LOCALIZATION NOTE (find_match_count): The supported plural forms are
|
||||||
|
# [one|two|few|many|other], with [other] as the default value.
|
||||||
|
# "{{current}}" and "{{total}}" will be replaced by a number representing the
|
||||||
|
# index of the currently active find result, respectively a number representing
|
||||||
|
# the total number of matches in the document.
|
||||||
|
find_match_count={[ plural(total) ]}
|
||||||
|
find_match_count[one]={{current}} de {{total}} coincidencia
|
||||||
|
find_match_count[two]={{current}} de {{total}} coincidencias
|
||||||
|
find_match_count[few]={{current}} de {{total}} coincidencias
|
||||||
|
find_match_count[many]={{current}} de {{total}} coincidencias
|
||||||
|
find_match_count[other]={{current}} de {{total}} coincidencias
|
||||||
|
# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
|
||||||
|
# [zero|one|two|few|many|other], with [other] as the default value.
|
||||||
|
# "{{limit}}" will be replaced by a numerical value.
|
||||||
|
find_match_count_limit={[ plural(limit) ]}
|
||||||
|
find_match_count_limit[zero]=Mas de {{limit}} coincidencias
|
||||||
|
find_match_count_limit[one]=Mas de {{limit}} coincidencias
|
||||||
|
find_match_count_limit[two]=Mas que {{limit}} coincidencias
|
||||||
|
find_match_count_limit[few]=Mas que {{limit}} coincidencias
|
||||||
|
find_match_count_limit[many]=Mas que {{limit}} coincidencias
|
||||||
|
find_match_count_limit[other]=Mas que {{limit}} coincidencias
|
||||||
|
find_not_found=No s'ha trobau a frase
|
||||||
|
|
||||||
|
# Error panel labels
|
||||||
|
error_more_info=Mas información
|
||||||
|
error_less_info=Menos información
|
||||||
|
error_close=Zarrar
|
||||||
|
# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
|
||||||
|
# replaced by the PDF.JS version and build ID.
|
||||||
|
error_version_info=PDF.js v{{version}} (build: {{build}})
|
||||||
|
# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
|
||||||
|
# english string describing the error.
|
||||||
|
error_message=Mensache: {{message}}
|
||||||
|
# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
|
||||||
|
# trace.
|
||||||
|
error_stack=Pila: {{stack}}
|
||||||
|
# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
|
||||||
|
error_file=Fichero: {{file}}
|
||||||
|
# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
|
||||||
|
error_line=Linia: {{line}}
|
||||||
|
rendering_error=Ha ocurriu una error en renderizar a pachina.
|
||||||
|
|
||||||
|
# Predefined zoom values
|
||||||
|
page_scale_width=Amplaria d'a pachina
|
||||||
|
page_scale_fit=Achuste d'a pachina
|
||||||
|
page_scale_auto=Grandaria automatica
|
||||||
|
page_scale_actual=Grandaria actual
|
||||||
|
# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
|
||||||
|
# numerical scale value.
|
||||||
|
page_scale_percent={{scale}}%
|
||||||
|
|
||||||
|
loading_error=S'ha produciu una error en cargar o PDF.
|
||||||
|
invalid_file_error=O PDF no ye valido u ye estorbau.
|
||||||
|
missing_file_error=No i ha fichero PDF.
|
||||||
|
unexpected_response_error=Respuesta a lo servicio inasperada.
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
|
||||||
|
# replaced by the modification date, and time, of the annotation.
|
||||||
|
annotation_date_string={{date}}, {{time}}
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
|
||||||
|
# "{{type}}" will be replaced with an annotation type from a list defined in
|
||||||
|
# the PDF spec (32000-1:2008 Table 169 – Annotation types).
|
||||||
|
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
||||||
|
text_annotation_type.alt=[Anotación {{type}}]
|
||||||
|
password_label=Introduzca a clau ta ubrir iste fichero PDF.
|
||||||
|
password_invalid=Clau invalida. Torna a intentar-lo.
|
||||||
|
password_ok=Acceptar
|
||||||
|
password_cancel=Cancelar
|
||||||
|
|
||||||
|
printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.
|
||||||
|
printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.
|
||||||
|
web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.
|
||||||
|
|
@ -1,289 +0,0 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
|
|
||||||
## Main toolbar buttons (tooltips and alt text for images)
|
|
||||||
|
|
||||||
pdfjs-previous-button =
|
|
||||||
.title = الصفحة السابقة
|
|
||||||
pdfjs-previous-button-label = السابقة
|
|
||||||
pdfjs-next-button =
|
|
||||||
.title = الصفحة التالية
|
|
||||||
pdfjs-next-button-label = التالية
|
|
||||||
# .title: Tooltip for the pageNumber input.
|
|
||||||
pdfjs-page-input =
|
|
||||||
.title = صفحة
|
|
||||||
# Variables:
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
# This string follows an input field with the number of the page currently displayed.
|
|
||||||
pdfjs-of-pages = من { $pagesCount }
|
|
||||||
# Variables:
|
|
||||||
# $pageNumber (Number) - the currently visible page
|
|
||||||
# $pagesCount (Number) - the total number of pages in the document
|
|
||||||
pdfjs-page-of-pages = ({ $pageNumber } من { $pagesCount })
|
|
||||||
pdfjs-zoom-out-button =
|
|
||||||
.title = بعّد
|
|
||||||
pdfjs-zoom-out-button-label = بعّد
|
|
||||||
pdfjs-zoom-in-button =
|
|
||||||
.title = قرّب
|
|
||||||
pdfjs-zoom-in-button-label = قرّب
|
|
||||||
pdfjs-zoom-select =
|
|
||||||
.title = التقريب
|
|
||||||
pdfjs-presentation-mode-button =
|
|
||||||
.title = انتقل لوضع العرض التقديمي
|
|
||||||
pdfjs-presentation-mode-button-label = وضع العرض التقديمي
|
|
||||||
pdfjs-open-file-button =
|
|
||||||
.title = افتح ملفًا
|
|
||||||
pdfjs-open-file-button-label = افتح
|
|
||||||
pdfjs-print-button =
|
|
||||||
.title = اطبع
|
|
||||||
pdfjs-print-button-label = اطبع
|
|
||||||
pdfjs-save-button =
|
|
||||||
.title = احفظ
|
|
||||||
pdfjs-save-button-label = احفظ
|
|
||||||
# Used in Firefox for Android as a tooltip for the download button (“download” is a verb).
|
|
||||||
pdfjs-download-button =
|
|
||||||
.title = نزّل
|
|
||||||
# Used in Firefox for Android as a label for the download button (“download” is a verb).
|
|
||||||
# Length of the translation matters since we are in a mobile context, with limited screen estate.
|
|
||||||
pdfjs-download-button-label = نزّل
|
|
||||||
pdfjs-bookmark-button =
|
|
||||||
.title = الصفحة الحالية (عرض URL من الصفحة الحالية)
|
|
||||||
pdfjs-bookmark-button-label = الصفحة الحالية
|
|
||||||
# Used in Firefox for Android.
|
|
||||||
pdfjs-open-in-app-button =
|
|
||||||
.title = افتح في تطبيق
|
|
||||||
# Used in Firefox for Android.
|
|
||||||
# Length of the translation matters since we are in a mobile context, with limited screen estate.
|
|
||||||
pdfjs-open-in-app-button-label = افتح في تطبيق
|
|
||||||
|
|
||||||
## Secondary toolbar and context menu
|
|
||||||
|
|
||||||
pdfjs-tools-button =
|
|
||||||
.title = الأدوات
|
|
||||||
pdfjs-tools-button-label = الأدوات
|
|
||||||
pdfjs-first-page-button =
|
|
||||||
.title = انتقل إلى الصفحة الأولى
|
|
||||||
pdfjs-first-page-button-label = انتقل إلى الصفحة الأولى
|
|
||||||
pdfjs-last-page-button =
|
|
||||||
.title = انتقل إلى الصفحة الأخيرة
|
|
||||||
pdfjs-last-page-button-label = انتقل إلى الصفحة الأخيرة
|
|
||||||
pdfjs-page-rotate-cw-button =
|
|
||||||
.title = أدر باتجاه عقارب الساعة
|
|
||||||
pdfjs-page-rotate-cw-button-label = أدر باتجاه عقارب الساعة
|
|
||||||
pdfjs-page-rotate-ccw-button =
|
|
||||||
.title = أدر بعكس اتجاه عقارب الساعة
|
|
||||||
pdfjs-page-rotate-ccw-button-label = أدر بعكس اتجاه عقارب الساعة
|
|
||||||
pdfjs-cursor-text-select-tool-button =
|
|
||||||
.title = فعّل أداة اختيار النص
|
|
||||||
pdfjs-cursor-text-select-tool-button-label = أداة اختيار النص
|
|
||||||
pdfjs-cursor-hand-tool-button =
|
|
||||||
.title = فعّل أداة اليد
|
|
||||||
pdfjs-cursor-hand-tool-button-label = أداة اليد
|
|
||||||
pdfjs-scroll-vertical-button =
|
|
||||||
.title = استخدم التمرير الرأسي
|
|
||||||
pdfjs-scroll-vertical-button-label = التمرير الرأسي
|
|
||||||
pdfjs-scroll-horizontal-button =
|
|
||||||
.title = استخدم التمرير الأفقي
|
|
||||||
pdfjs-scroll-horizontal-button-label = التمرير الأفقي
|
|
||||||
pdfjs-scroll-wrapped-button =
|
|
||||||
.title = استخدم التمرير الملتف
|
|
||||||
pdfjs-scroll-wrapped-button-label = التمرير الملتف
|
|
||||||
pdfjs-spread-none-button =
|
|
||||||
.title = لا تدمج هوامش الصفحات مع بعضها البعض
|
|
||||||
pdfjs-spread-none-button-label = بلا هوامش
|
|
||||||
pdfjs-spread-odd-button =
|
|
||||||
.title = ادمج هوامش الصفحات الفردية
|
|
||||||
pdfjs-spread-odd-button-label = هوامش الصفحات الفردية
|
|
||||||
pdfjs-spread-even-button =
|
|
||||||
.title = ادمج هوامش الصفحات الزوجية
|
|
||||||
pdfjs-spread-even-button-label = هوامش الصفحات الزوجية
|
|
||||||
|
|
||||||
## Document properties dialog
|
|
||||||
|
|
||||||
pdfjs-document-properties-button =
|
|
||||||
.title = خصائص المستند…
|
|
||||||
pdfjs-document-properties-button-label = خصائص المستند…
|
|
||||||
pdfjs-document-properties-file-name = اسم الملف:
|
|
||||||
pdfjs-document-properties-file-size = حجم الملف:
|
|
||||||
# Variables:
|
|
||||||
# $size_kb (Number) - the PDF file size in kilobytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-kb = { $size_kb } ك.بايت ({ $size_b } بايت)
|
|
||||||
# Variables:
|
|
||||||
# $size_mb (Number) - the PDF file size in megabytes
|
|
||||||
# $size_b (Number) - the PDF file size in bytes
|
|
||||||
pdfjs-document-properties-mb = { $size_mb } م.بايت ({ $size_b } بايت)
|
|
||||||
pdfjs-document-properties-title = العنوان:
|
|
||||||
pdfjs-document-properties-author = المؤلف:
|
|
||||||
pdfjs-document-properties-subject = الموضوع:
|
|
||||||
pdfjs-document-properties-keywords = الكلمات الأساسية:
|
|
||||||
pdfjs-document-properties-creation-date = تاريخ الإنشاء:
|
|
||||||
pdfjs-document-properties-modification-date = تاريخ التعديل:
|
|
||||||
# Variables:
|
|
||||||
# $date (Date) - the creation/modification date of the PDF file
|
|
||||||
# $time (Time) - the creation/modification time of the PDF file
|
|
||||||
pdfjs-document-properties-date-string = { $date }، { $time }
|
|
||||||
pdfjs-document-properties-creator = المنشئ:
|
|
||||||
pdfjs-document-properties-producer = منتج PDF:
|
|
||||||
pdfjs-document-properties-version = إصدارة PDF:
|
|
||||||
pdfjs-document-properties-page-count = عدد الصفحات:
|
|
||||||
pdfjs-document-properties-page-size = مقاس الورقة:
|
|
||||||
pdfjs-document-properties-page-size-unit-inches = بوصة
|
|
||||||
pdfjs-document-properties-page-size-unit-millimeters = ملم
|
|
||||||
pdfjs-document-properties-page-size-orientation-portrait = طوليّ
|
|
||||||
pdfjs-document-properties-page-size-orientation-landscape = عرضيّ
|
|
||||||
pdfjs-document-properties-page-size-name-a-three = A3
|
|
||||||
pdfjs-document-properties-page-size-name-a-four = A4
|
|
||||||
pdfjs-document-properties-page-size-name-letter = خطاب
|
|
||||||
pdfjs-document-properties-page-size-name-legal = قانونيّ
|
|
||||||
|
|
||||||
## Variables:
|
|
||||||
## $width (Number) - the width of the (current) page
|
|
||||||
## $height (Number) - the height of the (current) page
|
|
||||||
## $unit (String) - the unit of measurement of the (current) page
|
|
||||||
## $name (String) - the name of the (current) page
|
|
||||||
## $orientation (String) - the orientation of the (current) page
|
|
||||||
|
|
||||||
pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation })
|
|
||||||
pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }، { $orientation })
|
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
# The linearization status of the document; usually called "Fast Web View" in
|
|
||||||
# English locales of Adobe software.
|
|
||||||
pdfjs-document-properties-linearized = العرض السريع عبر الوِب:
|
|
||||||
pdfjs-document-properties-linearized-yes = نعم
|
|
||||||
pdfjs-document-properties-linearized-no = لا
|
|
||||||
pdfjs-document-properties-close-button = أغلق
|
|
||||||
|
|
||||||
## Print
|
|
||||||
|
|
||||||
pdfjs-print-progress-message = يُحضّر المستند للطباعة…
|
|
||||||
# Variables:
|
|
||||||
# $progress (Number) - percent value
|
|
||||||
pdfjs-print-progress-percent = { $progress }٪
|
|
||||||
pdfjs-print-progress-close-button = ألغِ
|
|
||||||
pdfjs-printing-not-supported = تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.
|
|
||||||
pdfjs-printing-not-ready = تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.
|
|
||||||
|
|
||||||
## Tooltips and alt text for side panel toolbar buttons
|
|
||||||
|
|
||||||
pdfjs-toggle-sidebar-button =
|
|
||||||
.title = بدّل ظهور الشريط الجانبي
|
|
||||||
pdfjs-toggle-sidebar-notification-button =
|
|
||||||
.title = بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات أو طبقات)
|
|
||||||
pdfjs-toggle-sidebar-button-label = بدّل ظهور الشريط الجانبي
|
|
||||||
pdfjs-document-outline-button =
|
|
||||||
.title = اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر)
|
|
||||||
pdfjs-document-outline-button-label = مخطط المستند
|
|
||||||
pdfjs-attachments-button =
|
|
||||||
.title = اعرض المرفقات
|
|
||||||
pdfjs-attachments-button-label = المُرفقات
|
|
||||||
pdfjs-layers-button =
|
|
||||||
.title = اعرض الطبقات (انقر مرتين لتصفير كل الطبقات إلى الحالة المبدئية)
|
|
||||||
pdfjs-layers-button-label = الطبقات
|
|
||||||
pdfjs-thumbs-button =
|
|
||||||
.title = اعرض مُصغرات
|
|
||||||
pdfjs-thumbs-button-label = مُصغّرات
|
|
||||||
pdfjs-findbar-button =
|
|
||||||
.title = ابحث في المستند
|
|
||||||
pdfjs-findbar-button-label = ابحث
|
|
||||||
pdfjs-additional-layers = الطبقات الإضافية
|
|
||||||
|
|
||||||
## Thumbnails panel item (tooltip and alt text for images)
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-title =
|
|
||||||
.title = صفحة { $page }
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-thumb-page-canvas =
|
|
||||||
.aria-label = مصغّرة صفحة { $page }
|
|
||||||
|
|
||||||
## Find panel button title and messages
|
|
||||||
|
|
||||||
pdfjs-find-input =
|
|
||||||
.title = ابحث
|
|
||||||
.placeholder = ابحث في المستند…
|
|
||||||
pdfjs-find-previous-button =
|
|
||||||
.title = ابحث عن التّواجد السّابق للعبارة
|
|
||||||
pdfjs-find-previous-button-label = السابق
|
|
||||||
pdfjs-find-next-button =
|
|
||||||
.title = ابحث عن التّواجد التّالي للعبارة
|
|
||||||
pdfjs-find-next-button-label = التالي
|
|
||||||
pdfjs-find-highlight-checkbox = أبرِز الكل
|
|
||||||
pdfjs-find-match-case-checkbox-label = طابق حالة الأحرف
|
|
||||||
pdfjs-find-match-diacritics-checkbox-label = طابِق الحركات
|
|
||||||
pdfjs-find-entire-word-checkbox-label = كلمات كاملة
|
|
||||||
pdfjs-find-reached-top = تابعت من الأسفل بعدما وصلت إلى بداية المستند
|
|
||||||
pdfjs-find-reached-bottom = تابعت من الأعلى بعدما وصلت إلى نهاية المستند
|
|
||||||
pdfjs-find-not-found = لا وجود للعبارة
|
|
||||||
|
|
||||||
## Predefined zoom values
|
|
||||||
|
|
||||||
pdfjs-page-scale-width = عرض الصفحة
|
|
||||||
pdfjs-page-scale-fit = ملائمة الصفحة
|
|
||||||
pdfjs-page-scale-auto = تقريب تلقائي
|
|
||||||
pdfjs-page-scale-actual = الحجم الفعلي
|
|
||||||
# Variables:
|
|
||||||
# $scale (Number) - percent value for page scale
|
|
||||||
pdfjs-page-scale-percent = { $scale }٪
|
|
||||||
|
|
||||||
## PDF page
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $page (Number) - the page number
|
|
||||||
pdfjs-page-landmark =
|
|
||||||
.aria-label = صفحة { $page }
|
|
||||||
|
|
||||||
## Loading indicator messages
|
|
||||||
|
|
||||||
pdfjs-loading-error = حدث عطل أثناء تحميل ملف PDF.
|
|
||||||
pdfjs-invalid-file-error = ملف PDF تالف أو غير صحيح.
|
|
||||||
pdfjs-missing-file-error = ملف PDF غير موجود.
|
|
||||||
pdfjs-unexpected-response-error = استجابة خادوم غير متوقعة.
|
|
||||||
pdfjs-rendering-error = حدث خطأ أثناء عرض الصفحة.
|
|
||||||
|
|
||||||
## Annotations
|
|
||||||
|
|
||||||
# Variables:
|
|
||||||
# $date (Date) - the modification date of the annotation
|
|
||||||
# $time (Time) - the modification time of the annotation
|
|
||||||
pdfjs-annotation-date-string = { $date }، { $time }
|
|
||||||
# .alt: This is used as a tooltip.
|
|
||||||
# Variables:
|
|
||||||
# $type (String) - an annotation type from a list defined in the PDF spec
|
|
||||||
# (32000-1:2008 Table 169 – Annotation types).
|
|
||||||
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
|
||||||
pdfjs-text-annotation-type =
|
|
||||||
.alt = [تعليق { $type }]
|
|
||||||
|
|
||||||
## Password
|
|
||||||
|
|
||||||
pdfjs-password-label = أدخل لكلمة السر لفتح هذا الملف.
|
|
||||||
pdfjs-password-invalid = كلمة سر خطأ. من فضلك أعد المحاولة.
|
|
||||||
pdfjs-password-ok-button = حسنا
|
|
||||||
pdfjs-password-cancel-button = ألغِ
|
|
||||||
pdfjs-web-fonts-disabled = خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.
|
|
||||||
|
|
||||||
## Editing
|
|
||||||
|
|
||||||
|
|
||||||
## Remove button for the various kind of editor.
|
|
||||||
|
|
||||||
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
## Alt-text dialog
|
|
||||||
|
|
||||||
|
|
||||||
## Editor resizers
|
|
||||||
## This is used in an aria label to help to understand the role of the resizer.
|
|
||||||
|
|
||||||
|
|
||||||
## Color picker
|
|
||||||
|
|
247
l10n/ar/viewer.properties
Normal file
247
l10n/ar/viewer.properties
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
# Copyright 2012 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.
|
||||||
|
|
||||||
|
# Main toolbar buttons (tooltips and alt text for images)
|
||||||
|
previous.title=الصفحة السابقة
|
||||||
|
previous_label=السابقة
|
||||||
|
next.title=الصفحة التالية
|
||||||
|
next_label=التالية
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
|
||||||
|
page.title=صفحة
|
||||||
|
# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
|
||||||
|
# representing the total number of pages in the document.
|
||||||
|
of_pages=من {{pagesCount}}
|
||||||
|
# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
|
||||||
|
# will be replaced by a number representing the currently visible page,
|
||||||
|
# respectively a number representing the total number of pages in the document.
|
||||||
|
page_of_pages=({{pageNumber}} من {{pagesCount}})
|
||||||
|
|
||||||
|
zoom_out.title=بعّد
|
||||||
|
zoom_out_label=بعّد
|
||||||
|
zoom_in.title=قرّب
|
||||||
|
zoom_in_label=قرّب
|
||||||
|
zoom.title=التقريب
|
||||||
|
presentation_mode.title=انتقل لوضع العرض التقديمي
|
||||||
|
presentation_mode_label=وضع العرض التقديمي
|
||||||
|
open_file.title=افتح ملفًا
|
||||||
|
open_file_label=افتح
|
||||||
|
print.title=اطبع
|
||||||
|
print_label=اطبع
|
||||||
|
download.title=نزّل
|
||||||
|
download_label=نزّل
|
||||||
|
bookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)
|
||||||
|
bookmark_label=المنظور الحالي
|
||||||
|
|
||||||
|
# Secondary toolbar and context menu
|
||||||
|
tools.title=الأدوات
|
||||||
|
tools_label=الأدوات
|
||||||
|
first_page.title=انتقل إلى الصفحة الأولى
|
||||||
|
first_page_label=انتقل إلى الصفحة الأولى
|
||||||
|
last_page.title=انتقل إلى الصفحة الأخيرة
|
||||||
|
last_page_label=انتقل إلى الصفحة الأخيرة
|
||||||
|
page_rotate_cw.title=أدر باتجاه عقارب الساعة
|
||||||
|
page_rotate_cw_label=أدر باتجاه عقارب الساعة
|
||||||
|
page_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة
|
||||||
|
page_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة
|
||||||
|
|
||||||
|
cursor_text_select_tool.title=فعّل أداة اختيار النص
|
||||||
|
cursor_text_select_tool_label=أداة اختيار النص
|
||||||
|
cursor_hand_tool.title=فعّل أداة اليد
|
||||||
|
cursor_hand_tool_label=أداة اليد
|
||||||
|
|
||||||
|
scroll_vertical.title=استخدم التمرير الرأسي
|
||||||
|
scroll_vertical_label=التمرير الرأسي
|
||||||
|
scroll_horizontal.title=استخدم التمرير الأفقي
|
||||||
|
scroll_horizontal_label=التمرير الأفقي
|
||||||
|
scroll_wrapped.title=استخدم التمرير الملتف
|
||||||
|
scroll_wrapped_label=التمرير الملتف
|
||||||
|
|
||||||
|
spread_none.title=لا تدمج هوامش الصفحات مع بعضها البعض
|
||||||
|
spread_none_label=بلا هوامش
|
||||||
|
spread_odd.title=ادمج هوامش الصفحات الفردية
|
||||||
|
spread_odd_label=هوامش الصفحات الفردية
|
||||||
|
spread_even.title=ادمج هوامش الصفحات الزوجية
|
||||||
|
spread_even_label=هوامش الصفحات الزوجية
|
||||||
|
|
||||||
|
# Document properties dialog box
|
||||||
|
document_properties.title=خصائص المستند…
|
||||||
|
document_properties_label=خصائص المستند…
|
||||||
|
document_properties_file_name=اسم الملف:
|
||||||
|
document_properties_file_size=حجم الملف:
|
||||||
|
# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in kilobytes, respectively in bytes.
|
||||||
|
document_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)
|
||||||
|
# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
|
||||||
|
# will be replaced by the PDF file size in megabytes, respectively in bytes.
|
||||||
|
document_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)
|
||||||
|
document_properties_title=العنوان:
|
||||||
|
document_properties_author=المؤلف:
|
||||||
|
document_properties_subject=الموضوع:
|
||||||
|
document_properties_keywords=الكلمات الأساسية:
|
||||||
|
document_properties_creation_date=تاريخ الإنشاء:
|
||||||
|
document_properties_modification_date=تاريخ التعديل:
|
||||||
|
# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
|
||||||
|
# will be replaced by the creation/modification date, and time, of the PDF file.
|
||||||
|
document_properties_date_string={{date}}، {{time}}
|
||||||
|
document_properties_creator=المنشئ:
|
||||||
|
document_properties_producer=منتج PDF:
|
||||||
|
document_properties_version=إصدارة PDF:
|
||||||
|
document_properties_page_count=عدد الصفحات:
|
||||||
|
document_properties_page_size=مقاس الورقة:
|
||||||
|
document_properties_page_size_unit_inches=بوصة
|
||||||
|
document_properties_page_size_unit_millimeters=ملم
|
||||||
|
document_properties_page_size_orientation_portrait=طوليّ
|
||||||
|
document_properties_page_size_orientation_landscape=عرضيّ
|
||||||
|
document_properties_page_size_name_a3=A3
|
||||||
|
document_properties_page_size_name_a4=A4
|
||||||
|
document_properties_page_size_name_letter=خطاب
|
||||||
|
document_properties_page_size_name_legal=قانونيّ
|
||||||
|
# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
|
||||||
|
# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
|
||||||
|
# the size, respectively their unit of measurement and orientation, of the (current) page.
|
||||||
|
document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}} ({{orientation}})
|
||||||
|
# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
|
||||||
|
# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
|
||||||
|
# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
|
||||||
|
document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}} ({{name}}، {{orientation}})
|
||||||
|
# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
|
||||||
|
# the document; usually called "Fast Web View" in English locales of Adobe software.
|
||||||
|
document_properties_linearized=العرض السريع عبر الوِب:
|
||||||
|
document_properties_linearized_yes=نعم
|
||||||
|
document_properties_linearized_no=لا
|
||||||
|
document_properties_close=أغلق
|
||||||
|
|
||||||
|
print_progress_message=يُحضّر المستند للطباعة…
|
||||||
|
# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
|
||||||
|
# a numerical per cent value.
|
||||||
|
print_progress_percent={{progress}}٪
|
||||||
|
print_progress_close=ألغِ
|
||||||
|
|
||||||
|
# Tooltips and alt text for side panel toolbar buttons
|
||||||
|
# (the _label strings are alt text for the buttons, the .title strings are
|
||||||
|
# tooltips)
|
||||||
|
toggle_sidebar.title=بدّل ظهور الشريط الجانبي
|
||||||
|
toggle_sidebar_notification2.title=بدّل ظهور الشريط الجانبي (يحتوي المستند على مخطط أو مرفقات أو طبقات)
|
||||||
|
toggle_sidebar_label=بدّل ظهور الشريط الجانبي
|
||||||
|
document_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر)
|
||||||
|
document_outline_label=مخطط المستند
|
||||||
|
attachments.title=اعرض المرفقات
|
||||||
|
attachments_label=المُرفقات
|
||||||
|
layers.title=اعرض الطبقات (انقر مرتين لتصفير كل الطبقات إلى الحالة المبدئية)
|
||||||
|
layers_label=الطبقات
|
||||||
|
thumbs.title=اعرض مُصغرات
|
||||||
|
thumbs_label=مُصغّرات
|
||||||
|
findbar.title=ابحث في المستند
|
||||||
|
findbar_label=ابحث
|
||||||
|
|
||||||
|
additional_layers=الطبقات الإضافية
|
||||||
|
# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
|
||||||
|
page_landmark=صفحة {{page}}
|
||||||
|
# Thumbnails panel item (tooltip and alt text for images)
|
||||||
|
# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_title=صفحة {{page}}
|
||||||
|
# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
|
||||||
|
# number.
|
||||||
|
thumb_page_canvas=مصغّرة صفحة {{page}}
|
||||||
|
|
||||||
|
# Find panel button title and messages
|
||||||
|
find_input.title=ابحث
|
||||||
|
find_input.placeholder=ابحث في المستند…
|
||||||
|
find_previous.title=ابحث عن التّواجد السّابق للعبارة
|
||||||
|
find_previous_label=السابق
|
||||||
|
find_next.title=ابحث عن التّواجد التّالي للعبارة
|
||||||
|
find_next_label=التالي
|
||||||
|
find_highlight=أبرِز الكل
|
||||||
|
find_match_case_label=طابق حالة الأحرف
|
||||||
|
find_entire_word_label=كلمات كاملة
|
||||||
|
find_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند
|
||||||
|
find_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند
|
||||||
|
# LOCALIZATION NOTE (find_match_count): The supported plural forms are
|
||||||
|
# [one|two|few|many|other], with [other] as the default value.
|
||||||
|
# "{{current}}" and "{{total}}" will be replaced by a number representing the
|
||||||
|
# index of the currently active find result, respectively a number representing
|
||||||
|
# the total number of matches in the document.
|
||||||
|
find_match_count={[ plural(total) ]}
|
||||||
|
find_match_count[one]={{current}} من أصل مطابقة واحدة
|
||||||
|
find_match_count[two]={{current}} من أصل مطابقتين
|
||||||
|
find_match_count[few]={{current}} من أصل {{total}} مطابقات
|
||||||
|
find_match_count[many]={{current}} من أصل {{total}} مطابقة
|
||||||
|
find_match_count[other]={{current}} من أصل {{total}} مطابقة
|
||||||
|
# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
|
||||||
|
# [zero|one|two|few|many|other], with [other] as the default value.
|
||||||
|
# "{{limit}}" will be replaced by a numerical value.
|
||||||
|
find_match_count_limit={[ plural(limit) ]}
|
||||||
|
find_match_count_limit[zero]=فقط
|
||||||
|
find_match_count_limit[one]=أكثر من مطابقة واحدة
|
||||||
|
find_match_count_limit[two]=أكثر من مطابقتين
|
||||||
|
find_match_count_limit[few]=أكثر من {{limit}} مطابقات
|
||||||
|
find_match_count_limit[many]=أكثر من {{limit}} مطابقة
|
||||||
|
find_match_count_limit[other]=أكثر من {{limit}} مطابقة
|
||||||
|
find_not_found=لا وجود للعبارة
|
||||||
|
|
||||||
|
# Error panel labels
|
||||||
|
error_more_info=معلومات أكثر
|
||||||
|
error_less_info=معلومات أقل
|
||||||
|
error_close=أغلق
|
||||||
|
# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
|
||||||
|
# replaced by the PDF.JS version and build ID.
|
||||||
|
error_version_info=PDF.js ن{{version}} (بناء: {{build}})
|
||||||
|
# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
|
||||||
|
# english string describing the error.
|
||||||
|
error_message=الرسالة: {{message}}
|
||||||
|
# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
|
||||||
|
# trace.
|
||||||
|
error_stack=الرصّة: {{stack}}
|
||||||
|
# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
|
||||||
|
error_file=الملف: {{file}}
|
||||||
|
# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
|
||||||
|
error_line=السطر: {{line}}
|
||||||
|
rendering_error=حدث خطأ أثناء عرض الصفحة.
|
||||||
|
|
||||||
|
# Predefined zoom values
|
||||||
|
page_scale_width=عرض الصفحة
|
||||||
|
page_scale_fit=ملائمة الصفحة
|
||||||
|
page_scale_auto=تقريب تلقائي
|
||||||
|
page_scale_actual=الحجم الفعلي
|
||||||
|
# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
|
||||||
|
# numerical scale value.
|
||||||
|
page_scale_percent={{scale}}٪
|
||||||
|
|
||||||
|
# Loading indicator messages
|
||||||
|
loading=يحمّل…
|
||||||
|
loading_error=حدث عطل أثناء تحميل ملف PDF.
|
||||||
|
invalid_file_error=ملف PDF تالف أو غير صحيح.
|
||||||
|
missing_file_error=ملف PDF غير موجود.
|
||||||
|
unexpected_response_error=استجابة خادوم غير متوقعة.
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
|
||||||
|
# replaced by the modification date, and time, of the annotation.
|
||||||
|
annotation_date_string={{date}}، {{time}}
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
|
||||||
|
# "{{type}}" will be replaced with an annotation type from a list defined in
|
||||||
|
# the PDF spec (32000-1:2008 Table 169 – Annotation types).
|
||||||
|
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
||||||
|
text_annotation_type.alt=[تعليق {{type}}]
|
||||||
|
password_label=أدخل لكلمة السر لفتح هذا الملف.
|
||||||
|
password_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.
|
||||||
|
password_ok=حسنا
|
||||||
|
password_cancel=ألغِ
|
||||||
|
|
||||||
|
printing_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.
|
||||||
|
printing_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.
|
||||||
|
web_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user