diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22ce2be..d13652c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,6 +65,9 @@ jobs: build-wasm: runs-on: ubuntu-latest + defaults: + run: + working-directory: ./docx-wasm steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -77,7 +80,16 @@ jobs: - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - run: rustup target add wasm32-unknown-unknown - run: npm install -g pnpm - - run: cd docx-wasm && pnpm install && pnpm wasm-pack:node && pnpm wasm-pack:dev && tsc -p tsconfig.node.json && pnpm test + - run: pnpm install && pnpm wasm-pack:node && pnpm wasm-pack:dev && tsc -p tsconfig.node.json && pnpm test + - name: screenshot + run: pnpm screenshot + - uses: reg-viz/reg-actions@v2 + with: + github-token: '${{ secrets.GITHUB_TOKEN }}' + image-directory-path: 'docx-wasm/export-png/png' + threshold-rate: 0.06 + enable-antialias: true + matching-threshold: 0.5 lint: name: Clippy diff --git a/docx-wasm/export-png/.gitignore b/docx-wasm/export-png/.gitignore new file mode 100644 index 0000000..7a399be --- /dev/null +++ b/docx-wasm/export-png/.gitignore @@ -0,0 +1 @@ +png/*.png \ No newline at end of file diff --git a/docx-wasm/export-png/.keep b/docx-wasm/export-png/.keep new file mode 100644 index 0000000..e69de29 diff --git a/docx-wasm/export-png/index.mjs b/docx-wasm/export-png/index.mjs new file mode 100644 index 0000000..9d54f30 --- /dev/null +++ b/docx-wasm/export-png/index.mjs @@ -0,0 +1,29 @@ +import fs from "fs"; +import cp from "child_process"; +import path from "path"; +import { fileURLToPath } from "node:url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const fileType = "png"; + +const inputDir = process.env.OUTPUT_DIR ?? process.exit(1); +const files = fs.readdirSync(inputDir); + +for (const file of files) { + if (/\.docx$/.test(file)) { + console.log(file); + const spawn = cp.spawnSync("make", [ + "run", + `INPUT=${path.join(inputDir, file)}`, + `OUTPUT=${path.join( + __dirname, + "png", + file.replace(/\.docx$/, `.${fileType}`) + )}`, + ]); + console.log(spawn.stdout.toString()); + //break; + } +} diff --git a/docx-wasm/export-png/makefile b/docx-wasm/export-png/makefile new file mode 100644 index 0000000..af9e090 --- /dev/null +++ b/docx-wasm/export-png/makefile @@ -0,0 +1,30 @@ +# docx directory +OUTPUT_DIR=../../output/js + +# For more information for this image, see https://github.com/yuntara/docx-png-converter +REPOSITORY_BASE:=yuntara +IMAGE:=${REPOSITORY_BASE}/docx-png-converter + +# PNG dpi +DENSITY:=150 + +pull: + docker pull ${IMAGE} + +run: + cat ${INPUT} | docker exec -i docx-png-converter bash /root/run.sh ${DENSITY} > ${OUTPUT} + +start: + make stop + make pull + docker run --name docx-png-converter -itd ${IMAGE} /bin/bash + +convert-all: + make start + OUTPUT_DIR=${OUTPUT_DIR} node index.mjs + make stop + +stop: + - docker kill docx-png-converter + - docker rm docx-png-converter + diff --git a/docx-wasm/export-png/png/.keep b/docx-wasm/export-png/png/.keep new file mode 100644 index 0000000..e69de29 diff --git a/docx-wasm/export-png/tsconfig.json b/docx-wasm/export-png/tsconfig.json new file mode 100644 index 0000000..5dcbbbc --- /dev/null +++ b/docx-wasm/export-png/tsconfig.json @@ -0,0 +1,70 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/docx-wasm/package.json b/docx-wasm/package.json index 1814bcd..213a8b4 100644 --- a/docx-wasm/package.json +++ b/docx-wasm/package.json @@ -10,6 +10,7 @@ "wasm-pack:web": "wasm-pack build --release --out-dir dist/web/pkg && rm dist/web/pkg/.gitignore", "wasm-pack:node": "wasm-pack build --release --out-dir dist/node/pkg --target nodejs && rm dist/node/pkg/.gitignore", "wasm-pack": "run-s wasm-pack:*", + "screenshot": "cd export-png && make convert-all", "tsc:web": "tsc -p tsconfig.web.json --sourcemap", "tsc:node": "tsc -p tsconfig.node.json --sourcemap", "tsc": "run-s tsc:*", @@ -53,4 +54,4 @@ "module": "dist/web/index.js", "types": "dist/web/index.d.ts", "dependencies": {} -} \ No newline at end of file +} diff --git a/vrt/index.js b/vrt/index.js deleted file mode 100644 index 1d4a562..0000000 --- a/vrt/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const glob = require("glob"); -const path = require("path"); -const createPDF = require("./pdf"); - -glob( - path.join(__dirname, "..", "./docx-core/tests/output/**/*.docx"), - {}, - async (err, files) => { - for await (file of files) { - await createPDF(file, path.join(__dirname, "./screenshot/actual")); - } - } -); diff --git a/vrt/package.json b/vrt/package.json deleted file mode 100644 index ff0c83b..0000000 --- a/vrt/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "docx-rs", - "version": "1.0.0", - "main": "index.js", - "repository": "https://github.com/bokuweb/docx-rs.git", - "author": "bokuweb ", - "license": "MIT", - "devDependencies": { - "libreoffice-convert": "1.3.5" - }, - "dependencies": { - "glob": "^8.0.0" - } -} diff --git a/vrt/pdf.js b/vrt/pdf.js deleted file mode 100644 index ba5e597..0000000 --- a/vrt/pdf.js +++ /dev/null @@ -1,25 +0,0 @@ -const libre = require("libreoffice-convert"); -const path = require("path"); -const fs = require("fs"); - -const extend = "png"; - -module.exports = (docxPath, outputDir) => - new Promise((resolve, reject) => { - const filename = path.basename(docxPath, ".docx"); - const docxFile = fs.readFileSync(docxPath); - libre.convert(docxFile, extend, undefined, async (err, done) => { - if (err) { - reject(err); - } - try { - fs.mkdirSync(outputDir, { recursive: true }); - } catch (e) { - if (e.code !== "EEXIST") { - reject(e); - } - } - fs.writeFileSync(path.join(outputDir, `${filename}.${extend}`), done); - resolve(); - }); - }); diff --git a/vrt/pnpm-lock.yaml b/vrt/pnpm-lock.yaml deleted file mode 100644 index 1c456c4..0000000 --- a/vrt/pnpm-lock.yaml +++ /dev/null @@ -1,112 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - glob: - specifier: ^8.0.0 - version: 8.1.0 - devDependencies: - libreoffice-convert: - specifier: 1.3.5 - version: 1.3.5 - -packages: - - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - libreoffice-convert@1.3.5: - resolution: {integrity: sha512-nWwToElKATfDoHtbXJALdGoZfQdCNiITvSExVtRQBA32ZP9uwSaw7tDpBgeedJMWWnyoUZU1FWpPF6o4d13Pjw==} - engines: {node: '>=6'} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - -snapshots: - - async@2.6.4: - dependencies: - lodash: 4.17.21 - - balanced-match@1.0.2: {} - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - fs.realpath@1.0.0: {} - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - libreoffice-convert@1.3.5: - dependencies: - async: 2.6.4 - tmp: 0.2.3 - - lodash@4.17.21: {} - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - tmp@0.2.3: {} - - wrappy@1.0.2: {} diff --git a/vrt/screenshot/expected/alignment.png b/vrt/screenshot/expected/alignment.png deleted file mode 100644 index 3022f9b..0000000 Binary files a/vrt/screenshot/expected/alignment.png and /dev/null differ diff --git a/vrt/screenshot/expected/indent.png b/vrt/screenshot/expected/indent.png deleted file mode 100644 index ca69f6b..0000000 Binary files a/vrt/screenshot/expected/indent.png and /dev/null differ diff --git a/vrt/screenshot/expected/size.png b/vrt/screenshot/expected/size.png deleted file mode 100644 index e49024c..0000000 Binary files a/vrt/screenshot/expected/size.png and /dev/null differ