wwwjdic 13.0.1 → 16.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +60 -1
  3. data/Gemfile +7 -1
  4. data/README.md +500 -225
  5. data/Rakefile +10 -3
  6. data/copyright.md +17 -29
  7. data/examples/basics.rb +53 -45
  8. data/examples/translate.rb +159 -86
  9. data/examples/uri.rb +46 -78
  10. data/html/CHANGELOG.html +90 -35
  11. data/html/COPYING_md.html +26 -38
  12. data/html/Gemfile.html +25 -35
  13. data/html/Object.html +838 -74
  14. data/html/README_md.html +322 -175
  15. data/html/Rakefile.html +28 -38
  16. data/html/WWWJDic.html +63 -104
  17. data/html/WWWJDic/ParsableDuckType.html +38 -58
  18. data/html/WWWJDic/Parser.html +52 -92
  19. data/html/WWWJDic/Parsers.html +29 -35
  20. data/html/WWWJDic/Parsers/Dict.html +50 -76
  21. data/html/WWWJDic/Parsers/Display.html +45 -69
  22. data/html/WWWJDic/Parsers/Key.html +46 -70
  23. data/html/WWWJDic/Parsers/Search.html +41 -61
  24. data/html/WWWJDic/Parsers/Server.html +45 -69
  25. data/html/WWWJDic/Splitter.html +81 -175
  26. data/html/WWWJDic/Utils.html +30 -36
  27. data/html/WWWJDic/Utils/Downloader.html +41 -41
  28. data/html/WWWJDic/Utils/Downloader/Downloader.html +65 -92
  29. data/html/WWWJDic/Utils/Raisers.html +46 -98
  30. data/html/WWWJDic/WWWJDic.html +166 -348
  31. data/html/copyright_md.html +219 -239
  32. data/html/created.rid +33 -58
  33. data/html/css/rdoc.css +638 -590
  34. data/html/index.html +313 -182
  35. data/html/js/darkfish.js +84 -161
  36. data/html/js/navigation.js +4 -40
  37. data/html/js/navigation.js.gz +0 -0
  38. data/html/js/search.js +109 -109
  39. data/html/js/search_index.js +1 -1
  40. data/html/js/search_index.js.gz +0 -0
  41. data/html/js/searcher.js +228 -229
  42. data/html/js/searcher.js.gz +0 -0
  43. data/html/table_of_contents.html +161 -200
  44. data/lib/wwwjdic.rb +14 -15
  45. data/lib/wwwjdic/application.rb +68 -36
  46. data/lib/wwwjdic/constants.rb +56 -12
  47. data/lib/wwwjdic/locales/de.yml +9 -4
  48. data/lib/wwwjdic/locales/en.yml +9 -4
  49. data/lib/wwwjdic/locales/es.yml +9 -4
  50. data/lib/wwwjdic/locales/fr.yml +9 -4
  51. data/lib/wwwjdic/locales/hu.yml +9 -4
  52. data/lib/wwwjdic/locales/it.yml +9 -4
  53. data/lib/wwwjdic/locales/ja.yml +11 -5
  54. data/lib/wwwjdic/locales/nl.yml +9 -4
  55. data/lib/wwwjdic/locales/ru.yml +9 -4
  56. data/lib/wwwjdic/locales/sl.yml +9 -4
  57. data/lib/wwwjdic/locales/sv.yml +9 -4
  58. data/lib/wwwjdic/parser.rb +13 -8
  59. data/lib/wwwjdic/parsers/dict.rb +11 -8
  60. data/lib/wwwjdic/parsers/display.rb +8 -3
  61. data/lib/wwwjdic/parsers/key.rb +9 -3
  62. data/lib/wwwjdic/parsers/search.rb +10 -3
  63. data/lib/wwwjdic/parsers/server.rb +8 -3
  64. data/lib/wwwjdic/utils/downloader.rb +37 -34
  65. data/lib/wwwjdic/utils/raisers.rb +12 -15
  66. data/lib/wwwjdic/utils/splitter.rb +32 -18
  67. data/lib/wwwjdic/version.rb +22 -8
  68. data/test/test_helper.rb +10 -1
  69. data/test/test_wwwjdic.rb +10 -4
  70. data/test/wwwjdic/locales/de.yml +9 -1
  71. data/test/wwwjdic/locales/en.yml +9 -1
  72. data/test/wwwjdic/locales/es.yml +9 -1
  73. data/test/wwwjdic/locales/fr.yml +9 -1
  74. data/test/wwwjdic/locales/hu.yml +9 -1
  75. data/test/wwwjdic/locales/it.yml +10 -1
  76. data/test/wwwjdic/locales/ja.yml +11 -2
  77. data/test/wwwjdic/locales/nl.yml +9 -1
  78. data/test/wwwjdic/locales/ru.yml +9 -1
  79. data/test/wwwjdic/locales/sl.yml +9 -1
  80. data/test/wwwjdic/locales/sv.yml +9 -1
  81. data/test/wwwjdic/locales/test_locales.rb +41 -24
  82. data/test/wwwjdic/parsers/test_dict.rb +65 -37
  83. data/test/wwwjdic/parsers/test_display.rb +11 -5
  84. data/test/wwwjdic/parsers/test_key.rb +10 -4
  85. data/test/wwwjdic/parsers/test_server.rb +11 -5
  86. data/test/wwwjdic/test_application.rb +199 -149
  87. data/test/wwwjdic/test_parsable_duck_type.rb +9 -5
  88. data/test/wwwjdic/utils/test_downloader.rb +7 -1
  89. data/test/wwwjdic/utils/test_raisers.rb +46 -29
  90. data/wwwjdic.gemspec +44 -26
  91. metadata +55 -43
  92. data/acknowledgements.md +0 -55
  93. data/authors.md +0 -67
  94. data/html/acknowledgements_md.html +0 -149
  95. data/html/authors_md.html +0 -181
  96. data/html/js/jquery.js +0 -4
  97. data/html/wwwjdic_gemspec.html +0 -161
