diff options
author | Rafael Marçalo <raroma09@gmail.com> | 2023-11-29 17:20:09 +0000 |
---|---|---|
committer | Rafael Marçalo <raroma09@gmail.com> | 2023-11-29 17:20:09 +0000 |
commit | 8e69478ff67f886451b2e13e00806be03215d61e (patch) | |
tree | 2927fa70e8013832630853c5063d5ed46a40cb64 | |
parent | 515bba40658d47972d65fb654d9633791e242481 (diff) |
Replaced neovimb with surf
-rw-r--r-- | newsboat/.config/newsboat/urls | 2 | ||||
-rwxr-xr-x | scripts/.local/bin/compiler | 4 | ||||
-rw-r--r-- | suckless/.config/suckless/neovimb/config.h | 117 | ||||
-rw-r--r-- | suckless/.config/suckless/surf/config.h | 205 | ||||
-rwxr-xr-x | suckless/.local/src/compileSource | 8 | ||||
-rw-r--r-- | surf/.config/surf/scripts/vimnav.js | 363 |
6 files changed, 576 insertions, 123 deletions
diff --git a/newsboat/.config/newsboat/urls b/newsboat/.config/newsboat/urls index 205b8af..8b5cbf9 100644 --- a/newsboat/.config/newsboat/urls +++ b/newsboat/.config/newsboat/urls @@ -34,6 +34,7 @@ https://github.com/jbensmann/xmouseless/commits/master.atom "~xmouseless" "爵 Web" https://based.cooking/rss.xml "~Based Cooking" https://www.bleepingcomputer.com/feed/ "~Bleeping Computer" +https://brycevandegrift.xyz/rss.xml "~Bryce Vandegrift" https://www.cm-moita.pt/pages/1888.rss "~CM Moita" https://codeyarns.com/tech/rss.xml "~Code Yarns" https://distrowatch.com/news/dw.xml "~DistroWatch" @@ -54,6 +55,7 @@ https://filmsbykris.com/rss.xml "~Films By Kris" https://landchad.net/rss.xml "~LandChad" https://www.lowtechmagazine.com/atom.xml "~Low Tech Magazine" https://lukesmith.xyz/rss.xml "~Luke Smith" +https://michaelmob.com/index.xml "~Michael Mob" https://neovim.io/news.xml "~Neovim" https://null-byte.wonderhowto.com/rss.xml "~Null Byte" https://nvd.nist.gov/feeds/xml/cve/misc/nvd-rss.xml "~NVD" diff --git a/scripts/.local/bin/compiler b/scripts/.local/bin/compiler index ab8d62c..286be7d 100755 --- a/scripts/.local/bin/compiler +++ b/scripts/.local/bin/compiler @@ -11,10 +11,10 @@ if [ "$#" -eq 2 ] && { [ -e "$2/Makefile" ] || [ -e "$2/makefile" ]; }; then else case $EXTENSION in c|h) - cc -o "$BASE" ./*.c + cc -g -o "$BASE" ./*.c ;; cpp) - c++ -o "$BASE" ./*.cpp + c++ -g -o "$BASE" ./*.cpp ;; java) javac "$FILE" ./*.java diff --git a/suckless/.config/suckless/neovimb/config.h b/suckless/.config/suckless/neovimb/config.h deleted file mode 100644 index 28e8d66..0000000 --- a/suckless/.config/suckless/neovimb/config.h +++ /dev/null @@ -1,117 +0,0 @@ -/** - * vimb - a webkit based vim like browser. - * - * Copyright (C) 2012-2018 Daniel Carl - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see http://www.gnu.org/licenses/. - */ - -/* graphical features */ -/* show wget style progressbar in status bar */ -#define FEATURE_WGET_PROGRESS_BAR -/* show load progress in window title */ -#define FEATURE_TITLE_PROGRESS -/* show page title in url completions */ -#define FEATURE_TITLE_IN_COMPLETION -/* enable the read it later queue */ -#define FEATURE_QUEUE -/* disable X window embedding */ -/* #define FEATURE_NO_XEMBED */ - -#ifdef FEATURE_WGET_PROGRESS_BAR -/* chars to use for the progressbar */ -#define PROGRESS_BAR "=> " -#define PROGRESS_BAR_LEN 20 -#endif -#define FEATURE_AUTOCMD - -/* time in seconds after that message will be removed from inputbox if the - * message where only temporary */ -#define MESSAGE_TIMEOUT 5 - -/* number of chars to be shown in statusbar for ambiguous commands */ -#define SHOWCMD_LEN 10 -/* css applied to the gui elements regardless of user's settings */ -#define GUI_STYLE_CSS_BASE "#input text{background-color:inherit;color:inherit;caret-color:@color;font:inherit;}" - -/* default font size for fonts in webview */ -#define SETTING_DEFAULT_FONT_SIZE 16 -#define SETTING_DEFAULT_MONOSPACE_FONT_SIZE 13 -#define SETTING_GUI_FONT_NORMAL "10pt monospace" -#define SETTING_GUI_FONT_EMPH "bold 10pt monospace" -#define SETTING_COMPLETION_CSS "color:#ffffff;background-color:#656565;font:" SETTING_GUI_FONT_NORMAL -#define SETTING_COMPLETION_HOVER_CSS "background-color:#777777;" -#define SETTING_COMPLETION_SELECTED_CSS "color:#ffffff;background-color:#888888;" -#define SETTING_INPUT_CSS "background-color:#121b1c;color:#b1b9be;font:" SETTING_GUI_FONT_NORMAL -#define SETTING_INPUT_ERROR_CSS "background-color:#ff7777;font:" SETTING_GUI_FONT_EMPH -#define SETTING_STATUS_CSS "color:#b1b9be;background-color:#7B807F;font:" SETTING_GUI_FONT_EMPH -#define SETTING_STATUS_SSL_CSS "background-color:#7B807F;color:#b1b9be;" -#define SETTING_STATUS_SSL_INVLID_CSS "background-color:#ff7777;color:#000000;" - -/* hide input bar automatically */ -#define SETTING_HIDEINPUTBAR on - -#define MAXIMUM_HINTS 500 -/* default window dimensions */ -#define WIN_WIDTH 800 -#define WIN_HEIGHT 600 -/* dark mode */ -#define SETTING_DARK_MODE on - -/* browser features */ -/* if set to 1 neovimb will check if the webextension could be found. */ -#define CHECK_WEBEXTENSION_ON_STARTUP 1 -/* download folder */ -#define SETTING_DOWNLOAD_PATH "~/Downloads" -/* home page */ -#define SETTING_HOME_PAGE "https://rafaelmarcalo.xyz" -/* search engine */ -#define SETTING_SEARCH_ENGINE "https://searxng.rafaelmarcalo.xyz/searxng/search?q=$0" -/* user agent */ -#define SETTING_USER_AGENT "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Safari/605.1.15 " -/* geolocation-accept allowed values always, ask, never */ -#define SETTING_GEOLOCATION_ACCEPT "never" -/* cookie-accept allowed values always, origin, never */ -#define SETTING_COOKIE_ACCEPT "always" -/* javascript */ -#define SETTING_JAVASCRIPT_ACCEPT on -/* download command */ -#define SETTING_DOWNLOAD_COMMAND "/bin/sh -c \"curl -sLJOC - -e '$neovimb_URI' %s\"" - -#define SETTING_HINT_KEYS "0123456789" - -/* This status indicator is only shown if "status-bar-show-settings" is - * enabled. - * The CHAR_MAP(value, internalValue, outputValue, valueIfNotMapped) is a - * little workaround to translate internal used string value like for - * GET_CHAR(c, "cookie-accept") which is one of "always", "origin" or "never" - * to those values that should be shown on statusbar. - * The STATUS_VARAIBLE_SHOW is used as argument for a printf like function. So - * the first argument is the output pattern. */ -/* -#define STATUS_VARAIBLE_SHOW "js: %s, cookies: %s, hint-timeout: %d", \ - GET_BOOL(c, "scripts") ? "on" : "off", \ - GET_CHAR(c, "cookie-accept"), \ - GET_INT(c, "hint-timeout") -*/ -#define COOKIE GET_CHAR(c, "cookie-accept") -#define CHAR_MAP(v, i, m, d) (strcmp(v, i) == 0 ? m : (d)) -#define STATUS_VARAIBLE_SHOW "%c%c%c%c%c%c%c", \ - CHAR_MAP(COOKIE, "always", 'A', CHAR_MAP(COOKIE, "origin", '@', 'a')), \ - GET_BOOL(c, "dark-mode") ? 'D' : 'd', \ - GET_BOOL(c, "images") ? 'I' : 'i', \ - GET_BOOL(c, "html5-local-storage") ? 'L' : 'l', \ - GET_BOOL(c, "stylesheet") ? 'M' : 'm', \ - GET_BOOL(c, "scripts") ? 'S' : 's', \ - GET_BOOL(c, "strict-ssl") ? 'T' : 't' diff --git a/suckless/.config/suckless/surf/config.h b/suckless/.config/suckless/surf/config.h new file mode 100644 index 0000000..ef15e5f --- /dev/null +++ b/suckless/.config/suckless/surf/config.h @@ -0,0 +1,205 @@ +/* modifier 0 means no modifier */ +static int surfuseragent = 1; /* Append Surf version to default WebKit user agent */ +static int extendedtitle = 0; /* 0 to not append surf's toggle and page status to title. */ +static char *fulluseragent = ""; /* Or override the whole user agent string */ +static char *homepage = "rafaelmarcalo.xyz"; +static char *styledir = "~/.config/surf/styles/"; +static char *certdir = "~/.local/share/certificates/"; +static char *cachedir = "~/.cache/surf"; +static char *cookiefile = "~/.local/share/surf/cookies.txt"; +static char *searchurl = "https://searxng.rafaelmarcalo.xyz/searxng/search?q=%s"; +static char *scriptfiles[] = { + "~/.config/surf/scripts/vimnav.js", +}; + +/* Webkit default features */ +/* Highest priority value will be used. + * Default parameters are priority 0 + * Per-uri parameters are priority 1 + * Command parameters are priority 2 + */ +static Parameter defconfig[ParameterLast] = { + /* parameter Arg value priority */ + [AccessMicrophone] = { { .i = 0 }, }, + [AccessWebcam] = { { .i = 0 }, }, + [Certificate] = { { .i = 0 }, }, + [CaretBrowsing] = { { .i = 0 }, }, + [CookiePolicies] = { { .v = "@Aa" }, }, + [DarkMode] = { { .i = 0 }, }, + [DefaultCharset] = { { .v = "UTF-8" }, }, + [DiskCache] = { { .i = 1 }, }, + [DNSPrefetch] = { { .i = 0 }, }, + [Ephemeral] = { { .i = 0 }, }, + [FileURLsCrossAccess] = { { .i = 0 }, }, + [FontSize] = { { .i = 12 }, }, + [FrameFlattening] = { { .i = 0 }, }, + [Geolocation] = { { .i = 0 }, }, + [HideBackground] = { { .i = 0 }, }, + [Inspector] = { { .i = 0 }, }, + [Java] = { { .i = 1 }, }, + [JavaScript] = { { .i = 1 }, }, + [KioskMode] = { { .i = 0 }, }, + [LoadImages] = { { .i = 1 }, }, + [MediaManualPlay] = { { .i = 1 }, }, + [PreferredLanguages] = { { .v = (char *[]){ NULL } }, }, + [RunInFullscreen] = { { .i = 0 }, }, + [ScrollBars] = { { .i = 1 }, }, + [ShowIndicators] = { { .i = 1 }, }, + [SiteQuirks] = { { .i = 1 }, }, + [SmoothScrolling] = { { .i = 0 }, }, + [SpellChecking] = { { .i = 0 }, }, + [SpellLanguages] = { { .v = ((char *[]){ "en_US", NULL }) }, }, + [StrictTLS] = { { .i = 1 }, }, + [Style] = { { .i = 1 }, }, + [WebGL] = { { .i = 0 }, }, + [ZoomLevel] = { { .f = 1.0 }, }, +}; + +static UriParameters uriparams[] = { + { "(://|\\.)suckless\\.org(/|$)", { + [JavaScript] = { { .i = 0 }, 1 }, + }, }, +}; + +/* default window size: width, height */ +static int winsize[] = { 800, 600 }; + +static WebKitFindOptions findopts = WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | + WEBKIT_FIND_OPTIONS_WRAP_AROUND; + +#define PROMPT_GO "Go:" +#define PROMPT_FIND "Find:" +#define PROMPT_SEARCH "Search:" + +/* SETPROP(readprop, setprop, prompt)*/ +#define SETPROP(r, s, p) { \ + .v = (const char *[]){ "/bin/sh", "-c", \ + "prop=\"$(printf '%b' \"$(xprop -id $1 "r" " \ + "| sed -e 's/^"r"(UTF8_STRING) = \"\\(.*\\)\"/\\1/' " \ + " -e 's/\\\\\\(.\\)/\\1/g')\" " \ + "| dmenu -p '"p"' -w $1)\" " \ + "&& xprop -id $1 -f "s" 8u -set "s" \"$prop\"", \ + "surf-setprop", winid, NULL \ + } \ +} + +/* DOWNLOAD(URI, referer) */ +#define DOWNLOAD(u, r) { \ + .v = (const char *[]){ "st", "-e", "/bin/sh", "-c",\ + "curl -g -L -J -O -A \"$1\" -b \"$2\" -c \"$2\"" \ + " -e \"$3\" \"$4\"; read", \ + "surf-download", useragent, cookiefile, r, u, NULL \ + } \ +} + +/* PLUMB(URI) */ +/* This called when some URI which does not begin with "about:", + * "http://" or "https://" should be opened. + */ +#define PLUMB(u) {\ + .v = (const char *[]){ "/bin/sh", "-c", \ + "xdg-open \"$0\"", u, NULL \ + } \ +} + +/* VIDEOPLAY(URI) */ +#define VIDEOPLAY(u) {\ + .v = (const char *[]){ "/bin/sh", "-c", \ + "mpv --really-quiet \"$0\"", u, NULL \ + } \ +} + +/* SEARCH(searchQuery, prompt) */ +#define SEARCH(s, p) { \ + .v = (const char *[]){ "/bin/sh", "-c", \ + "query=\"$(dmenu -p '"p"' -w $1 < /dev/null)\" " \ + "&& xprop -id $1 -f "s" 8u -set "s" \"$query\"", \ + "surf-search", winid, "_SURF_SEARCH", NULL \ + } \ +} + +/* styles */ +/* + * The iteration will stop at the first match, beginning at the beginning of + * the list. + */ +static SiteSpecific styles[] = { + /* regexp file in $styledir */ + { ".*", "default.css" }, +}; + +/* certificates */ +/* + * Provide custom certificate for urls + */ +static SiteSpecific certs[] = { + /* regexp file in $certdir */ + { "://suckless\\.org/", "suckless.org.crt" }, +}; + +#define MODKEY GDK_CONTROL_MASK + +/* hotkeys */ +/* + * If you use anything else but MODKEY and GDK_SHIFT_MASK, don't forget to + * edit the CLEANMASK() macro. + */ +static Key keys[] = { + /* modifier keyval function arg */ + { MODKEY, GDK_KEY_o, spawn, SETPROP("_SURF_URI", "_SURF_GO", PROMPT_GO) }, + { MODKEY, GDK_KEY_slash, spawn, SETPROP("_SURF_FIND", "_SURF_FIND", PROMPT_FIND) }, + { MODKEY, GDK_KEY_s, spawn, SEARCH("_SURF_SEARCH", PROMPT_SEARCH) }, + + { MODKEY, GDK_KEY_w, playexternal, { 0 } }, + + { 0, GDK_KEY_Escape, stop, { 0 } }, + { MODKEY, GDK_KEY_c, stop, { 0 } }, + + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_r, reload, { .i = 1 } }, + { MODKEY, GDK_KEY_r, reload, { .i = 0 } }, + + { MODKEY, GDK_KEY_l, navigate, { .i = +1 } }, + { MODKEY, GDK_KEY_h, navigate, { .i = -1 } }, + + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_j, zoom, { .i = -1 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_k, zoom, { .i = +1 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_q, zoom, { .i = 0 } }, + { MODKEY, GDK_KEY_minus, zoom, { .i = -1 } }, + { MODKEY, GDK_KEY_plus, zoom, { .i = +1 } }, + + { MODKEY, GDK_KEY_p, clipboard, { .i = 1 } }, + { MODKEY, GDK_KEY_y, clipboard, { .i = 0 } }, + + { MODKEY, GDK_KEY_n, find, { .i = +1 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_n, find, { .i = -1 } }, + + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_p, print, { 0 } }, + { MODKEY, GDK_KEY_t, showcert, { 0 } }, + + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } }, + { 0, GDK_KEY_F11, togglefullscreen, { 0 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_e, toggletitle, { 0 } }, + + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_c, toggle, { .i = CaretBrowsing } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_f, toggle, { .i = FrameFlattening } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_g, toggle, { .i = Geolocation } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_s, toggle, { .i = JavaScript } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_i, toggle, { .i = LoadImages } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_b, toggle, { .i = ScrollBars } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_t, toggle, { .i = StrictTLS } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_m, toggle, { .i = Style } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_d, toggle, { .i = DarkMode } }, +}; + +/* button definitions */ +/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */ +static Button buttons[] = { + /* target event mask button function argument stop event */ + { OnLink, 0, 2, clicknewwindow, { .i = 0 }, 1 }, + { OnLink, MODKEY, 2, clicknewwindow, { .i = 1 }, 1 }, + { OnLink, MODKEY, 1, clicknewwindow, { .i = 1 }, 1 }, + { OnAny, 0, 8, clicknavigate, { .i = -1 }, 1 }, + { OnAny, 0, 9, clicknavigate, { .i = +1 }, 1 }, + { OnMedia, MODKEY, 1, clickexternplayer, { 0 }, 1 }, +}; diff --git a/suckless/.local/src/compileSource b/suckless/.local/src/compileSource index f9595ab..c0c996a 100755 --- a/suckless/.local/src/compileSource +++ b/suckless/.local/src/compileSource @@ -20,7 +20,7 @@ git clone git@github.com:rafa-99/st.git if [ "$KERNEL" = "Linux" ]; then git clone git@github.com:rafa-99/farbfeld.git - git clone git@github.com:rafa-99/neovimb.git + git clone git@github.com:rafa-99/surf.git git clone git@github.com:rafa-99/sent.git git clone git@github.com:rafa-99/slstatus.git git clone git@github.com:rafa-99/xmouseless.git @@ -35,7 +35,7 @@ cd "$SRC"/st && git pull ; if [ "$KERNEL" = "Linux" ]; then cd "$SRC"/farbfeld && git pull ; - cd "$SRC"/neovimb && git pull ; + cd "$SRC"/surf && git pull ; cd "$SRC"/sent && git pull ; cd "$SRC"/slstatus && git pull ; cd "$SRC"/xmouseless && git pull ; @@ -51,7 +51,7 @@ fi [ ! -f "$SRC"/st/config.h ] && cp -rf "$HOME"/.config/suckless/st/config.h "$SRC"/st/ ; if [ "$KERNEL" = "Linux" ]; then - [ ! -f "$SRC"/neovimb/src/config.h ] && cp -rf "$HOME"/.config/suckless/neovimb/config.h "$SRC"/neovimb/src ; + [ ! -f "$SRC"/surf/src/config.h ] && cp -rf "$HOME"/.config/suckless/surf/config.h "$SRC"/surf/src ; [ ! -f "$SRC"/sent/config.h ] && cp -rf "$HOME"/.config/suckless/sent/config.h "$SRC"/sent/ ; [ ! -f "$SRC"/slstatus/config.h ] && cp -rf "$HOME"/.config/suckless/slstatus/config.h "$SRC"/slstatus/ ; [ ! -f "$SRC"/xmouseless/config.h ] && cp -rf "$HOME"/.config/suckless/xmouseless/config.h "$SRC"/xmouseless/ ; @@ -80,7 +80,7 @@ cd "$SRC"/st && git pull ; doas make clean install ; make clean if [ "$KERNEL" = "Linux" ]; then cd "$SRC"/farbfeld && git pull ; doas make clean install ; make clean - cd "$SRC"/neovimb && git pull ; doas make clean install ; make clean + cd "$SRC"/surf && git pull ; doas make clean install ; make clean cd "$SRC"/sent && git pull ; doas make clean install ; make clean cd "$SRC"/slstatus && git pull ; doas make clean install ; make clean cd "$SRC"/xmouseless && git pull ; doas make clean install ; make clean diff --git a/surf/.config/surf/scripts/vimnav.js b/surf/.config/surf/scripts/vimnav.js new file mode 100644 index 0000000..e884118 --- /dev/null +++ b/surf/.config/surf/scripts/vimnav.js @@ -0,0 +1,363 @@ +var bindings = { + 'h' : left, + 'H' : back, + 'l' : right, + 'L' : forward, + 'k' : up, + 'j' : down, + 'g' : home, + 'G' : bottom, + 'u': pageup, + 'd': pagedown, + 'f': hintMode, + '^c': removeHints +} +var hint_num_str = ''; +var hint_elems = []; +var hint_enabled = false; + +function hintMode(){ + hint_enabled = true; + setHints(); + document.addEventListener('keydown', hintHandler, false); + hint_num_str = ''; +} +function hintHandler(e){ + e.preventDefault(); //Stop Default Event + var pressedKey = get_key(e); + if (pressedKey == 'Enter') { + if (hint_num_str == '') + hint_num_str = '1'; + judgeHintNum(Number(hint_num_str)); + } else if (/[0-9]/.test(pressedKey) == false) { + removeHints(); + } else { + hint_num_str += pressedKey; + var hint_num = Number(hint_num_str); + if (hint_num * 10 > hint_elems.length + 1) { + judgeHintNum(hint_num); + } else { + var hint_elem = hint_elems[hint_num - 1]; + if (hint_elem != undefined && hint_elem.tagName.toLowerCase() == 'a') { + setHighlight(hint_elem, true); + } + } + } +} +function setHighlight(elem, is_active) { + if (is_active) { + var active_elem = document.body.querySelector('a[highlight=hint_active]'); + if (active_elem != undefined) + active_elem.setAttribute('highlight', 'hint_elem'); + elem.setAttribute('highlight', 'hint_active'); + } else { + elem.setAttribute('highlight', 'hint_elem'); + } +} +function setHintRules() { + if (document.styleSheets.length < 1) { + var style = document.createElement("style"); + style.appendChild(document.createTextNode("")); + document.head.appendChild(style); + } + var ss = document.styleSheets[0]; + ss.insertRule('a[highlight=hint_elem] {background-color: yellow}', 0); + ss.insertRule('a[highlight=hint_active] {background-color: lime}', 0); +} +function deleteHintRules() { + var ss = document.styleSheets[0]; + ss.deleteRule(0); + ss.deleteRule(0); +} +function judgeHintNum(hint_num) { + var hint_elem = hint_elems[hint_num - 1]; + if (hint_elem != undefined) { + execSelect(hint_elem); + } else { + removeHints(); + } +} +function execSelect(elem) { + var tag_name = elem.tagName.toLowerCase(); + var type = elem.type ? elem.type.toLowerCase() : ""; + if (tag_name == 'a' && elem.href != '') { + setHighlight(elem, true); + // TODO: ajax, <select> + location.href=elem.href; + } else if (tag_name == 'input' && (type == "submit" || type == "button" || type == "reset")) { + elem.click(); + } else if (tag_name == 'input' && (type == "radio" || type == "checkbox")) { + // TODO: toggle checkbox + elem.checked = !elem.checked; + } else if (tag_name == 'input' || tag_name == 'textarea') { + elem.focus(); + elem.setSelectionRange(elem.value.length, elem.value.length); + } + removeHints(); +} +function setHints() { + setHintRules(); + var win_top = window.scrollY; + var win_bottom = win_top + window.innerHeight; + var win_left = window.scrollX; + var win_right = win_left + window.innerWidth; + // TODO: <area> + var elems = document.body.querySelectorAll('a, input:not([type=hidden]), textarea, select, button'); + var div = document.createElement('div'); + div.setAttribute('highlight', 'hints'); + document.body.appendChild(div); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (!isHintDisplay(elem)) + continue; + var pos = elem.getBoundingClientRect(); + var elem_top = win_top + pos.top; + var elem_bottom = win_top + pos.bottom; + var elem_left = win_left + pos.left; + var elem_right = win_left + pos.left; + if ( elem_bottom >= win_top && elem_top <= win_bottom) { + hint_elems.push(elem); + setHighlight(elem, false); + var span = document.createElement('span'); + span.style.cssText = [ + 'left: ', elem_left, 'px;', + 'top: ', elem_top, 'px;', + 'position: absolute;', + 'font-size: 13px;', + 'background-color: red;', + 'color: white;', + 'font-weight: bold;', + 'padding: 0px 1px;', + 'z-index: 100000;' + ].join(''); + span.innerHTML = hint_elems.length; + div.appendChild(span); + if (elem.tagName.toLowerCase() == 'a') { + if (hint_elems.length == 1) { + setHighlight(elem, true); + } else { + setHighlight(elem, false); + } + } + } + } +} +function isHintDisplay(elem) { + var pos = elem.getBoundingClientRect(); + return (pos.height != 0 && pos.width != 0); +} +function removeHints() { + if (!hint_enabled) + return; + hint_enabled = false; + deleteHintRules(); + for (var i = 0; i < hint_elems.length; i++) { + hint_elems[i].removeAttribute('highlight'); + } + hint_elems = []; + hint_num_str = ''; + var div = document.body.querySelector('div[highlight=hints]'); + if (div != undefined) { + document.body.removeChild(div); + } + document.removeEventListener('keydown', hintHandler, false); +} +var keyId = { + "U+0008" : "BackSpace", + "U+0009" : "Tab", + "U+0018" : "Cancel", + "U+001B" : "Esc", + "U+0020" : "Space", + "U+0021" : "!", + "U+0022" : "\"", + "U+0023" : "#", + "U+0024" : "$", + "U+0026" : "&", + "U+0027" : "'", + "U+0028" : "(", + "U+0029" : ")", + "U+002A" : "*", + "U+002B" : "+", + "U+002C" : ",", + "U+002D" : "-", + "U+002E" : ".", + "U+002F" : "/", + "U+0030" : "0", + "U+0031" : "1", + "U+0032" : "2", + "U+0033" : "3", + "U+0034" : "4", + "U+0035" : "5", + "U+0036" : "6", + "U+0037" : "7", + "U+0038" : "8", + "U+0039" : "9", + "U+003A" : ":", + "U+003B" : ";", + "U+003C" : "<", + "U+003D" : "=", + "U+003E" : ">", + "U+003F" : "?", + "U+0040" : "@", + "U+0041" : "a", + "U+0042" : "b", + "U+0043" : "c", + "U+0044" : "d", + "U+0045" : "e", + "U+0046" : "f", + "U+0047" : "g", + "U+0048" : "h", + "U+0049" : "i", + "U+004A" : "j", + "U+004B" : "k", + "U+004C" : "l", + "U+004D" : "m", + "U+004E" : "n", + "U+004F" : "o", + "U+0050" : "p", + "U+0051" : "q", + "U+0052" : "r", + "U+0053" : "s", + "U+0054" : "t", + "U+0055" : "u", + "U+0056" : "v", + "U+0057" : "w", + "U+0058" : "x", + "U+0059" : "y", + "U+005A" : "z", + //"U+005B" : "[", + //"U+005C" : "\\", + //"U+005D" : "]", + "U+00DB" : "[", + "U+00DC" : "\\", + "U+00DD" : "]", + "U+005E" : "^", + "U+005F" : "_", + "U+0060" : "`", + "U+007B" : "{", + "U+007C" : "|", + "U+007D" : "}", + "U+007F" : "Delete", + "U+00A1" : "¡", + "U+0300" : "CombGrave", + "U+0300" : "CombAcute", + "U+0302" : "CombCircum", + "U+0303" : "CombTilde", + "U+0304" : "CombMacron", + "U+0306" : "CombBreve", + "U+0307" : "CombDot", + "U+0308" : "CombDiaer", + "U+030A" : "CombRing", + "U+030B" : "CombDblAcute", + "U+030C" : "CombCaron", + "U+0327" : "CombCedilla", + "U+0328" : "CombOgonek", + "U+0345" : "CombYpogeg", + "U+20AC" : "€", + "U+3099" : "CombVoice", + "U+309A" : "CombSVoice", +} +function get_key(evt){ + var key = keyId[evt.keyIdentifier] || evt.keyIdentifier, + ctrl = evt.ctrlKey ? 'C-' : '', + meta = (evt.metaKey || evt.altKey) ? 'M-' : '', + shift = evt.shiftKey ? 'S-' : ''; + if (evt.shiftKey){ + if (/^[a-z]$/.test(key)) + return ctrl+meta+key.toUpperCase(); + if (/^[0-9]$/.test(key)) { + switch(key) { + // TODO + case "4": + key = "$"; + break; + }; + return key; + } + if (/^(Enter|Space|BackSpace|Tab|Esc|Home|End|Left|Right|Up|Down|PageUp|PageDown|F(\d\d?))$/.test(key)) + return ctrl+meta+shift+key; + } + return ctrl+meta+key; +} +////////////////////////////////////////////////////////////////////////////////////////// +function up() { + if (window.scrollByLines) + window.scrollByLines(-1); // gecko + else + window.scrollBy(0, -12); // webkit +} +function down() { + if (window.scrollByLines) + window.scrollByLines(1); // gecko + else + window.scrollBy(0, 12); // webkit +} +function pageup() { + if (window.scrollByPages) + window.scrollByPages(-1); // gecko + else + window.scrollBy(0, 0 - _pageScroll()); // webkit +} +function pagedown() { + if (window.scrollByPages) + window.scrollByPages(1); // gecko + else + window.scrollBy(0, _pageScroll()); // webkit +} +function right() { + window.scrollBy(15, 0); +} +function left() { + window.scrollBy(-15, 0); +} +function home() { + window.scroll(0, 0); +} +function bottom() { + window.scroll(document.body.scrollWidth, document.body.scrollHeight); +} +function back() { + history.back(); +} +function forward() { + history.forward(); +} +function isEditable(element) { + + if (element.nodeName.toLowerCase() == "textarea") + return true; + // we don't get keypress events for text input, but I don't known + // if it's a bug, so let's test that + if (element.nodeName.toLowerCase() == "input" && element.type == "text") + return true; + // element is editable + if (document.designMode == "on" || element.contentEditable == "true") { + return true; + } + + return false; +} +function keypress(evt) { + var target = evt.target; + + // if we're on a editable element, we probably don't want to catch + // keypress, we just want to write the typed character. + if (isEditable(target)) + return; + var key = String.fromCharCode(evt.charCode); + if (evt.ctrlKey) { + key = '^' + key; + } + var fun = bindings[key]; + if (fun) + fun(); +} +function _pageScroll() { + // Gecko algorithm + // ---------------- + // The page increment is the size of the page, minus the smaller of + // 10% of the size or 2 lines. + return window.innerHeight - Math.min(window.innerHeight / 10, 24); +} + +window.addEventListener("keypress", keypress, false); |