Добавить новый пункт "Удалить дубликаты закладок" в меню папок закладок( Firefox 17 + )
Автор: bunda1
Версия: от 09.08.2014.
Описание: Kод добавляет новый пункт Удалить дубликаты закладок в меню папок закладок, который удаляет все закладки которые дублирует по адресу закладки из проверяемой папки и также показывает количество удалённых дубликатов в всплывающей подсказке.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.
// Добавить новый пункт "Удалить дубликаты закладок" в меню папок закладок, от 09.08.2014. ................................ (function() { // Создать новый пункт в меню .... var menuitem = document.createElement("menuitem"); menuitem.id = "placesContext_deleteDuplicates"; menuitem.setAttribute("label", "Удалить дубликаты закладок"); menuitem.setAttribute("selection", "folder"); menuitem.setAttribute("closemenu", "single"); menuitem.setAttribute("oncommand", "this.run(document)"); // если клик или команда на пункте меню menuitem.run = function(doc) { // получить Id и контент папки закладок var node = PlacesUIUtils.getViewForNode( doc.popupNode ).selectedNode; var checkFolderId = node.folderItemId ? node.folderItemId : node.itemId; var contents = PlacesUtils.getFolderContents( checkFolderId, false, false ).root; // создать список закладок проверяемый папки, удалить дубликаты закладок в проверяемой папке for ( var checkList = [], deleted = 0, i = 0; i < contents.childCount; ++i ) { var item = contents.getChild(i); var uri = item.uri.replace(/\/$/,""); // if ( !PlacesUtils.nodeIsSeparator( item ) && checkList[uri] ) PlacesUtils.bookmarks.removeItem( item.itemId ), i--, deleted++; checkList[uri] = true; } // сравнить все закладки( кроме закладок проверяемой папки ) со списоком для проверки и удалить дубликаты function chooseBookmarks( folderId ) { var folder = PlacesUtils.getFolderContents( folderId ).root; folder.QueryInterface(Ci.nsINavHistoryContainerResultNode); folder.containerOpen = true; for ( var i = 0; i < folder.childCount; i++ ) { var child = folder.getChild(i); var uri = child.uri.replace(/\/$/,""); if ( PlacesUtils.nodeIsFolder( child ) && folderId !== PlacesUtils.tagsFolderId ) chooseBookmarks( child.itemId ); else if ( !PlacesUtils.nodeIsSeparator( item ) && folderId !== checkFolderId && checkList[uri] ) PlacesUtils.bookmarks.removeItem( child.itemId ), i--, deleted++; } folder.containerOpen = false; } chooseBookmarks(1); // показать количество удалённых дубликатов в всплывающей подсказке .... switch( deleted ) { case 0: var notification = "Дубликаты закладок не обнаружены"; break; case 1: var notification = "Удален: " + deleted + " дубликат закладок"; break; default: var notification = "Удалены: " + deleted + " дубликата закладок"; } custombuttons.alertSlide( notification, ''); }; // Добавить новый пункт во все меню папок закладок .... function handlePopup(e) { var node = e.target; if ( node.id !== 'placesContext' ) return; var sortByName = node.getElementsByAttribute("id", "placesContext_sortBy:name")[0]; setTimeout(function() { menuitem.setAttribute("disabled", sortByName.disabled ) }, 50 ); // отключать, если 'Сортировать по имени' отключено if ( node.getElementsByAttribute("id", "placesContext_deleteDuplicates")[0] ) return; // блокировать дублирование пункта node.insertBefore( menuitem, sortByName ); }; addEventListener("popupshowing", handlePopup, true, window ); addDestructor(function() menuitem.parentNode && menuitem.parentNode.removeChild(menuitem) ); // Добавить новый пункт во все меню папок закладок библиотеки .... function winObs( subject ) { subject.addEventListener("load", function(e) { this.removeEventListener( e.type, arguments.callee ); if ( subject.location.href !== 'chrome://browser/content/places/places.xul' ) return; // стоп, если не библиотека // добавлять и удалять обработчик для добавления в меню папок закладок новый пункт addEventListener("popupshowing", handlePopup, true, subject ); this.addEventListener("unload", function(e) { this.removeEventListener(e.type, arguments.callee ); removeEventListener("popupshowing", handlePopup, true, subject ); }) }) }; Services.ww.registerNotification(winObs); addDestructor(function() { Services.ww.unregisterNotification(winObs) }); })();
Отредактировано bunda1 (09-08-2014 20:01:21)
Отсутствует
bunda1
А она выбор даёт, какой из дубликатов удалить, или сама решает?
Выбора нет, смысл в том чтобы закладка с уникальном адресом была только той папке из контекстного меню которой запущен код.
Отсутствует
А URLы типа http://aaa/bbb/ccc и http://aaa/bbb/ccc/ он рассматривает как один URL или нет?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
А URLы типа http://aaa/bbb/ccc и http://aaa/bbb/ccc/ он рассматривает как один URL или нет?
Интересно, но оказывается что нет. Спасибо, буду думать как исправить. Может еще будут замечания
Отсутствует
А URLы типа http://aaa/bbb/ccc и http://aaa/bbb/ccc/ он рассматривает как один URL или нет?
Исправил Удалить дубликаты закладок
Отсутствует
Проблема дупликатных закладок в том, что их может быть много и юзер не знает толком где они.
Эта проблема усугубляется тем, что при древовидной иерархической структуре фолдеров их тоже может быть много да ещё с различной степенью вложенности.
В этой связи у меня есть 2 вопроса и 1 предложение.
Вопросы:
1. Проверяются только закладки фолдера или его подфолдеров тоже?
Если только фолдера без подфолдеров то почистить все закладки - можно умаяться.
Если же рекурсивно, то толком не знаешь где осталась закладка, а где - уничтожили.
2. Если в одном фолдере имеются дупликаты - что происходит?
Предложение: если некоторая закладка продублирована в фолдерах Ф1, Ф2 и Ф3 и удаляются закладки в фолдерах Ф2 и Ф3, то было бы полезно, чтобы оставшаяся в фолдере Ф1 закладка получала бы метки Ф2 и Ф3.
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
1. Проверяются только закладки фолдера или его подфолдеров тоже
Проверяются подфолдеров тоже, в общем проверяется все закладки.
2. Если в одном фолдере имеются дубликаты - что происходит?
Тоже удаляются. Смысл в том чтобы одна закладка с уникальном адресом была только той папке из контекстного меню которой запущен код.
Похоже что описание кода не удалась, раз такие вопросы.
Предложение: если некоторая закладка продублирована в фолдерах Ф1, Ф2 и Ф3 и удаляются закладки в фолдерах Ф2 и Ф3, то было бы полезно, чтобы оставшаяся в фолдере Ф1 закладка получала бы метки Ф2 и Ф3.
Я подумаю что тут можно сделать, хотя это сильно усложнит код. И разве возможны две метки у закладки?
Отсутствует
okkamas_knife
Понятно, а зачем нужны метки?
Метки - это некая альтернатива фолдерам - можно искать по меткам, а можно - по фолдерам.
Допустим, у меня есть фолдер "Животные" и фолдер "Актуалии".
Куда поместить закладку о молодом жирафе, которого умертвили в датском зоопарке потому что не могли найти ему пару?
По идее - в "Животные". Но сама проблема - актуальна...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Метки - это некая альтернатива фолдерам - можно искать по меткам, а можно - по фолдерам.
Firefox дублирует закладки с метками в папке Метки, открой Библиотеку и увидишь.
Отсутствует
difabor пишетМетки - это некая альтернатива фолдерам - можно искать по меткам, а можно - по фолдерам.
Firefox дублирует закладки с метками в папке Метки, открой Библиотеку и увидишь.
Это - результат поиска по меткам, а не дублирование.
Папка "Метки" - это псевдопапка, как впрочем, и псевдопапки меток внутри этой папки
Именно поэтому я и предложил добавлять имя фолдера как метку.
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Это - результат поиска по меткам, а не дублирование
Я по меткам поиск не вёл, но добавлял закладкам метки и они дублировались в папке Метки.
Именно поэтому я и предложил добавлять имя фолдера как метку.
Не было такого предложения, или ты сейчас предлагаешь, ну тогда поясни пожалуйста.
Отсутствует
когда ты открываешь в библиотеке папку с метками и выбираешь какуюто метку то происходит поисковый запрос к базе по этой метке и справа тогда выводятся результаты поиска
А вот и нет, мой код удаляет закладки из папки Метки именно как дубликаты и после этого метка у проверяемой закладки удаляется.
если я правильно понял difabor действие должно быть таким
имеем три одинаковых закладки в папках ааа ббб ссс
удаляем те что в папках ббб ссс а закладке в папке ааа присваиваем метки ббб и ссс
зы имхо это неудобно и создаст перегруженность метками впрочем тебе решать
Я думаю легче будет просто не удалять закладки с метками.
Отсутствует
когда ты открываешь в библиотеке папку с метками и выбираешь какуюто метку то происходит поисковый запрос к базе по этой метке и справа тогда выводятся результаты поиска
А вот и нет, мой код удаляет закладки из папки Метки именно как дубликаты и после этого метка у проверяемой закладки удаляется.
Это нехорошо.
При таком подходе у закладок будут убраны все метки. Ведь метка не может быть в вакууме. Закладка с меткой всегда находится в каком-то фолдере/папке
Кстати, есть ещё псевдопапки "Недавно добавленные" и "Последние метки", если кнопка и их чистит, то это тоже нехорошо.
если я правильно понял difabor действие должно быть таким
имеем три одинаковых закладки в папках ааа ббб ссс
удаляем те что в папках ббб ссс а закладке в папке ааа присваиваем метки ббб и ссс
зы имхо это неудобно и создаст перегруженность метками впрочем тебе решатьЯ думаю легче будет просто не удалять закладки с метками.
Это снизит эффективность удалителя дупликатов.
По идее надо исключить просмотр псевдопапок, т.е. папок, имеющих родительской псевдопапку "Метки" а также "Недавно добавленные" и "Последние метки".
Кроме того надо все атрибуты удаляемых закладок (в частности, метки) добавлять в оставляемую закладку, добавив метку с именем папки/папок из которых эта закладка была удалена.
Насчёт перегрузки метками - не думаю, что это критично. Конечно, при добавлении меток надо проследить, чтобы они не дублировались.
Отредактировано difabor (09-08-2014 17:57:18)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
При таком подходе у закладок будут убраны все метки. Ведь метка не может быть в вакууме. Закладка с меткой всегда находится в каком-то фолдере/папке
Я как раз работаю над этим.
Кроме того надо все атрибуты удаляемых закладок (в частности, метки) добавлять в оставляемую закладку, добавив метку с именем папки/папок из которых эта закладка была удалена.
Насчёт добавления атрибутов удаляемых закладок согласен но зачем метка с именем папки/папок.
Кстати, есть ещё псевдопапки "Недавно добавленные" и "Последние метки", если кнопка и их чистит, то это тоже нехорошо.
Не чистит.
Добавлено 09-08-2014 18:20:43
difabor
Упс, похоже у закладок с одинаковым адресом метки автоматически одинаковые
Отредактировано bunda1 (09-08-2014 18:22:06)
Отсутствует
difabor
Я исправил проблему с меткам 03-08-2014 14:59:02, думаю остальные атрибуты переносить не имеет смысла их мало кто использует.
Отсутствует
При таком подходе у закладок будут убраны все метки. Ведь метка не может быть в вакууме. Закладка с меткой всегда находится в каком-то фолдере/папке
Я как раз работаю над этим.
Кроме того надо все атрибуты удаляемых закладок (в частности, метки) добавлять в оставляемую закладку, добавив метку с именем папки/папок из которых эта закладка была удалена.
Насчёт добавления атрибутов удаляемых закладок согласен но зачем метка с именем папки/папок.
Кстати, есть ещё псевдопапки "Недавно добавленные" и "Последние метки", если кнопка и их чистит, то это тоже нехорошо.
Не чистит.
Добавлено 09-08-2014 18:20:43
difabor
Упс, похоже у закладок с одинаковым адресом метки автоматически одинаковые
Да, метки одинаковые... Что более чем странно...
Основной источник появления дубликатов - импорт закладок. Но тогда что происходит с метками - неясно...
Теперь - попробую ответить на вопрос "зачем метка с именем папки/папок".
1. Сначала зададимся вопросом - а как вообще получились две закладки с одинаковым адресом в разных фолдерах?
а) Либо из-за импорта
б) Либо насильственным копированием.
Просто установкой закладки это невозможно.
В обоих случаях (а и б) эта закладка ассоциировалась с папками (фолдерами).
Если мы убираем закладку из одной из папок/фолдеров - вполне логично сохранить ассоциацию с её именем
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Просто установкой закладки это невозможно.
Можно, смотря как устанавливать
Если мы убираем закладку из одной из папок/фолдеров - вполне логично сохранить ассоциацию с её именем
Да кто будет смотреть эти метки с именем папки/папок.
Отсутствует
Просто установкой закладки это невозможно.
Можно, смотря как устанавливать
Если мы убираем закладку из одной из папок/фолдеров - вполне логично сохранить ассоциацию с её именем
Да кто будет смотреть эти метки с именем папки/папок.
Тем, кто не пользуется метками - действительно это не нужно.
А те, кто пользуются - имеют соответствующие расширения, с соответствующими контекстными меню.
А вот как установить закладку, которая уже установлена - я не знаю...
Если с трюками - то всё можно, а если без трюков - то мне неизвестно...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
А вот как установить закладку, которая уже установлена - я не знаю...
Если с трюками - то всё можно, а если без трюков - то мне неизвестно...
Пример:
// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 12.05.2014. ................................ addEventListener("dblclick", function(e) { var target = e.originalTarget; if ( e.button !== 0 || !target._placesNode || !PlacesUtils.nodeIsFolder( target._placesNode ) ) return; var title = ( content.document.title || gBrowser.mCurrentTab.label ).slice(0, 100); var folderId = PlacesUtils.getConcreteItemId( target._placesNode ); PlacesUtils.bookmarks.insertBookmark( folderId, gBrowser.currentURI, 0, title ); // всплывающая подсказка .... var icon = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/Portrait.png"; Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService) .showAlertNotification( icon, "Добавил в папку " + (target.label || "(без заголовка)") + ":", title ); });
Отсутствует