From 1413ab5b148c9c19e551a85c563451b4c2580199 Mon Sep 17 00:00:00 2001 From: Patrizio Bekerle Date: Mon, 15 May 2017 15:20:14 +0200 Subject: [PATCH] added the github-header script --- github-header/github-header.qml | 340 ++++++++++++++++++++++++++++++++ github-header/info.json | 7 + 2 files changed, 347 insertions(+) create mode 100644 github-header/github-header.qml create mode 100644 github-header/info.json diff --git a/github-header/github-header.qml b/github-header/github-header.qml new file mode 100644 index 0000000..1145b06 --- /dev/null +++ b/github-header/github-header.qml @@ -0,0 +1,340 @@ +import QtQml 2.0 + +/** + * This script detects if a GitHub issue url is in the clipboard and downloads the page + * so it can parse the headline from it to paste a markdown headline and a link + */ +QtObject { + /** + * This function is called when html or a media file is pasted to a note with `Ctrl + Shift + V` + * + * @param text text of the QMimeData object + * @param html html of the QMimeData object + * @returns the string that should be inserted instead of the text from the QMimeData object + */ + function insertingFromMimeDataHook(text, html) { + text = text.trim(); + + // http://www.regexpal.com is your friend + // check if the pasted text is a GitHub issue url + var re = /^http[s]?:\/\/github\.com.+\/issues\//igm; + if (re.test(text)) { + script.log("found GitHub issue url in clipboard: " + text); + + // download matched GitHub url + var output = script.downloadUrlToString(text); + + // parse the headline + var re2 = /([^>]+)<\/span>/im + var result2 = re2.exec(output); + + if (result2 !== null) { + var headline = entityToHtml(result2[1].trim()); + script.log("found headline: " + headline); + + // generate markdown to paste + var result = "## " + headline + "\n- <" + text + ">\n"; + return result; + } + + script.log("no headline was found!"); + } else { + script.log("no GitHub issue url was found"); + } + + return ""; + } + + /** + * Replaces html entities to characters + */ + function entityToHtml(string) { + var entity_table = { + 34: """, // Quotation mark. Not required + 38: "&", // Ampersand. Applied before everything else in the application + 60: "<", // Less-than sign + 62: ">", // Greater-than sign + 63: "?", // Question mark + 111: "o", // Latin small letter o + 160: " ", // Non-breaking space + 161: "¡", // Inverted exclamation mark + 162: "¢", // Cent sign + 163: "£", // Pound sign + 164: "¤", // Currency sign + 165: "¥", // Yen sign + 166: "¦", // Broken vertical bar + 167: "§", // Section sign + 168: "¨", // Diaeresis + 169: "©", // Copyright sign + 170: "ª", // Feminine ordinal indicator + 171: "«", // Left-pointing double angle quotation mark + 172: "¬", // Not sign + 173: "­", // Soft hyphen + 174: "®", // Registered sign + 175: "¯", // Macron + 176: "°", // Degree sign + 177: "±", // Plus-minus sign + 178: "²", // Superscript two + 179: "³", // Superscript three + 180: "´", // Acute accent + 181: "µ", // Micro sign + 182: "¶", // Pilcrow sign + 183: "·", // Middle dot + 184: "¸", // Cedilla + 185: "¹", // Superscript one + 186: "º", // Masculine ordinal indicator + 187: "»", // Right-pointing double angle quotation mark + 188: "¼", // Vulgar fraction one-quarter + 189: "½", // Vulgar fraction one-half + 190: "¾", // Vulgar fraction three-quarters + 191: "¿", // Inverted question mark + 192: "À", // A with grave + 193: "Á", // A with acute + 194: "Â", // A with circumflex + 195: "Ã", // A with tilde + 196: "Ä", // A with diaeresis + 197: "Å", // A with ring above + 198: "Æ", // AE + 199: "Ç", // C with cedilla + 200: "È", // E with grave + 201: "É", // E with acute + 202: "Ê", // E with circumflex + 203: "Ë", // E with diaeresis + 204: "Ì", // I with grave + 205: "Í", // I with acute + 206: "Î", // I with circumflex + 207: "Ï", // I with diaeresis + 208: "Ð", // Eth + 209: "Ñ", // N with tilde + 210: "Ò", // O with grave + 211: "Ó", // O with acute + 212: "Ô", // O with circumflex + 213: "Õ", // O with tilde + 214: "Ö", // O with diaeresis + 215: "×", // Multiplication sign + 216: "Ø", // O with stroke + 217: "Ù", // U with grave + 218: "Ú", // U with acute + 219: "Û", // U with circumflex + 220: "Ü", // U with diaeresis + 221: "Ý", // Y with acute + 222: "Þ", // Thorn + 223: "ß", // Sharp s. Also known as ess-zed + 224: "à", // a with grave + 225: "á", // a with acute + 226: "â", // a with circumflex + 227: "ã", // a with tilde + 228: "ä", // a with diaeresis + 229: "å", // a with ring above + 230: "æ", // ae. Also known as ligature ae + 231: "ç", // c with cedilla + 232: "è", // e with grave + 233: "é", // e with acute + 234: "ê", // e with circumflex + 235: "ë", // e with diaeresis + 236: "ì", // i with grave + 237: "í", // i with acute + 238: "î", // i with circumflex + 239: "ï", // i with diaeresis + 240: "ð", // eth + 241: "ñ", // n with tilde + 242: "ò", // o with grave + 243: "ó", // o with acute + 244: "ô", // o with circumflex + 245: "õ", // o with tilde + 246: "ö", // o with diaeresis + 247: "÷", // Division sign + 248: "ø", // o with stroke. Also known as o with slash + 249: "ù", // u with grave + 250: "ú", // u with acute + 251: "û", // u with circumflex + 252: "ü", // u with diaeresis + 253: "ý", // y with acute + 254: "þ", // thorn + 255: "ÿ", // y with diaeresis + 264: "Ĉ", // Latin capital letter C with circumflex + 265: "ĉ", // Latin small letter c with circumflex + 338: "Œ", // Latin capital ligature OE + 339: "œ", // Latin small ligature oe + 352: "Š", // Latin capital letter S with caron + 353: "š", // Latin small letter s with caron + 372: "Ŵ", // Latin capital letter W with circumflex + 373: "ŵ", // Latin small letter w with circumflex + 374: "Ŷ", // Latin capital letter Y with circumflex + 375: "ŷ", // Latin small letter y with circumflex + 376: "Ÿ", // Latin capital letter Y with diaeresis + 402: "ƒ", // Latin small f with hook, function, florin + 710: "ˆ", // Modifier letter circumflex accent + 732: "˜", // Small tilde + 913: "Α", // Alpha + 914: "Β", // Beta + 915: "Γ", // Gamma + 916: "Δ", // Delta + 917: "Ε", // Epsilon + 918: "Ζ", // Zeta + 919: "Η", // Eta + 920: "Θ", // Theta + 921: "Ι", // Iota + 922: "Κ", // Kappa + 923: "Λ", // Lambda + 924: "Μ", // Mu + 925: "Ν", // Nu + 926: "Ξ", // Xi + 927: "Ο", // Omicron + 928: "Π", // Pi + 929: "Ρ", // Rho + 931: "Σ", // Sigma + 932: "Τ", // Tau + 933: "Υ", // Upsilon + 934: "Φ", // Phi + 935: "Χ", // Chi + 936: "Ψ", // Psi + 937: "Ω", // Omega + 945: "α", // alpha + 946: "β", // beta + 947: "γ", // gamma + 948: "δ", // delta + 949: "ε", // epsilon + 950: "ζ", // zeta + 951: "η", // eta + 952: "θ", // theta + 953: "ι", // iota + 954: "κ", // kappa + 955: "λ", // lambda + 956: "μ", // mu + 957: "ν", // nu + 958: "ξ", // xi + 959: "ο", // omicron + 960: "π", // pi + 961: "ρ", // rho + 962: "ς", // sigmaf + 963: "σ", // sigma + 964: "τ", // tau + 965: "υ", // upsilon + 966: "φ", // phi + 967: "χ", // chi + 968: "ψ", // psi + 969: "ω", // omega + 977: "ϑ", // Theta symbol + 978: "ϒ", // Greek upsilon with hook symbol + 982: "ϖ", // Pi symbol + 8194: " ", // En space + 8195: " ", // Em space + 8201: " ", // Thin space + 8204: "‌", // Zero width non-joiner + 8205: "‍", // Zero width joiner + 8206: "‎", // Left-to-right mark + 8207: "‏", // Right-to-left mark + 8211: "–", // En dash + 8212: "—", // Em dash + 8216: "‘", // Left single quotation mark + 8217: "’", // Right single quotation mark + 8218: "‚", // Single low-9 quotation mark + 8220: "“", // Left double quotation mark + 8221: "”", // Right double quotation mark + 8222: "„", // Double low-9 quotation mark + 8224: "†", // Dagger + 8225: "‡", // Double dagger + 8226: "•", // Bullet + 8230: "…", // Horizontal ellipsis + 8240: "‰", // Per mille sign + 8242: "′", // Prime + 8243: "″", // Double Prime + 8249: "‹", // Single left-pointing angle quotation + 8250: "›", // Single right-pointing angle quotation + 8254: "‾", // Overline + 8260: "⁄", // Fraction Slash + 8364: "€", // Euro sign + 8472: "℘", // Script capital + 8465: "ℑ", // Blackletter capital I + 8476: "ℜ", // Blackletter capital R + 8482: "™", // Trade mark sign + 8501: "ℵ", // Alef symbol + 8592: "←", // Leftward arrow + 8593: "↑", // Upward arrow + 8594: "→", // Rightward arrow + 8595: "↓", // Downward arrow + 8596: "↔", // Left right arrow + 8629: "↵", // Downward arrow with corner leftward. Also known as carriage return + 8656: "⇐", // Leftward double arrow. ISO 10646 does not say that lArr is the same as the 'is implied by' arrow but also does not have any other character for that function. So ? lArr can be used for 'is implied by' as ISOtech suggests + 8657: "⇑", // Upward double arrow + 8658: "⇒", // Rightward double arrow. ISO 10646 does not say this is the 'implies' character but does not have another character with this function so ? rArr can be used for 'implies' as ISOtech suggests + 8659: "⇓", // Downward double arrow + 8660: "⇔", // Left-right double arrow + // Mathematical Operators + 8704: "∀", // For all + 8706: "∂", // Partial differential + 8707: "∃", // There exists + 8709: "∅", // Empty set. Also known as null set and diameter + 8711: "∇", // Nabla. Also known as backward difference + 8712: "∈", // Element of + 8713: "∉", // Not an element of + 8715: "∋", // Contains as member + 8719: "∏", // N-ary product. Also known as product sign. Prod is not the same character as U+03A0 'greek capital letter pi' though the same glyph might be used for both + 8721: "∑", // N-ary summation. Sum is not the same character as U+03A3 'greek capital letter sigma' though the same glyph might be used for both + 8722: "−", // Minus sign + 8727: "∗", // Asterisk operator + 8729: "∙", // Bullet operator + 8730: "√", // Square root. Also known as radical sign + 8733: "∝", // Proportional to + 8734: "∞", // Infinity + 8736: "∠", // Angle + 8743: "∧", // Logical and. Also known as wedge + 8744: "∨", // Logical or. Also known as vee + 8745: "∩", // Intersection. Also known as cap + 8746: "∪", // Union. Also known as cup + 8747: "∫", // Integral + 8756: "∴", // Therefore + 8764: "∼", // tilde operator. Also known as varies with and similar to. The tilde operator is not the same character as the tilde, U+007E, although the same glyph might be used to represent both + 8773: "≅", // Approximately equal to + 8776: "≈", // Almost equal to. Also known as asymptotic to + 8800: "≠", // Not equal to + 8801: "≡", // Identical to + 8804: "≤", // Less-than or equal to + 8805: "≥", // Greater-than or equal to + 8834: "⊂", // Subset of + 8835: "⊃", // Superset of. Note that nsup, 'not a superset of, U+2283' is not covered by the Symbol font encoding and is not included. + 8836: "⊄", // Not a subset of + 8838: "⊆", // Subset of or equal to + 8839: "⊇", // Superset of or equal to + 8853: "⊕", // Circled plus. Also known as direct sum + 8855: "⊗", // Circled times. Also known as vector product + 8869: "⊥", // Up tack. Also known as orthogonal to and perpendicular + 8901: "⋅", // Dot operator. The dot operator is not the same character as U+00B7 middle dot + // Miscellaneous Technical + 8968: "⌈", // Left ceiling. Also known as an APL upstile + 8969: "⌉", // Right ceiling + 8970: "⌊", // left floor. Also known as APL downstile + 8971: "⌋", // Right floor + 9001: "⟨", // Left-pointing angle bracket. Also known as bra. Lang is not the same character as U+003C 'less than'or U+2039 'single left-pointing angle quotation mark' + 9002: "⟩", // Right-pointing angle bracket. Also known as ket. Rang is not the same character as U+003E 'greater than' or U+203A 'single right-pointing angle quotation mark' + // Geometric Shapes + 9642: "▪", // Black small square + 9643: "▫", // White small square + 9674: "◊", // Lozenge + // Miscellaneous Symbols + 9702: "◦", // White bullet + 9824: "♠", // Black (filled) spade suit + 9827: "♣", // Black (filled) club suit. Also known as shamrock + 9829: "♥", // Black (filled) heart suit. Also known as shamrock + 9830: "♦" // Black (filled) diamond suit + } + + for (var i in entity_table) { + for (var i in entity_table) { + if (i != 38) { + string = string.replace(new RegExp(entity_table[i], "g"), String.fromCharCode(i)); + } + } + + string = string.replace(new RegExp("&#(x?)(\\d+);", "g"), function(match, p1, p2, string) { + + return String.fromCharCode(((p1 == 'x') ? parseInt(p2, 16) : p2)); + + }); + + string = string.replace(new RegExp(entity_table[38], "g"), String.fromCharCode(38)); + return string; + } + } +} diff --git a/github-header/info.json b/github-header/info.json new file mode 100644 index 0000000..d2d61c6 --- /dev/null +++ b/github-header/info.json @@ -0,0 +1,7 @@ +{ + "name": "GitHub Header", + "identifier": "github-header", + "script": "github-header.qml", + "version": 0.1, + "description" : "Inserts a headline and a link to the GitHub issue from an url in the clipboard into the current note", +}