webgen-tipue_search-bundle 1.0.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MDQyNWZhZGM2NDVhYjUyYjRkMjBjYzc3ZDMyMDlkMDhjOWNlZGRmNg==
5
+ data.tar.gz: !binary |-
6
+ ZTBkYjhmNTAwYWNkZGUxYzA1NzA5MWZmNGY5NTgxMDZiNjk3OWNlMw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NDNkNWFiOWJhODkxMmRkYThmOGMwMTljNGJjM2E2MjM2MjllNWY1NzM3NDk4
10
+ YzhmY2IwYjRmMjFmNjkxNzRmZjZlNzIxNDRiNjRmNWQ1NzUwN2YyNGU0NDUx
11
+ OGRlYTkxOTkzMjNlYzY5OWE4MWEyOTY4M2RkOTk3NGI4MmM5MmQ=
12
+ data.tar.gz: !binary |-
13
+ NGE0N2ViZjgwYzI4M2Q3ODYwZjg2YjJlMmRjZGFjNWEyZWI4YjEyMGQ5NWIz
14
+ Y2FhNTA0MzQ5NmJiY2JiNWQ3NzgzY2QwMGVjODE4M2YxMDQ0OGNmZTRkNWQ2
15
+ Mzk5NzNkMGIwMjg1OWZkYzQxZDdkY2VhZmRmYjg3MDQwYmI4NjU=
@@ -0,0 +1,3 @@
1
+ # 2013-08-25, Version 1.0.0
2
+
3
+ - Initial release with Tipue Search 3.0.1
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Thomas Leitner
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a
4
+ copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included
12
+ in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,20 @@
1
+ Tipue Search Copyright (c) 2012 Tipue
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,123 @@
1
+ # Tipue Search integration for [webgen]
2
+
3
+ [Tipue Search] is a site search engine which uses jQuery. It provides
4
+ three modes of operation:
5
+
6
+ * live mode where one supplies a list of URLs which are then searched
7
+ (not very fast, needs a web server),
8
+
9
+ * json mode where the search data is loaded via an Ajax request (still
10
+ needs a web server) and
11
+
12
+ * static mode where the search data is loaded directly by the HTML file
13
+ (fast, no web server needed).
14
+
15
+ [Tipue Search]: http://www.tipue.com/search/
16
+ [webgen]: http://webgen.rubyforge.org
17
+
18
+
19
+ # Usage
20
+
21
+ ## Provided Paths
22
+
23
+ This [webgen] extension bundle contains all needed Tipue Search files
24
+ except jQuery. Remember that one needs to load the jQuery library before
25
+ Tipue Search!
26
+
27
+ The Tipue Search files are provided as passive paths at the following
28
+ locations:
29
+
30
+ * `/javascriptss/tipue_search/tipuesearch.min.js` - the main Tipue
31
+ Search javascript file
32
+
33
+ * `/javascripts/tipue_search/tipuesearch_set.js` - defines stop and
34
+ replacement words as well as word stems
35
+
36
+ * `/stylesheets/tipue_search/tipuesearch.css` - the CSS file that includes the
37
+ necessary styles
38
+
39
+ * `/stylesheets/tipue_search/img/loader.gif`,
40
+ `/stylesheets/tipue_search/img/link.png`,
41
+ `/stylesheets/tipue_search/img/search.gif,
42
+ `/stylesheets/tipue_search/img/expand.png` - images needed by the CSS
43
+ file
44
+
45
+ Additionally, the following paths are provided:
46
+
47
+ * `/templates/tipue_search.template` - provides the blocks for rendering
48
+ the tag and the path handler contents
49
+
50
+
51
+ ## Easy Usage
52
+
53
+ Tipue Search can easily be integrated into a webgen website by using the
54
+ included `tipue_search` tag:
55
+
56
+ {tipue_search: {path: data.js, options: {mode: static},
57
+ nodes: {alcn: /**/*.html}}}
58
+
59
+ The option `options` can be used to set any [Tipue Search
60
+ option][tipuset] and the option `nodes` specifies the nodes that should
61
+ appear in the search index (more information on this below).
62
+
63
+ If this tag occurs on a page, the needed nodes are automatically linked
64
+ to it and a new node representing the search index at the specified path
65
+ is created.
66
+
67
+ [tipueset]: http://www.tipue.com/search/docs/set/
68
+
69
+
70
+ ## Manual Usage
71
+
72
+ It is also possible to craft the needed HTML fragments manually and just
73
+ use this extension for providing the necessary files. If you want to use
74
+ it this way, have a look at the [Tipue Search documentation][tipuedoc]
75
+
76
+ A search index node can be created by the path handler `tipue_search`
77
+ which uses paths in Webgen Page Format. Since no path extension is
78
+ registered for it, you need to explicitly specify the `handler` meta
79
+ information for a path that should be handled by the tipue_search
80
+ handler via a meta information path.
81
+
82
+ The following meta information on a tipue search node should be set:
83
+
84
+ * `entries` (mandatory): The node finder option set specifying the nodes
85
+ that should be used for the search index. It is assumed that the nodes
86
+ are valid HTML files.
87
+
88
+ * `mode` (mandatory): The Tipue Search mode (static, live or json).
89
+
90
+ * `content_css`: A CSS query for selecting the elements that contain the
91
+ text that should be indexed. Default is `body`.
92
+
93
+ The template which defines the content of a search index node can be
94
+ customized by adding a content block named 'tipue_search' to the path.
95
+
96
+ [tipuedoc]: http://www.tipue.com/search/docs/
97
+
98
+
99
+
100
+ # Installation
101
+
102
+ The easiest way to install this extension bundle is by installing the
103
+ corresponding Rubygem:
104
+
105
+ gem install webgen-tipue_search-bundle
106
+
107
+ If you don't use Rubygems, copy the folder
108
+ `lib/webgen/bundle/tipue_search` into your `ext` directory.
109
+
110
+ After that you just need to tell webgen to use this extension bundle by
111
+ adding the following line to your `ext/init.rb` file:
112
+
113
+ load("tipue_search")
114
+
115
+
116
+ # Copyright and license
117
+
118
+ Copyright (c) 2013 Thomas Leitner under the MIT License (see LICENSE)
119
+
120
+ * * *
121
+
122
+ The included Tipue Search files are also licensed under the MIT (see
123
+ LICENSE-TIPUESEARCH).
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,12 @@
1
+ (function($){$.fn.tipuesearch=function(options){var set=$.extend({"show":7,"newWindow":false,"showURL":true,"minimumLength":3,"descriptiveWords":25,"highlightTerms":true,"highlightEveryTerm":false,"mode":"static","liveDescription":"*","liveContent":"*","contentLocation":"tipuesearch/tipuesearch_content.json"},options);return this.each(function(){var tipuesearch_in={pages:[]};$.ajaxSetup({async:false});if(set.mode=="live")for(var i=0;i<tipuesearch_pages.length;i++)$.get(tipuesearch_pages[i],"",function(html){var cont=
2
+ $(set.liveContent,html).text();cont=cont.replace(/\s+/g," ");var desc=$(set.liveDescription,html).text();desc=desc.replace(/\s+/g," ");var t_1=html.toLowerCase().indexOf("<title>");var t_2=html.toLowerCase().indexOf("</title>",t_1+7);if(t_1!=-1&&t_2!=-1)var tit=html.slice(t_1+7,t_2);else var tit="No title";tipuesearch_in.pages.push({"title":tit,"text":desc,"tags":cont,"loc":tipuesearch_pages[i]})});if(set.mode=="json")$.getJSON(set.contentLocation,function(json){tipuesearch_in=$.extend({},json)});
3
+ if(set.mode=="static")tipuesearch_in=$.extend({},tipuesearch);var tipue_search_w="";if(set.newWindow)tipue_search_w=' target="_blank"';function getURLP(name){return decodeURIComponent(((new RegExp("[?|&]"+name+"="+"([^&;]+?)(&|#|;|$)")).exec(location.search)||[,""])[1].replace(/\+/g,"%20"))||null}if(getURLP("q")){$("#tipue_search_input").val(getURLP("q"));getTipueSearch(0,true)}$("#tipue_search_button").click(function(){getTipueSearch(0,true)});$(this).keyup(function(event){if(event.keyCode=="13")getTipueSearch(0,
4
+ true)});function getTipueSearch(start,replace){$("#tipue_search_content").hide();var out="";var results="";var show_replace=false;var show_stop=false;var d=$("#tipue_search_input").val().toLowerCase();d=$.trim(d);var d_w=d.split(" ");d="";for(var i=0;i<d_w.length;i++){var a_w=true;for(var f=0;f<tipuesearch_stop_words.length;f++)if(d_w[i]==tipuesearch_stop_words[f]){a_w=false;show_stop=true}if(a_w)d=d+" "+d_w[i]}d=$.trim(d);d_w=d.split(" ");if(d.length>=set.minimumLength){if(replace){var d_r=d;for(var i=
5
+ 0;i<d_w.length;i++)for(var f=0;f<tipuesearch_replace.words.length;f++)if(d_w[i]==tipuesearch_replace.words[f].word){d=d.replace(d_w[i],tipuesearch_replace.words[f].replace_with);show_replace=true}d_w=d.split(" ")}var d_t=d;for(var i=0;i<d_w.length;i++)for(var f=0;f<tipuesearch_stem.words.length;f++)if(d_w[i]==tipuesearch_stem.words[f].word)d_t=d_t+" "+tipuesearch_stem.words[f].stem;d_w=d_t.split(" ");var c=0;found=new Array;for(var i=0;i<tipuesearch_in.pages.length;i++){var score=1E9;var s_t=tipuesearch_in.pages[i].text;
6
+ for(var f=0;f<d_w.length;f++){var pat=new RegExp(d_w[f],"i");if(tipuesearch_in.pages[i].title.search(pat)!=-1)score-=2E5-i;if(tipuesearch_in.pages[i].text.search(pat)!=-1)score-=15E4-i;if(set.highlightTerms){if(set.highlightEveryTerm)var patr=new RegExp("("+d_w[f]+")","gi");else var patr=new RegExp("("+d_w[f]+")","i");s_t=s_t.replace(patr,"<b>$1</b>")}if(tipuesearch_in.pages[i].tags.search(pat)!=-1)score-=1E5-i}if(score<1E9)found[c++]=score+"^"+tipuesearch_in.pages[i].title+"^"+s_t+"^"+tipuesearch_in.pages[i].loc}if(c!=
7
+ 0){if(show_replace==1){out+='<div id="tipue_search_warning_head">Showing results for '+d+"</div>";out+='<div id="tipue_search_warning">Search for <a href="javascript:void(0)" id="tipue_search_replaced">'+d_r+"</a></div>"}if(c==1)out+='<div id="tipue_search_results_count">1 result</div>';else{c_c=c.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",");out+='<div id="tipue_search_results_count">'+c_c+" results</div>"}found.sort();var l_o=0;for(var i=0;i<found.length;i++){var fo=found[i].split("^");if(l_o>=
8
+ start&&l_o<set.show+start){out+='<div class="tipue_search_content_title"><a href="'+fo[3]+'"'+tipue_search_w+">"+fo[1]+"</a></div>";var t=fo[2];var t_d="";var t_w=t.split(" ");if(t_w.length<set.descriptiveWords)t_d=t;else for(var f=0;f<set.descriptiveWords;f++)t_d+=t_w[f]+" ";t_d=$.trim(t_d);if(t_d.charAt(t_d.length-1)!=".")t_d+=" ...";out+='<div class="tipue_search_content_text">'+t_d+"</div>";if(set.showURL){t_url=fo[3];if(t_url.length>45)t_url=fo[3].substr(0,45)+" ...";out+='<div class="tipue_search_content_loc"><a href="'+
9
+ fo[3]+'"'+tipue_search_w+">"+t_url+"</a></div>"}}l_o++}if(c>set.show){var pages=Math.ceil(c/set.show);var page=start/set.show;out+='<div id="tipue_search_foot"><ul id="tipue_search_foot_boxes">';if(start>0)out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+(start-set.show)+"_"+replace+'">Prev</a></li>';if(page<=2){var p_b=pages;if(pages>3)p_b=3;for(var f=0;f<p_b;f++)if(f==page)out+='<li class="current">'+(f+1)+"</li>";else out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+
10
+ f*set.show+"_"+replace+'">'+(f+1)+"</a></li>"}else{var p_b=page+3;if(p_b>pages)p_b=pages;for(var f=page;f<p_b;f++)if(f==page)out+='<li class="current">'+(f+1)+"</li>";else out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+f*set.show+"_"+replace+'">'+(f+1)+"</a></li>"}if(page+1!=pages)out+='<li><a href="javascript:void(0)" class="tipue_search_foot_box" id="'+(start+set.show)+"_"+replace+'">Next</a></li>';out+="</ul></div>"}}else out+='<div id="tipue_search_warning_head">Nothing found</div>'}else if(show_stop)out+=
11
+ '<div id="tipue_search_warning_head">Nothing found</div><div id="tipue_search_warning">Common words are largely ignored</div>';else{out+='<div id="tipue_search_warning_head">Search too short</div>';if(set.minimumLength==1)out+='<div id="tipue_search_warning">Should be one character or more</div>';else out+='<div id="tipue_search_warning">Should be '+set.minimumLength+" characters or more</div>"}$("#tipue_search_content").html(out);$("#tipue_search_content").slideDown(200);$("#tipue_search_replaced").click(function(){getTipueSearch(0,
12
+ false)});$(".tipue_search_foot_box").click(function(){var id_v=$(this).attr("id");var id_a=id_v.split("_");getTipueSearch(parseInt(id_a[0]),id_a[1])})}})}})(jQuery);
@@ -0,0 +1,23 @@
1
+
2
+ /*
3
+ Tipue Search 3.0.1
4
+ Copyright (c) 2013 Tipue
5
+ Tipue Search is released under the MIT License
6
+ http://www.tipue.com/search
7
+ */
8
+
9
+
10
+ var tipuesearch_stop_words = ["and", "be", "by", "do", "for", "he", "how", "if", "is", "it", "my", "not", "of", "or", "the", "to", "up", "what", "when"];
11
+
12
+ var tipuesearch_replace = {"words": [
13
+ {"word": "tipua", replace_with: "tipue"},
14
+ {"word": "javscript", replace_with: "javascript"}
15
+ ]};
16
+
17
+ var tipuesearch_stem = {"words": [
18
+ {"word": "e-mail", stem: "email"},
19
+ {"word": "javascript", stem: "script"},
20
+ {"word": "javascript", stem: "js"}
21
+ ]};
22
+
23
+
@@ -0,0 +1,4 @@
1
+ --- paths
2
+ tipuesearch.css:
3
+ handler: copy
4
+ pipeline: erb
@@ -0,0 +1,159 @@
1
+
2
+ /*
3
+ Tipue Search 3.0.1
4
+ Copyright (c) 2013 Tipue
5
+ Tipue Search is released under the MIT License
6
+ http://www.tipue.com/search
7
+ */
8
+
9
+
10
+ #tipue_search_input
11
+ {
12
+ font: 12px/1.7 'open sans', sans-serif;
13
+ color: #333;
14
+ padding: 7px;
15
+ width: 150px;
16
+ border: 1px solid #e2e2e2;
17
+ border-radius: 0;
18
+ -moz-appearance: none;
19
+ -webkit-appearance: none;
20
+ box-shadow: none;
21
+ outline: 0;
22
+ margin: 0;
23
+ }
24
+ #tipue_search_input:focus
25
+ {
26
+ border: 1px solid #ccc;
27
+ }
28
+ #tipue_search_button
29
+ {
30
+ width: 70px;
31
+ height: 36px;
32
+ border: 0;
33
+ border-radius: 1px;
34
+ background: #5193fb url('<%= context.tag("relocatable", "img/search.gif") %>') no-repeat center;
35
+ outline: none;
36
+ }
37
+ #tipue_search_button:hover
38
+ {
39
+ background-color: #4589fb;
40
+ }
41
+
42
+ #tipue_search_content
43
+ {
44
+ clear: left;
45
+ max-width: 650px;
46
+ padding: 25px 0 13px 0;
47
+ margin: 0;
48
+ }
49
+ #tipue_search_loading
50
+ {
51
+ padding-top: 60px;
52
+ background: #fff url('<%= context.tag("relocatable", "img/loader.gif") %>') no-repeat left;
53
+ }
54
+
55
+ #tipue_search_warning_head
56
+ {
57
+ font: 300 16px/1.6 'open sans', sans-serif;
58
+ color: #333;
59
+ }
60
+ #tipue_search_warning
61
+ {
62
+ font: 12px/1.6 'open sans', sans-serif;
63
+ color: #333;
64
+ margin: 7px 0;
65
+ }
66
+ #tipue_search_warning a
67
+ {
68
+ color: #3f72d8;
69
+ text-decoration: none;
70
+ }
71
+ #tipue_search_warning a:hover
72
+ {
73
+ padding-bottom: 1px;
74
+ border-bottom: 1px solid #ccc;
75
+ }
76
+ #tipue_search_results_count
77
+ {
78
+ font: 13px/1.6 'open sans', sans-serif;
79
+ color: #333;
80
+ }
81
+ .tipue_search_content_title
82
+ {
83
+ font: 300 23px/1.6 'open sans', sans-serif;
84
+ margin-top: 31px;
85
+ }
86
+ .tipue_search_content_title a
87
+ {
88
+ color: #3f72d8;
89
+ text-decoration: none;
90
+ }
91
+ .tipue_search_content_title a:hover
92
+ {
93
+ padding-bottom: 1px;
94
+ border-bottom: 1px solid #ccc;
95
+ }
96
+ .tipue_search_content_text
97
+ {
98
+ font: 12px/1.7 'open sans', sans-serif;
99
+ color: #333;
100
+ padding: 13px 0;
101
+ }
102
+ .tipue_search_content_loc
103
+ {
104
+ font: 300 13px/1.7 'open sans', sans-serif;
105
+ overflow: auto;
106
+ }
107
+ .tipue_search_content_loc a
108
+ {
109
+ color: #555;
110
+ text-decoration: none;
111
+ }
112
+ .tipue_search_content_loc a:hover
113
+ {
114
+ padding-bottom: 1px;
115
+ border-bottom: 1px solid #ccc;
116
+ }
117
+ #tipue_search_foot
118
+ {
119
+ margin: 51px 0 21px 0;
120
+ }
121
+ #tipue_search_foot_boxes
122
+ {
123
+ padding: 0;
124
+ margin: 0;
125
+ font: 12px/1 'open sans', sans-serif;
126
+ }
127
+ #tipue_search_foot_boxes li
128
+ {
129
+ list-style: none;
130
+ margin: 0;
131
+ padding: 0;
132
+ display: inline;
133
+ }
134
+ #tipue_search_foot_boxes li a
135
+ {
136
+ padding: 7px 13px 8px 13px;
137
+ background-color: #f1f1f1;
138
+ border: 1px solid #dcdcdc;
139
+ border-radius: 1px;
140
+ color: #333;
141
+ margin-right: 7px;
142
+ text-decoration: none;
143
+ text-align: center;
144
+ }
145
+ #tipue_search_foot_boxes li.current
146
+ {
147
+ padding: 7px 13px 8px 13px;
148
+ background: #fff;
149
+ border: 1px solid #dcdcdc;
150
+ border-radius: 1px;
151
+ color: #333;
152
+ margin-right: 7px;
153
+ text-align: center;
154
+ }
155
+ #tipue_search_foot_boxes li a:hover
156
+ {
157
+ border: 1px solid #ccc;
158
+ background-color: #f3f3f3;
159
+ }
@@ -0,0 +1,24 @@
1
+ --- name:tag.tipue_search pipeline:erb
2
+ <%
3
+ options = context[:config]['tag.tipue_search.options'].dup
4
+ options['contentLocation'] = context[:data_node].url if options['mode'] == 'json'
5
+ %>
6
+ <input type="text" placeholder="search" id="tipue_search_input" />
7
+ <input type="button" id="tipue_search_button" />
8
+ <div id="tipue_search_content"></div>
9
+ <script>
10
+ $(document).ready(function() {
11
+ $('#tipue_search_input').tipuesearch(<%= JSON.dump(options) %>);
12
+ });
13
+ </script>
14
+ --- name:tipue_search pipeline:ruby
15
+ if context.node['mode'] == 'live'
16
+ context.content = "var tipuesearch_pages = #{JSON.dump(context.node.entries.map {|e| e.url})}"
17
+ else
18
+ data = []
19
+ context.node.entries.each do |node|
20
+ data << {'loc' => node.url, 'title' => node['title'], 'tags' => '', 'text' => context.node.text_for(node)}
21
+ end
22
+
23
+ context.content = "var tipuesearch = {\"pages\": #{JSON.dump(data)}};"
24
+ end
@@ -0,0 +1,73 @@
1
+ author: &author Thomas Leitner <t_leitner@gmx.at>
2
+ summary: webgen extension bundle for Tipue Search javascript site search engine
3
+ description: |
4
+ Tipue Search is a site search engine which uses jQuery. It can use a
5
+ pre-built search index to provide a fast search experience for a
6
+ static website.
7
+ version: 1.0.0
8
+ license: MIT
9
+ homepage: http://github.com/gettalong/webgen-tipue_search-bundle
10
+
11
+ extensions:
12
+ path_handler.tipue_search:
13
+ author: *author
14
+ summary: |
15
+ Creates a search index data file for the Tipue Search site search
16
+ engine
17
+
18
+ tag.tipue_search:
19
+ author: *author
20
+ summary: |
21
+ Creates a site search field and result area for displaying search
22
+ results
23
+
24
+ options:
25
+ tag.tipue_search.path:
26
+ summary: |
27
+ The source path that should be used for creating the Tipue Search
28
+ data file. The destination path is derived from this path the
29
+ usual way. Don't use a path that does already exist!
30
+ syntax: |
31
+ `PATH` where `PATH` is a relative or absolute source path
32
+ example:
33
+ tag: |
34
+ {tipue_search: {path: data.js, options: {mode: static}, entries: {alcn: /**/*.html}}}
35
+
36
+ tag.tipue_search.options:
37
+ summary: |
38
+ Options passed to the Tipue Search engine (and partially to
39
+ path_handler.tipue_search). The keys 'mode' and 'liveDescription'
40
+ are mapped to the meta information keys 'mode' and 'content_css'
41
+ for path_handler.tipue_search.
42
+ syntax: |
43
+ `{KEY: VALUE, ...}` where `KEY` and `VALUE` are key-value pairs of
44
+ Tipue Search options
45
+ example:
46
+ config: |
47
+ tag.tipue_search.options: {}
48
+ tag: |
49
+ {tipue_search: {path: data.js, options: {mode: static}, entries: {alcn: /**/*.html}}}
50
+
51
+ tag.tipue_search.entries:
52
+ summary: |
53
+ Node finder option set defining the search index. The nodes of the
54
+ result set may only contain valid HTML content.
55
+ syntax: |
56
+ `OPTIONS` where `OPTIONS` is a hash with node finder options
57
+ example:
58
+ tag: |
59
+ {tipue_search: {path: data.js, options: {mode: static}, entries: {alcn: /**/*.html}}}
60
+
61
+ tag.tipue_search.template:
62
+ summary: |
63
+ The template node used for rendering the tag. It has to contain the block
64
+ 'tag.tipue_search' because this block is used for rendering.
65
+ syntax: |
66
+ `PATH` where `PATH` is the (a)(l)cn of the template node
67
+ example:
68
+ config: |
69
+ tag.tipue_search.template: /other.template
70
+ tag: |
71
+ {tipue_search: {path: data.js, options: {mode: static},
72
+ entries: {alcn: /**/*.html}, template: /my.template}}
73
+
@@ -0,0 +1,19 @@
1
+ # Extension bundle initialization
2
+
3
+ mount_passive('data/', '/')
4
+
5
+ require_relative('tipue_search_tag')
6
+ require_relative('tipue_search_path_handler')
7
+
8
+ is_hash = lambda do |val|
9
+ raise "The value has to be a hash" unless val.kind_of?(Hash)
10
+ val
11
+ end
12
+
13
+ website.ext.tag.register('Webgen::Tag::TipueSearch', :mandatory => ['path', 'entries'])
14
+ option('tag.tipue_search.path', '')
15
+ option('tag.tipue_search.options', {'mode' => 'static'}, &is_hash)
16
+ option('tag.tipue_search.entries', nil, &is_hash)
17
+ option('tag.tipue_search.template', '/templates/tipue_search.template')
18
+
19
+ website.ext.path_handler.register('Webgen::PathHandler::TipueSearch')
@@ -0,0 +1,77 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'json'
4
+ require 'nokogiri'
5
+ require 'webgen/path_handler/base'
6
+ require 'webgen/path_handler/page_utils'
7
+ require 'webgen/context'
8
+
9
+ module Webgen
10
+ class PathHandler
11
+
12
+ # Path handler for creating a Tipue Search site index.
13
+ class TipueSearch
14
+
15
+ include Base
16
+ include PageUtils
17
+
18
+
19
+ # Provides custom methods for tipue search nodes.
20
+ class Node < PageUtils::Node
21
+
22
+ # Return the entries for the tipue search +node+.
23
+ def entries
24
+ tree.website.ext.node_finder.find(node_info[:entries], self)
25
+ end
26
+
27
+ # Return the text content of the given node.
28
+ def text_for(node)
29
+ if tree.website.ext.destination.exists?(node.dest_path)
30
+ Nokogiri::HTML(tree.website.ext.destination.read(node.dest_path)).
31
+ css(self['content_css'] || 'body').text.gsub(/\s+/, ' ')
32
+ else
33
+ ''
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+
40
+ # The mandatory keys that need to be set in a tipue search file.
41
+ MANDATORY_INFOS = %W[mode entries]
42
+
43
+ # Create a Tipue Search site index from +path+.
44
+ def create_nodes(path, blocks)
45
+ if MANDATORY_INFOS.any? {|t| path.meta_info[t].nil?}
46
+ raise Webgen::NodeCreationError.new("At least one of #{MANDATORY_INFOS.join('/')} is missing",
47
+ "path_handler.tipue_search", path)
48
+ end
49
+
50
+ if @website.config['website.base_url'].empty?
51
+ raise Webgen::NodeCreationError.new("The configuration option 'website.base_url' needs to be set",
52
+ "path_handler.tipue_search", path)
53
+ end
54
+
55
+ path.ext = 'js'
56
+ path['node_class'] = Node.to_s
57
+ path['write_order'] = 'z'
58
+ create_node(path) do |node|
59
+ set_blocks(node, blocks)
60
+ node.node_info[:entries] = {:flatten => true, :and => node['entries']}
61
+ @website.ext.item_tracker.add(node, :nodes, :node_finder_option_set,
62
+ {:opts => node.node_info[:entries], :ref_alcn => node.alcn}, :content)
63
+ end
64
+ end
65
+
66
+ # Return the rendered feed represented by +node+.
67
+ def content(node)
68
+ context = Webgen::Context.new(@website)
69
+ context.render_block(:name => "tipue_search", :node => 'first',
70
+ :chain => [node, node.resolve("/templates/tipue_search.template", node.lang, true),
71
+ node].compact)
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'json'
4
+ require 'webgen/tag'
5
+
6
+ module Webgen
7
+ class Tag
8
+
9
+ # Generates the Tipue Search HTML fragments (input box, result area) and links the necessary
10
+ # nodes to the destination node.
11
+ module TipueSearch
12
+
13
+ # Generate the menu.
14
+ def self.call(tag, body, context)
15
+ path = Webgen::Path.append(context.ref_node.parent.alcn, context[:config]['tag.tipue_search.path'])
16
+ path = Webgen::Path.new(path)
17
+
18
+ path.meta_info['mode'] = context[:config]['tag.tipue_search.options']['mode'] || 'static'
19
+ path.meta_info['content_css'] = context[:config]['tag.tipue_search.options']['liveDescription'] || 'body'
20
+ path.meta_info['entries'] = context[:config]['tag.tipue_search.entries']
21
+ path.meta_info['handler'] = 'tipue_search'
22
+
23
+ node = context.website.ext.path_handler.create_secondary_nodes(path, '', context.ref_node.alcn).first
24
+
25
+ context.html_head.link_file(:css, '/stylesheets/tipue_search/tipuesearch.css')
26
+ context.html_head.link_file(:js, '/javascripts/tipue_search/tipuesearch_set.js')
27
+ context.html_head.link_file(:js, node.alcn) unless path.meta_info['mode'] == 'json'
28
+ context.html_head.link_file(:js, '/javascripts/tipue_search/tipuesearch.min.js')
29
+
30
+ context[:data_node] = node
31
+ Webgen::Tag.render_tag_template(context, "tipue_search")
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webgen-tipue_search-bundle
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Thomas Leitner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: ! 'Tipue Search is a site search engine which uses jQuery. It can use
28
+ a
29
+
30
+ pre-built search index to provide a fast search experience for a
31
+
32
+ static website.
33
+
34
+ '
35
+ email:
36
+ - t_leitner@gmx.at
37
+ executables: []
38
+ extensions: []
39
+ extra_rdoc_files: []
40
+ files:
41
+ - lib/webgen/bundle/tipue_search/data/javascripts/tipue_search/tipuesearch.min.js
42
+ - lib/webgen/bundle/tipue_search/data/javascripts/tipue_search/tipuesearch_set.js
43
+ - lib/webgen/bundle/tipue_search/data/stylesheets/tipue_search/img/expand.png
44
+ - lib/webgen/bundle/tipue_search/data/stylesheets/tipue_search/img/link.png
45
+ - lib/webgen/bundle/tipue_search/data/stylesheets/tipue_search/img/loader.gif
46
+ - lib/webgen/bundle/tipue_search/data/stylesheets/tipue_search/img/search.gif
47
+ - lib/webgen/bundle/tipue_search/data/stylesheets/tipue_search/metainfo
48
+ - lib/webgen/bundle/tipue_search/data/stylesheets/tipue_search/tipuesearch.css
49
+ - lib/webgen/bundle/tipue_search/data/templates/tipue_search.template
50
+ - lib/webgen/bundle/tipue_search/info.yaml
51
+ - lib/webgen/bundle/tipue_search/init.rb
52
+ - lib/webgen/bundle/tipue_search/tipue_search_path_handler.rb
53
+ - lib/webgen/bundle/tipue_search/tipue_search_tag.rb
54
+ - README.md
55
+ - ChangeLog
56
+ - LICENSE
57
+ - LICENSE-TIPUESEARCH
58
+ - VERSION
59
+ homepage: http://github.com/gettalong/webgen-tipue_search-bundle
60
+ licenses:
61
+ - MIT
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 2.0.0
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: webgen extension bundle for Tipue Search javascript site search engine
83
+ test_files: []