diff options
Diffstat (limited to 'apps/comments/js/vendor/At.js/src/default.coffee')
-rw-r--r-- | apps/comments/js/vendor/At.js/src/default.coffee | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/apps/comments/js/vendor/At.js/src/default.coffee b/apps/comments/js/vendor/At.js/src/default.coffee new file mode 100644 index 00000000000..f8c64a9fe18 --- /dev/null +++ b/apps/comments/js/vendor/At.js/src/default.coffee @@ -0,0 +1,147 @@ +KEY_CODE = + ESC: 27 + TAB: 9 + ENTER: 13 + CTRL: 17 + A: 65 + P: 80 + N: 78 + LEFT: 37 + UP:38 + RIGHT: 39 + DOWN: 40 + BACKSPACE: 8 + SPACE: 32 + +# Functions set for handling and rendering the data. +# Others developers can override these methods to tweak At.js such as matcher. +# We can override them in `callbacks` settings. +# +# @mixin +# +# The context of these functions is `$.atwho.Controller` object and they are called in this sequences: +# +# [beforeSave, matcher, filter, remoteFilter, sorter, tplEvl, highlighter, beforeInsert, afterMatchFailed] +# +DEFAULT_CALLBACKS = + + # It would be called to restructure the data before At.js invokes `Model#save` to save data + # By default, At.js will convert it to a Hash Array. + # + # @param data [Array] data to refacotor. + # @return [Array] Data after refactor. + beforeSave: (data) -> + Controller.arrayToDefaultHash data + + # It would be called to match the `flag`. + # It will match at start of line or after whitespace + # + # @param flag [String] current `flag` ("@", etc) + # @param subtext [String] Text from start to current caret position. + # @param should_startWithSpace [boolean] accept white space as beginning of match. + # @param acceptSpaceBar [boolean] accept a space bar in the center of match, + # so you can match a first and last name, for ex. + # + # @return [String | null] Matched result. + matcher: (flag, subtext, should_startWithSpace, acceptSpaceBar) -> + # escape RegExp + flag = flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + flag = '(?:^|\\s)' + flag if should_startWithSpace + + # À + _a = decodeURI("%C3%80") + # ÿ + _y = decodeURI("%C3%BF") + space = if acceptSpaceBar then "\ " else "" + regexp = new RegExp "#{flag}([A-Za-z#{_a}-#{_y}0-9_#{space}\'\.\+\-]*)$|#{flag}([^\\x00-\\xff]*)$",'gi' + match = regexp.exec subtext + if match then match[2] || match[1] else null + + # --------------------- + + # Filter data by matched string. + # + # @param query [String] Matched string. + # @param data [Array] data list + # @param searchKey [String] at char for searching. + # + # @return [Array] result data. + filter: (query, data, searchKey) -> + # !!null #=> false; !!undefined #=> false; !!'' #=> false; + _results = [] + for item in data + _results.push item if ~new String(item[searchKey]).toLowerCase().indexOf query.toLowerCase() + _results + + # If a function is given, At.js will invoke it if local filter can not find any data + # + # @param params [String] matched query + # @param callback [Function] callback to render page. + remoteFilter: null + # remoteFilter: (query, callback) -> + # $.ajax url, + # data: params + # success: (data) -> + # callback(data) + + # Sorter data of course. + # + # @param query [String] matched string + # @param items [Array] data that was refactored + # @param searchKey [String] at char to search + # + # @return [Array] sorted data + sorter: (query, items, searchKey) -> + return items unless query + + _results = [] + for item in items + item.atwho_order = new String(item[searchKey]).toLowerCase().indexOf query.toLowerCase() + _results.push item if item.atwho_order > -1 + + _results.sort (a,b) -> a.atwho_order - b.atwho_order + + # Evaluate the template either as a string or as a function + # this allows someone to pass in a set of data that needs a + # different template for different data results + # + # @param tpl [function] the template function or string + # @param map [Hash] Data map to eval. + tplEval: (tpl, map) -> + template = tpl + try + template = tpl(map) unless typeof tpl == 'string' + template.replace /\$\{([^\}]*)\}/g, (tag, key, pos) -> map[key] + catch error + "" + + + # Highlight the `matched query` string. + # + # @param li [String] HTML String after eval. + # @param query [String] matched query. + # + # @return [String] highlighted string. + highlighter: (li, query) -> + return li if not query + regexp = new RegExp(">\\s*([^\<]*?)(" + query.replace("+","\\+") + ")([^\<]*)\\s*<", 'ig') + li.replace regexp, (str, $1, $2, $3) -> '> '+$1+'<strong>' + $2 + '</strong>'+$3+' <' + + # What to do before inserting item's value into inputor. + # + # @param value [String] content to insert + # @param $li [jQuery Object] the chosen item + # @param e [event Object] from the user selection (keyDown or click) + beforeInsert: (value, $li, e) -> + value + + # You can adjust the menu's offset here. + # + # @param offset [Hash] offset will be applied to menu + # beforeReposition: (offset) -> + # offset.left += 10 + # offset.top += 10 + # offset + beforeReposition: (offset) -> offset + + afterMatchFailed: (at, el) -> |