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 |   31 ++++++++++++++++++++++++++-----
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/modules/element.js b/modules/element.js
index 576cfff..c1a2f14 100644
--- a/modules/element.js
+++ b/modules/element.js
@@ -245,6 +245,17 @@ define_browser_object_class("up-url",
         return I.buffer.current_uri.resolve(up);
     });
 
+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");
+
 define_browser_object_class("focused-element",
     "Browser object which returns the focused element.",
     function (I, prompt) { return I.buffer.focused_element; });
diff --git a/modules/load-spec.js b/modules/load-spec.js
index 5a5631d..e5c89cf 100644
--- a/modules/load-spec.js
+++ b/modules/load-spec.js
@@ -54,6 +54,22 @@
 
 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 +83,22 @@ 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))
-- 
1.6.6

_______________________________________________
Conkeror mailing list
[email protected]
https://www.mozdev.org/mailman/listinfo/conkeror

Reply via email to