File modules/editor/codemirror/src/util/misc.min.js
Last commit: Tue May 22 22:39:52 2018 +0200 Jan Dankert Fix für PHP 7.2: 'Object' darf nun nicht mehr als Klassennamen verwendet werden. AUCH NICHT IN EINEM NAMESPACE! WTF, wozu habe ich das in einen verfickten Namespace gepackt? Wozu soll der sonst da sein??? Amateure. Daher nun notgedrungen unbenannt in 'BaseObject'.
1 export function bind(f) { 2 let args = Array.prototype.slice.call(arguments, 1) 3 return function(){return f.apply(null, args)} 4 } 5 6 export function copyObj(obj, target, overwrite) { 7 if (!target) target = {} 8 for (let prop in obj) 9 if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) 10 target[prop] = obj[prop] 11 return target 12 } 13 14 // Counts the column offset in a string, taking tabs into account. 15 // Used mostly to find indentation. 16 export function countColumn(string, end, tabSize, startIndex, startValue) { 17 if (end == null) { 18 end = string.search(/[^\s\u00a0]/) 19 if (end == -1) end = string.length 20 } 21 for (let i = startIndex || 0, n = startValue || 0;;) { 22 let nextTab = string.indexOf("\t", i) 23 if (nextTab < 0 || nextTab >= end) 24 return n + (end - i) 25 n += nextTab - i 26 n += tabSize - (n % tabSize) 27 i = nextTab + 1 28 } 29 } 30 31 export class Delayed { 32 constructor() {this.id = null} 33 set(ms, f) { 34 clearTimeout(this.id) 35 this.id = setTimeout(f, ms) 36 } 37 } 38 39 export function indexOf(array, elt) { 40 for (let i = 0; i < array.length; ++i) 41 if (array[i] == elt) return i 42 return -1 43 } 44 45 // Number of pixels added to scroller and sizer to hide scrollbar 46 export let scrollerGap = 30 47 48 // Returned or thrown by various protocols to signal 'I'm not 49 // handling this'. 50 export let Pass = {toString: function(){return "CodeMirror.Pass"}} 51 52 // Reused option objects for setSelection & friends 53 export let sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"} 54 55 // The inverse of countColumn -- find the offset that corresponds to 56 // a particular column. 57 export function findColumn(string, goal, tabSize) { 58 for (let pos = 0, col = 0;;) { 59 let nextTab = string.indexOf("\t", pos) 60 if (nextTab == -1) nextTab = string.length 61 let skipped = nextTab - pos 62 if (nextTab == string.length || col + skipped >= goal) 63 return pos + Math.min(skipped, goal - col) 64 col += nextTab - pos 65 col += tabSize - (col % tabSize) 66 pos = nextTab + 1 67 if (col >= goal) return pos 68 } 69 } 70 71 let spaceStrs = [""] 72 export function spaceStr(n) { 73 while (spaceStrs.length <= n) 74 spaceStrs.push(lst(spaceStrs) + " ") 75 return spaceStrs[n] 76 } 77 78 export function lst(arr) { return arr[arr.length-1] } 79 80 export function map(array, f) { 81 let out = [] 82 for (let i = 0; i < array.length; i++) out[i] = f(array[i], i) 83 return out 84 } 85 86 export function insertSorted(array, value, score) { 87 let pos = 0, priority = score(value) 88 while (pos < array.length && score(array[pos]) <= priority) pos++ 89 array.splice(pos, 0, value) 90 } 91 92 function nothing() {} 93 94 export function createObj(base, props) { 95 let inst 96 if (Object.create) { 97 inst = Object.create(base) 98 } else { 99 nothing.prototype = base 100 inst = new nothing() 101 } 102 if (props) copyObj(props, inst) 103 return inst 104 } 105 106 let nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/ 107 export function isWordCharBasic(ch) { 108 return /\w/.test(ch) || ch > "\x80" && 109 (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) 110 } 111 export function isWordChar(ch, helper) { 112 if (!helper) return isWordCharBasic(ch) 113 if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true 114 return helper.test(ch) 115 } 116 117 export function isEmpty(obj) { 118 for (let n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false 119 return true 120 } 121 122 // Extending unicode characters. A series of a non-extending char + 123 // any number of extending chars is treated as a single unit as far 124 // as editing and measuring is concerned. This is not fully correct, 125 // since some scripts/fonts/browsers also treat other configurations 126 // of code points as a group. 127 let extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/ 128 export function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } 129 130 // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. 131 export function skipExtendingChars(str, pos, dir) { 132 while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) pos += dir 133 return pos 134 } 135 136 // Returns the value from the range [`from`; `to`] that satisfies 137 // `pred` and is closest to `from`. Assumes that at least `to` 138 // satisfies `pred`. Supports `from` being greater than `to`. 139 export function findFirst(pred, from, to) { 140 // At any point we are certain `to` satisfies `pred`, don't know 141 // whether `from` does. 142 let dir = from > to ? -1 : 1 143 for (;;) { 144 if (from == to) return from 145 let midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF) 146 if (mid == from) return pred(mid) ? from : to 147 if (pred(mid)) to = mid 148 else from = mid + dir 149 } 150 }
Downloadmodules/editor/codemirror/src/util/misc.min.js
History Tue, 22 May 2018 22:39:52 +0200 Jan Dankert Fix für PHP 7.2: 'Object' darf nun nicht mehr als Klassennamen verwendet werden. AUCH NICHT IN EINEM NAMESPACE! WTF, wozu habe ich das in einen verfickten Namespace gepackt? Wozu soll der sonst da sein??? Amateure. Daher nun notgedrungen unbenannt in 'BaseObject'.