diff --git a/Dockerfile b/Dockerfile index c0aac4b7..80314ab9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ FROM mafgwo/wkhtmltopdf-nodejs:11.15.0 -RUN mkdir -p /opt/stackedit WORKDIR /opt/stackedit COPY package*json /opt/stackedit/ diff --git a/package-lock.json b/package-lock.json index 16eafb33..8e19bf84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -736,7 +736,8 @@ "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true }, "abbrev": { "version": "1.1.1", @@ -763,7 +764,8 @@ "acorn": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==" + "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "dev": true }, "acorn-dynamic-import": { "version": "2.0.2", @@ -786,6 +788,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, "requires": { "acorn": "^5.0.0" } @@ -1021,7 +1024,8 @@ "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true }, "array-filter": { "version": "0.0.1", @@ -1237,7 +1241,8 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true }, "async-settle": { "version": "1.0.0", @@ -2481,7 +2486,8 @@ "browser-process-hrtime": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", - "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=" + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true }, "browser-resolve": { "version": "1.11.3", @@ -3904,12 +3910,14 @@ "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==" + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true }, "cssstyle": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "dev": true, "requires": { "cssom": "0.3.x" } @@ -4249,6 +4257,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "dev": true, "requires": { "abab": "^2.0.0", "whatwg-mimetype": "^2.1.0", @@ -4259,6 +4268,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -4317,7 +4327,8 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "default-compare": { "version": "1.0.0", @@ -4579,6 +4590,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, "requires": { "webidl-conversions": "^4.0.2" } @@ -4592,6 +4604,11 @@ "domelementtype": "1" } }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, "domutils": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", @@ -4881,6 +4898,7 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -4892,12 +4910,14 @@ "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "optional": true } } @@ -5349,12 +5369,14 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "etag": { "version": "1.8.1", @@ -6060,7 +6082,8 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "fastparse": { "version": "1.1.1", @@ -9069,6 +9092,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, "requires": { "whatwg-encoding": "^1.0.1" } @@ -11298,6 +11322,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, "requires": { "abab": "^2.0.0", "acorn": "^5.5.3", @@ -11330,17 +11355,20 @@ "acorn": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==" + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true }, "whatwg-url": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -11351,6 +11379,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, "requires": { "async-limiter": "~1.0.0" } @@ -11549,7 +11578,8 @@ "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true }, "leven": { "version": "2.1.0", @@ -11561,6 +11591,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -13342,7 +13373,8 @@ "nwsapi": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.8.tgz", - "integrity": "sha512-7RZ+qbFGiVc6v14Y8DSZjPN1wZPOaMbiiP4tzf5eNuyOITAeOIA3cMhjuKUypVIqBgCSg1KaSyAv8Ocq/0ZJ1A==" + "integrity": "sha512-7RZ+qbFGiVc6v14Y8DSZjPN1wZPOaMbiiP4tzf5eNuyOITAeOIA3cMhjuKUypVIqBgCSg1KaSyAv8Ocq/0ZJ1A==", + "dev": true }, "oauth-sign": { "version": "0.9.0", @@ -13677,6 +13709,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -13689,7 +13722,8 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true } } }, @@ -14007,7 +14041,8 @@ "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true }, "parseurl": { "version": "1.3.2", @@ -14208,7 +14243,8 @@ "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true }, "pngjs": { "version": "3.3.3", @@ -15111,7 +15147,8 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, "prepend-http": { "version": "1.0.4", @@ -16250,6 +16287,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true, "requires": { "lodash": "^4.13.1" } @@ -16258,6 +16296,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dev": true, "requires": { "request-promise-core": "1.1.1", "stealthy-require": "^1.1.0", @@ -18448,7 +18487,8 @@ "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true }, "stream-browserify": { "version": "2.0.1", @@ -19607,7 +19647,8 @@ "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true }, "table": { "version": "4.0.2", @@ -20466,11 +20507,11 @@ } }, "turndown": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/turndown/-/turndown-4.0.2.tgz", - "integrity": "sha512-pqZ6WrHFGnxXC9q2xJ3Qa7EoLAwrojgFRajWZjxTKwbz9vnNnyi8lLjiD5h86UTPOcMlEyHjm6NMhjEDdlc25A==", + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/turndown/-/turndown-7.1.1.tgz", + "integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==", "requires": { - "jsdom": "^11.9.0" + "domino": "^2.1.6" } }, "tweetnacl": { @@ -20489,6 +20530,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -21336,6 +21378,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, "requires": { "browser-process-hrtime": "^0.1.2" } @@ -21757,6 +21800,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz", "integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==", + "dev": true, "requires": { "iconv-lite": "0.4.23" }, @@ -21765,6 +21809,7 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -21774,7 +21819,8 @@ "whatwg-mimetype": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", - "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==" + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", + "dev": true }, "whatwg-url": { "version": "6.4.0", @@ -21953,7 +21999,8 @@ "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true }, "xml-parse-from-string": { "version": "1.0.1", diff --git a/package.json b/package.json index d95dd2bf..648e08d9 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "request": "^2.85.0", "serve-static": "^1.13.2", "tmp": "^0.0.33", - "turndown": "^4.0.2", + "turndown": "^7.1.1", "vue": "^2.5.16", "vuex": "^3.0.1" }, diff --git a/src/components/modals/WorkspaceImgPathModal.vue b/src/components/modals/WorkspaceImgPathModal.vue index d873d122..ca1c6191 100644 --- a/src/components/modals/WorkspaceImgPathModal.vue +++ b/src/components/modals/WorkspaceImgPathModal.vue @@ -8,8 +8,9 @@
- 如果不提供,默认为 /imgs/{YYYY}-{MM}-{DD} ,其中{YYYY}为年变量、{MM}为月变量、{DD}为日变量。
- 支持相对路径,如 ./imgs 或 imgs 都是相对当前编辑中文档的路径,不支持相对上级路径。 + 如果不提供,默认为 /imgs/{YYYY}-{MM}-{DD}。
+ 支持相对路径,如 ./imgs、../imgs 或 imgs 都是相对当前编辑中文档的路径。
+ 变量说明:{YYYY}为年变量、{MM}为月变量、{DD}为日变量、{MDNAME}为当前文档名称
diff --git a/src/components/modals/providers/GiteaImgStorageModal.vue b/src/components/modals/providers/GiteaImgStorageModal.vue index d05ddeab..f409fe35 100644 --- a/src/components/modals/providers/GiteaImgStorageModal.vue +++ b/src/components/modals/providers/GiteaImgStorageModal.vue @@ -12,9 +12,10 @@ - +
- 如果不提供,默认为 {YYYY}/{MM}/{DD} ,其中{YYYY}为年变量、{MM}为月变量、{DD}为日变量。 + 如果不提供,默认为 imgs/{YYYY}-{MM}-{DD} 。
+ 变量说明:{YYYY}为年变量、{MM}为月变量、{DD}为日变量、{MDNAME}为当前文档名称。
@@ -62,7 +63,7 @@ export default modalTemplate({ const path = this.path && this.path.replace(/^\//, ''); this.config.resolve({ repoUri: projectPath, - path: path || '{YYYY}/{MM}/{DD}', + path: path || 'imgs/{YYYY}-{MM}-{DD}', branch: this.branch || 'master', }); } catch (err) { diff --git a/src/components/modals/providers/GithubImgStorageModal.vue b/src/components/modals/providers/GithubImgStorageModal.vue index 6ad57b06..58673cda 100644 --- a/src/components/modals/providers/GithubImgStorageModal.vue +++ b/src/components/modals/providers/GithubImgStorageModal.vue @@ -12,9 +12,10 @@ - +
- 如果不提供,默认为 {YYYY}/{MM}/{DD} ,其中{YYYY}为年变量、{MM}为月变量、{DD}为日变量。 + 如果不提供,默认为 imgs/{YYYY}-{MM}-{DD} 。
+ 变量说明:{YYYY}为年变量、{MM}为月变量、{DD}为日变量、{MDNAME}为当前文档名称。
@@ -63,7 +64,7 @@ export default modalTemplate({ this.config.resolve({ owner, repo, - path: path || '{YYYY}/{MM}/{DD}', + path: path || 'imgs/{YYYY}-{MM}-{DD}', branch: this.branch || 'master', }); } catch (err) { diff --git a/src/services/editorSvc.js b/src/services/editorSvc.js index a6b49238..b5731987 100644 --- a/src/services/editorSvc.js +++ b/src/services/editorSvc.js @@ -209,9 +209,17 @@ const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils, this.previewElt.appendChild(sectionPreviewElt); } extensionSvc.sectionPreview(sectionPreviewElt, this.options, true); + const imgs = Array.prototype.slice.call(sectionPreviewElt.getElementsByTagName('img')).map((imgElt) => { + if (imgElt.src.indexOf(constants.origin) >= 0) { + const uri = decodeURIComponent(imgElt.attributes.src.nodeValue); + imgElt.removeAttribute('src'); + return { imgElt, uri }; + } + return { imgElt }; + }); loadingImages = [ ...loadingImages, - ...Array.prototype.slice.call(sectionPreviewElt.getElementsByTagName('img')), + ...imgs, ]; // Create TOC section element @@ -249,22 +257,22 @@ const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils, this.makeTextToPreviewDiffs(); // Wait for images to load - const loadedPromises = loadingImages.map(imgElt => new Promise((resolve, reject) => { - if (!imgElt.src) { - resolve(); + const loadedPromises = loadingImages.map(it => new Promise((resolve, reject) => { + if (!it.imgElt.src && it.uri) { + getImgUrl(it.uri).then((newUrl) => { + it.imgElt.src = newUrl; + resolve(); + }, () => reject(new Error('加载当前空间图片出错'))); return; } - if (imgElt.src.indexOf(constants.origin) >= 0) { - getImgUrl(imgElt.attributes.src.nodeValue).then((newUrl) => { - imgElt.src = newUrl; - resolve(); - }, () => reject(new Error('加载本地空间图片出错'))); + if (!it.imgElt.src) { + resolve(); return; } const img = new window.Image(); img.onload = resolve; img.onerror = resolve; - img.src = imgElt.src; + img.src = it.imgElt.src; })); await Promise.all(loadedPromises); @@ -542,7 +550,8 @@ const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils, } imgEltsToCache.push(imgElt); if (imgElt.src.indexOf(origin) >= 0) { - loadImgs.push(imgElt); + imgElt.removeAttribute('src'); + loadImgs.push({ imgElt, uri: decodeURIComponent(uri) }); } } const imgTokenWrapper = document.createElement('span'); @@ -554,11 +563,11 @@ const editorSvc = Object.assign(new Vue(), editorSvcDiscussions, editorSvcUtils, }); if (loadImgs.length) { // Wait for images to load - const loadWorkspaceImg = loadImgs.map(imgElt => new Promise((resolve, reject) => { - getImgUrl(imgElt.attributes.src.nodeValue).then((newUrl) => { - imgElt.src = newUrl; + const loadWorkspaceImg = loadImgs.map(it => new Promise((resolve, reject) => { + getImgUrl(it.uri).then((newUrl) => { + it.imgElt.src = newUrl; resolve(); - }, () => reject(new Error(`加载本地空间图片出错,uri:${imgElt.attributes.src.nodeValue}`))); + }, () => reject(new Error(`加载当前空间图片出错,uri:${it.uri}`))); })); Promise.all(loadWorkspaceImg).then(); } diff --git a/src/services/imageSvc.js b/src/services/imageSvc.js index b811349f..757eceea 100644 --- a/src/services/imageSvc.js +++ b/src/services/imageSvc.js @@ -19,8 +19,8 @@ function getImagePath(confPath, imgType) { const date = time.getDate(); const month = time.getMonth() + 1; const year = time.getFullYear(); - const path = confPath.replace('{YYYY}', year) - .replace('{MM}', `0${month}`.slice(-2)).replace('{DD}', `0${date}`.slice(-2)); + const path = confPath.replace('{YYYY}', year).replace('{MM}', `0${month}`.slice(-2)) + .replace('{DD}', `0${date}`.slice(-2)).replace('{MDNAME}', store.getters['file/current'].name); return `${path}${path.endsWith('/') ? '' : '/'}${utils.uid()}.${imgType.split('/')[1]}`; } @@ -44,7 +44,7 @@ export default { path: absolutePath, content: base64, }); - return { url: path }; + return { url: path.replace(' ', '%20') }; } if (!currStorage.provider) { return { error: '暂无已选择的图床!' }; diff --git a/src/services/syncSvc.js b/src/services/syncSvc.js index 4f3f1ee7..decf4ce6 100644 --- a/src/services/syncSvc.js +++ b/src/services/syncSvc.js @@ -844,7 +844,7 @@ const syncWorkspace = async (skipContents = false) => { const syncImg = async (absolutePath) => { const token = workspaceProvider.getToken(); - const path = absolutePath.substring(1, absolutePath.length); + const path = absolutePath.substring(1, absolutePath.length).replace('%20', ' '); const { sha, content } = await workspaceProvider.downloadFile({ token, path, @@ -877,7 +877,7 @@ const uploadImg = async (imgIds, index = 0) => { file: { ...utils.deepCopy(item), type: 'img', - path: item.path.substring(1, item.path.length), + path: item.path.substring(1, item.path.length).replace('%20', ' '), }, isImg: true, }); diff --git a/src/services/utils.js b/src/services/utils.js index 60bfbf36..b8dc52e0 100644 --- a/src/services/utils.js +++ b/src/services/utils.js @@ -387,14 +387,17 @@ export default { getAbsoluteFilePath(currAbsolutePath, filePath) { // "/"开头说明已经是绝对路径 if (filePath.indexOf('/') === 0) { - return filePath; + return this.encodeUrlPath(filePath); } let path = filePath; - if (filePath.indexOf('./') === 0) { + // 相对上级路径 + if (path.indexOf('../') === 0) { + return this.getAbsoluteFilePath(currAbsolutePath.substring(0, currAbsolutePath.lastIndexOf('/')), path.replace('../', '')); + } else if (path.indexOf('./') === 0) { path = `${currAbsolutePath}/${path.replace('./', '')}`; } else { path = `${currAbsolutePath}/${path}`; } - return path.indexOf('/') === 0 ? path : `/${path}`; + return (path.indexOf('/') === 0 ? path : `/${path}`).replace(' ', '%20'); }, };