From 65bc4e4213c12093471d667787c50650409ed2d1 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Sun, 9 Nov 2008 15:39:12 -0500 Subject: [PATCH] initial commit --- images/keyboard-navigation-next-page-id.png | Bin 0 -> 18912 bytes ...keyboard-navigation-next-page-traverse.png | Bin 0 -> 14348 bytes keyboard_navigation.js | 75 ++++++ keyboard_navigation.php | 219 ++++++++++++++++++ readme.txt | 12 + styles.css | 53 +++++ wordpress_pathfinding.php | 24 ++ 7 files changed, 383 insertions(+) create mode 100644 images/keyboard-navigation-next-page-id.png create mode 100644 images/keyboard-navigation-next-page-traverse.png create mode 100644 keyboard_navigation.js create mode 100644 keyboard_navigation.php create mode 100644 readme.txt create mode 100644 styles.css create mode 100644 wordpress_pathfinding.php diff --git a/images/keyboard-navigation-next-page-id.png b/images/keyboard-navigation-next-page-id.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f83bb611502d88173a5f3563a4ca5f466e24bc GIT binary patch literal 18912 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 literal 0 HcmV?d00001 diff --git a/images/keyboard-navigation-next-page-traverse.png b/images/keyboard-navigation-next-page-traverse.png new file mode 100644 index 0000000000000000000000000000000000000000..c83b7ffce00b7acfbdda09857dda88adca8ab10c GIT binary patch literal 14348 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 literal 0 HcmV?d00001 diff --git a/keyboard_navigation.js b/keyboard_navigation.js new file mode 100644 index 0000000..7b1c11f --- /dev/null +++ b/keyboard_navigation.js @@ -0,0 +1,75 @@ +var KeyboardNavigation = {}; + +KeyboardNavigation.get_hrefs = function(fields, admin_mode) { + var found_properties = {}; + var any_found = false; + var missing_properties = []; + + for (key in fields) { + if (fields.hasOwnProperty(key)) { + var instructions = fields[key]; + var found_nodes = $$(instructions); + var is_found = false; + if (found_nodes.length > 0) { + var top_node = $(found_nodes[0]); + while (top_node) { + if (top_node.href) { + found_properties[key] = top_node.href; is_found = true; + if (admin_mode) { + var highlight_a = new Element("a", { "title": key + ": " + instructions, "href": top_node.href, "style": "display: block; position: absolute; border: solid #f00 1px; background-color: #ff0; z-index: 1" }); + highlight_a.setOpacity(0.5); + highlight_a.clonePosition(top_node); + document.body.appendChild(highlight_a); + } + any_found = true; break; + } + top_node = top_node.parentNode; + } + } + + if (!is_found) { + missing_properties.push(key + ": " + instructions); + } + } + } + + if (missing_properties.length > 0) { + var message = "[Keyboard Navigation] Missing selectors:\n\n" + missing_properties.join("\n"); + if (top.console) { + top.console.log(message); + } else { + alert(message); + } + } + + if (any_found) { + return found_properties; + } else { + return false; + } +}; + +KeyboardNavigation.add_events = function(hrefs) { + Event.observe(document, 'keyup', function(e) { + var prop_to_use = null; + switch (e.keyCode) { + case 37: + prop_to_use = (e.shiftKey) ? "first" : "previous"; + break; + case 39: + prop_to_use = (e.shiftKey) ? "last" : "next"; + break; + } + if (prop_to_use) { + if (hrefs[prop_to_use]) { document.location.href = hrefs[prop_to_use]; } + } + }, true); + + var i,il; + ["input","textarea","select"].each(function(type) { + var all_type = document.getElementsByTagName(type); + for (i = 0, il = all_type.length; i < il; ++i) { + Event.observe(all_type[i], 'keyup', function(e) { Event.stop(e); return false; }); + } + }); +}; \ No newline at end of file diff --git a/keyboard_navigation.php b/keyboard_navigation.php new file mode 100644 index 0000000..f65922c --- /dev/null +++ b/keyboard_navigation.php @@ -0,0 +1,219 @@ +messages = array(); + $this->fields = array( + 'previous' => __("Previous [Left arrow]", 'keyboard-navigation'), + 'next' => __("Next [Right arrow]", 'keyboard-navigation'), + 'first' => __("First [Shift-Left arrow]", 'keyboard-navigation'), + 'last' => __("Last [Shift-Right arrow]", 'keyboard-navigation'), + ); + + if (isset($_POST['action'])) { + if ($_POST['action'] == "update-fields") { + $any_updated = false; + foreach (array_keys($this->fields) as $field) { + if (isset($_POST["selector-${field}"])) { + update_option("keyboard-navigation-selector-${field}", $_POST["selector-${field}"]); + $any_updated = true; + } + } + update_option("keyboard-navigation-highlight-selected-elements", ($_POST['highlight-selected-elements'] ? "1" : "0")); + if ($any_updated) { $this->messages[] = "Selectors updated."; } + } + } + } + + function footer() { + $plugin_url_root = pathfinding_get_admin_url() . '/' . pathfinding_get_plugin_path(); ?> + + + + +
+ messages) > 0) { ?> +
+ messages as $message) { ?> +

+ +
+ +

+ +
+
+ + + fields as $field => $name) { ?> + + + + + + + + + + + +
+ " />
Highlight selected elements on theme? + /> + (overlay yellow boxes on selected theme elements, and show missing selector alerts in Firebug console or in alert dialogs) +
+ +
+
+ +
+

Keyboard Navigation Version 0.1

+ +

Copyright © 2008 John Bintz | + Released under the GNU GPL

+ +

Need some sane defaults for your theme? Click one of the links below to populate the selectors on the left:

+ + + +

Are you a theme author? Send your theme's navigation defaults to John Bintz and get them included!

+
+
+ +

How does this work?

+

Keyboard Navigation uses CSS3 Selectors to find the hyperlinks on the page that define the previous and next links on the page, and then uses JavaScript to assign the act of hitting the left and right arrow keys on the keyboard to clicking those links. This is exactly the same approach that you would use to style a specific element on the page:

+ +
+ Firebug display of a simple targeting procedure +
+

Targeting the <a href="next-page"> on this page is quite easy — provide the CSS selector for the id of the element:

+ +
+ a#next-link +
+ +

If the <a href> does not have an id, but does have a class, or is the only child of a particular element, you can use syntax like:

+ +
+ div.nav div#next-link-holder a +
+
+
+ +

Keyboard Navigation extends this slightly so that, if the target element is not a <a href> tag, Keyboard Navigation will move up through the tree from the found element until an <a href> is found:

+ +
+ Firebug display of a more complicated targeting procedure +
+

You have two approaches for identifying the <a href="next-page"> tag:

+
    +
  • Using CSS3 selectors, you can use nth-child: +
    + div#menunav a:nth-child(2) +
    +
  • +
  • Using more familiar CSS syntax, target the <span class="next"> element, and Keyboard Navigation will move up through the DOM tree until it finds <a href="next-page">: +
    + div#menunav a span.next +
    +
  • +
+
+
+ +

Keyboard Navigation requires that the visitor have JavaScript enabled. This plugin uses + the Prototype JavaScript library, and including it will increase the size of your total site download.

+
+ \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..3781f0e --- /dev/null +++ b/readme.txt @@ -0,0 +1,12 @@ +=== Keyboard Navigation === +Contributors: johncoswell +Tags: comicpress, webcomics, posts, plugin, navigation +Requires at least: 2.5.1 +Tested up to: 2.6.3 +Stable tag: 0.1 + +Keyboard Navigation easily adds JavaScript-based keyboard navigation to a WordPress site. + +== Description == + +Keyboard Navigation uses CSS3 Selectors (via the Prototype JS library) to pluck navigational elements out of your pages and assign them to keyboard shortcuts. This sort of navigation is ideal for sites which have small, sequential archives (such as Webcomic sites). The plugin offers one assistive feature: you can enable the highlighting of the hyperlink elements that are being used to generate the navigation, and you can send selection errors to the Firebug console or to alert() messages. \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..08fc114 --- /dev/null +++ b/styles.css @@ -0,0 +1,53 @@ +td.field { + font-weight: bold; + padding-right: 10px +} + +div.image-holder { + overflow: hidden +} + +div.image-holder div { + float: left; + display: inline; + width: 440px; +} + +div.image-holder img { + float: left; + display: inline; + margin-right: 10px; +} + +div#top-holder { + overflow: hidden +} + +div#top-holder form { + float: left; + display: inline; + width: 650px; +} + +div#top-holder form input[type="text"] { + width: 440px +} + +div#top-holder form input[type="submit"] { + width: 250px +} + +div#top-holder div { + float: left; + display: inline; + width: 295px; + border: solid #ddd 1px; + margin-left: 10px; + margin-top: 10px; + padding: 10px; + background: #dfe +} + +div#top-holder div p { + margin-top: 0 +} \ No newline at end of file diff --git a/wordpress_pathfinding.php b/wordpress_pathfinding.php new file mode 100644 index 0000000..69eb990 --- /dev/null +++ b/wordpress_pathfinding.php @@ -0,0 +1,24 @@ +domain . $site->path); + } else { + return get_option('home'); + } +} + +function pathfinding_get_admin_url() { + if (function_exists('get_current_site')) { // WPMU + return cpm_get_home_url(); + } else { + return get_option('siteurl'); + } +} + +function pathfinding_get_plugin_path() { + return (defined("MUPLUGINDIR") ? MUPLUGINDIR : PLUGINDIR) . '/' . preg_replace('#^.*/([^\/]*)#', '\\1', dirname(plugin_basename(__FILE__))); +} + +?> \ No newline at end of file