Regex: add export buttons for global and scoped scripts

6df95b98ecdfadedd65570051e9309ab9de558ae

gk <gkpyon@gmail.com>

2 files changed, +29 -1Showing whitespace changes
public/scripts/extensions/regex/dropdown.html+8 -0
@@ -21,6 +21,14 @@
21 <small data-i18n="ext_regex_import_script">Import</small>21 <small data-i18n="ext_regex_import_script">Import</small>
22 </div>22 </div>
23 <input type="file" id="import_regex_file" hidden accept="*.json" multiple />23 <input type="file" id="import_regex_file" hidden accept="*.json" multiple />
24 <div id="export_global_regex" class="menu_button menu_button_icon">
25 <i class="fa-solid fa-file-export"></i>
26 <small data-i18n="ext_regex_export_global">Export Global</small>
27 </div>
28 <div id="export_scoped_regex" class="menu_button menu_button_icon">
29 <i class="fa-solid fa-file-export"></i>
30 <small data-i18n="ext_regex_export_scoped">Export Scoped</small>
31 </div>
24 </div>32 </div>
25 <hr />33 <hr />
26 <div id="global_scripts_block" class="padding5">34 <div id="global_scripts_block" class="padding5">
public/scripts/extensions/regex/index.js+21 -1
@@ -12,6 +12,8 @@ import { regex_placement, runRegexScript, substitute_find_regex } from './engine
12import { t } from '../../i18n.js';12import { t } from '../../i18n.js';
13import { accountStorage } from '../../util/AccountStorage.js';13import { accountStorage } from '../../util/AccountStorage.js';
1414
15const sanitizeFileName = name => name.replace(/[\s.<>:"/\\|?*\x00-\x1F\x7F]/g, '_').toLowerCase();
16
15/**17/**
16 * @typedef {import('../../char-data.js').RegexScriptData} RegexScript18 * @typedef {import('../../char-data.js').RegexScriptData} RegexScript
17 */19 */
@@ -167,7 +169,7 @@ async function loadRegexScripts() {
167 await saveRegexScript(script, -1, true);169 await saveRegexScript(script, -1, true);
168 });170 });
169 scriptHtml.find('.export_regex').on('click', async function () {171 scriptHtml.find('.export_regex').on('click', async function () {
170 const fileName = `${script.scriptName.replace(/[\s.<>:"/\\|?*\x00-\x1F\x7F]/g, '_').toLowerCase()}.json`;172 const fileName = `regex-${sanitizeFileName(script.scriptName)}.json`;
171 const fileData = JSON.stringify(script, null, 4);173 const fileData = JSON.stringify(script, null, 4);
172 download(fileData, fileName, 'application/json');174 download(fileData, fileName, 'application/json');
173 });175 });
@@ -605,6 +607,24 @@ jQuery(async () => {
605 $('#import_regex_file').trigger('click');607 $('#import_regex_file').trigger('click');
606 });608 });
607609
610 $('#export_global_regex').on('click', async function () {
611 const regexScripts = extension_settings?.regex ?? [];
612 if (regexScripts.length) {
613 const fileName = 'regex-global.json';
614 const fileData = JSON.stringify(regexScripts, null, 4);
615 download(fileData, fileName, 'application/json');
616 }
617 });
618
619 $('#export_scoped_regex').on('click', async function () {
620 const regexScripts = characters[this_chid]?.data?.extensions?.regex_scripts ?? [];
621 if (regexScripts.length) {
622 const fileName = `regex-${sanitizeFileName(characters[this_chid].name)}.json`;
623 const fileData = JSON.stringify(regexScripts, null, 4);
624 download(fileData, fileName, 'application/json');
625 }
626 });
627
608 let sortableDatas = [628 let sortableDatas = [
609 {629 {
610 selector: '#saved_regex_scripts',630 selector: '#saved_regex_scripts',