// ==UserScript==
// @name Show QRCode
// @name:en Show QRCode
// @namespace http://tampermonkey.net/
// @version 0.3
// @description 显示网页二维码
// @description:en show current page qrcode
// @author whbb
// @match http://*/*
// @match https://*/*
// @require https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js
// @require https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js
// @require https://cdn.bootcss.com/vex-js/3.0.0/js/vex.combined.min.js
// @resource vexCSS https://cdn.bootcss.com/vex-js/3.0.0/css/vex.min.css
// @resource vexTheme https://cdn.bootcss.com/vex-js/3.0.0/css/vex-theme-default.min.css
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// ==/UserScript==
(function () {
'use strict';
var keyboardMap = [
"", // [0]
"", // [1]
"", // [2]
"CANCEL", // [3]
"", // [4]
"", // [5]
"HELP", // [6]
"", // [7]
"BACK_SPACE", // [8]
"TAB", // [9]
"", // [10]
"", // [11]
"CLEAR", // [12]
"ENTER", // [13]
"ENTER_SPECIAL", // [14]
"", // [15]
"SHIFT", // [16]
"CONTROL", // [17]
"ALT", // [18]
"PAUSE", // [19]
"CAPS_LOCK", // [20]
"KANA", // [21]
"EISU", // [22]
"JUNJA", // [23]
"FINAL", // [24]
"HANJA", // [25]
"", // [26]
"ESCAPE", // [27]
"CONVERT", // [28]
"NONCONVERT", // [29]
"ACCEPT", // [30]
"MODECHANGE", // [31]
"SPACE", // [32]
"PAGE_UP", // [33]
"PAGE_DOWN", // [34]
"END", // [35]
"HOME", // [36]
"LEFT", // [37]
"UP", // [38]
"RIGHT", // [39]
"DOWN", // [40]
"SELECT", // [41]
"PRINT", // [42]
"EXECUTE", // [43]
"PRINTSCREEN", // [44]
"INSERT", // [45]
"DELETE", // [46]
"", // [47]
"0", // [48]
"1", // [49]
"2", // [50]
"3", // [51]
"4", // [52]
"5", // [53]
"6", // [54]
"7", // [55]
"8", // [56]
"9", // [57]
"COLON", // [58]
"SEMICOLON", // [59]
"LESS_THAN", // [60]
"EQUALS", // [61]
"GREATER_THAN", // [62]
"QUESTION_MARK", // [63]
"AT", // [64]
"A", // [65]
"B", // [66]
"C", // [67]
"D", // [68]
"E", // [69]
"F", // [70]
"G", // [71]
"H", // [72]
"I", // [73]
"J", // [74]
"K", // [75]
"L", // [76]
"M", // [77]
"N", // [78]
"O", // [79]
"P", // [80]
"Q", // [81]
"R", // [82]
"S", // [83]
"T", // [84]
"U", // [85]
"V", // [86]
"W", // [87]
"X", // [88]
"Y", // [89]
"Z", // [90]
"OS_KEY", // [91] Windows Key (Windows) or Command Key (Mac)
"", // [92]
"CONTEXT_MENU", // [93]
"", // [94]
"SLEEP", // [95]
"NUMPAD0", // [96]
"NUMPAD1", // [97]
"NUMPAD2", // [98]
"NUMPAD3", // [99]
"NUMPAD4", // [100]
"NUMPAD5", // [101]
"NUMPAD6", // [102]
"NUMPAD7", // [103]
"NUMPAD8", // [104]
"NUMPAD9", // [105]
"MULTIPLY", // [106]
"ADD", // [107]
"SEPARATOR", // [108]
"SUBTRACT", // [109]
"DECIMAL", // [110]
"DIVIDE", // [111]
"F1", // [112]
"F2", // [113]
"F3", // [114]
"F4", // [115]
"F5", // [116]
"F6", // [117]
"F7", // [118]
"F8", // [119]
"F9", // [120]
"F10", // [121]
"F11", // [122]
"F12", // [123]
"F13", // [124]
"F14", // [125]
"F15", // [126]
"F16", // [127]
"F17", // [128]
"F18", // [129]
"F19", // [130]
"F20", // [131]
"F21", // [132]
"F22", // [133]
"F23", // [134]
"F24", // [135]
"", // [136]
"", // [137]
"", // [138]
"", // [139]
"", // [140]
"", // [141]
"", // [142]
"", // [143]
"NUM_LOCK", // [144]
"SCROLL_LOCK", // [145]
"WIN_OEM_FJ_JISHO", // [146]
"WIN_OEM_FJ_MASSHOU", // [147]
"WIN_OEM_FJ_TOUROKU", // [148]
"WIN_OEM_FJ_LOYA", // [149]
"WIN_OEM_FJ_ROYA", // [150]
"", // [151]
"", // [152]
"", // [153]
"", // [154]
"", // [155]
"", // [156]
"", // [157]
"", // [158]
"", // [159]
"CIRCUMFLEX", // [160]
"EXCLAMATION", // [161]
"DOUBLE_QUOTE", // [162]
"HASH", // [163]
"DOLLAR", // [164]
"PERCENT", // [165]
"AMPERSAND", // [166]
"UNDERSCORE", // [167]
"OPEN_PAREN", // [168]
"CLOSE_PAREN", // [169]
"ASTERISK", // [170]
"PLUS", // [171]
"PIPE", // [172]
"HYPHEN_MINUS", // [173]
"OPEN_CURLY_BRACKET", // [174]
"CLOSE_CURLY_BRACKET", // [175]
"TILDE", // [176]
"", // [177]
"", // [178]
"", // [179]
"", // [180]
"VOLUME_MUTE", // [181]
"VOLUME_DOWN", // [182]
"VOLUME_UP", // [183]
"", // [184]
"", // [185]
"SEMICOLON", // [186]
"EQUALS", // [187]
"COMMA", // [188]
"MINUS", // [189]
"PERIOD", // [190]
"SLASH", // [191]
"BACK_QUOTE", // [192]
"", // [193]
"", // [194]
"", // [195]
"", // [196]
"", // [197]
"", // [198]
"", // [199]
"", // [200]
"", // [201]
"", // [202]
"", // [203]
"", // [204]
"", // [205]
"", // [206]
"", // [207]
"", // [208]
"", // [209]
"", // [210]
"", // [211]
"", // [212]
"", // [213]
"", // [214]
"", // [215]
"", // [216]
"", // [217]
"", // [218]
"OPEN_BRACKET", // [219]
"BACK_SLASH", // [220]
"CLOSE_BRACKET", // [221]
"QUOTE", // [222]
"", // [223]
"META", // [224]
"ALTGR", // [225]
"", // [226]
"WIN_ICO_HELP", // [227]
"WIN_ICO_00", // [228]
"", // [229]
"WIN_ICO_CLEAR", // [230]
"", // [231]
"", // [232]
"WIN_OEM_RESET", // [233]
"WIN_OEM_JUMP", // [234]
"WIN_OEM_PA1", // [235]
"WIN_OEM_PA2", // [236]
"WIN_OEM_PA3", // [237]
"WIN_OEM_WSCTRL", // [238]
"WIN_OEM_CUSEL", // [239]
"WIN_OEM_ATTN", // [240]
"WIN_OEM_FINISH", // [241]
"WIN_OEM_COPY", // [242]
"WIN_OEM_AUTO", // [243]
"WIN_OEM_ENLW", // [244]
"WIN_OEM_BACKTAB", // [245]
"ATTN", // [246]
"CRSEL", // [247]
"EXSEL", // [248]
"EREOF", // [249]
"PLAY", // [250]
"ZOOM", // [251]
"", // [252]
"PA1", // [253]
"WIN_OEM_CLEAR", // [254]
"" // [255]
];
const vexCss = GM_getResourceText('vexCSS')
const vexTheme = GM_getResourceText('vexTheme')
GM_addStyle(vexCss)
GM_addStyle(vexTheme)
vex.defaultOptions.className = 'vex-theme-default'
const setting = {}, defaultSetting = {
keyList: '81,82'.split(','),
setting: false,
isCtrl: true,
isAlt: true,
isShift: false,
settingError: false,
}
function defineProperty(obj, key, onchange) {
let value = obj[key]
Object.defineProperty(obj, key, {
get: function() { return value },
set: function(val) {
if(onchange) {
onchange(val, value)
}
value = val
}
})
}
function setInit() {
Object.keys(defaultSetting).forEach(function(key) {
setting[key] = GM_getValue(key, defaultSetting[key])
})
setting.settingError = false
}
function setDefault() {
Object.keys(defaultSetting).forEach(function(key) {
setting[key] = defaultSetting[key]
})
setting.settingError = false
}
for(let key in defaultSetting) {
setInit()
defineProperty(setting, key, function(val) {
let _ = null
switch(key) {
case 'keyList':
$('#qr-shortcut').val(val.map(function(keyCode) { return keyboardMap[keyCode] }))
setting.settingError = !val.length
break;
case 'setting':
_ = val ? $('#qr-setting').show() : $('#qr-setting').hide()
$('#qr-set-button-arrow').html(val ? '▼ ' : '▶ ')
break;
case 'isCtrl':
case 'isAlt':
case 'isShift':
$('#qr-' + key).css('background', val ? 'red' : '#aaa')
break;
case 'settingError':
$('#qr-shortcut').css('border', val ? '1px solid red' : 'none')
break;
}
})
}
GM_registerMenuCommand('QrCode Default', setDefault)
let q = 0
document.onkeydown = function (e) {
if ((!setting.isCtrl || e.ctrlKey) && (!setting.isAlt || e.altKey) && (!setting.isShift || e.shiftKey)) {
if (setting.keyList[q] == e.which && setting.keyList.length === q + 1) {
vex.dialog.open({
message: location.href,
input: ['<div id="qr-qrcode" style="width: 256px; margin: 20px auto"></div>',
'<div id="qr-set-part" style="border: 1px solid #ccc; padding-left: 10px;">',
'<div id="qr-set-button" style="cursor: pointer;"><span id="qr-set-button-arrow">▶ </span>Setting</div>',
'<div id="qr-setting" style="display: none; margin: 10px 20px; font-size: 14px;" >',
'<label style=""> ',
'Shortcut: <input id="qr-shortcut" style="height: 24px;" >',
'<label id="qr-isCtrl" class="qr-mod-key" style="margin: 0 5px; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;"> Ctrl </label>',
'<label id="qr-isAlt" class="qr-mod-key" style="margin: 0 5px; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;"> Alt </label>',
'<label id="qr-isShift" class="qr-mod-key" style="margin: 0 5px; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;"> Shift </label>',
'</label>',
'<br><label id="qr-setting-default" style="display: inline-block; line-height: 24px; margin: 20px 0 0; padding: 0 5px; border: 1px solid #aaa; background: #ccc; cursor: pointer;">default</label>',
'</div>',
'</div>'
].join(''),
buttons: [vex.dialog.buttons.YES],
onSubmit: function(e) {
e.preventDefault()
if(setting.keyList.length) {
this.close()
GM_setValue('keyList', setting.keyList)
GM_setValue('isCtrl', setting.isCtrl)
GM_setValue('isAlt', setting.isAlt)
GM_setValue('isShift', setting.isShift)
}
}
})
setTimeout(function () {
setInit()
$('#qr-qrcode').qrcode(location.href)
$('#qr-set-button').click(function(e) {
setting.setting = !setting.setting
e.stopPropagation()
e.preventDefault()
})
$('.qr-mod-key').click(function(e) {
const key = e.target.id.substr(3)
setting[key] = !setting[key]
})
$('#qr-shortcut').keyup(function(e) {
setting.settingError = false
if(e.which === keyboardMap.indexOf('BACK_SPACE')) {
setting.keyList = setting.keyList.slice(0, setting.keyList.length - 1)
} else if(keyboardMap[e.which]) {
setting.keyList = setting.keyList.concat(e.which)
}
})
$('#qr-setting-default').click(function(e) {
setDefault()
setting.setting = true
})
}, 0);
e.stopPropagation()
e.preventDefault()
}
q = setting.keyList[q] == e.which ? q + 1 : 0
}
}
})();