6

Estoy tratando de escribir un mejor administrador de marcadores en las extensiones de Chrome. El problema es que no hay ejemplos simples (que pueda encontrar) sobre cómo usar realmente el bookmarks API.Obtener la carpeta de marcadores raíz de Google Chrome

He visto la fuente de ejemplo (cuando d/led y lo instalé en mi computadora, no hizo nada excepto proporcionar un cuadro de búsqueda. Escribir/escribir y presionar devolver no pudo hacer nada) y puede ' t encuentra algo útil.

Mi objetivo final es hacer una extensión que me permita guardar páginas para leer más tarde sin tener que registrarme para obtener una cuenta en algún servicio en alguna parte. Así que planeo crear una o dos carpetas de favoritos en la carpeta raíz/otros marcadores, como mínimo una carpeta de "páginas no leídas". En esa carpeta crearé los marcadores no leídos. Cuando el usuario marca el elemento como leído, se eliminará de esa carpeta.

Así que eso es lo que estoy tratando de hacer ... cualquier ayuda será muy apreciada, incluso si solo me está apuntando a algunos buenos ejemplos.

ACTUALIZACIÓN:

...<script> 
function display(tree){ 
    document.getElementById("Output").innerHTML = tree; 
} 
function start(){ 
    chrome.bookmarks.getTree(display); 
} 
</script> 
</head> 
<body> 
<h4 id="Output"></h4> 
<script> 
start(); 
</script> 
... 

que muestra [object Object], que sugiere que (al menos a mí con una experiencia limitada JavaScript) que existe un objeto. Pero, ¿cómo acceder a los miembros de ese objeto?

Cambiando tree a tree.id o cualquiera de lo que parecen parámetros muestra undefined.

Respuesta

9

Actualmente, no hay una buena manera de encontrar carpetas como "Otros marcadores" o "Barra de marcadores" en la API de marcadores. Tendría que recorrer todos los marcadores y encontrar qué nodo tiene esas carpetas raíz y guardar su identificación de marcador. El error está archivado Issue 21330.

La ID de la raíz siempre es 0, y cuando digo 0, corresponde a "Barra de marcadores" y "Otros marcadores". Como cualquier estructura de árbol, cada nodo tiene hijos. Si desea buscar todos los marcadores en una sola carpeta, puede usar getChildren API y obtener cada nodo recursivamente (también puede hacerlo iterativamente). Por ejemplo, el siguiente obtendrá cada marcador:

printBookmarks('0'); 

function printBookmarks(id) { 
chrome.bookmarks.getChildren(id, function(children) { 
    children.forEach(function(bookmark) { 
     console.debug(bookmark.title); 
     printBookmarks(bookmark.id); 
    }); 
}); 
} 

Ahora, ¿por qué tenemos que llamar a la API para cada iteración? Su es una API para obtener todo el Árbol. Si lo probó, verá que cada nodo en getTree tendrá una lista de hijos. Eso es perfecta:

chrome.bookmarks.getTree(function(bookmarks) { 
    printBookmarks(bookmarks); 
}); 

function printBookmarks(bookmarks) { 
    bookmarks.forEach(function(bookmark) { 
    console.debug(bookmark.id + ' - ' + bookmark.title + ' - ' + bookmark.url); 
    if (bookmark.children) 
     printBookmark(bookmark.children); 
    }); 
} 

que es todo, usted puede hacer todo esto de forma iterativa, así que es un mejor rendimiento, pero puede darse cuenta de eso :) Tenga en cuenta que, ya que desea hacer de nuevo la barra de marcadores, puede anular esa página en extensiones (en breve): http://code.google.com/chrome/extensions/override.html

Si desea mostrar un árbol HTML agradable de sus marcadores, puede fácilmente hacer que al extender la funcionalidad getTree he mostrado antes de aceptar un DOM padres. Puedes hacer algo like this. Edite el código para hacer uso de getTree o contraiga todo y haga uso de getChildren y busque más marcadores si lo solicitan.

+0

Excelente respuesta, gracias Mohamed. –

1

Marcadores se organizan en un árbol, donde cada nodo en el árbol es o bien un marcador o un grupo (una carpeta que pueden contener nodos). Cada nodo en el árbol está representado por un objeto BookmarkTreeNode.

No hay una carpeta de marcadores raíz en el sentido de un objeto del sistema de archivos. Todos los marcadores se almacenan en un archivo estructurado al que se accede a través de la API en el enlace que proporcionó. La raíz del árbol la devuelve getTree:

chrome.bookmarks.getTree 
+0

Si bien eso puede ser cierto, cada forma y moda que he probado no arroja un resultado correcto. chrome.bookmarks.getTree en realidad no devuelve un valor. Requiere una función y supuestamente hace algo con esa función, pero ahí radica el problema: no hay un simple ejemplo que diga "esto obtiene el nodo raíz, bla, bla, bla". Hay un ejemplo bastante avanzado, pero en la medida en que pude determinar que ya no es válido (ya que no funciona, y me encontré con un enlace que hablaba sobre cómo actualizaron la API) –

1

Bien, he descubierto cómo acceder a lo que quiero. En retrospectiva, debería haberlo visto antes.

http://code.google.com/chrome/extensions/tut_debugging.html

Usando el depurador yo era capaz de establecer un punto de interrupción y ver los objetos. [object Object] es una matriz de longitud 1.

Utilizando la función dada en mi ejemplo, tree [0] .children es la matriz que contiene los elementos secundarios. En mi árbol de configuración predeterminado tiene dos hijos, el árbol [0] .children [0] es "Barra de marcadores" y el árbol [0] .children [1] es "Otros marcadores". El resto del árbol de marcadores fluye hacia abajo desde allí, aunque "Otros marcadores" (árbol [0] .children [1]) es la carpeta que estoy buscando.

Cuestiones relacionadas