data/html/js/darkfish.js CHANGED
@@ -1,161 +1,84 @@
1
- /**
2
- *
3
- * Darkfish Page Functions
4
- * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $
5
- *
6
- * Author: Michael Granger <mgranger@laika.com>
7
- *
8
- */
9
-
10
- /* Provide console simulation for firebug-less environments */
11
- if (!("console" in window) || !("firebug" in console)) {
12
- var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
13
- "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
14
-
15
- window.console = {};
16
- for (var i = 0; i < names.length; ++i)
17
- window.console[names[i]] = function() {};
18
- };
19
-
20
-
21
- /**
22
- * Unwrap the first element that matches the given @expr@ from the targets and return them.
23
- */
24
- $.fn.unwrap = function( expr ) {
25
- return this.each( function() {
26
- $(this).parents( expr ).eq( 0 ).after( this ).remove();
27
- });
28
- };
29
-
30
-
31
- function showSource( e ) {
32
- var target = e.target;
33
- var codeSections = $(target).
34
- parents('.method-detail').
35
- find('.method-source-code');
36
-
37
- $(target).
38
- parents('.method-detail').
39
- find('.method-source-code').
40
- slideToggle();
41
- };
42
-
43
- function hookSourceViews() {
44
- $('.method-heading').click( showSource );
45
- };
46
-
47
- function hookSearch() {
48
- var input = $('#search-field').eq(0);
49
- var result = $('#search-results').eq(0);
50
- $(result).show();
51
-
52
- var search_section = $('#search-section').get(0);
53
- $(search_section).show();
54
-
55
- var search = new Search(search_data, input, result);
56
-
57
- search.renderItem = function(result) {
58
- var li = document.createElement('li');
59
- var html = '';
60
-
61
- // TODO add relative path to <script> per-page
62
- html += '<p class="search-match"><a href="' + index_rel_prefix + result.path + '">' + this.hlt(result.title);
63
- if (result.params)
64
- html += '<span class="params">' + result.params + '</span>';
65
- html += '</a>';
66
-
67
-
68
- if (result.namespace)
69
- html += '<p class="search-namespace">' + this.hlt(result.namespace);
70
-
71
- if (result.snippet)
72
- html += '<div class="search-snippet">' + result.snippet + '</div>';
73
-
74
- li.innerHTML = html;
75
-
76
- return li;
77
- }
78
-
79
- search.select = function(result) {
80
- var result_element = result.get(0);
81
- window.location.href = result_element.firstChild.firstChild.href;
82
- }
83
-
84
- search.scrollIntoView = search.scrollInWindow;
85
- };
86
-
87
- function highlightTarget( anchor ) {
88
- console.debug( "Highlighting target '%s'.", anchor );
89
-
90
- $("a[name]").each( function() {
91
- if ( $(this).attr("name") == anchor ) {
92
- if ( !$(this).parent().parent().hasClass('target-section') ) {
93
- console.debug( "Wrapping the target-section" );
94
- $('div.method-detail').unwrap( 'div.target-section' );
95
- $(this).parent().wrap( '<div class="target-section"></div>' );
96
- } else {
97
- console.debug( "Already wrapped." );
98
- }
99
- }
100
- });
101
- };
102
-
103
- function highlightLocationTarget() {
104
- console.debug( "Location hash: %s", window.location.hash );
105
- if ( ! window.location.hash || window.location.hash.length == 0 ) return;
106
-
107
- var anchor = window.location.hash.substring(1);
108
- console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" );
109
-
110
- highlightTarget( anchor );
111
- };
112
-
113
- function highlightClickTarget( event ) {
114
- console.debug( "Highlighting click target for event %o", event.target );
115
- try {
116
- var anchor = $(event.target).attr( 'href' ).substring(1);
117
- console.debug( "Found target anchor: %s", anchor );
118
- highlightTarget( anchor );
119
- } catch ( err ) {
120
- console.error( "Exception while highlighting: %o", err );
121
- };
122
- };
123
-
124
- function loadAsync(path, success, prefix) {
125
- $.ajax({
126
- url: prefix + path,
127
- dataType: 'script',
128
- success: success,
129
- cache: true
130
- });
131
- };
132
-
133
- $(document).ready( function() {
134
- hookSourceViews();
135
- highlightLocationTarget();
136
- $('ul.link-list a').bind( "click", highlightClickTarget );
137
-
138
- var search_scripts_loaded = {
139
- navigation_loaded: false,
140
- search_loaded: false,
141
- search_index_loaded: false,
142
- searcher_loaded: false,
143
- }
144
-
145
- var search_success_function = function(variable) {
146
- return (function (data, status, xhr) {
147
- search_scripts_loaded[variable] = true;
148
-
149
- if (search_scripts_loaded['navigation_loaded'] == true &&
150
- search_scripts_loaded['search_loaded'] == true &&
151
- search_scripts_loaded['search_index_loaded'] == true &&
152
- search_scripts_loaded['searcher_loaded'] == true)
153
- hookSearch();
154
- });
155
- }
156
-
157
- loadAsync('js/navigation.js', search_success_function('navigation_loaded'), rdoc_rel_prefix);
158
- loadAsync('js/search.js', search_success_function('search_loaded'), rdoc_rel_prefix);
159
- loadAsync('js/search_index.js', search_success_function('search_index_loaded'), index_rel_prefix);
160
- loadAsync('js/searcher.js', search_success_function('searcher_loaded'), rdoc_rel_prefix);
161
- });
1
+ /**
2
+ *
3
+ * Darkfish Page Functions
4
+ * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $
5
+ *
6
+ * Author: Michael Granger <mgranger@laika.com>
7
+ *
8
+ */
9
+
10
+ /* Provide console simulation for firebug-less environments */
11
+ /*
12
+ if (!("console" in window) || !("firebug" in console)) {
13
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
14
+ "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
15
+
16
+ window.console = {};
17
+ for (var i = 0; i < names.length; ++i)
18
+ window.console[names[i]] = function() {};
19
+ };
20
+ */
21
+
22
+
23
+ function showSource( e ) {
24
+ var target = e.target;
25
+ while (!target.classList.contains('method-detail')) {
26
+ target = target.parentNode;
27
+ }
28
+ if (typeof target !== "undefined" && target !== null) {
29
+ target = target.querySelector('.method-source-code');
30
+ }
31
+ if (typeof target !== "undefined" && target !== null) {
32
+ target.classList.toggle('active-menu')
33
+ }
34
+ }
35
+
36
+ function hookSourceViews() {
37
+ document.querySelectorAll('.method-heading').forEach(function (codeObject) {
38
+ codeObject.addEventListener('click', showSource);
39
+ });
40
+ }
41
+
42
+ function hookSearch() {
43
+ var input = document.querySelector('#search-field');
44
+ var result = document.querySelector('#search-results');
45
+ result.classList.remove("initially-hidden");
46
+
47
+ var search_section = document.querySelector('#search-section');
48
+ search_section.classList.remove("initially-hidden");
49
+
50
+ var search = new Search(search_data, input, result);
51
+
52
+ search.renderItem = function(result) {
53
+ var li = document.createElement('li');
54
+ var html = '';
55
+
56
+ // TODO add relative path to <script> per-page
57
+ html += '<p class="search-match"><a href="' + index_rel_prefix + result.path + '">' + this.hlt(result.title);
58
+ if (result.params)
59
+ html += '<span class="params">' + result.params + '</span>';
60
+ html += '</a>';
61
+
62
+
63
+ if (result.namespace)
64
+ html += '<p class="search-namespace">' + this.hlt(result.namespace);
65
+
66
+ if (result.snippet)
67
+ html += '<div class="search-snippet">' + result.snippet + '</div>';
68
+
69
+ li.innerHTML = html;
70
+
71
+ return li;
72
+ }
73
+
74
+ search.select = function(result) {
75
+ window.location.href = result.firstChild.firstChild.href;
76
+ }
77
+
78
+ search.scrollIntoView = search.scrollInWindow;
79
+ }
80
+
81
+ document.addEventListener('DOMContentLoaded', function() {
82
+ hookSourceViews();
83
+ hookSearch();
84
+ });
@@ -10,10 +10,8 @@ Navigation = new function() {
10
10
  this.initNavigation = function() {
11
11
  var _this = this;
12
12
 
13
- $(document).keydown(function(e) {
13
+ document.addEventListener('keydown', function(e) {
14
14
  _this.onkeydown(e);
15
- }).keyup(function(e) {
16
- _this.onkeyup(e);
17
15
  });
18
16
 
19
17
  this.navigationActive = true;
@@ -21,20 +19,6 @@ Navigation = new function() {
21
19
 
22
20
  this.setNavigationActive = function(state) {
23
21
  this.navigationActive = state;
24
- this.clearMoveTimeout();
25
- }
26
-
27
- this.onkeyup = function(e) {
28
- if (!this.navigationActive) return;
29
-
30
- switch(e.keyCode) {
31
- case 37: //Event.KEY_LEFT:
32
- case 38: //Event.KEY_UP:
33
- case 39: //Event.KEY_RIGHT:
34
- case 40: //Event.KEY_DOWN:
35
- this.clearMoveTimeout();
36
- break;
37
- }
38
22
  }
39
23
 
40
24
  this.onkeydown = function(e) {
@@ -46,7 +30,6 @@ Navigation = new function() {
46
30
  case 38: //Event.KEY_UP:
47
31
  if (e.keyCode == 38 || e.ctrlKey) {
48
32
  if (this.moveUp()) e.preventDefault();
49
- this.startMoveTimeout(false);
50
33
  }
51
34
  break;
52
35
  case 39: //Event.KEY_RIGHT:
@@ -55,33 +38,14 @@ Navigation = new function() {
55
38
  case 40: //Event.KEY_DOWN:
56
39
  if (e.keyCode == 40 || e.ctrlKey) {
57
40
  if (this.moveDown()) e.preventDefault();
58
- this.startMoveTimeout(true);
59
41
  }
60
42
  break;
61
43
  case 13: //Event.KEY_RETURN:
62
- if (this.$current) e.preventDefault();
63
- this.select(this.$current);
44
+ if (this.current) e.preventDefault();
45
+ this.select(this.current);
64
46
  break;
65
47
  }
66
- if (e.ctrlKey && e.shiftKey) this.select(this.$current);
67
- }
68
-
69
- this.clearMoveTimeout = function() {
70
- clearTimeout(this.moveTimeout);
71
- this.moveTimeout = null;
72
- }
73
-
74
- this.startMoveTimeout = function(isDown) {
75
- if (!$.browser.mozilla && !$.browser.opera) return;
76
- if (this.moveTimeout) this.clearMoveTimeout();
77
- var _this = this;
78
-
79
- var go = function() {
80
- if (!_this.moveTimeout) return;
81
- _this[isDown ? 'moveDown' : 'moveUp']();
82
- _this.moveTimeout = setTimeout(go, 100);
83
- }
84
- this.moveTimeout = setTimeout(go, 200);
48
+ if (e.ctrlKey && e.shiftKey) this.select(this.current);
85
49
  }
86
50
 
87
51
  this.moveRight = function() {
Binary file
data/html/js/search.js CHANGED
@@ -1,109 +1,109 @@
1
- Search = function(data, input, result) {
2
- this.data = data;
3
- this.$input = $(input);
4
- this.$result = $(result);
5
-
6
- this.$current = null;
7
- this.$view = this.$result.parent();
8
- this.searcher = new Searcher(data.index);
9
- this.init();
10
- }
11
-
12
- Search.prototype = $.extend({}, Navigation, new function() {
13
- var suid = 1;
14
-
15
- this.init = function() {
16
- var _this = this;
17
- var observer = function(e) {
18
- switch(e.originalEvent.keyCode) {
19
- case 38: // Event.KEY_UP
20
- case 40: // Event.KEY_DOWN
21
- return;
22
- }
23
- _this.search(_this.$input[0].value);
24
- };
25
- this.$input.keyup(observer);
26
- this.$input.click(observer); // mac's clear field
27
-
28
- this.searcher.ready(function(results, isLast) {
29
- _this.addResults(results, isLast);
30
- })
31
-
32
- this.initNavigation();
33
- this.setNavigationActive(false);
34
- }
35
-
36
- this.search = function(value, selectFirstMatch) {
37
- value = jQuery.trim(value).toLowerCase();
38
- if (value) {
39
- this.setNavigationActive(true);
40
- } else {
41
- this.setNavigationActive(false);
42
- }
43
-
44
- if (value == '') {
45
- this.lastQuery = value;
46
- this.$result.empty();
47
- this.$result.attr('aria-expanded', 'false');
48
- this.setNavigationActive(false);
49
- } else if (value != this.lastQuery) {
50
- this.lastQuery = value;
51
- this.$result.attr('aria-busy', 'true');
52
- this.$result.attr('aria-expanded', 'true');
53
- this.firstRun = true;
54
- this.searcher.find(value);
55
- }
56
- }
57
-
58
- this.addResults = function(results, isLast) {
59
- var target = this.$result.get(0);
60
- if (this.firstRun && (results.length > 0 || isLast)) {
61
- this.$current = null;
62
- this.$result.empty();
63
- }
64
-
65
- for (var i=0, l = results.length; i < l; i++) {
66
- var item = this.renderItem.call(this, results[i]);
67
- item.setAttribute('id', 'search-result-' + target.childElementCount);
68
- target.appendChild(item);
69
- };
70
-
71
- if (this.firstRun && results.length > 0) {
72
- this.firstRun = false;
73
- this.$current = $(target.firstChild);
74
- this.$current.addClass('search-selected');
75
- }
76
- if (jQuery.browser.msie) this.$element[0].className += '';
77
-
78
- if (isLast) this.$result.attr('aria-busy', 'false');
79
- }
80
-
81
- this.move = function(isDown) {
82
- if (!this.$current) return;
83
- var $next = this.$current[isDown ? 'next' : 'prev']();
84
- if ($next.length) {
85
- this.$current.removeClass('search-selected');
86
- $next.addClass('search-selected');
87
- this.$input.attr('aria-activedescendant', $next.attr('id'));
88
- this.scrollIntoView($next[0], this.$view[0]);
89
- this.$current = $next;
90
- this.$input.val($next[0].firstChild.firstChild.text);
91
- this.$input.select();
92
- }
93
- return true;
94
- }
95
-
96
- this.hlt = function(html) {
97
- return this.escapeHTML(html).
98
- replace(/\u0001/g, '<em>').
99
- replace(/\u0002/g, '</em>');
100
- }
101
-
102
- this.escapeHTML = function(html) {
103
- return html.replace(/[&<>]/g, function(c) {
104
- return '&#' + c.charCodeAt(0) + ';';
105
- });
106
- }
107
-
108
- });
109
-
1
+ Search = function(data, input, result) {
2
+ this.data = data;
3
+ this.input = input;
4
+ this.result = result;
5
+
6
+ this.current = null;
7
+ this.view = this.result.parentNode;
8
+ this.searcher = new Searcher(data.index);
9
+ this.init();
10
+ }
11
+
12
+ Search.prototype = Object.assign({}, Navigation, new function() {
13
+ var suid = 1;
14
+
15
+ this.init = function() {
16
+ var _this = this;
17
+ var observer = function(e) {
18
+ switch(e.keyCode) {
19
+ case 38: // Event.KEY_UP
20
+ case 40: // Event.KEY_DOWN
21
+ return;
22
+ }
23
+ _this.search(_this.input.value);
24
+ };
25
+ this.input.addEventListener('keyup', observer);
26
+ this.input.addEventListener('click', observer); // mac's clear field
27
+
28
+ this.searcher.ready(function(results, isLast) {
29
+ _this.addResults(results, isLast);
30
+ })
31
+
32
+ this.initNavigation();
33
+ this.setNavigationActive(false);
34
+ }
35
+
36
+ this.search = function(value, selectFirstMatch) {
37
+ value = value.trim().toLowerCase();
38
+ if (value) {
39
+ this.setNavigationActive(true);
40
+ } else {
41
+ this.setNavigationActive(false);
42
+ }
43
+
44
+ if (value == '') {
45
+ this.lastQuery = value;
46
+ this.result.innerHTML = '';
47
+ this.result.setAttribute('aria-expanded', 'false');
48
+ this.setNavigationActive(false);
49
+ } else if (value != this.lastQuery) {
50
+ this.lastQuery = value;
51
+ this.result.setAttribute('aria-busy', 'true');
52
+ this.result.setAttribute('aria-expanded', 'true');
53
+ this.firstRun = true;
54
+ this.searcher.find(value);
55
+ }
56
+ }
57
+
58
+ this.addResults = function(results, isLast) {
59
+ var target = this.result;
60
+ if (this.firstRun && (results.length > 0 || isLast)) {
61
+ this.current = null;
62
+ this.result.innerHTML = '';
63
+ }
64
+
65
+ for (var i=0, l = results.length; i < l; i++) {
66
+ var item = this.renderItem.call(this, results[i]);
67
+ item.setAttribute('id', 'search-result-' + target.childElementCount);
68
+ target.appendChild(item);
69
+ }
70
+
71
+ if (this.firstRun && results.length > 0) {
72
+ this.firstRun = false;
73
+ this.current = target.firstChild;
74
+ this.current.classList.add('search-selected');
75
+ }
76
+ //TODO: ECMAScript
77
+ //if (jQuery.browser.msie) this.$element[0].className += '';
78
+
79
+ if (isLast) this.result.setAttribute('aria-busy', 'false');
80
+ }
81
+
82
+ this.move = function(isDown) {
83
+ if (!this.current) return;
84
+ var next = isDown ? this.current.nextElementSibling : this.current.previousElementSibling;
85
+ if (next) {
86
+ this.current.classList.remove('search-selected');
87
+ next.classList.add('search-selected');
88
+ this.input.setAttribute('aria-activedescendant', next.getAttribute('id'));
89
+ this.scrollIntoView(next, this.view);
90
+ this.current = next;
91
+ this.input.value = next.firstChild.firstChild.text;
92
+ this.input.select();
93
+ }
94
+ return true;
95
+ }
96
+
97
+ this.hlt = function(html) {
98
+ return this.escapeHTML(html).
99
+ replace(/\u0001/g, '<em>').
100
+ replace(/\u0002/g, '</em>');
101
+ }
102
+
103
+ this.escapeHTML = function(html) {
104
+ return html.replace(/[&<>]/g, function(c) {
105
+ return '&#' + c.charCodeAt(0) + ';';
106
+ });
107
+ }
108
+
109
+ });