From cdc0d5178a075fb4345c24f30b5bc0334ff11ad2 Mon Sep 17 00:00:00 2001 From: Ben Spencer Date: Sun, 31 Jan 2010 12:05:20 +0000 Subject: [PATCH] Added support for generating URLs with fragment indentifiers (eg #foo). Added a new browser object class 'fragment-link', which generates a link with a fragment identifier pointing to an element in the current document. This can be any element with an ID attribute, or an A element with a NAME attribute. Also modified load_spec_from_element to generate a load spec with a fragment identifier when passed an element that meets this description (and doesn't also have an HREF attribute). --- modules/element.js | 11 +++++++++++ modules/load-spec.js | 30 +++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/modules/element.js b/modules/element.js index 576cfff..dbdf259 100644 --- a/modules/element.js +++ b/modules/element.js @@ -253,6 +253,17 @@ define_browser_object_class("dom-node", null, xpath_browser_object_handler("//* | //xhtml:*"), $hint = "select DOM node"); +define_browser_object_class("fragment-link", + "Browser object class which returns a link to the specified fragment of a page", + function (I, prompt) { + var elem = yield I.buffer.window.minibuffer.read_hinted_element( + $buffer = I.buffer, + $prompt = prompt, + $hint_xpath_expression = "//*[@id] | //a[@name] | //xhtml:*[@id] | //xhtml:a[@name]"); + yield co_return(page_fragment_load_spec(elem)); + }, + $hint = "select element to link to"); + interactive("browser-object-text", "Composable browser object which returns the text of another object.", function (I) { diff --git a/modules/load-spec.js b/modules/load-spec.js index 5a5631d..ab8b7a1 100644 --- a/modules/load-spec.js +++ b/modules/load-spec.js @@ -54,6 +54,20 @@ require("webjump.js"); +function page_fragment_load_spec (elem) { + var uri = makeURLAbsolute(elem.baseURI, "#" + (elem.id || elem.name)); + var title = elem.ownerDocument.title; + if (elem.textContent) { + if (title) title += ' - '; + title += elem.textContent; + } + return { + uri: uri, + element: elem, + title: title + }; +} + function load_spec_from_element (elem) { var spec = {}; if (elem instanceof Ci.nsIDOMWindow) @@ -67,17 +81,23 @@ function load_spec_from_element (elem) { var url = null; var title = null; - if (elem instanceof Ci.nsIDOMHTMLAnchorElement || - elem instanceof Ci.nsIDOMHTMLAreaElement || - elem instanceof Ci.nsIDOMHTMLLinkElement) { - if (elem.hasAttribute("href")) - url = elem.href; + if ((elem instanceof Ci.nsIDOMHTMLAnchorElement || + elem instanceof Ci.nsIDOMHTMLAreaElement || + elem instanceof Ci.nsIDOMHTMLLinkElement) && + elem.hasAttribute("href")) + { + url = elem.href; title = elem.title || elem.textContent; } else if (elem instanceof Ci.nsIDOMHTMLImageElement) { url = elem.src; title = elem.title || elem.alt; } + else if (elem.hasAttribute("id") || + (elem instanceof Ci.nsIDOMHTMLAnchorElement && + elem.hasAttribute("name"))) { + return page_fragment_load_spec(elem); + } else { var node = elem; while (node && !(node instanceof Ci.nsIDOMHTMLAnchorElement)) -- 2.11.4.GIT