From cd231780738067cf6c90b531aead27a087484ac6 Mon Sep 17 00:00:00 2001 From: bokuweb Date: Fri, 1 Nov 2024 13:37:39 +0900 Subject: [PATCH] spec: add reg (#774) * spec: add reg * fix * fix * fix --- .github/workflows/ci.yml | 14 +++- docx-wasm/export-png/.gitignore | 1 + docx-wasm/export-png/.keep | 0 docx-wasm/export-png/index.mjs | 29 +++++++ docx-wasm/export-png/makefile | 30 +++++++ docx-wasm/export-png/png/.keep | 0 docx-wasm/export-png/tsconfig.json | 70 ++++++++++++++++ docx-wasm/package.json | 3 +- vrt/index.js | 13 --- vrt/package.json | 14 ---- vrt/pdf.js | 25 ------ vrt/pnpm-lock.yaml | 112 -------------------------- vrt/screenshot/expected/alignment.png | Bin 7555 -> 0 bytes vrt/screenshot/expected/indent.png | Bin 25021 -> 0 bytes vrt/screenshot/expected/size.png | Bin 9906 -> 0 bytes 15 files changed, 145 insertions(+), 166 deletions(-) create mode 100644 docx-wasm/export-png/.gitignore create mode 100644 docx-wasm/export-png/.keep create mode 100644 docx-wasm/export-png/index.mjs create mode 100644 docx-wasm/export-png/makefile create mode 100644 docx-wasm/export-png/png/.keep create mode 100644 docx-wasm/export-png/tsconfig.json delete mode 100644 vrt/index.js delete mode 100644 vrt/package.json delete mode 100644 vrt/pdf.js delete mode 100644 vrt/pnpm-lock.yaml delete mode 100644 vrt/screenshot/expected/alignment.png delete mode 100644 vrt/screenshot/expected/indent.png delete mode 100644 vrt/screenshot/expected/size.png 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 3022f9ba11e12e1b4fd502ed0d63726ddd90a013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7555 zcmeI1Yfw{X9>$Nx8Woi~y57P?$0@EiKu~T0&nj-w1)*vc6@;`A&;`P#SO^dj7Z<5Q zh?iQ3A<0&%(INyIE{0oxVxn9^Eh+?oXrhTBKsW>>mqW5IPIqSa!+zUOoqRcS=FB7fiSvz}^2W;Kx;zmf+i^_xImhv-Q-~6}RIk2kIB?K8)hG0+FxU8$N!wLXKk_5;Yp6%LVW3Ltf_KTDdWyWd=t!EF4u@x_kY9ow z8L$;$>YOo93;p7M%HxCpKmL$dLbsX>Jsq_}X)noxWGN%mqv?E-u-gYmW!&5rS;(`Y z8Wk8A*DzkM^P7HlR4USN@wEegEwd?ou@E8EjZo{^1KZGm)RbnE`Z|(aH{`P%MkmN! zJEdK%NS$~#88u2_7eTXm9FR1GGPoJGSr(Lfu7Y2GbSUsvHORVtp&? zHqf$9?ge>HBRbhh%yUjVp-<#l1~sc~*)o4kK?+rcQ{82gPL;d_l_b|fT>J$cqo6?> zB9!6vjpX(fAq9zorZks`y;B2;0!F8YnA&V@$aaJvipTtThskS9>Y2ezUAe9+V%sK< z#)&pmFSgC#=HjxvpD35 zISlq?2O7G(L)B{}4m{v+Txd&Wd-ZzZ%y3o@_6Rpa&0?QtFlkezMAPJ3)pt>(b(^^q zr4rp`oyda&-w&lL97lBXp~~D9o)3rv?xxD0m*W)X7j*%X?AO|*>FDgK%01hl9!>jb>IFfNy$N^l3TGos=lsQ+`Y5Ib|*8#v<0 z2E{CiBf>2ABMfF}IQq<{GN6ruZ;JK$|XOqar?!W~RLRK2I$id7){=x;n)g z+tx@nF$2B!7+5_?lbQ(|4>*NzamW70K{JEig}^9}Oy>ff#dJXN!09LMLR4JflBE28~* zhi3YT%x>&yUgpSs!`{BA8Q#N$ z;!+yP=qoI|c1~B)FY=syNDX7Prdvtt=5{As+>&B#0&#AF(s@`XPk|(?%&T{#t4NH# z%?SLct8Hs{Tei1`lRoUH{AQD+rY{E1bOfn_{M*vQ3kV<^iZu#~ib3u@z)c#7-O0Y8~ed|F(@`<|gIxZ$|BcTws8cj7@2zQ;OZoTN7 zfUA1L@r=lrjJTL<{+3Z;QMB&AjozJ_HCEHtAn62w5*V9s<@@wo<~_(B+t#fg;3S(*_Am1t^bF~6$r`O%yDHZFYmu65)B`CX?@F06co}

|_-cZy`H zTubcTV{EOPEs7+HE1@Va=j(Zr-qoGG$2)OKqN}AJT`2@@+N>64uw&5qL7*_h`>x-VkUTS#?#eSi<4bNt>=B*$DBg>~HxO2*xkdeL z>S+j5ClJ$yy)rVnvcI!xiQp<FXf- zzHBmV=20in6TG<`K}a;qOGQPxb)-xX<7IvANcV$>&kbBI=$^B={k&u+U?*TFU?*TF zU?*TFU?*TFU?*TFU?*TFU?*TFU?*TFU?=eZCm<0+316mUhhMAbf}fbs!9R!Zuh>V( F`4>QpWS#&3 diff --git a/vrt/screenshot/expected/indent.png b/vrt/screenshot/expected/indent.png deleted file mode 100644 index ca69f6b22737b302e141fdb368cb1f42021747b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25021 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