diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-07-27 16:01:55 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-07-27 17:47:59 -0700 |
commit | 6e1eeeebfb453fa7c871869c19375ce60fbd7413 (patch) | |
tree | 539c4a3fdf1756ae79770d5c4aaf6366f1d1525e /archive/1.vm.arc/charterm/planet-docs/doc/scribble-common.js | |
parent | 8846a7f85cc04b77b2fe8a67b6d317723437b00c (diff) | |
download | mu-6e1eeeebfb453fa7c871869c19375ce60fbd7413.tar.gz |
5485 - promote SubX to top-level
Diffstat (limited to 'archive/1.vm.arc/charterm/planet-docs/doc/scribble-common.js')
-rw-r--r-- | archive/1.vm.arc/charterm/planet-docs/doc/scribble-common.js | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/archive/1.vm.arc/charterm/planet-docs/doc/scribble-common.js b/archive/1.vm.arc/charterm/planet-docs/doc/scribble-common.js new file mode 100644 index 00000000..00eec767 --- /dev/null +++ b/archive/1.vm.arc/charterm/planet-docs/doc/scribble-common.js @@ -0,0 +1,153 @@ +// Common functionality for PLT documentation pages + +// Page Parameters ------------------------------------------------------------ + +var page_query_string = + (location.href.search(/\?([^#]+)(?:#|$)/) >= 0) && RegExp.$1; + +var page_args = + ((function(){ + if (!page_query_string) return []; + var args = page_query_string.split(/[&;]/); + for (var i=0; i<args.length; i++) { + var a = args[i]; + var p = a.indexOf('='); + if (p >= 0) args[i] = [a.substring(0,p), a.substring(p+1)]; + else args[i] = [a, false]; + } + return args; + })()); + +function GetPageArg(key, def) { + for (var i=0; i<page_args.length; i++) + if (page_args[i][0] == key) return unescape(page_args[i][1]); + return def; +} + +function MergePageArgsIntoLink(a) { + if (page_args.length == 0 || + (!a.attributes["data-pltdoc"]) || (a.attributes["data-pltdoc"].value == "")) + return; + a.href.search(/^([^?#]*)(?:\?([^#]*))?(#.*)?$/); + if (RegExp.$2.length == 0) { + a.href = RegExp.$1 + "?" + page_query_string + RegExp.$3; + } else { + // need to merge here, precedence to arguments that exist in `a' + var i, j; + var prefix = RegExp.$1, str = RegExp.$2, suffix = RegExp.$3; + var args = str.split(/[&;]/); + for (i=0; i<args.length; i++) { + j = args[i].indexOf('='); + if (j) args[i] = args[i].substring(0,j); + } + var additions = ""; + for (i=0; i<page_args.length; i++) { + var exists = false; + for (j=0; j<args.length; j++) + if (args[j] == page_args[i][0]) { exists = true; break; } + if (!exists) str += "&" + page_args[i][0] + "=" + page_args[i][1]; + } + a.href = prefix + "?" + str + suffix; + } +} + +// Cookies -------------------------------------------------------------------- + +function GetCookie(key, def) { + var i, cookiestrs; + try { + if (document.cookie.length <= 0) return def; + cookiestrs = document.cookie.split(/; */); + } catch (e) { return def; } + for (i = 0; i < cookiestrs.length; i++) { + var cur = cookiestrs[i]; + var eql = cur.indexOf('='); + if (eql >= 0 && cur.substring(0,eql) == key) + return unescape(cur.substring(eql+1)); + } + return def; +} + +function SetCookie(key, val) { + var d = new Date(); + d.setTime(d.getTime()+(365*24*60*60*1000)); + try { + document.cookie = + key + "=" + escape(val) + "; expires="+ d.toGMTString() + "; path=/"; + } catch (e) {} +} + +// note that this always stores a directory name, ending with a "/" +function SetPLTRoot(ver, relative) { + var root = location.protocol + "//" + location.host + + NormalizePath(location.pathname.replace(/[^\/]*$/, relative)); + SetCookie("PLT_Root."+ver, root); +} + +// adding index.html works because of the above +function GotoPLTRoot(ver, relative) { + var u = GetCookie("PLT_Root."+ver, null); + if (u == null) return true; // no cookie: use plain up link + // the relative path is optional, default goes to the toplevel start page + if (!relative) relative = "index.html"; + location = u + relative; + return false; +} + +// Utilities ------------------------------------------------------------------ + +var normalize_rxs = [/\/\/+/g, /\/\.(\/|$)/, /\/[^\/]*\/\.\.(\/|$)/]; +function NormalizePath(path) { + var tmp, i; + for (i = 0; i < normalize_rxs.length; i++) + while ((tmp = path.replace(normalize_rxs[i], "/")) != path) path = tmp; + return path; +} + +// `noscript' is problematic in some browsers (always renders as a +// block), use this hack instead (does not always work!) +// document.write("<style>mynoscript { display:none; }</style>"); + +// Interactions --------------------------------------------------------------- + +function DoSearchKey(event, field, ver, top_path) { + var val = field.value; + if (event && event.keyCode == 13) { + var u = GetCookie("PLT_Root."+ver, null); + if (u == null) u = top_path; // default: go to the top path + u += "search/index.html?q=" + escape(val); + if (page_query_string) u += "&" + page_query_string; + location = u; + return false; + } + return true; +} + +function TocviewToggle(glyph, id) { + var s = document.getElementById(id).style; + var expand = s.display == "none"; + s.display = expand ? "block" : "none"; + glyph.innerHTML = expand ? "▼" : "►"; +} + +// Page Init ------------------------------------------------------------------ + +// Note: could make a function that inspects and uses window.onload to chain to +// a previous one, but this file needs to be required first anyway, since it +// contains utilities for all other files. +var on_load_funcs = []; +function AddOnLoad(fun) { on_load_funcs.push(fun); } +window.onload = function() { + for (var i=0; i<on_load_funcs.length; i++) on_load_funcs[i](); +}; + +AddOnLoad(function(){ + var links = document.getElementsByTagName("a"); + for (var i=0; i<links.length; i++) MergePageArgsIntoLink(links[i]); + var label = GetPageArg("ctxtname",false); + if (!label) return; + var indicator = document.getElementById("contextindicator"); + if (!indicator) return; + indicator.innerHTML = label; + indicator.style.display = "block"; + }); |