syclink 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +33 -0
- data/LICENSE +21 -0
- data/README.md +191 -0
- data/README.rdoc +9 -0
- data/Rakefile +5 -0
- data/bin/syclink +290 -0
- data/doc/Gemfile.html +109 -0
- data/doc/Gemfile_lock.html +147 -0
- data/doc/LICENSE.html +129 -0
- data/doc/Object.html +188 -0
- data/doc/README_md.html +322 -0
- data/doc/README_rdoc.html +171 -0
- data/doc/SycLink/Designer.html +560 -0
- data/doc/SycLink/Exporter.html +149 -0
- data/doc/SycLink/Formatter.html +416 -0
- data/doc/SycLink/Infrastructure.html +297 -0
- data/doc/SycLink/Link.html +296 -0
- data/doc/SycLink/Website.html +428 -0
- data/doc/SycLink.html +127 -0
- data/doc/created.rid +31 -0
- data/doc/css/fonts.css +167 -0
- data/doc/css/rdoc.css +590 -0
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +131 -0
- data/doc/js/darkfish.js +161 -0
- data/doc/js/jquery.js +4 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +109 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +228 -0
- data/doc/js/searcher.js.gz +0 -0
- data/doc/links_csv.html +113 -0
- data/doc/setup_md.html +192 -0
- data/doc/syclink_gemspec.html +133 -0
- data/doc/syclink_rdoc.html +154 -0
- data/doc/table_of_contents.html +336 -0
- data/doc/templates/example_html.html +399 -0
- data/doc/templates/links.html +116 -0
- data/doc/templates/stylesheets/style_css.html +170 -0
- data/doc/templates/stylesheets/style_css_map.html +111 -0
- data/doc/templates/stylesheets/style_css_scss.html +198 -0
- data/doc/templates/syc-link_html.html +235 -0
- data/lib/syclink/designer.rb +97 -0
- data/lib/syclink/designer_example.rb +9 -0
- data/lib/syclink/exporter.rb +17 -0
- data/lib/syclink/formatter.rb +70 -0
- data/lib/syclink/infrastructure.rb +44 -0
- data/lib/syclink/link.rb +62 -0
- data/lib/syclink/version.rb +7 -0
- data/lib/syclink/website.rb +62 -0
- data/lib/syclink/website_example.rb +68 -0
- data/lib/syclink.rb +7 -0
- data/setup.md +92 -0
- data/spec/syclink/designer_spec.rb +100 -0
- data/spec/syclink/link_spec.rb +47 -0
- data/spec/syclink/website_spec.rb +75 -0
- data/syclink.gemspec +23 -0
- data/syclink.rdoc +39 -0
- data/templates/links +4 -0
- data/templates/stylesheets/style.css +55 -0
- data/templates/stylesheets/style.css.map +7 -0
- data/templates/stylesheets/style.css.scss +76 -0
- data/templates/syc-link.html +123 -0
- data/templates/syclink.html.erb +63 -0
- metadata +193 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Navigation allows movement using the arrow keys through the search results.
|
|
3
|
+
*
|
|
4
|
+
* When using this library you will need to set scrollIntoView to the
|
|
5
|
+
* appropriate function for your layout. Use scrollInWindow if the container
|
|
6
|
+
* is not scrollable and scrollInElement if the container is a separate
|
|
7
|
+
* scrolling region.
|
|
8
|
+
*/
|
|
9
|
+
Navigation = new function() {
|
|
10
|
+
this.initNavigation = function() {
|
|
11
|
+
var _this = this;
|
|
12
|
+
|
|
13
|
+
$(document).keydown(function(e) {
|
|
14
|
+
_this.onkeydown(e);
|
|
15
|
+
}).keyup(function(e) {
|
|
16
|
+
_this.onkeyup(e);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
this.navigationActive = true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
this.setNavigationActive = function(state) {
|
|
23
|
+
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
|
+
}
|
|
39
|
+
|
|
40
|
+
this.onkeydown = function(e) {
|
|
41
|
+
if (!this.navigationActive) return;
|
|
42
|
+
switch(e.keyCode) {
|
|
43
|
+
case 37: //Event.KEY_LEFT:
|
|
44
|
+
if (this.moveLeft()) e.preventDefault();
|
|
45
|
+
break;
|
|
46
|
+
case 38: //Event.KEY_UP:
|
|
47
|
+
if (e.keyCode == 38 || e.ctrlKey) {
|
|
48
|
+
if (this.moveUp()) e.preventDefault();
|
|
49
|
+
this.startMoveTimeout(false);
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case 39: //Event.KEY_RIGHT:
|
|
53
|
+
if (this.moveRight()) e.preventDefault();
|
|
54
|
+
break;
|
|
55
|
+
case 40: //Event.KEY_DOWN:
|
|
56
|
+
if (e.keyCode == 40 || e.ctrlKey) {
|
|
57
|
+
if (this.moveDown()) e.preventDefault();
|
|
58
|
+
this.startMoveTimeout(true);
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
case 13: //Event.KEY_RETURN:
|
|
62
|
+
if (this.$current)
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
this.select(this.$current);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
if (e.ctrlKey && e.shiftKey) this.select(this.$current);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
this.clearMoveTimeout = function() {
|
|
71
|
+
clearTimeout(this.moveTimeout);
|
|
72
|
+
this.moveTimeout = null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
this.startMoveTimeout = function(isDown) {
|
|
76
|
+
if (!$.browser.mozilla && !$.browser.opera) return;
|
|
77
|
+
if (this.moveTimeout) this.clearMoveTimeout();
|
|
78
|
+
var _this = this;
|
|
79
|
+
|
|
80
|
+
var go = function() {
|
|
81
|
+
if (!_this.moveTimeout) return;
|
|
82
|
+
_this[isDown ? 'moveDown' : 'moveUp']();
|
|
83
|
+
_this.moveTimout = setTimeout(go, 100);
|
|
84
|
+
}
|
|
85
|
+
this.moveTimeout = setTimeout(go, 200);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
this.moveRight = function() {
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
this.moveLeft = function() {
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
this.move = function(isDown) {
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
this.moveUp = function() {
|
|
98
|
+
return this.move(false);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
this.moveDown = function() {
|
|
102
|
+
return this.move(true);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Scrolls to the given element in the scrollable element view.
|
|
107
|
+
*/
|
|
108
|
+
this.scrollInElement = function(element, view) {
|
|
109
|
+
var offset, viewHeight, viewScroll, height;
|
|
110
|
+
offset = element.offsetTop;
|
|
111
|
+
height = element.offsetHeight;
|
|
112
|
+
viewHeight = view.offsetHeight;
|
|
113
|
+
viewScroll = view.scrollTop;
|
|
114
|
+
|
|
115
|
+
if (offset - viewScroll + height > viewHeight) {
|
|
116
|
+
view.scrollTop = offset - viewHeight + height;
|
|
117
|
+
}
|
|
118
|
+
if (offset < viewScroll) {
|
|
119
|
+
view.scrollTop = offset;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/*
|
|
124
|
+
* Scrolls to the given element in the window. The second argument is
|
|
125
|
+
* ignored
|
|
126
|
+
*/
|
|
127
|
+
this.scrollInWindow = function(element, ignored) {
|
|
128
|
+
var offset, viewHeight, viewScroll, height;
|
|
129
|
+
offset = element.offsetTop;
|
|
130
|
+
height = element.offsetHeight;
|
|
131
|
+
viewHeight = window.innerHeight;
|
|
132
|
+
viewScroll = window.scrollY;
|
|
133
|
+
|
|
134
|
+
if (offset - viewScroll + height > viewHeight) {
|
|
135
|
+
window.scrollTo(window.scrollX, offset - viewHeight + height);
|
|
136
|
+
}
|
|
137
|
+
if (offset < viewScroll) {
|
|
138
|
+
window.scrollTo(window.scrollX, offset);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
Binary file
|
data/doc/js/search.js
ADDED
|
@@ -0,0 +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
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var search_data = {"index":{"searchIndex":["object","syclink","designer","exporter","formatter","infrastructure","link","website","add_link()","add_link()","add_links_from_file()","contains?()","copy_file_if_missing()","create_directory_if_missing()","create_website()","cut()","delete_website()","extract_columns()","find_links()","find_links()","formatter_string()","html_file()","link_attribute_list()","links_group_by()","list_links()","list_links()","load_config()","load_website()","match?()","max_column_widths()","new()","new()","new_website()","print_header()","print_horizontal_line()","print_links()","print_table()","remove_link()","remove_links()","save_website()","table()","to_html()","update()","update_link()","yaml_file()","gemfile","gemfile.lock","license","readme","readme","links.csv","setup","syclink.gemspec","syclink","example.html","links","style.css","style.css.map","style.css.scss","syc-link.html"],"longSearchIndex":["object","syclink","syclink::designer","syclink::exporter","syclink::formatter","syclink::infrastructure","syclink::link","syclink::website","syclink::designer#add_link()","syclink::website#add_link()","syclink::designer#add_links_from_file()","syclink::link#contains?()","syclink::infrastructure#copy_file_if_missing()","syclink::infrastructure#create_directory_if_missing()","syclink::designer#create_website()","syclink::formatter#cut()","syclink::designer#delete_website()","syclink::formatter#extract_columns()","syclink::designer#find_links()","syclink::website#find_links()","syclink::formatter#formatter_string()","syclink::infrastructure#html_file()","syclink::website#link_attribute_list()","syclink::website#links_group_by()","syclink::designer#list_links()","syclink::website#list_links()","syclink::infrastructure#load_config()","syclink::designer#load_website()","syclink::link#match?()","syclink::formatter#max_column_widths()","syclink::link::new()","syclink::website::new()","syclink::designer#new_website()","syclink::formatter#print_header()","syclink::formatter#print_horizontal_line()","object#print_links()","syclink::formatter#print_table()","syclink::website#remove_link()","syclink::designer#remove_links()","syclink::designer#save_website()","syclink::formatter#table()","syclink::exporter#to_html()","syclink::link#update()","syclink::designer#update_link()","syclink::infrastructure#yaml_file()","","","","","","","","","","","","","","",""],"info":[["Object","","Object.html","",""],["SycLink","","SycLink.html","","<p>Module that creates a link list and generates an html representation\n<p>Module that creates a link list and …\n"],["SycLink::Designer","","SycLink/Designer.html","","<p>Creates a designer that acts as a proxy between the user and the website.\nThe designer will create a …\n"],["SycLink::Exporter","","SycLink/Exporter.html","","<p>Methods to export data into specific formats\n"],["SycLink::Formatter","","SycLink/Formatter.html","","<p>Methods to print data in a formatted way\n"],["SycLink::Infrastructure","","SycLink/Infrastructure.html","","<p>Helper methods to setup the infrastructure for syclink\n"],["SycLink::Link","","SycLink/Link.html","","<p>Creates a link with url, name, description and tag\n"],["SycLink::Website","","SycLink/Website.html","","<p>A Website is organizing a link list. The links can be added, updated and \nremoved. It is also possible …\n"],["add_link","SycLink::Designer","SycLink/Designer.html#method-i-add_link","(url, args = {})","<p>Adds a link based on the provided arguments to the website\n"],["add_link","SycLink::Website","SycLink/Website.html#method-i-add_link","(link)","<p>Add a link to the website\n"],["add_links_from_file","SycLink::Designer","SycLink/Designer.html#method-i-add_links_from_file","(file)","<p>Reads arguments from a CSV file and creates links accordingly. The links\nare added to the websie\n"],["contains?","SycLink::Link","SycLink/Link.html#method-i-contains-3F","(search)","<p>Checks whether the search string is contained in one or more of the\nattributes. If the search string …\n"],["copy_file_if_missing","SycLink::Infrastructure","SycLink/Infrastructure.html#method-i-copy_file_if_missing","(file, to_directory)","<p>Copies a file to a target directory\n"],["create_directory_if_missing","SycLink::Infrastructure","SycLink/Infrastructure.html#method-i-create_directory_if_missing","(directory)","<p>Creates a directory if it does not exist\n"],["create_website","SycLink::Designer","SycLink/Designer.html#method-i-create_website","(directory, template_filename)","<p>Creates the html representation of the website. The website is saved to the\ndirectory with websites title …\n"],["cut","SycLink::Formatter","SycLink/Formatter.html#method-i-cut","(string, size)","<p>Cuts the string down to the specified size\n"],["delete_website","SycLink::Designer","SycLink/Designer.html#method-i-delete_website","(directory)","<p>Deletes the website if it already exists\n"],["extract_columns","SycLink::Formatter","SycLink/Formatter.html#method-i-extract_columns","(rows, header)","<p>Extracts the columns to display in the table based on the header column\nnames\n"],["find_links","SycLink::Designer","SycLink/Designer.html#method-i-find_links","(search)","<p>Finds links based on a search string\n"],["find_links","SycLink::Website","SycLink/Website.html#method-i-find_links","(search)","<p>Finds all links that contain the search string\n"],["formatter_string","SycLink::Formatter","SycLink/Formatter.html#method-i-formatter_string","(widhts, separator)","<p>Creates a formatter string based on the widths and the column separator\n"],["html_file","SycLink::Infrastructure","SycLink/Infrastructure.html#method-i-html_file","(directory = '.', website)","<p>Creates an html filename to save the html representation of the website to\n"],["link_attribute_list","SycLink::Website","SycLink/Website.html#method-i-link_attribute_list","(attribute)","<p>List all attributes of the links\n"],["links_group_by","SycLink::Website","SycLink/Website.html#method-i-links_group_by","(attribute)","<p>Groups the links on the provided attribute\n"],["list_links","SycLink::Designer","SycLink/Designer.html#method-i-list_links","(args = {})","<p>List links contained in the website and optionally filter on attributes\n"],["list_links","SycLink::Website","SycLink/Website.html#method-i-list_links","(args = {})","<p>List links that match the attributes\n"],["load_config","SycLink::Infrastructure","SycLink/Infrastructure.html#method-i-load_config","(file)","<p>Loads the configuration from a file\n"],["load_website","SycLink::Designer","SycLink/Designer.html#method-i-load_website","(website)","<p>Loads a website based on the provided YAML-file and asigns it to the\ndesigner to operate on\n"],["match?","SycLink::Link","SycLink/Link.html#method-i-match-3F","(args)","<p>Checks whether the link matches the values provided by args and returns\ntrue if so otherwise false\n"],["max_column_widths","SycLink::Formatter","SycLink/Formatter.html#method-i-max_column_widths","(columns, header)","<p>Determines max column widths for each column based on the data and header\ncolumns\n"],["new","SycLink::Link","SycLink/Link.html#method-c-new","(url, params = {})","<p>Create a new link with url and params. If params are not provided defaults\nare used for name the url …\n"],["new","SycLink::Website","SycLink/Website.html#method-c-new","(title = \"Link List\")","<p>Create a new Website\n"],["new_website","SycLink::Designer","SycLink/Designer.html#method-i-new_website","(title = \"SYC LINK\")","<p>Creates a new website where designer can operate on\n"],["print_header","SycLink::Formatter","SycLink/Formatter.html#method-i-print_header","(header, formatter)","<p>Prints the table's header\n"],["print_horizontal_line","SycLink::Formatter","SycLink/Formatter.html#method-i-print_horizontal_line","(line, separator, widths)","<p>Prints a horizontal line below the header\n"],["print_links","Object","Object.html#method-i-print_links","(links, columns)",""],["print_table","SycLink::Formatter","SycLink/Formatter.html#method-i-print_table","(columns, formatter)","<p>Prints columns in a table format\n"],["remove_link","SycLink::Website","SycLink/Website.html#method-i-remove_link","(link)","<p>Remove a link from the website\n"],["remove_links","SycLink::Designer","SycLink/Designer.html#method-i-remove_links","(urls)","<p>Deletes one or more links from the website. Returns the deleted links.\nExpects the links provided in …\n"],["save_website","SycLink::Designer","SycLink/Designer.html#method-i-save_website","(directory)","<p>Saves the website to the specified directory with the downcased name of the\nwebsite and the extension …\n"],["table","SycLink::Formatter","SycLink/Formatter.html#method-i-table","(rows, header)","<p>Based on the rows provided and the header values a table is printed\n"],["to_html","SycLink::Exporter","SycLink/Exporter.html#method-i-to_html","(template)","<p>Creates an html file based on an erb template\n"],["update","SycLink::Link","SycLink/Link.html#method-i-update","(args)","<p>Updates the attributes of the link specified by args\n"],["update_link","SycLink::Designer","SycLink/Designer.html#method-i-update_link","(url, args)","<p>Updates a link. The link is identified by the URL. If there is more than\none link with the same URL, …\n"],["yaml_file","SycLink::Infrastructure","SycLink/Infrastructure.html#method-i-yaml_file","(directory = '.', website)","<p>Creates the filename of the website for saving, loading and deleting\n"],["Gemfile","","Gemfile.html","","<p>source 'rubygems.org' gemspec\n"],["Gemfile.lock","","Gemfile_lock.html","","<p>PATH\n\n<pre>remote: .\nspecs:\n syclink (0.0.1)\n gli (= 2.13.1)</pre>\n<p>GEM\n"],["LICENSE","","LICENSE.html","","<p>The MIT License (MIT)\n<p>Copyright © 2015 sugaryourcoffee\n<p>Permission is hereby granted, free of charge, …\n"],["README","","README_md.html","","<p>syclink\n<p><em>syclink</em> is a comand line application to create a website with a\nlink\ncollection. <em>syclink</em> allows ...\n"],["README","","README_rdoc.html","","<p>syclink\n<p>syclink can be used to create link list and turn them into an html \nrepresentation.\n<p>Detailed information …\n"],["links.csv","","links_csv.html","","<p>syc.dyndns.org:8080;Secondhand;Kinder- und Kleiderbörse;Sales\nsyc.dyndns.org:8081;Apptrack;Application …\n"],["setup","","setup_md.html","","<p>Create Directory Structure\n<p>We follow the <em>RubyGems</em> convention to organize a Ruby project. We\ncreate a\ndirectory ...\n"],["syclink.gemspec","","syclink_gemspec.html","","<p># Ensure we require the local version and not one we might have installed\nalready require File.join( …\n"],["syclink","","syclink_rdoc.html","","<p>syclink\n<p>NAME\n\n<pre>syclink - Create a link list and display it as an html page</pre>\n"],["example.html","","templates/example_html.html","","<p><!DOCTYPE html> <html lang=“en-CA”>\n\n<pre><head>\n <meta charset="utf-8">\n <title>Test</title> ...</pre>\n"],["links","","templates/links.html","","<p>example.com;Example;An example website;Web\nsyc.dyndns.org:8080;Secondhand;Kinderkleider- und Spielzeugbörse;Sales …\n"],["style.css","","templates/stylesheets/style_css.html","","<p>header#page_header {\n\n<pre>background-color: #888888;\ncolor: #fff;\nheight: 68px;\nmargin-bottom: 10px;\noverflow: ...</pre>\n"],["style.css.map","","templates/stylesheets/style_css_map.html","","<p>{ “version”: 3, “mappings”:\n“AAAA,kBAAmB;EACjB,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,IAAI;EACnB,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,SAAS;;AAGpB,kBAAmB;EACjB,gBAAgB,EAAE,OAAO;EACzB,aAAa,EAAE,kBAAkB;EACjC,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE,IAAI;EAEX,qBAAG;IACD,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,MAAM;IAEf,wBAAG;MACD,KAAK,EAAE,IAAI;MACX,mCAAa;QACX,KAAK,EAAE,KAAK;;AAMpB,UAAW;EACT,MAAM,EAAE,QAAQ;;AAGlB,YAAa;EACX,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,YAAY;;AAGtB,eAAgB;EACd,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,YAAY;EACpB,kBAAG;IACD,eAAe,EAAE,IAAI;;AAIzB,CAAE;EACA,eAAe,EAAE,IAAI;EACrB,OAAQ;IACN,eAAe,EAAE,SAAS;;AAI9B,KAAM;EAAG,eAAe,EAAE,QAAQ;EAChC,KAAK,EAAE,IAAI;EAEX,kBAAO;IACL,MAAM,EAAE,IAAI;EAGd,QAAG;IACD,gBAAgB,EAAE,OAAO;IACzB,KAAK,EAAa,IAAI;EAKpB,gCAAoB;IAClB,gBAAgB,EAAE,OAAO”,\n…\n"],["style.css.scss","","templates/stylesheets/style_css_scss.html","","<p>header#page_header {\n\n<pre>background-color: #888888;\ncolor: #fff;\nheight: 68px;\nmargin-bottom: 10px;\noverflow: ...</pre>\n"],["syc-link.html","","templates/syc-link_html.html","","<p><!DOCTYPE html> <html lang=“en-CA”>\n\n<pre><head>\n <meta charset="utf-8">\n <title>SYC ...</pre>\n"]]}}
|
|
Binary file
|
data/doc/js/searcher.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
Searcher = function(data) {
|
|
2
|
+
this.data = data;
|
|
3
|
+
this.handlers = [];
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
Searcher.prototype = new function() {
|
|
7
|
+
// search is performed in chunks of 1000 for non-blocking user input
|
|
8
|
+
var CHUNK_SIZE = 1000;
|
|
9
|
+
// do not try to find more than 100 results
|
|
10
|
+
var MAX_RESULTS = 100;
|
|
11
|
+
var huid = 1;
|
|
12
|
+
var suid = 1;
|
|
13
|
+
var runs = 0;
|
|
14
|
+
|
|
15
|
+
this.find = function(query) {
|
|
16
|
+
var queries = splitQuery(query);
|
|
17
|
+
var regexps = buildRegexps(queries);
|
|
18
|
+
var highlighters = buildHilighters(queries);
|
|
19
|
+
var state = { from: 0, pass: 0, limit: MAX_RESULTS, n: suid++};
|
|
20
|
+
var _this = this;
|
|
21
|
+
|
|
22
|
+
this.currentSuid = state.n;
|
|
23
|
+
|
|
24
|
+
if (!query) return;
|
|
25
|
+
|
|
26
|
+
var run = function() {
|
|
27
|
+
// stop current search thread if new search started
|
|
28
|
+
if (state.n != _this.currentSuid) return;
|
|
29
|
+
|
|
30
|
+
var results =
|
|
31
|
+
performSearch(_this.data, regexps, queries, highlighters, state);
|
|
32
|
+
var hasMore = (state.limit > 0 && state.pass < 4);
|
|
33
|
+
|
|
34
|
+
triggerResults.call(_this, results, !hasMore);
|
|
35
|
+
if (hasMore) {
|
|
36
|
+
setTimeout(run, 2);
|
|
37
|
+
}
|
|
38
|
+
runs++;
|
|
39
|
+
};
|
|
40
|
+
runs = 0;
|
|
41
|
+
|
|
42
|
+
// start search thread
|
|
43
|
+
run();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* ----- Events ------ */
|
|
47
|
+
this.ready = function(fn) {
|
|
48
|
+
fn.huid = huid;
|
|
49
|
+
this.handlers.push(fn);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ----- Utilities ------ */
|
|
53
|
+
function splitQuery(query) {
|
|
54
|
+
return jQuery.grep(query.split(/(\s+|::?|\(\)?)/), function(string) {
|
|
55
|
+
return string.match(/\S/)
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function buildRegexps(queries) {
|
|
60
|
+
return jQuery.map(queries, function(query) {
|
|
61
|
+
return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i')
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function buildHilighters(queries) {
|
|
66
|
+
return jQuery.map(queries, function(query) {
|
|
67
|
+
return jQuery.map(query.split(''), function(l, i) {
|
|
68
|
+
return '\u0001$' + (i*2+1) + '\u0002$' + (i*2+2);
|
|
69
|
+
}).join('');
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// function longMatchRegexp(index, longIndex, regexps) {
|
|
74
|
+
// for (var i = regexps.length - 1; i >= 0; i--){
|
|
75
|
+
// if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false;
|
|
76
|
+
// };
|
|
77
|
+
// return true;
|
|
78
|
+
// }
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
/* ----- Mathchers ------ */
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
* This record matches if the index starts with queries[0] and the record
|
|
85
|
+
* matches all of the regexps
|
|
86
|
+
*/
|
|
87
|
+
function matchPassBeginning(index, longIndex, queries, regexps) {
|
|
88
|
+
if (index.indexOf(queries[0]) != 0) return false;
|
|
89
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
|
90
|
+
if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
|
|
91
|
+
return false;
|
|
92
|
+
};
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* This record matches if the longIndex starts with queries[0] and the
|
|
98
|
+
* longIndex matches all of the regexps
|
|
99
|
+
*/
|
|
100
|
+
function matchPassLongIndex(index, longIndex, queries, regexps) {
|
|
101
|
+
if (longIndex.indexOf(queries[0]) != 0) return false;
|
|
102
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
|
103
|
+
if (!longIndex.match(regexps[i]))
|
|
104
|
+
return false;
|
|
105
|
+
};
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/*
|
|
110
|
+
* This record matches if the index contains queries[0] and the record
|
|
111
|
+
* matches all of the regexps
|
|
112
|
+
*/
|
|
113
|
+
function matchPassContains(index, longIndex, queries, regexps) {
|
|
114
|
+
if (index.indexOf(queries[0]) == -1) return false;
|
|
115
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
|
116
|
+
if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
|
|
117
|
+
return false;
|
|
118
|
+
};
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* This record matches if regexps[0] matches the index and the record
|
|
124
|
+
* matches all of the regexps
|
|
125
|
+
*/
|
|
126
|
+
function matchPassRegexp(index, longIndex, queries, regexps) {
|
|
127
|
+
if (!index.match(regexps[0])) return false;
|
|
128
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
|
129
|
+
if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
|
|
130
|
+
return false;
|
|
131
|
+
};
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
/* ----- Highlighters ------ */
|
|
137
|
+
function highlightRegexp(info, queries, regexps, highlighters) {
|
|
138
|
+
var result = createResult(info);
|
|
139
|
+
for (var i=0, l = regexps.length; i < l; i++) {
|
|
140
|
+
result.title = result.title.replace(regexps[i], highlighters[i]);
|
|
141
|
+
result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
|
|
142
|
+
};
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function hltSubstring(string, pos, length) {
|
|
147
|
+
return string.substring(0, pos) + '\u0001' + string.substring(pos, pos + length) + '\u0002' + string.substring(pos + length);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function highlightQuery(info, queries, regexps, highlighters) {
|
|
151
|
+
var result = createResult(info);
|
|
152
|
+
var pos = 0;
|
|
153
|
+
var lcTitle = result.title.toLowerCase();
|
|
154
|
+
|
|
155
|
+
pos = lcTitle.indexOf(queries[0]);
|
|
156
|
+
if (pos != -1) {
|
|
157
|
+
result.title = hltSubstring(result.title, pos, queries[0].length);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
result.namespace = result.namespace.replace(regexps[0], highlighters[0]);
|
|
161
|
+
for (var i=1, l = regexps.length; i < l; i++) {
|
|
162
|
+
result.title = result.title.replace(regexps[i], highlighters[i]);
|
|
163
|
+
result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
|
|
164
|
+
};
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function createResult(info) {
|
|
169
|
+
var result = {};
|
|
170
|
+
result.title = info[0];
|
|
171
|
+
result.namespace = info[1];
|
|
172
|
+
result.path = info[2];
|
|
173
|
+
result.params = info[3];
|
|
174
|
+
result.snippet = info[4];
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* ----- Searching ------ */
|
|
179
|
+
function performSearch(data, regexps, queries, highlighters, state) {
|
|
180
|
+
var searchIndex = data.searchIndex;
|
|
181
|
+
var longSearchIndex = data.longSearchIndex;
|
|
182
|
+
var info = data.info;
|
|
183
|
+
var result = [];
|
|
184
|
+
var i = state.from;
|
|
185
|
+
var l = searchIndex.length;
|
|
186
|
+
var togo = CHUNK_SIZE;
|
|
187
|
+
var matchFunc, hltFunc;
|
|
188
|
+
|
|
189
|
+
while (state.pass < 4 && state.limit > 0 && togo > 0) {
|
|
190
|
+
if (state.pass == 0) {
|
|
191
|
+
matchFunc = matchPassBeginning;
|
|
192
|
+
hltFunc = highlightQuery;
|
|
193
|
+
} else if (state.pass == 1) {
|
|
194
|
+
matchFunc = matchPassLongIndex;
|
|
195
|
+
hltFunc = highlightQuery;
|
|
196
|
+
} else if (state.pass == 2) {
|
|
197
|
+
matchFunc = matchPassContains;
|
|
198
|
+
hltFunc = highlightQuery;
|
|
199
|
+
} else if (state.pass == 3) {
|
|
200
|
+
matchFunc = matchPassRegexp;
|
|
201
|
+
hltFunc = highlightRegexp;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
for (; togo > 0 && i < l && state.limit > 0; i++, togo--) {
|
|
205
|
+
if (info[i].n == state.n) continue;
|
|
206
|
+
if (matchFunc(searchIndex[i], longSearchIndex[i], queries, regexps)) {
|
|
207
|
+
info[i].n = state.n;
|
|
208
|
+
result.push(hltFunc(info[i], queries, regexps, highlighters));
|
|
209
|
+
state.limit--;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
if (searchIndex.length <= i) {
|
|
213
|
+
state.pass++;
|
|
214
|
+
i = state.from = 0;
|
|
215
|
+
} else {
|
|
216
|
+
state.from = i;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function triggerResults(results, isLast) {
|
|
223
|
+
jQuery.each(this.handlers, function(i, fn) {
|
|
224
|
+
fn.call(this, results, isLast)
|
|
225
|
+
})
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
Binary file
|
data/doc/links_csv.html
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
|
|
3
|
+
<html>
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
|
|
7
|
+
<title>links.csv - RDoc Documentation</title>
|
|
8
|
+
|
|
9
|
+
<script type="text/javascript">
|
|
10
|
+
var rdoc_rel_prefix = "./";
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<script src="./js/jquery.js"></script>
|
|
14
|
+
<script src="./js/darkfish.js"></script>
|
|
15
|
+
|
|
16
|
+
<link href="./css/fonts.css" rel="stylesheet">
|
|
17
|
+
<link href="./css/rdoc.css" rel="stylesheet">
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
<body id="top" role="document" class="file">
|
|
22
|
+
<nav role="navigation">
|
|
23
|
+
<div id="project-navigation">
|
|
24
|
+
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
|
|
25
|
+
<h2>
|
|
26
|
+
<a href="./index.html" rel="home">Home</a>
|
|
27
|
+
</h2>
|
|
28
|
+
|
|
29
|
+
<div id="table-of-contents-navigation">
|
|
30
|
+
<a href="./table_of_contents.html#pages">Pages</a>
|
|
31
|
+
<a href="./table_of_contents.html#classes">Classes</a>
|
|
32
|
+
<a href="./table_of_contents.html#methods">Methods</a>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div id="search-section" role="search" class="project-section initially-hidden">
|
|
37
|
+
<form action="#" method="get" accept-charset="utf-8">
|
|
38
|
+
<div id="search-field-wrapper">
|
|
39
|
+
<input id="search-field" role="combobox" aria-label="Search"
|
|
40
|
+
aria-autocomplete="list" aria-controls="search-results"
|
|
41
|
+
type="text" name="search" placeholder="Search" spellcheck="false"
|
|
42
|
+
title="Type to search, Up and Down to navigate, Enter to load">
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<ul id="search-results" aria-label="Search Results"
|
|
46
|
+
aria-busy="false" aria-expanded="false"
|
|
47
|
+
aria-atomic="false" class="initially-hidden"></ul>
|
|
48
|
+
</form>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
<div id="project-metadata">
|
|
56
|
+
<div id="fileindex-section" class="nav-section">
|
|
57
|
+
<h3>Pages</h3>
|
|
58
|
+
|
|
59
|
+
<ul class="link-list">
|
|
60
|
+
|
|
61
|
+
<li><a href="./Gemfile.html">Gemfile</a>
|
|
62
|
+
|
|
63
|
+
<li><a href="./Gemfile_lock.html">Gemfile.lock</a>
|
|
64
|
+
|
|
65
|
+
<li><a href="./LICENSE.html">LICENSE</a>
|
|
66
|
+
|
|
67
|
+
<li><a href="./README_md.html">README</a>
|
|
68
|
+
|
|
69
|
+
<li><a href="./README_rdoc.html">README</a>
|
|
70
|
+
|
|
71
|
+
<li><a href="./links_csv.html">links.csv</a>
|
|
72
|
+
|
|
73
|
+
<li><a href="./setup_md.html">setup</a>
|
|
74
|
+
|
|
75
|
+
<li><a href="./syclink_gemspec.html">syclink.gemspec</a>
|
|
76
|
+
|
|
77
|
+
<li><a href="./syclink_rdoc.html">syclink</a>
|
|
78
|
+
|
|
79
|
+
<li><a href="./templates/example_html.html">example.html</a>
|
|
80
|
+
|
|
81
|
+
<li><a href="./templates/links.html">links</a>
|
|
82
|
+
|
|
83
|
+
<li><a href="./templates/stylesheets/style_css.html">style.css</a>
|
|
84
|
+
|
|
85
|
+
<li><a href="./templates/stylesheets/style_css_map.html">style.css.map</a>
|
|
86
|
+
|
|
87
|
+
<li><a href="./templates/stylesheets/style_css_scss.html">style.css.scss</a>
|
|
88
|
+
|
|
89
|
+
<li><a href="./templates/syc-link_html.html">syc-link.html</a>
|
|
90
|
+
|
|
91
|
+
</ul>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
</div>
|
|
95
|
+
</nav>
|
|
96
|
+
|
|
97
|
+
<main role="main" aria-label="Page links.csv">
|
|
98
|
+
|
|
99
|
+
<p><a
|
|
100
|
+
href="http://syc.dyndns.org:8080;Secondhand;Kinder">syc.dyndns.org:8080;Secondhand;Kinder</a>-
|
|
101
|
+
und Kleiderbörse;Sales <a
|
|
102
|
+
href="http://syc.dyndns.org:8081;Apptrack;Application">syc.dyndns.org:8081;Apptrack;Application</a>
|
|
103
|
+
Tracking made easy;Development</p>
|
|
104
|
+
</main>
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
<footer id="validator-badges" role="contentinfo">
|
|
109
|
+
<p><a href="http://validator.w3.org/check/referer">Validate</a>
|
|
110
|
+
<p>Generated by <a href="http://docs.seattlerb.org/rdoc/">RDoc</a> 4.2.0.
|
|
111
|
+
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
|
|
112
|
+
</footer>
|
|
113
|
+
|