From e2731f97c0bb21086205b3193db30cd055d2159a Mon Sep 17 00:00:00 2001 From: Sergey Kurdin Date: Sun, 22 Jun 2025 20:55:38 -0400 Subject: [PATCH] feat: Add HTML to Plain Text transformation and improve text processing - Added `html-to-text` package for converting HTML to plain text. - Implemented `stripHtmlTags` function to normalize whitespace and strip HTML tags. - Introduced new transformation option for converting HTML to plain text in the format converter. - Updated localization files for German, Spanish, French, Italian, Russian, Turkish, Ukrainian, and Chinese to include new transformation options. - Enhanced UI text in Clipboard History Settings for better user guidance on drag-and-drop functionality. --- package-lock.json | 423 +++++++----------- package.json | 1 + packages/pastebar-app-ui/package.json | 1 + .../src/lib/text-transforms.ts | 74 +++ .../src/locales/lang/de/specailCopyPaste.yaml | 73 +++ .../src/locales/lang/en/specailCopyPaste.yaml | 5 +- .../locales/lang/esES/specailCopyPaste.yaml | 73 +++ .../src/locales/lang/fr/specailCopyPaste.yaml | 73 +++ .../src/locales/lang/it/specailCopyPaste.yaml | 73 +++ .../src/locales/lang/ru/specailCopyPaste.yaml | 73 +++ .../src/locales/lang/tr/specailCopyPaste.yaml | 73 +++ .../src/locales/lang/uk/specailCopyPaste.yaml | 73 +++ .../locales/lang/zhCN/specailCopyPaste.yaml | 73 +++ .../settings/ClipboardHistorySettings.tsx | 11 +- 14 files changed, 837 insertions(+), 262 deletions(-) create mode 100644 packages/pastebar-app-ui/src/locales/lang/de/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/esES/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/fr/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/it/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/ru/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/tr/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/uk/specailCopyPaste.yaml create mode 100644 packages/pastebar-app-ui/src/locales/lang/zhCN/specailCopyPaste.yaml diff --git a/package-lock.json b/package-lock.json index adcd92a8..81118ce0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -141,6 +141,7 @@ "@types/codemirror": "^5.60.15", "@types/dompurify": "^3.0.5", "@types/events": "^3.0.3", + "@types/html-to-text": "^9.0.4", "@types/js-yaml": "^4.0.9", "@types/linkify-it": "^3.0.5", "@types/lodash-es": "^4.17.12", @@ -168,7 +169,6 @@ "tailwind-merge": "^2.0.0", "tailwindcss": "^3.3.5", "taze": "^0.12.2", - "ts-node": "^10.9.2", "typescript": "^5.8.3", "vite": "^6.0.6", "vite-plugin-tauri": "^4.0.0" @@ -2658,28 +2658,6 @@ "node": ">=0.1.90" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -6328,6 +6306,19 @@ "win32" ] }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/@sigstore/bundle": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", @@ -7304,30 +7295,6 @@ "node": ">=10.13.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -7515,6 +7482,13 @@ "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==", "dev": true }, + "node_modules/@types/html-to-text": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz", + "integrity": "sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -7839,18 +7813,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -9246,12 +9208,6 @@ "node": ">=10" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -9744,15 +9700,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -11205,6 +11152,41 @@ "void-elements": "3.1.0" } }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "license": "MIT", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -12071,6 +12053,15 @@ "node": ">=6" } }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -12194,12 +12185,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "node_modules/make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", @@ -13468,6 +13453,19 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "license": "MIT", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/pastebar-app-ui": { "resolved": "packages/pastebar-app-ui", "link": true @@ -13538,6 +13536,15 @@ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -15117,6 +15124,18 @@ "resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.9.tgz", "integrity": "sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg==" }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "license": "MIT", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -16179,55 +16198,6 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -16662,12 +16632,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -17150,15 +17114,6 @@ "node": ">=12" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/youtube-player": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz", @@ -17307,6 +17262,7 @@ "framer-motion": "^10.16.5", "garbados-crypt": "^3.0.0-beta", "glob-all": "^3.3.1", + "html-to-text": "^9.0.5", "i18next": "^23.10.0", "i18next-browser-languagedetector": "^7.2.0", "idb-keyval": "^6.2.1", @@ -19906,27 +19862,6 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "optional": true }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, "@dnd-kit/accessibility": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", @@ -22193,6 +22128,15 @@ "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", "optional": true }, + "@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "requires": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + } + }, "@sigstore/bundle": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", @@ -22697,30 +22641,6 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, - "@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, "@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -22898,6 +22818,12 @@ "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==", "dev": true }, + "@types/html-to-text": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz", + "integrity": "sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -23173,15 +23099,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, - "acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "requires": { - "acorn": "^8.11.0" - } - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -24199,12 +24116,6 @@ "yaml": "^1.10.0" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -24540,12 +24451,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -25638,6 +25543,29 @@ "void-elements": "3.1.0" } }, + "html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -26246,6 +26174,11 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==" + }, "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -26353,12 +26286,6 @@ } } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "make-fetch-happen": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", @@ -27335,6 +27262,15 @@ } } }, + "parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "requires": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + } + }, "pastebar-app-ui": { "version": "file:packages/pastebar-app-ui", "requires": { @@ -27435,6 +27371,7 @@ "framer-motion": "^10.16.5", "garbados-crypt": "^3.0.0-beta", "glob-all": "^3.3.1", + "html-to-text": "^9.0.5", "i18next": "^23.10.0", "i18next-browser-languagedetector": "^7.2.0", "idb-keyval": "^6.2.1", @@ -27883,6 +27820,11 @@ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, + "peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -28896,6 +28838,14 @@ "resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.9.tgz", "integrity": "sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg==" }, + "selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "requires": { + "parseley": "^0.12.0" + } + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -29686,35 +29636,6 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - } - } - }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -30009,12 +29930,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -30343,12 +30258,6 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, "youtube-player": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz", diff --git a/package.json b/package.json index 85c922fa..7daff615 100644 --- a/package.json +++ b/package.json @@ -156,6 +156,7 @@ "@types/codemirror": "^5.60.15", "@types/dompurify": "^3.0.5", "@types/events": "^3.0.3", + "@types/html-to-text": "^9.0.4", "@types/js-yaml": "^4.0.9", "@types/linkify-it": "^3.0.5", "@types/lodash-es": "^4.17.12", diff --git a/packages/pastebar-app-ui/package.json b/packages/pastebar-app-ui/package.json index 6c730f6f..5009c997 100644 --- a/packages/pastebar-app-ui/package.json +++ b/packages/pastebar-app-ui/package.json @@ -82,6 +82,7 @@ "framer-motion": "^10.16.5", "garbados-crypt": "^3.0.0-beta", "glob-all": "^3.3.1", + "html-to-text": "^9.0.5", "i18next": "^23.10.0", "i18next-browser-languagedetector": "^7.2.0", "idb-keyval": "^6.2.1", diff --git a/packages/pastebar-app-ui/src/lib/text-transforms.ts b/packages/pastebar-app-ui/src/lib/text-transforms.ts index 4a83b4cc..6c7c49a2 100644 --- a/packages/pastebar-app-ui/src/lib/text-transforms.ts +++ b/packages/pastebar-app-ui/src/lib/text-transforms.ts @@ -171,6 +171,60 @@ const toJsonStringify = (text: string): string => { } } +// Helper function to strip HTML tags and return plain text with normalized whitespace +const stripHtmlTags = (html: string): string => { + // First, add line breaks before block-level elements to preserve structure + const blockElements = [ + 'p', + 'div', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'ul', + 'ol', + 'li', + 'blockquote', + 'pre', + 'address', + 'article', + 'aside', + 'footer', + 'header', + 'nav', + 'section', + 'table', + 'tr', + 'br', + ] + + // Create regex pattern for block elements + const blockRegex = new RegExp(`<(${blockElements.join('|')})[^>]*>`, 'gi') + + // Add newlines before block elements to preserve structure + let processedHtml = html.replace(blockRegex, '\n<$1>') + + // Create a temporary div element + const div = document.createElement('div') + div.innerHTML = processedHtml + // Get text content, which automatically strips all HTML tags + const text = div.textContent || div.innerText || '' + + // Normalize whitespace while preserving structure + return text + .replace(/\r\n/g, '\n') // Normalize Windows line endings to Unix + .replace(/\r/g, '\n') // Normalize old Mac line endings to Unix + .replace(/\n{3,}/g, '\n\n') // Replace 3+ newlines with double newline + .replace(/\t+/g, '\t') // Replace multiple tabs with single tab + .replace(/[ \t]+/g, ' ') // Replace multiple spaces/tabs with single space + .replace(/\n[ \t]+/g, '\n') // Remove spaces/tabs at the beginning of lines + .replace(/[ \t]+\n/g, '\n') // Remove spaces/tabs at the end of lines + .replace(/\n{2,}/g, '\n') // Replace multiple newlines with single newline + .trim() // Remove leading and trailing whitespace +} + // Format Converter subcategories - organized by source format const formatConverterSubcategories = [ { @@ -197,6 +251,26 @@ const formatConverterSubcategories = [ label: 'HTML to Text', transform: (text: string) => convertFormat(text, 'html_to_text'), }, + { + id: 'htmlToPlainText', + label: 'HTML to Plain Text', + transform: async (text: string) => { + // dynamic import for html-to-text + const { convert } = await import('html-to-text') + return convert(text, { + wordwrap: 130, + preserveNewlines: false, + // selectors: [{ selector: 'a', format: }], + }) + .replace(/\n{3,}/g, '\n\n') // Replace 3+ newlines with double newline + .trim() // Remove leading and trailing whitespace + }, + }, + // { + // id: 'htmlToPlainText', + // label: 'HTML to Plain Text', + // transform: (text: string) => stripHtmlTags(text), + // }, ], }, { diff --git a/packages/pastebar-app-ui/src/locales/lang/de/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/de/specailCopyPaste.yaml new file mode 100644 index 00000000..9631efc7 --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/de/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Aktuelles Datum/Uhrzeit hinzufügen +Add Line Numbers: Zeilennummern hinzufügen +Add One Line Feed: Einen Zeilenvorschub hinzufügen +Add Two Line Feeds: Zwei Zeilenvorschübe hinzufügen +Base64 Decode: Base64 dekodieren +Base64 Encode: Base64 kodieren +CSV: CSV +CSV to JSON: CSV zu JSON +CSV to Markdown Table: CSV zu Markdown-Tabelle +Capitalize Case: Erster Buchstabe groß +Code Formatting: Code-Formatierung +Count Characters: Zeichen zählen +Count Lines: Zeilen zählen +Count Sentences: Sätze zählen +Count Words: Wörter zählen +Data Conversion: Datenkonvertierung +Drag and drop category to prioritize its order in the special copy/paste menu.: Ziehe eine Kategorie per Drag & Drop, um ihre Reihenfolge im speziellen Kopieren/Einfügen-Menü zu priorisieren. +Enable All: Alle aktivieren +Enable special text transformation options for clipboard history items: Spezielle Textumwandlungsoptionen für Zwischenablage-Verlaufselemente aktivieren +Enabled Operations: Aktivierte Operationen +Encode/Decode: Kodieren/Dekodieren +Format Converter: Formatkonverter +HTML: HTML +HTML Decode: HTML dekodieren +HTML Encode: HTML kodieren +HTML to Markdown: HTML zu Markdown +HTML to Plain Text: HTML zu reinem Text +HTML to React Component: HTML zu React-Komponente +HTML to React JSX: HTML zu React JSX +HTML to Text: HTML zu Text +JSON: JSON +JSON Stringify: JSON Stringify +JSON to CSV: JSON zu CSV +JSON to Markdown Table: JSON zu Markdown-Tabelle +JSON to TOML: JSON zu TOML +JSON to XML: JSON zu XML +JSON to YAML: JSON zu YAML +Markdown: Markdown +Markdown to HTML: Markdown zu HTML +Markdown to Text: Markdown zu Text +Operations: Operationen +PascalCase: PascalCase +Prioritize Category Order: Kategorie-Reihenfolge priorisieren +Remove Duplicate Lines: Doppelte Zeilen entfernen +Remove Extra Spaces: Zusätzliche Leerzeichen entfernen +Remove Line Feeds: Zeilenvorschübe entfernen +Reverse Text: Text umkehren +Select Operations: Operationen auswählen +Sentence case: Satzbau +Sort Lines Alphabetically: Zeilen alphabetisch sortieren +Special Copy: Spezielles Kopieren +Special Copy/Paste Operations: Spezielle Kopier-/Einfüge-Operationen +Special Paste: Spezielles Einfügen +Special Settings: Spezielle Einstellungen +TOML: TOML +TOML to JSON: TOML zu JSON +Text Case: Groß-/Kleinschreibung +Text Tools: Textwerkzeuge +Title Case: Titel-Fall +Trim White Space: Leerzeichen entfernen +UPPER CASE: GROSSBUCHSTABEN +URL Decode: URL dekodieren +URL Encode: URL kodieren +Whitespace & Lines: Leerraum & Zeilen +XML: XML +XML to JSON: XML zu JSON +YAML: YAML +YAML to JSON: YAML zu JSON +camelCase: camelCase +iNVERT cASE: gROSS/kLEIN uMKEHREN +kebab-case: kebab-case +lower case: kleinbuchstaben +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/en/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/en/specailCopyPaste.yaml index c5089b3d..1586b8c9 100644 --- a/packages/pastebar-app-ui/src/locales/lang/en/specailCopyPaste.yaml +++ b/packages/pastebar-app-ui/src/locales/lang/en/specailCopyPaste.yaml @@ -14,8 +14,7 @@ Count Lines: Count Lines Count Sentences: Count Sentences Count Words: Count Words Data Conversion: Data Conversion -? Drag and drop to prioritize categories in the special copy/paste menu. The higher a category is in the list, the higher its menu priority. -: Drag and drop to prioritize categories in the special copy/paste menu. The higher a category is in the list, the higher its menu priority. +Drag and drop category to prioritize its order in the special copy/paste menu.: Drag and drop category to prioritize its order in the special copy/paste menu. Enable All: Enable All Enable special text transformation options for clipboard history items: Enable special text transformation options for clipboard history items Enabled Operations: Enabled Operations @@ -25,6 +24,7 @@ HTML: HTML HTML Decode: HTML Decode HTML Encode: HTML Encode HTML to Markdown: HTML to Markdown +HTML to Plain Text: HTML to Plain Text HTML to React Component: HTML to React Component HTML to React JSX: HTML to React JSX HTML to Text: HTML to Text @@ -41,6 +41,7 @@ Markdown to Text: Markdown to Text Operations: Operations PascalCase: PascalCase Prioritize Category Order: Prioritize Category Order +PrioritizeCategoryOrderNote: PrioritizeCategoryOrderNote Remove Duplicate Lines: Remove Duplicate Lines Remove Extra Spaces: Remove Extra Spaces Remove Line Feeds: Remove Line Feeds diff --git a/packages/pastebar-app-ui/src/locales/lang/esES/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/esES/specailCopyPaste.yaml new file mode 100644 index 00000000..97a4dbd6 --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/esES/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Agregar Fecha/Hora Actual +Add Line Numbers: Agregar Números de Línea +Add One Line Feed: Agregar un Salto de Línea +Add Two Line Feeds: Agregar dos Saltos de Línea +Base64 Decode: Decodificar Base64 +Base64 Encode: Codificar Base64 +CSV: CSV +CSV to JSON: CSV a JSON +CSV to Markdown Table: CSV a Tabla Markdown +Capitalize Case: Poner en Mayúscula +Code Formatting: Formateo de Código +Count Characters: Contar Caracteres +Count Lines: Contar Líneas +Count Sentences: Contar Oraciones +Count Words: Contar Palabras +Data Conversion: Conversión de Datos +Drag and drop category to prioritize its order in the special copy/paste menu.: Arrastra y suelta la categoría para priorizar su orden en el menú especial de copiar/pegar. +Enable All: Habilitar Todo +Enable special text transformation options for clipboard history items: Habilitar opciones especiales de transformación de texto para elementos del historial del portapapeles +Enabled Operations: Operaciones Habilitadas +Encode/Decode: Codificar/Decodificar +Format Converter: Convertidor de Formato +HTML: HTML +HTML Decode: Decodificar HTML +HTML Encode: Codificar HTML +HTML to Markdown: HTML a Markdown +HTML to Plain Text: HTML a Texto Plano +HTML to React Component: HTML a Componente React +HTML to React JSX: HTML a React JSX +HTML to Text: HTML a Texto +JSON: JSON +JSON Stringify: JSON a Cadena +JSON to CSV: JSON a CSV +JSON to Markdown Table: JSON a Tabla Markdown +JSON to TOML: JSON a TOML +JSON to XML: JSON a XML +JSON to YAML: JSON a YAML +Markdown: Markdown +Markdown to HTML: Markdown a HTML +Markdown to Text: Markdown a Texto +Operations: Operaciones +PascalCase: PascalCase +Prioritize Category Order: Priorizar Orden de Categorías +Remove Duplicate Lines: Eliminar Líneas Duplicadas +Remove Extra Spaces: Eliminar Espacios Extra +Remove Line Feeds: Eliminar Saltos de Línea +Reverse Text: Invertir Texto +Select Operations: Seleccionar Operaciones +Sentence case: Tipo oración +Sort Lines Alphabetically: Ordenar Líneas Alfabéticamente +Special Copy: Copia Especial +Special Copy/Paste Operations: Operaciones Especiales de Copiar/Pegar +Special Paste: Pegado Especial +Special Settings: Ajustes Especiales +TOML: TOML +TOML to JSON: TOML a JSON +Text Case: Mayúsculas/Minúsculas +Text Tools: Herramientas de Texto +Title Case: Tipo Título +Trim White Space: Recortar Espacios en Blanco +UPPER CASE: MAYÚSCULAS +URL Decode: Decodificar URL +URL Encode: Codificar URL +Whitespace & Lines: Espacios y Líneas +XML: XML +XML to JSON: XML a JSON +YAML: YAML +YAML to JSON: YAML a JSON +camelCase: camelCase +iNVERT cASE: iNVERTIR cASO +kebab-case: kebab-case +lower case: minúsculas +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/fr/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/fr/specailCopyPaste.yaml new file mode 100644 index 00000000..dddf604a --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/fr/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Ajouter Date/Heure Actuelle +Add Line Numbers: Ajouter Numéros de Ligne +Add One Line Feed: Ajouter un Saut de Ligne +Add Two Line Feeds: Ajouter deux Sauts de Ligne +Base64 Decode: Décoder Base64 +Base64 Encode: Encoder Base64 +CSV: CSV +CSV to JSON: CSV vers JSON +CSV to Markdown Table: CSV vers Tableau Markdown +Capitalize Case: Mettre en Capitale +Code Formatting: Formatage de Code +Count Characters: Compter les Caractères +Count Lines: Compter les Lignes +Count Sentences: Compter les Phrases +Count Words: Compter les Mots +Data Conversion: Conversion de Données +Drag and drop category to prioritize its order in the special copy/paste menu.: Glissez-déposez la catégorie pour prioriser son ordre dans le menu spécial copier/coller. +Enable All: Activer Tout +Enable special text transformation options for clipboard history items: Activer les options de transformation de texte spéciales pour les éléments de l'historique du presse-papiers +Enabled Operations: Opérations Activées +Encode/Decode: Encoder/Décoder +Format Converter: Convertisseur de Format +HTML: HTML +HTML Decode: Décoder HTML +HTML Encode: Encoder HTML +HTML to Markdown: HTML vers Markdown +HTML to Plain Text: HTML vers Texte Brut +HTML to React Component: HTML vers Composant React +HTML to React JSX: HTML vers React JSX +HTML to Text: HTML vers Texte +JSON: JSON +JSON Stringify: JSON Stringify +JSON to CSV: JSON vers CSV +JSON to Markdown Table: JSON vers Tableau Markdown +JSON to TOML: JSON vers TOML +JSON to XML: JSON vers XML +JSON to YAML: JSON vers YAML +Markdown: Markdown +Markdown to HTML: Markdown vers HTML +Markdown to Text: Markdown vers Texte +Operations: Opérations +PascalCase: PascalCase +Prioritize Category Order: Prioriser l'Ordre des Catégories +Remove Duplicate Lines: Supprimer Lignes Doubles +Remove Extra Spaces: Supprimer Espaces Superflus +Remove Line Feeds: Supprimer Sauts de Ligne +Reverse Text: Inverser le Texte +Select Operations: Sélectionner Opérations +Sentence case: Cas de la phrase +Sort Lines Alphabetically: Trier Lignes par Ordre Alphabétique +Special Copy: Copie Spéciale +Special Copy/Paste Operations: Opérations Spéciales Copier/Coller +Special Paste: Collage Spécial +Special Settings: Paramètres Spéciaux +TOML: TOML +TOML to JSON: TOML vers JSON +Text Case: Casse du Texte +Text Tools: Outils Texte +Title Case: Cas du Titre +Trim White Space: Supprimer Espaces Blancs +UPPER CASE: MAJUSCULES +URL Decode: Décoder URL +URL Encode: Encoder URL +Whitespace & Lines: Espaces & Lignes +XML: XML +XML to JSON: XML vers JSON +YAML: YAML +YAML to JSON: YAML vers JSON +camelCase: camelCase +iNVERT cASE: iNVERSER cASSE +kebab-case: kebab-case +lower case: minuscules +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/it/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/it/specailCopyPaste.yaml new file mode 100644 index 00000000..e03933b6 --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/it/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Aggiungi Data/Ora Attuale +Add Line Numbers: Aggiungi Numeri di Riga +Add One Line Feed: Aggiungi un a Capo +Add Two Line Feeds: Aggiungi due a Capo +Base64 Decode: Decodifica Base64 +Base64 Encode: Codifica Base64 +CSV: CSV +CSV to JSON: CSV in JSON +CSV to Markdown Table: CSV in Tabella Markdown +Capitalize Case: Maiuscolo Iniziale +Code Formatting: Formattazione Codice +Count Characters: Conta Caratteri +Count Lines: Conta Righe +Count Sentences: Conta Frasi +Count Words: Conta Parole +Data Conversion: Conversione Dati +Drag and drop category to prioritize its order in the special copy/paste menu.: Trascina e rilascia la categoria per dare priorità al suo ordine nel menu speciale di copia/incolla. +Enable All: Abilita Tutto +Enable special text transformation options for clipboard history items: Abilita opzioni speciali di trasformazione del testo per gli elementi della cronologia degli appunti +Enabled Operations: Operazioni Abilitate +Encode/Decode: Codifica/Decodifica +Format Converter: Convertitore di Formato +HTML: HTML +HTML Decode: Decodifica HTML +HTML Encode: Codifica HTML +HTML to Markdown: HTML in Markdown +HTML to Plain Text: HTML in Testo Semplice +HTML to React Component: HTML in Componente React +HTML to React JSX: HTML in React JSX +HTML to Text: HTML in Testo +JSON: JSON +JSON Stringify: JSON Stringify +JSON to CSV: JSON in CSV +JSON to Markdown Table: JSON in Tabella Markdown +JSON to TOML: JSON in TOML +JSON to XML: JSON in XML +JSON to YAML: JSON in YAML +Markdown: Markdown +Markdown to HTML: Markdown in HTML +Markdown to Text: Markdown in Testo +Operations: Operazioni +PascalCase: PascalCase +Prioritize Category Order: Priorità Ordine Categorie +Remove Duplicate Lines: Rimuovi Righe Duplicate +Remove Extra Spaces: Rimuovi Spazi Extra +Remove Line Feeds: Rimuovi a Capo +Reverse Text: Inverti Testo +Select Operations: Seleziona Operazioni +Sentence case: Maiuscolo a inizio frase +Sort Lines Alphabetically: Ordina Righe Alfabeticamente +Special Copy: Copia Speciale +Special Copy/Paste Operations: Operazioni Speciali di Copia/Incolla +Special Paste: Incolla Speciale +Special Settings: Impostazioni Speciali +TOML: TOML +TOML to JSON: TOML in JSON +Text Case: Maiuscole/Minuscole +Text Tools: Strumenti Testo +Title Case: Maiuscolo a Inizio Parola +Trim White Space: Taglia Spazi Bianchi +UPPER CASE: MAIUSCOLO +URL Decode: Decodifica URL +URL Encode: Codifica URL +Whitespace & Lines: Spazi & Righe +XML: XML +XML to JSON: XML in JSON +YAML: YAML +YAML to JSON: YAML in JSON +camelCase: camelCase +iNVERT cASE: iNVERTI cASO +kebab-case: kebab-case +lower case: minuscolo +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/ru/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/ru/specailCopyPaste.yaml new file mode 100644 index 00000000..aaaa1602 --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/ru/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Добавить текущие дату/время +Add Line Numbers: Добавить номера строк +Add One Line Feed: Добавить один перевод строки +Add Two Line Feeds: Добавить два перевода строки +Base64 Decode: Декодировать Base64 +Base64 Encode: Кодировать Base64 +CSV: CSV +CSV to JSON: CSV в JSON +CSV to Markdown Table: CSV в таблицу Markdown +Capitalize Case: С большой буквы +Code Formatting: Форматирование кода +Count Characters: Подсчет символов +Count Lines: Подсчет строк +Count Sentences: Подсчет предложений +Count Words: Подсчет слов +Data Conversion: Преобразование данных +Drag and drop category to prioritize its order in the special copy/paste menu.: Перетащите категорию, чтобы задать ей приоритет в специальном меню копирования/вставки. +Enable All: Включить все +Enable special text transformation options for clipboard history items: Включить специальные параметры преобразования текста для элементов истории буфера обмена +Enabled Operations: Включенные операции +Encode/Decode: Кодировать/Декодировать +Format Converter: Конвертер форматов +HTML: HTML +HTML Decode: Декодировать HTML +HTML Encode: Кодировать HTML +HTML to Markdown: HTML в Markdown +HTML to Plain Text: HTML в обычный текст +HTML to React Component: HTML в компонент React +HTML to React JSX: HTML в React JSX +HTML to Text: HTML в текст +JSON: JSON +JSON Stringify: JSON в строку +JSON to CSV: JSON в CSV +JSON to Markdown Table: JSON в таблицу Markdown +JSON to TOML: JSON в TOML +JSON to XML: JSON в XML +JSON to YAML: JSON в YAML +Markdown: Markdown +Markdown to HTML: Markdown в HTML +Markdown to Text: Markdown в текст +Operations: Операции +PascalCase: PascalCase +Prioritize Category Order: Приоритет порядка категорий +Remove Duplicate Lines: Удалить дублирующиеся строки +Remove Extra Spaces: Удалить лишние пробелы +Remove Line Feeds: Удалить переводы строк +Reverse Text: Обратный текст +Select Operations: Выбрать операции +Sentence case: Регистр предложений +Sort Lines Alphabetically: Сортировать строки по алфавиту +Special Copy: Специальное копирование +Special Copy/Paste Operations: Специальные операции копирования/вставки +Special Paste: Специальная вставка +Special Settings: Специальные настройки +TOML: TOML +TOML to JSON: TOML в JSON +Text Case: Регистр текста +Text Tools: Инструменты для текста +Title Case: Регистр заголовков +Trim White Space: Обрезать пробелы +UPPER CASE: ВЕРХНИЙ РЕГИСТР +URL Decode: Декодировать URL +URL Encode: Кодировать URL +Whitespace & Lines: Пробелы и строки +XML: XML +XML to JSON: XML в JSON +YAML: YAML +YAML to JSON: YAML в JSON +camelCase: camelCase +iNVERT cASE: иНВЕРТИРОВАТЬ рЕГИСТР +kebab-case: kebab-case +lower case: нижний регистр +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/tr/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/tr/specailCopyPaste.yaml new file mode 100644 index 00000000..d359f7ea --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/tr/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Geçerli Tarih/Saati Ekle +Add Line Numbers: Satır Numaraları Ekle +Add One Line Feed: Bir Satır Başı Ekle +Add Two Line Feeds: İki Satır Başı Ekle +Base64 Decode: Base64 Kodunu Çöz +Base64 Encode: Base64 Kodla +CSV: CSV +CSV to JSON: CSV'yi JSON'a Dönüştür +CSV to Markdown Table: CSV'yi Markdown Tablosuna Dönüştür +Capitalize Case: Baş Harfleri Büyüt +Code Formatting: Kod Formatlama +Count Characters: Karakter Sayısı +Count Lines: Satır Sayısı +Count Sentences: Cümle Sayısı +Count Words: Kelime Sayısı +Data Conversion: Veri Dönüştürme +Drag and drop category to prioritize its order in the special copy/paste menu.: Özel kopyala/yapıştır menüsünde kategorinin sırasını önceliklendirmek için sürükleyip bırakın. +Enable All: Tümünü Etkinleştir +Enable special text transformation options for clipboard history items: Pano geçmişi öğeleri için özel metin dönüştürme seçeneklerini etkinleştirin +Enabled Operations: Etkin İşlemler +Encode/Decode: Kodla/Kodu Çöz +Format Converter: Format Dönüştürücü +HTML: HTML +HTML Decode: HTML Kodunu Çöz +HTML Encode: HTML Kodla +HTML to Markdown: HTML'yi Markdown'a Dönüştür +HTML to Plain Text: HTML'yi Düz Metne Dönüştür +HTML to React Component: HTML'yi React Bileşenine Dönüştür +HTML to React JSX: HTML'yi React JSX'e Dönüştür +HTML to Text: HTML'yi Metne Dönüştür +JSON: JSON +JSON Stringify: JSON Stringify +JSON to CSV: JSON'u CSV'ye Dönüştür +JSON to Markdown Table: JSON'u Markdown Tablosuna Dönüştür +JSON to TOML: JSON'u TOML'a Dönüştür +JSON to XML: JSON'u XML'e Dönüştür +JSON to YAML: JSON'u YAML'a Dönüştür +Markdown: Markdown +Markdown to HTML: Markdown'u HTML'ye Dönüştür +Markdown to Text: Markdown'u Metne Dönüştür +Operations: İşlemler +PascalCase: PascalCase +Prioritize Category Order: Kategori Sırasını Önceliklendir +Remove Duplicate Lines: Yinelenen Satırları Kaldır +Remove Extra Spaces: Fazla Boşlukları Kaldır +Remove Line Feeds: Satır Başlarını Kaldır +Reverse Text: Metni Ters Çevir +Select Operations: İşlemleri Seç +Sentence case: Cümle düzeni +Sort Lines Alphabetically: Satırları Alfabetik Olarak Sırala +Special Copy: Özel Kopyala +Special Copy/Paste Operations: Özel Kopyala/Yapıştır İşlemleri +Special Paste: Özel Yapıştır +Special Settings: Özel Ayarlar +TOML: TOML +TOML to JSON: TOML'u JSON'a Dönüştür +Text Case: Metin Kılıfı +Text Tools: Metin Araçları +Title Case: Başlık Düzeni +Trim White Space: Beyaz Boşlukları Kırp +UPPER CASE: BÜYÜK HARF +URL Decode: URL Kodunu Çöz +URL Encode: URL Kodla +Whitespace & Lines: Boşluk & Satırlar +XML: XML +XML to JSON: XML'i JSON'a Dönüştür +YAML: YAML +YAML to JSON: YAML'ı JSON'a Dönüştür +camelCase: camelCase +iNVERT cASE: dURUMU tERSINE cEVIR +kebab-case: kebab-case +lower case: küçük harf +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/uk/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/uk/specailCopyPaste.yaml new file mode 100644 index 00000000..3a2f8ae9 --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/uk/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: Додати поточну дату/час +Add Line Numbers: Додати номери рядків +Add One Line Feed: Додати один розрив рядка +Add Two Line Feeds: Додати два розриви рядка +Base64 Decode: Декодувати Base64 +Base64 Encode: Кодувати Base64 +CSV: CSV +CSV to JSON: CSV у JSON +CSV to Markdown Table: CSV у таблицю Markdown +Capitalize Case: З великої літери +Code Formatting: Форматування коду +Count Characters: Підрахунок символів +Count Lines: Підрахунок рядків +Count Sentences: Підрахунок речень +Count Words: Підрахунок слів +Data Conversion: Перетворення даних +Drag and drop category to prioritize its order in the special copy/paste menu.: Перетягніть категорію, щоб задати їй пріоритет у спеціальному меню копіювання/вставки. +Enable All: Увімкнути все +Enable special text transformation options for clipboard history items: Увімкнути спеціальні параметри перетворення тексту для елементів історії буфера обміну +Enabled Operations: Увімкнені операції +Encode/Decode: Кодувати/Декодувати +Format Converter: Конвертер форматів +HTML: HTML +HTML Decode: Декодувати HTML +HTML Encode: Кодувати HTML +HTML to Markdown: HTML у Markdown +HTML to Plain Text: HTML у звичайний текст +HTML to React Component: HTML у компонент React +HTML to React JSX: HTML у React JSX +HTML to Text: HTML у текст +JSON: JSON +JSON Stringify: JSON у рядок +JSON to CSV: JSON у CSV +JSON to Markdown Table: JSON у таблицю Markdown +JSON to TOML: JSON у TOML +JSON to XML: JSON у XML +JSON to YAML: JSON у YAML +Markdown: Markdown +Markdown to HTML: Markdown у HTML +Markdown to Text: Markdown у текст +Operations: Операції +PascalCase: PascalCase +Prioritize Category Order: Пріоритет порядку категорій +Remove Duplicate Lines: Видалити дублікати рядків +Remove Extra Spaces: Видалити зайві пробіли +Remove Line Feeds: Видалити розриви рядків +Reverse Text: Зворотний текст +Select Operations: Вибрати операції +Sentence case: Регістр речень +Sort Lines Alphabetically: Сортувати рядки за алфавітом +Special Copy: Спеціальне копіювання +Special Copy/Paste Operations: Спеціальні операції копіювання/вставки +Special Paste: Спеціальна вставка +Special Settings: Спеціальні налаштування +TOML: TOML +TOML to JSON: TOML у JSON +Text Case: Регістр тексту +Text Tools: Інструменти для тексту +Title Case: Регістр заголовків +Trim White Space: Обрізати пробіли +UPPER CASE: ВЕРХНІЙ РЕГІСТР +URL Decode: Декодувати URL +URL Encode: Кодувати URL +Whitespace & Lines: Пробіли та рядки +XML: XML +XML to JSON: XML у JSON +YAML: YAML +YAML to JSON: YAML у JSON +camelCase: camelCase +iNVERT cASE: іНВЕРТУВАТИ рЕГІСТР +kebab-case: kebab-case +lower case: нижній регістр +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/locales/lang/zhCN/specailCopyPaste.yaml b/packages/pastebar-app-ui/src/locales/lang/zhCN/specailCopyPaste.yaml new file mode 100644 index 00000000..9ba3b5dd --- /dev/null +++ b/packages/pastebar-app-ui/src/locales/lang/zhCN/specailCopyPaste.yaml @@ -0,0 +1,73 @@ +Add Current Date/Time: 添加当前日期/时间 +Add Line Numbers: 添加行号 +Add One Line Feed: 添加一个换行符 +Add Two Line Feeds: 添加两个换行符 +Base64 Decode: Base64 解码 +Base64 Encode: Base64 编码 +CSV: CSV +CSV to JSON: CSV 转 JSON +CSV to Markdown Table: CSV 转 Markdown 表格 +Capitalize Case: 首字母大写 +Code Formatting: 代码格式化 +Count Characters: 计算字符数 +Count Lines: 计算行数 +Count Sentences: 计算句子数 +Count Words: 计算单词数 +Data Conversion: 数据转换 +Drag and drop category to prioritize its order in the special copy/paste menu.: 拖放类别以在特殊复制/粘贴菜单中优先排列其顺序。 +Enable All: 全部启用 +Enable special text transformation options for clipboard history items: 为剪贴板历史记录项启用特殊文本转换选项 +Enabled Operations: 已启用的操作 +Encode/Decode: 编码/解码 +Format Converter: 格式转换器 +HTML: HTML +HTML Decode: HTML 解码 +HTML Encode: HTML 编码 +HTML to Markdown: HTML 转 Markdown +HTML to Plain Text: HTML 转纯文本 +HTML to React Component: HTML 转 React 组件 +HTML to React JSX: HTML 转 React JSX +HTML to Text: HTML 转文本 +JSON: JSON +JSON Stringify: JSON 字符串化 +JSON to CSV: JSON 转 CSV +JSON to Markdown Table: JSON 转 Markdown 表格 +JSON to TOML: JSON 转 TOML +JSON to XML: JSON 转 XML +JSON to YAML: JSON 转 YAML +Markdown: Markdown +Markdown to HTML: Markdown 转 HTML +Markdown to Text: Markdown 转文本 +Operations: 操作 +PascalCase: PascalCase +Prioritize Category Order: 确定类别顺序优先级 +Remove Duplicate Lines: 删除重复行 +Remove Extra Spaces: 删除多余空格 +Remove Line Feeds: 删除换行符 +Reverse Text: 反转文本 +Select Operations: 选择操作 +Sentence case: 句子大小写 +Sort Lines Alphabetically: 按字母顺序对行排序 +Special Copy: 特殊复制 +Special Copy/Paste Operations: 特殊复制/粘贴操作 +Special Paste: 特殊粘贴 +Special Settings: 特殊设置 +TOML: TOML +TOML to JSON: TOML 转 JSON +Text Case: 文本大小写 +Text Tools: 文本工具 +Title Case: 标题大小写 +Trim White Space: 修剪空白 +UPPER CASE: 大写 +URL Decode: URL 解码 +URL Encode: URL 编码 +Whitespace & Lines: 空白和行 +XML: XML +XML to JSON: XML 转 JSON +YAML: YAML +YAML to JSON: YAML 转 JSON +camelCase: camelCase +iNVERT cASE: 反转大小写 +kebab-case: kebab-case +lower case: 小写 +snake_case: snake_case \ No newline at end of file diff --git a/packages/pastebar-app-ui/src/pages/settings/ClipboardHistorySettings.tsx b/packages/pastebar-app-ui/src/pages/settings/ClipboardHistorySettings.tsx index f5ae17f8..2dd844bc 100644 --- a/packages/pastebar-app-ui/src/pages/settings/ClipboardHistorySettings.tsx +++ b/packages/pastebar-app-ui/src/pages/settings/ClipboardHistorySettings.tsx @@ -917,7 +917,7 @@ export default function ClipboardHistorySettings() { - + - + {t( 'Enable special text transformation options for clipboard history items', { ns: 'specailCopyPaste' } )} - {/* Category Controls - only show when enabled */} {isSpecialCopyPasteHistoryEnabled && ( <> + + {t( + 'Drag and drop category to prioritize its order in the special copy/paste menu.', + { ns: 'specailCopyPaste' } + )} + {