"Добавить закладку в папку" в контекстном меню на странице( Firefox 17 + )
Автор: bunda1
Версия: от 22.03.2018.
Описание: добавляет новый пункт Добавить как закладку в: [имя папки] в контекстном меню на странице как последний пункт, который добавляет страницу или ссылку в папку "Новая папка", если такая папка не существует код сам создаст папку на панели закладок.
Если нажать ПКМ на пункте откроется окошко для изменения папки добавления закладок, после вода названия новой папки соответственно поменяется пункт меню.
Использование: можно создать новую Custom Buttons кнопку или использовать уже существующую кнопку и положитъ код  в вкладку инициализации.

Выделить код

Код:

// "Добавить как закладку в папку" в контекстном меню на странице, от 22.03.2018. ..................
(()=> {
   var s = "CB.bookmarkFolderForSaving";
   var contextMenu = document.getElementById("contentAreaContextMenu");
   var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);

   
   // Создать новый пункт в контекстном меню на странице ....
   var menuitem = contextMenu.appendChild(document.createElement("menuitem"));   
   menuitem.setAttribute("id", "context-addBookmark");
   menuitem.setAttribute("label", "Добавить закладку в: " + getFolderName());  
   addDestructor(()=> menuitem.remove());
   
   
   // Обрабатывать клики на пункте меню ....    
   addEventListener("click", e=> {     
      if ( e.button == 0 ) {  // ЛКМ добавить закладку
           gContextMenu.onLink 
           ? addBookmark(gContextMenu.getLinkURI(), gContextMenu.linkText(), gContextMenu.onLink) // на ссылке
           : addBookmark(gBrowser.selectedBrowser.webNavigation.currentURI, getDocTitle());       // на странице
           } 
      
      if ( e.button == 2 ) {  // ПКМ изменить папку для закладок 
           contextMenu.hidePopup();
                    
           var val = custombuttons.promptBox(menuitem.label, 'Отмена вернёт значение по умолчанию');
           var newFolder = val[0] ? val[1] : defaultFolder;           

           cbu.setPrefs(s, convertFromUnicode("UTF-8", newFolder));
           menuitem.setAttribute("label", "Добавить закладку в: " + newFolder);            
           
           alertsService.showAlertNotification("chrome://global/skin/icons/information-16.png", newFolder, "Папка для добавления закладок");
           setTimeout(()=> alertsService.closeAlert(), 3500);
           }                  
   }, false, menuitem);
   

   // Получить заголовк страницы или название вкладки ....
   function getDocTitle() {
      var docTitle = content.document.title || gBrowser.mCurrentTab.label;       
      var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
      return docTitle.substring(0, 50);
   };
   
   
   // Получить из 'about:config' название папки для добавления закладок ....
   function getFolderName() { 
      var p = Services.prefs;
      try { return p.getStringPref ? p.getStringPref(s) : p.getComplexValue(s, Ci.nsISupportsString).data } 
      catch(e) { return "Новая папка" }; // папка по умолчанию 
   };
   
   
   // Конвертировать текст в Unicode ....
   function convertFromUnicode(charset, str) {
      var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
      converter.charset = charset;
      str = converter.ConvertFromUnicode(str);
      return str + converter.Finish();
   };
   

   // Получить Id нужной папки закладок .... 
   function getBookFolderId(folderName, parentId = 3, res = false) {
      var parentFolder = PlacesUtils.getFolderContents(parentId).root;
      for ( var i = 0; i < parentFolder.childCount; i++ ) {
            var child = parentFolder.getChild(i);            
            if ( child.title == folderName ) {
                 res = child.itemId;
                 break;
                 }
            }      
      return res; 
   }; 
   
            
   // Добавить текущую страницу или ссылку в папку закладок ....
   function addBookmark(url, label, link) {
      var folderName = getFolderName();
      var folderId = getBookFolderId(folderName);
      
      !folderId && PlacesUtils.bookmarks.createFolder(3, folderName, -1); // создать папку если не существует
      PlacesUtils.bookmarks.insertBookmark(folderId, url, 0, label);
 
      var image = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/information-16.png";
      alertsService.showAlertNotification(image, label, 'Добавил закладку в папку: ' + folderName);
      setTimeout(()=> alertsService.closeAlert(), 3500);
   };   
})();

За помощь с кнопкой спасибо Dumby и okkamas_knife

Классная кнопка, спасиб! :music:

Можно её как-то настроить так, чтобы сохранять закладки в «Меню закладок», а не в «Панель закладок» (и вообще без папки, да, я знаю, что так делает стандартный пункт меню, но он у меня глючит, видимо конфликт с каким-то дополнением, но лень разбираться)?
А то я привык сортировать закладки потом, а вначале кидать их, чтобы они на виду висели в меню, всякие темы в новостях, где я слежу за дискуссией, а если что-то важное, то потом сортирую в подпапки, а ненужное удаляю...

Zaycoff пишет:

Можно её как-то настроить так, чтобы сохранять закладки в «Меню закладок»

Наверно можно, попробуй

1. Заменить var rootFolder = bmsvc.toolbarFolder; на var rootFolder = bmsvc.placesRoot;
2. ПКМ на пункте меню, ввести «Меню закладок»

Dumby
О, спасибо огромное, шикарно работает =)

bunda1
Спасибо. Интересное решение проблемы.

Dumby пишет:

1. Заменить var rootFolder = bmsvc.toolbarFolder; на var rootFolder = bmsvc.placesRoot;
2. ПКМ на пункте меню, ввести «Меню закладок»

Для не корня можно ещё проще, заменив на bmsvc.bookmarksMenuFolder.

Поломалась кнопочка, если не сложно, почините плиз.

Zaycoff пишет:

Поломалась кнопочка, если не сложно, почините плиз.

"Добавить закладку в папку" в контекстном меню на странице

bunda1, благодарю! :music:

Снова сломалась, будьте добры, почините пожалуйста если не сложно.

В Симанки работает, иконку присобачил...Надо правым кликом ID папки менять , а не название . Т.е не только на панели , в меню, к примеру...

drage2 пишет:

Т.е не только на панели , в меню, к примеру...

Вы о чем? [firefox] 55, не работает, проверял на двух профилях.

Stkvsky
В 57 работает, но не создает новые папки...В 52 - работает полностью.

Stkvsky пишет:

Снова сломалась, будьте добры, почините пожалуйста если не сложно.

"Добавить закладку в папку" в контекстном меню на странице

Оперативненько! Ну, и иконку добавлю:

Выделить код

Код:

// Создать новый пункт в контекстном меню на странице ....
   var menuitem = contextMenu.appendChild(document.createElement("menuitem"));   
   menuitem.setAttribute("id", "context-addBookmark");
   menuitem.setAttribute("label", "Добавить закладку в: " + getFolderName()); 
   menuitem.setAttribute("class", "menu-iconic");
   menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACD0lEQVR42oWTXUhTYRiAP89qziAYepG6TfAiyV1JsFojMJrVjf3dDOsmMoOwCwnSXLSJXgWDqAWBF7aGoFGGV0EUrL9FERoh1bQsqeiXfrzoB0N6es8528ncaC88fOfwnff53vN976eUUprafJk8lPIKS1XRkI8LRVayUVgmLBFsQklBwfhb8rAkRauSidQLDK49/zvqFKmqxBKcn4BzDzBGnU39BVZfTMOxQ6ZIXk6msdh7wUz+9IP/RraaLYYgfAUL73Fz8tJjs5rBh3B2HPrvQ/P+N8TvYJAVdBqCfRcxWH8aYm0dpCIRxvr6SG7bSWLrDsZ6e7ke7SESaiV61UoeFVoMwfYEBrGWNr6NjEAmY5JKmUxPw9QU35NJDq/ekBOcEqoNQSAOnh5Ih0IwPAwJsQ0MSP2DMDTEfDTKV7+f904nN12uBavr/SECZ6dZ1u11Aejqgu5u2ZAwv9vbmfP5mLXZeK0UrzSNGy53bnWXdYw6K47CEX8znwMB5oNBvtTX87G0lA+SmEueqazkYHWdLtgl1OVaybvwfPd41vLI42HGbicjiZPCy7IyntTUcKBqpZ58Iru61dZ6a64RwkJMmGi022dv1dbyrKKCp+XlpOW5yeH4KXPvhMbs3fgndJtDqDJ3VjX4NO3MqNs9J/xapWn3sv/dlJfcGr+rFbijunC5EBQ6hN2C27j6i+IP/uDMhPNYgHUAAAAASUVORK5CYII="); 
   addDestructor(()=> menuitem.remove())

bunda1
Благодарю.