Управление вкладками Firefox в emacs с помощью org-mode

#javascript #firefox #firefox-addon

#javascript #firefox #firefox-дополнение

Вопрос:

Недавно я нашел способ управлять вкладками Firefox в emacs. Это звучит немного безумно. Для этого я использую вкладки в стиле дерева (дополнение Firefox), Moz Repl, emacs, org-mode.

Для 10-15 вкладок мой план работает нормально. Но при более чем 20 вкладках мой firefox зависает случайным образом. Может быть, переполнение стека javascript или что-то еще? Я не знаю, что не так с моим кодом. Я публикую здесь самый важный код. Кто-нибудь поможет мне найти некоторые ошибки?

Приведенный ниже базовый код firefox chrome, вы можете запустить его в Firefox без emacs и MozPepl.

Я использую API вкладок в стиле дерева, чтобы получать вкладки и устанавливать для каждой вкладки определенный уровень. Выходные данные будут использоваться в emacs с org-mode. api вкладок в виде дерева:http://piro.sakura.ne.jp/xul/_treestyletab.html.en#api

Код может выполняться многими способами. Я рекомендую «workspace addon». Скопируйте мой код, выберите контекст chrome для его запуска. https://addons.mozilla.org/en-US/firefox/addon/workspace

 // two helper function to get title and url of tab
function getTitle(tab)
{ 
    var brower = gBrowser.getBrowserForTab(tab)
    var url = brower.currentURI.spec
    var title = brower.contentTitle
    return title
}
function getUrl(tab)
{ 
    var brower = gBrowser.getBrowserForTab(tab)
    var url = brower.currentURI.spec
    var title = brower.contentTitle
    return ":PROPERTIES:n:URL:" url "n:END:n"
}

var L = gBrowser.tabContainer.childNodes.length //firefox tabs length
var str = "" //global string for output

//parse tabs. If tab has child, parse it. It tab has no child, just output.
for(i = 0; i < L; i  ){
    level = "*"
    tab = gBrowser.tabContainer.childNodes[i]
    if ('TreeStyleTabService' in window){
    if(TreeStyleTabService.hasChildTabs(tab))
    {
      str = [str, level, " [ ] ",  getTitle(tab), "n", getUrl(tab)].join("") //output title and url. level used in org-mode
      treeparse(TreeStyleTabService.getChildTabs(tab), "**") //if a tab has child tabs. parse it and level up
    }   
str = [str, level, " ",  getTitle(tab), "n", getUrl(tab)].join("")
}

function treeparse(tablist,level) //parse a list of tabs. If tab has not a child, output. If it has childs, parse again
{
    for(i=0 ; i < tablist.length;i  ) {
    tab = tablist[i]
    if ('TreeStyleTabService' in window){
        if(TreeStyleTabService.hasChildTabs(tab))
        {
        str = [str, level, " [ ] ",  getTitle(tab), "n", getUrl(tab)].join("")
        newlevel = level   "*"
        treeparse(TreeStyleTabService.getChildTabs(tab),newlevel)       
        }
        } }
    str = [str, level, " ",  getTitle(tab), "n", getUrl(tab)].join("")
    }
}

alert(str) //alert to view result. You can also write the result into a file.
  

Ответ №1:

Я не уверен, что конкретно вызывает проблему, поскольку я не смог ее воспроизвести, но я вижу множество проблем с этим кодом. Я не могу вспомнить, как работает MozRepl, но этот улучшенный код должен обеспечить вам приятный вывод вкладок, удобных для org-mode. Я надеюсь, что это поможет вам или любому, кто наткнется на эту тему.

 var bullet = "*"; // Org-mode bullet

// two helper function to get title and url of tab
function getTitle(tab) { 
    var brower = gBrowser.getBrowserForTab(tab);
    var url = brower.currentURI.spec;
    var title = brower.contentTitle;
    return title;
}

function getUrl(tab) { 
    var brower = gBrowser.getBrowserForTab(tab);
    var url = brower.currentURI.spec;
    var title = brower.contentTitle;
    return ":PROPERTIES:n:URL:" url "n:END:n";
}

// NOTE: we factor these string-generation functions out,
// to make things a bit more clear
function makeParentNodeOutput(tab, level) {
    return (Array(level 1).join(bullet)  
        " [ ] "  
        getTitle(tab)  
        "n"  
        getUrl(tab));
}

function makeLeafNodeOutput(tab, level) {
    return (Array(level 1).join(bullet)  
        " "  
        getTitle(tab)  
        "n"  
        getUrl(tab));
}

// NOTE: we only need to handle parsing a collection of tabs
// in once place, and we have a function for it here.
function parseTabCollection(tabs, level) {
    var currentTab;
    var outputString = "";
    for(var i = 0; i < tabs.length; i  ){
        currentTab = tabs[i];

        // For a parent node, we output the node and its children
        if(TreeStyleTabService.hasChildTabs(currentTab)){
            outputString  = makeParentNodeOutput(currentTab, level);
            outputString  = parseTabCollection(
                TreeStyleTabService.getChildTabs(currentTab),
                level   1
            );
        } else {
            outputString  = makeLeafNodeOutput(currentTab, level);
        }
    }
    return outputString;
}

if ('TreeStyleTabService' in window){
    //NOTE: Start with the rootTabs only. The old version started with
    // *all* tabs, which isn't what we want
    var orgModeOutput = parseTabCollection(TreeStyleTabService.rootTabs, 1);
    alert(orgModeOutput);
}
  

Я надеюсь, что это как-то поможет.

Комментарии:

1. Черт возьми, это потрясающая идея. Я тоже использую вкладки в стиле дерева и org-mode emacs, было бы довольно безумно комбинировать их.