yup
Ммм, потыкаюсь. Спасибо.
так что: JSON.parse() и проход (рекурсивный) по получившемуся массиву с дописыванием в начало очередной посещённой строки нужного количества пробелов.
- мне мало о чем говорит. Теорию учить лень. Так - методом тыка и гугления/подглядыванием в чужое кой-чего нахватался.
Отсутствует
Но вы неверно оцениваете мои познания.
Ладно, сейчас оторвусь от той хрени, которую ваяю, и сделаю перевод из строки JSON в форматированный текст. Но в свой код это потом сами вставите.
Отсутствует
После небольшого изучения матчасти всё оказалось примитивно просто:
если в str содержится исходная JSON-последовательность, то двойная конвертация
даст на выходе строку с отформатированным текстом.
P.S. Вот только приведённые вами коды для кнопки (что первый, что второй) у меня ничего не сохраняют - ни в Firefox, ни в Seamonkey. (Но и в консоли никакой ругани не появляется.)
Отредактировано yup (03-05-2016 22:14:58)
Отсутствует
Вот только приведённые вами коды для кнопки (что первый, что второй) у меня ничего не сохраняют - ни в Firefox, ни в Seamonkey. (Но и в консоли никакой ругани не появляется.)
Странно. Проверил еще на 38 - работает.
даст на выходе строку с отформатированным текстом.
Ага, спасибо. Попробую присобачить.
Отсутствует
Проверил еще на 38 - работает.
У меня Seamonkey 2.40 и Firefox 45.0.2, Custom Buttons 0.0.5.8.9.
В обоих браузерах после выбора сжатого файла одинаково ничего не происходит.
Отредактировано yup (03-05-2016 22:35:57)
Отсутствует
yupОшибся - не работает. Наверное, потому что Atomics - JavaScript с 46-ой фф только поддерживается.
Не туда смотрю. Нет, вроде не в этом дело.
Добавлено 03-05-2016 22:55:40
yup
Это все моя самодеятельность виной. Так - работает:
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "Open File", Components.interfaces.nsIFilePicker.modeOpen); fp.appendFilter("Mozilla's Lz4 and json files format", "*.jsonlz4; *.mozlz4; *.json"); if (fp.show() == Components.interfaces.nsIFilePicker.returnOK) { var file = fp.file; if (file.exists() && file.isFile() && file.isReadable()) { Components.utils.import("resource://gre/modules/Task.jsm"); Components.utils.import("resource://gre/modules/osfile.jsm"); var oldFile = fp.file.path; if (oldFile.endsWith(".json")) { var newFile = oldFile.replace(/(\.json)$/, ".mozlz4"); function compress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath); yield OS.File.writeAtomic(nFilePath, jsonString,{ compression: "lz4" }); }) } compress(oldFile,newFile); } else { var newFile = (oldFile.replace(".mozlz4", ".json") || oldFile.replace(".jsonlz4", ".json")); function decompress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath,{ compression: "lz4" }); yield OS.File.writeAtomic(nFilePath, jsonString); }) } decompress(oldFile,newFile); } } };
На 34+ точно должно работать. Проверил. Странно, что ночнушка мою ошибку переваривала и не давилась.
Отредактировано turbot (03-05-2016 22:59:44)
Отсутствует
Я с CB и созданием своих дополнений дела никогда не имел. Как там вообще отлаживаться? Как хотя бы в консоль что-то вывести? У меня из кода кнопки console.log() ничего никуда не пишет.
Отсутствует
yup
Я тоже не знаток , но например
Отсутствует
А у меня это не работает.
Вот прямо сейчас вписал в код кнопки первой строкой:
Результат: распакованный файл на диске создаётся, а в консоли тишина.
И JSON в кнопке почему-то не работает.
Та пара команд, которую выше написал, в коде, вписанном в тестовый HTML, работает, в консоли работает, а вписываю в кнопку - и распакованный файл не создаётся.
Причём достаточно даже абстрактного обращения, не затрагивающего выводимый текст.
Например, даже строчка: "var zzz = JSON.parse(jsonString);" - уже всё убивает.
Отредактировано yup (03-05-2016 23:40:30)
Отсутствует
Понял. Я смотрел консоль отладчика (и встроенного, и Firebug). Был уверен, что в окошко "Консоль браузера" то же самое выводится.
Сейчас на часик примерно отвлекусь, а потом попробую разобраться, почему JSON хулиганит. Мысль некоторая есть.
Отсутствует
Меня обмануло название переменной (jsonString). Оказалось, что OS.File.read() возвращает не строку, а массив байтов, который ещё нужно превратить в строку, прежде чем скармливать JSON.parse().
Теперь рабочий код выглядит так:
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "Open File", Components.interfaces.nsIFilePicker.modeOpen); fp.appendFilter("Mozilla's Lz4 and json files format", "*.jsonlz4; *.mozlz4; *.json"); if (fp.show() == Components.interfaces.nsIFilePicker.returnOK) { var file = fp.file; if (file.exists() && file.isFile() && file.isReadable()) { Components.utils.import("resource://gre/modules/Task.jsm"); Components.utils.import("resource://gre/modules/osfile.jsm"); var oldFile = fp.file.path; if (oldFile.endsWith(".json")) { var newFile = oldFile.replace(/(\.json)$/, ".mozlz4"); function compress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath); yield OS.File.writeAtomic(nFilePath, jsonString,{ compression: "lz4" }); }) } compress(oldFile,newFile); } else { var newFile = (oldFile.replace(".mozlz4", ".json") || oldFile.replace(".jsonlz4", ".json")); function decompress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = new TextDecoder("utf-8").decode(yield OS.File.read(oFilePath,{ compression: "lz4" })); yield OS.File.writeAtomic(nFilePath, JSON.stringify(JSON.parse(jsonString), null, ' ')); }) } decompress(oldFile,newFile); } } };
Отсутствует
yup
Шикарно! Спасибо.
Я смотрю, обратно в строку нет необходимости переводить? И так пережевывает. Правда, search.json.mozlz4 на пару КБ в размере вырастает.
Хм, после перезапуска браузера, снова уменьшился. Автоматом оптимизируется?
Отсутствует
Правда, search.json.mozlz4 на пару КБ в размере вырастает.
Это потому, что сжимается наш форматированный текст - со всеми добавленными туда пробелами и переносами строк.
Хм, после перезапуска браузера, снова уменьшился. Автоматом оптимизируется?
Может быть. У меня search.json при перезапусках не меняется (и дата у него на два месяца более ранняя, чем у search.json.mozlz4).
Но если заглянуть в search.json.mozlz4, то там почти в самом начале будет видна последовательность {"version":1
Если между фигурной скобкой и кавычкой пробелов нет - значит, браузер всё опять в одну строку перевёл ("оптимизировал").
Отсутствует
Это потому, что сжимается наш форматированный текст - со всеми добавленными туда пробелами и переносами строк.
Ну да, я понял.
Если между фигурной скобкой и кавычкой пробелов нет - значит, браузер всё опять в одну строку перевёл ("оптимизировал").
Не подумал открыть посмотреть. Так и есть.
Еще раз спасибо за помощь. Гораздо удобнее и быстрее, чем в скратчпад вставлять.
Отсутствует
Нашёл описание нововведений в функции read и writeAtomic. (Хм, два года уже им.)
Теперь можно сразу заказать чтение не в массив, а в строку, и обойтись без TextDecoder:
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "Open File", Components.interfaces.nsIFilePicker.modeOpen); fp.appendFilter("Mozilla's Lz4 and json files format", "*.jsonlz4; *.mozlz4; *.json"); if (fp.show() == Components.interfaces.nsIFilePicker.returnOK) { var file = fp.file; if (file.exists() && file.isFile() && file.isReadable()) { Components.utils.import("resource://gre/modules/Task.jsm"); Components.utils.import("resource://gre/modules/osfile.jsm"); var oldFile = fp.file.path; if (oldFile.endsWith(".json")) { var newFile = oldFile.replace(/(\.json)$/, ".mozlz4"); function compress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath); yield OS.File.writeAtomic(nFilePath, jsonString, {compression: "lz4"}); }) } compress(oldFile,newFile); } else { var newFile = (oldFile.replace(".mozlz4", ".json") || oldFile.replace(".jsonlz4", ".json")); function decompress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath, {encoding: "utf-8", compression: "lz4"}); yield OS.File.writeAtomic(nFilePath, JSON.stringify(JSON.parse(jsonString), null, ' '), {encoding: "utf-8"}); }) } decompress(oldFile,newFile); } } };
Отредактировано yup (04-05-2016 02:36:50)
Отсутствует
turbot
yup
Полезная кнопка оказалась!
А можно ли открывать диалог Open File уже в папке профиля (прописать относительный путь к папке %ПРОФИЛЯ%)
Отредактировано thrower (05-05-2016 20:45:34)
Отсутствует
Можно. Но у меня не выходит.
Где-нибудь между первой строкой кода и вызовом функции fp.show() нужно добавить строку
Теоретически, перед ней ещё нужно иметь
но у меня почему-то и без этого работает.
Отсутствует
voqabuhe
Распакаванные/запакованные файлы сохраняются втихую в ту же директорию, без подтверждения. Добавьте LOG и смотрите в консоли, если сомневаетесь:
var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker); fp.displayDirectory = FileUtils.getDir("ProfD", []); fp.init(window, "Open File", Components.interfaces.nsIFilePicker.modeOpen); fp.appendFilter("Mozilla's Lz4 and json files format", "*.jsonlz4; *.mozlz4; *.json"); if (fp.show() == Components.interfaces.nsIFilePicker.returnOK) { var file = fp.file; if (file.exists() && file.isFile() && file.isReadable()) { Components.utils.import("resource://gre/modules/Task.jsm"); Components.utils.import("resource://gre/modules/osfile.jsm"); var oldFile = fp.file.path; if (oldFile.endsWith(".json")) { var newFile = oldFile.replace(/(\.json)$/, ".mozlz4"); function compress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath); yield OS.File.writeAtomic(nFilePath, jsonString, {compression: "lz4"}); }) } compress(oldFile,newFile); LOG("Saved as: " + newFile); } else { var newFile = (oldFile.replace(".mozlz4", ".json") || oldFile.replace(".jsonlz4", ".json")); function decompress(oFilePath,nFilePath){ return Task.spawn(function* () { var jsonString = yield OS.File.read(oFilePath, {encoding: "utf-8", compression: "lz4"}); yield OS.File.writeAtomic(nFilePath, JSON.stringify(JSON.parse(jsonString), null, ' '), {encoding: "utf-8"}); }) } decompress(oldFile,newFile); LOG("Saved as: " + newFile); } } };
Отсутствует
Распакаванные/запакованные файлы сохраняются втихую в ту же директорию, без подтверждения. Добавьте LOG и смотрите в консоли, если сомневаетесь:
Да я ни в чём не сомневаюсь пока, я просто не пойму что кнопка делает? Написало что Saved as: C:\......\search.mozlz4 и чё мне это даёт?
Отредактировано voqabuhe (06-05-2016 18:39:04)
Отсутствует