-
-
Save odnodn/8d0abe9f3eed4687b547a4abe1ec3bd6 to your computer and use it in GitHub Desktop.
replace emoji for javascript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //https://github.com/node-modules/emoji | |
| //http://apps.timwhitlock.info/emoji/tables/unicode | |
| var unified_emoji_ranges = [ | |
| '\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF | |
| '\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F | |
| '\ud83d[\ude80-\udeff]' // U+1F680 to U+1F6FF | |
| ]; | |
| var reg = new RegExp(unified_emoji_ranges.join('|'), 'g'); | |
| console.log("🐬 🐙 🐟 🐠 🐡 🐚 🐌 🐛 🐜 🐝 🐞 🐾".replace(reg, "[表情]")) | |
| var teststring = "web-extension-starter_ 🖥🔋Web Extension starter to build _Write Once Run on Any Browser_ extension"; | |
| console.log(teststring); | |
| console.log(teststring.replace(reg, "_")) | |
| // https://github.com/nizaroni/emoji-strip | |
| // A remove all non-ascii characters regex works as a workaround for me: | |
| return myString.replace(/[^\x00-\x7F]/g, ""); | |
| // | |
| var regexCreator = require('emoji-regex'); | |
| var emojiRegex = regexCreator(); | |
| function emoji_strip (string) { | |
| return string.replace(emojiRegex, ''); | |
| } | |
| module.exports = emoji_strip; | |
| // https://github.com/mathiasbynens/emoji-regex | |
| module.exports = () => { | |
| // https://mths.be/emoji | |
| return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?|\u200D(?:\uD83D\uDC8B\u200D)?)\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69])|\uD83E\uDEF1\uD83C\uDFFF\u200D\uD83E\uDEF2)(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?|\u200D(?:\uD83D\uDC8B\u200D)?)\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69])|\uD83E\uDEF1\uD83C\uDFFE\u200D\uD83E\uDEF2)(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?|\u200D(?:\uD83D\uDC8B\u200D)?)\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69])|\uD83E\uDEF1\uD83C\uDFFD\u200D\uD83E\uDEF2)(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?|\u200D(?:\uD83D\uDC8B\u200D)?)\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69])|\uD83E\uDEF1\uD83C\uDFFC\u200D\uD83E\uDEF2)(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?|\u200D(?:\uD83D\uDC8B\u200D)?)\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69])|\uD83E\uDEF1\uD83C\uDFFB\u200D\uD83E\uDEF2)(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|[\u2695\u2696\u2708]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])))|\u200D(?:\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?|\u200D(?:\uD83D\uDC8B\u200D)?)\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\u200D[\u2695\u2696\u2708])?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764(?:\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F?\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F?\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83D\uDC41\uFE0F?\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83C\uDFF3\uFE0F?\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F?\u200D\u26A7|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDEF1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764(?:\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\u200D(?:\uD83D\uDD25|\uD83E\uDE79))|\uD83D\uDC41\uFE0F?|\uD83C\uDFF3\uFE0F?|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F?\u20E3|\uD83E\uDD3C(?:\uD83C[\uDFFB-\uDFFF])|\u2764\uFE0F?|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF6])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD3C\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF6]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDDDE\uDDDF]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B50]|\uD83C[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDD-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC2\uDED0-\uDED9\uDEE0-\uDEE7]/g; | |
| }; | |
| // https://stackoverflow.com/questions/32511789/looping-through-files-in-a-folder-node-js | |
| /** | |
| node.js file/director reading | |
| */ | |
| // Asynchronously Multiple Folders | |
| const fs = require('fs') | |
| const util = require('util') | |
| const path = require('path') | |
| // Multiple folders list | |
| const in_dir_list = [ | |
| 'Folder 1 Large', | |
| 'Folder 2 Small', // small folder and files will complete first | |
| 'Folder 3 Extra Large' | |
| ] | |
| // BEST PRACTICES: (1) Faster folder list For loop has to be outside async_capture_callback functions for async to make sense | |
| // (2) Slower Read Write or I/O processes best be contained in an async_capture_callback functions because these processes are slower than for loop events and faster completed items get callback-ed out first | |
| for (i = 0; i < in_dir_list.length; i++) { | |
| var in_dir = in_dir_list[i] | |
| // function is created (see below) so each folder is processed asynchronously for readFile_async that follows | |
| readdir_async_capture(in_dir, function(files_path) { | |
| console.log("Processing folders asynchronously ...") | |
| for (j = 0; j < files_path.length; j++) { | |
| file_path = files_path[j] | |
| file = file_path.substr(file_path.lastIndexOf("/") + 1, file_path.length) | |
| // function is created (see below) so all files are read simultaneously but the smallest file will be completed first and get callback-ed first | |
| readFile_async_capture(file_path, file, function(file_string) { | |
| try { | |
| console.log(file_path) | |
| console.log(file_string) | |
| } catch (error) { | |
| console.log(error) | |
| console.log("System exiting first to catch error if not async will continue...") | |
| process.exit() | |
| } | |
| }) | |
| } | |
| }) | |
| } | |
| // fs.readdir async_capture function to deal with asynchronous code above | |
| function readdir_async_capture(in_dir, callback) { | |
| fs.readdir(in_dir, function(error, files) { | |
| if (error) { return console.log(error) } | |
| files_path = files.map(function(x) { return path.join(in_dir, x) }) | |
| callback(files_path) | |
| }) | |
| } | |
| // fs.readFile async_capture function to deal with asynchronous code above | |
| function readFile_async_capture(file_path, file, callback) { | |
| fs.readFile(file_path, function(error, data) { | |
| if (error) { return console.log(error) } | |
| file_string = data.toString() | |
| callback(file_string) | |
| }) | |
| } | |
| /** | |
| */ | |
| // Read all folders in a directory | |
| const readAllFolder = (dirMain) => { | |
| const readDirMain = fs.readdirSync(dirMain); | |
| console.log(dirMain); | |
| console.log(readDirMain); | |
| readDirMain.forEach((dirNext) => { | |
| console.log(dirNext, fs.lstatSync(dirMain + "/" + dirNext).isDirectory()); | |
| if (fs.lstatSync(dirMain + "/" + dirNext).isDirectory()) { | |
| readAllFolder(dirMain + "/" + dirNext); | |
| } | |
| }); | |
| }; | |
| /** | |
| */ | |
| //jshint esversion:8 | |
| //jshint node:true | |
| const fs = require( 'fs' ); | |
| const path = require( 'path' ); | |
| const moveFrom = "/tmp/movefrom"; | |
| const moveTo = "/tmp/moveto"; | |
| // Make an async function that gets executed immediately | |
| (async ()=>{ | |
| // Our starting point | |
| try { | |
| // Get the files as an array | |
| const files = await fs.promises.readdir( moveFrom ); | |
| // Loop them all with the new for...of | |
| for( const file of files ) { | |
| // Get the full paths | |
| const fromPath = path.join( moveFrom, file ); | |
| const toPath = path.join( moveTo, file ); | |
| // Stat the file to see if we have a file or dir | |
| const stat = await fs.promises.stat( fromPath ); | |
| if( stat.isFile() ) | |
| console.log( "'%s' is a file.", fromPath ); | |
| else if( stat.isDirectory() ) | |
| console.log( "'%s' is a directory.", fromPath ); | |
| // Now move async | |
| await fs.promises.rename( fromPath, toPath ); | |
| // Log because we're crazy | |
| console.log( "Moved '%s'->'%s'", fromPath, toPath ); | |
| } // End for...of | |
| } | |
| catch( e ) { | |
| // Catch anything bad that happens | |
| console.error( "We've thrown! Whoops!", e ); | |
| } | |
| })(); // Wrap in parenthesis and call now | |
| // https://stackoverflow.com/questions/28080088/node-trying-to-rename-every-file-in-a-directory-skips-over-some | |
| var fs = require('fs'), | |
| path = require('path'); | |
| var oldPath = 'G:\\oldPath\\oldPath'; | |
| var newPath = 'G:\\newPath\\newPath\\'; | |
| var ext = 'jpg'; | |
| var newPrefix = 'newPrefix'; | |
| var myFun = function(mypath) { | |
| fs.readdir(mypath, function(error, files) { | |
| if (error) | |
| console.log('error ' + error.code + ' : ' + error.message); | |
| else { | |
| files.map(function(file) { | |
| return path.join(mypath, file) | |
| }).filter(function(file) { | |
| if(fs.statSync(file).isFile()) | |
| return file; | |
| else | |
| return myFun(file); | |
| }).forEach(function(file){ | |
| var path_file = file.split('\\'); | |
| var extension = path_file[path_file.length - 1].split('.'); | |
| if (extension[1] === ext) { | |
| var source = fs.createReadStream(file); | |
| var target = fs.createWriteStream(newPath + newPrefix + path_file[path_file.length - 1]); | |
| source.pipe(target); | |
| fs.unlink(file); | |
| } | |
| }) | |
| } | |
| }) | |
| } | |
| // https://stackoverflow.com/questions/60746329/multiple-async-execution-nodejs | |
| const fsp = require('fs').promises; | |
| const path = require('path'); | |
| const replaceExt = require('replace-ext'); | |
| // takes an argument that specifies the directory to list | |
| // returns a promise that resolves to a list of files in that directory | |
| function listFiles(dir) { | |
| // make dir into a fully qualified path | |
| let fullDir = path.resolve(dir); | |
| return fsp.readdir(fullDir).then(files => { | |
| // make into full path | |
| return files.map(f => { | |
| return path.join(fullDir, f); | |
| }); | |
| }); | |
| } | |
| // takes an array of filenames and a new file extension | |
| // renames all the files to have the new extension | |
| // returns array of new filenames | |
| async function renameFiles(files, newExt) { | |
| // build array of renamed filenames | |
| const newFiles = files.map(f => { | |
| return replaceExt(f, newExt); | |
| }); | |
| for (let i = 0; i < files.length; i++) { | |
| await fsp.rename(files[i], newFiles[i]); | |
| } | |
| return newFiles; | |
| } | |
| // Example usage | |
| listFiles("./zipped").then(files => { | |
| return renameFiles(files, ".zip"); | |
| }).then(newFiles => { | |
| console.log(newFiles); | |
| }).catch(err => { | |
| console.log(err); | |
| }) | |
| // renamer.js https://github.com/ericute/renamer/blob/master/routes/renamer.js | |
| const express = require('express'); | |
| const router = express.Router(); | |
| const path = require('path'); | |
| const fs = require('fs'); | |
| const csv = require('csvtojson'); | |
| // Count Files | |
| router.get('/countFilesToRename', async (req, res, next) => { | |
| let startDate = new Date(); | |
| let folderPath = req.query.folderPath; | |
| folderPath = decodeURIComponent(decodeURI(folderPath)); | |
| let csvPath = req.query.csvPath; | |
| csvPath = decodeURIComponent(decodeURI(csvPath)); | |
| let errList = []; | |
| if (!fs.existsSync(folderPath)) { | |
| errList.push("Cannot find \"" + folderPath + "\". Please check if the directory you provided exists and is accessible."); | |
| } else { | |
| if (!fs.lstatSync(folderPath).isDirectory) { | |
| errList.push("Cannot find \"" + folderPath + "\". Please check if the directory you provided exists and is accessible."); | |
| } | |
| } | |
| if (!fs.existsSync(csvPath)) { | |
| //errList.push("Please provide a valid Document Data in csv file format."); | |
| errList.push("Cannot find \"" + csvPath + "\". Please provide a valid Document Data in csv file format."); | |
| } else { | |
| if (!fs.lstatSync(csvPath).isFile) { | |
| errList.push("Unexpected file: \"" + csvPath + "\".Please provide a valid Document Data in csv file format."); | |
| } | |
| } | |
| if (errList.length > 0) { | |
| res.send({"status":"error", "message":errList}); | |
| return; | |
| } | |
| let filesForRenaming = await getFilesForRenaming(csvPath); | |
| let fileCounter = 0; | |
| let filesToBeRenamed = 0; | |
| await asyncWalk(folderPath, function(err, results) { | |
| if (err) throw err; | |
| results.forEach(file => { | |
| if (fs.lstatSync(file).isFile) { | |
| fileCounter++; | |
| } | |
| if (!filesForRenaming[path.basename(file)]) { | |
| //In a javascript forEach loop, | |
| //return is the equivalent of continue | |
| //https://stackoverflow.com/questions/31399411/go-to-next-iteration-in-javascript-foreach-loop | |
| return; | |
| } | |
| filesToBeRenamed++; | |
| }); | |
| if (Object.keys(errList).length > 0) { | |
| res.send({"status":"error", "errors": errList}); | |
| } else { | |
| res.send({ | |
| "status":"success", | |
| "filesFoundInDocData": Object.keys(filesForRenaming).length, | |
| "filesFound": fileCounter, | |
| "filesToBeRenamed": filesToBeRenamed, | |
| "startDate": startDate | |
| }); | |
| } | |
| }); | |
| }); | |
| // Rename Files | |
| router.get('/renameFiles', async (req, res, next) => { | |
| let startDate = new Date(); | |
| let folderPath = req.query.folderPath; | |
| folderPath = decodeURIComponent(decodeURI(folderPath)); | |
| let csvPath = req.query.csvPath; | |
| csvPath = decodeURIComponent(decodeURI(csvPath)); | |
| let errList = []; | |
| if (!fs.existsSync(folderPath)) { | |
| errList.push("Cannot find \"" + folderPath + "\". Please check if the directory you provided exists and is accessible."); | |
| } else { | |
| if (!fs.lstatSync(folderPath).isDirectory) { | |
| errList.push("Cannot find \"" + folderPath + "\". Please check if the directory you provided exists and is accessible."); | |
| } | |
| } | |
| if (!fs.existsSync(csvPath)) { | |
| //errList.push("Please provide a valid Document Data in csv file format."); | |
| errList.push("Cannot find \"" + csvPath + "\". Please provide a valid Document Data in csv file format."); | |
| } else { | |
| if (!fs.lstatSync(csvPath).isFile) { | |
| errList.push("Unexpected file: \"" + csvPath + "\".Please provide a valid Document Data in csv file format."); | |
| } | |
| } | |
| if (errList.length > 0) { | |
| res.send({"status":"error", "message":errList}); | |
| return; | |
| } | |
| let filesForRenaming = await getFilesForRenaming(csvPath); | |
| let fileCounter = 0; | |
| let renamedFiles = 0; | |
| await walk(folderPath, function(err, results) { | |
| if (err) throw err; | |
| results.forEach(file => { | |
| if (fs.lstatSync(file).isFile) { | |
| fileCounter++; | |
| } | |
| let fileBasename = path.basename(file); | |
| let filePath = path.dirname(file); | |
| if (!filesForRenaming[path.basename(file)]) { | |
| //In a javascript forEach loop, | |
| //return is the equivalent of continue | |
| //https://stackoverflow.com/questions/31399411/go-to-next-iteration-in-javascript-foreach-loop | |
| return; | |
| } | |
| let description = filesForRenaming[path.basename(file)].description; | |
| // Process instances where the absolute file name exceeds 255 characters. | |
| let tempNewName = path.resolve(filePath, description + "_" + fileBasename); | |
| let tempNewNameLength = tempNewName.length; | |
| let newName = ''; | |
| if (tempNewNameLength > 255) { | |
| let excess = 254 - tempNewNameLength; | |
| if (description.length > Math.abs(excess)) { | |
| description = description.substring(0, (description.length - Math.abs(excess))); | |
| } | |
| newName = path.resolve(filePath, description + "_" + fileBasename); | |
| } else { | |
| newName = tempNewName; | |
| } | |
| renamedFiles++; | |
| // Actual File Renaming | |
| fs.renameSync(file, newName, (err) => { | |
| if (err) { | |
| errList.push(err); | |
| } | |
| renamedFiles++; | |
| }); | |
| /* | |
| fs.unlink(file, (err) => { | |
| if (err) { | |
| errList.push(err); | |
| } | |
| renamedFiles++; | |
| }); | |
| */ | |
| }); | |
| if (Object.keys(errList).length > 0) { | |
| res.send({"status":"error", "errors": errList}); | |
| } else { | |
| res.send({ | |
| "status":"success", | |
| "filesFoundInDocData": Object.keys(filesForRenaming).length, | |
| "filesFound": fileCounter, | |
| "renamedFiles": renamedFiles, | |
| "startDate": startDate | |
| }); | |
| } | |
| }); | |
| }); | |
| function cleanUpString(str) { | |
| return str.replace(/[:;/\\?%*|"<>]/g, '_'); | |
| } | |
| function walk (dir, done) { | |
| var results = []; | |
| fs.readdir(dir, function(err, list) { | |
| if (err) return done(err); | |
| var pending = list.length; | |
| if (!pending) return done(null, results); | |
| list.forEach(function(file) { | |
| file = path.resolve(dir, file); | |
| fs.stat(file, function(err, stat) { | |
| if (stat && stat.isDirectory()) { | |
| walk(file, function(err, res) { | |
| results = results.concat(res); | |
| if (!--pending) done(null, results); | |
| }); | |
| } else { | |
| results.push(file); | |
| if (!--pending) done(null, results); | |
| } | |
| }); | |
| }); | |
| }); | |
| return results; | |
| }; | |
| function asyncWalk (dir, done) { | |
| var results = []; | |
| fs.readdir(dir, function(err, list) { | |
| if (err) return done(err); | |
| var pending = list.length; | |
| if (!pending) return done(null, results); | |
| list.forEach(function(file) { | |
| file = path.resolve(dir, file); | |
| fs.stat(file, function(err, stat) { | |
| if (stat && stat.isDirectory()) { | |
| asyncWalk(file, function(err, res) { | |
| results = results.concat(res); | |
| if (!--pending) done(null, results); | |
| }); | |
| } else { | |
| results.push(file); | |
| if (!--pending) done(null, results); | |
| } | |
| }); | |
| }); | |
| }); | |
| }; | |
| async function getFilesForRenaming(csvPath) { | |
| let filesToProcess = await csv().fromFile(csvPath); | |
| let filesForRenaming = {}; | |
| for (let key in filesToProcess) { | |
| let fileFull = filesToProcess[key].Path; | |
| let fileName = path.basename(fileFull); | |
| let description = filesToProcess[key].Description; | |
| filesForRenaming[fileName] = { | |
| "oldName": fileName, | |
| "description": cleanUpString(description) | |
| }; | |
| } | |
| return filesForRenaming; | |
| } | |
| module.exports = router; | |
| // ------------- | |
| const { join } = require('path'); | |
| const { readdirSync, renameSync } = require('fs'); | |
| const [dir, search, replace] = process.argv.slice(2); | |
| const match = RegExp(search, 'g'); | |
| const files = readdirSync(dir); | |
| files | |
| .filter(file => file.match(match)) | |
| .forEach(file => { | |
| const filePath = join(dir, file); | |
| const newFilePath = join(dir, file.replace(match, replace)); | |
| renameSync(filePath, newFilePath); | |
| }); | |
| // Usage | |
| // node rename.js path/to/directory 'string-to-search' 'string-to-replace' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment