zenweb-autolink 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.
- data/.gemtest +0 -0
- data/History.txt +5 -0
- data/Manifest.txt +12 -0
- data/README.txt +72 -0
- data/Rakefile +15 -0
- data/lib/zenweb-autolink.rb +79 -0
- data/test/test_zenweb_autolink.rb +50 -0
- data/test_site/Rakefile +3 -0
- data/test_site/_config.yml +1 -0
- data/test_site/_layouts/site.erb +7 -0
- data/test_site/page2.html.md +5 -0
- data/test_site/page3.html.autolink.md +5 -0
- data/test_site/zenweb.html.md +5 -0
- metadata +123 -0
data/.gemtest
ADDED
File without changes
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.txt
|
4
|
+
Rakefile
|
5
|
+
lib/zenweb-autolink.rb
|
6
|
+
test/test_zenweb_autolink.rb
|
7
|
+
test_site/Rakefile
|
8
|
+
test_site/_config.yml
|
9
|
+
test_site/_layouts/site.erb
|
10
|
+
test_site/page2.html.md
|
11
|
+
test_site/page3.html.autolink.md
|
12
|
+
test_site/zenweb.html.md
|
data/README.txt
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
= zenweb-autolink
|
2
|
+
|
3
|
+
* Source :: http://github.com/tamc/zenweb-autolink
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
A plugin for zenweb that automatically generates links between pages.
|
8
|
+
|
9
|
+
For example: If a page has a title attribute 'my page about zebweb' then
|
10
|
+
any other page that contains text like 'see my page about zenweb' would
|
11
|
+
have some of the text replaced with a link to that page:
|
12
|
+
'see <a href='/zenweb.html'>my page about zenweb</a>'
|
13
|
+
|
14
|
+
== FEATURES/PROBLEMS:
|
15
|
+
|
16
|
+
* Only replaces text with links if the text is part of a paragraph or
|
17
|
+
list (i.e., won't create links in titles or inside other links)
|
18
|
+
* Works on any html
|
19
|
+
* But, doesn't allow you to specify when links do or don't occur
|
20
|
+
|
21
|
+
== SYNOPSIS:
|
22
|
+
|
23
|
+
See test_site directory for an example of its usage.
|
24
|
+
|
25
|
+
|
26
|
+
1 Add `require 'zenweb-autolink'`
|
27
|
+
2 Make sure some of your pages have title attributes (i.e., they have a
|
28
|
+
_config.yml file or config block that has title: tile at the top)
|
29
|
+
3 Add the extension .autolink to pages that you want the autolinker to operate on
|
30
|
+
(it is best to put the extension immediately after the '.html' extension)
|
31
|
+
|
32
|
+
== REQUIREMENTS:
|
33
|
+
|
34
|
+
* Zenweb 3.0.0.b3 or later
|
35
|
+
|
36
|
+
== INSTALL:
|
37
|
+
|
38
|
+
sudo gem install zenweb-autolink
|
39
|
+
|
40
|
+
== DEVELOPERS:
|
41
|
+
|
42
|
+
After checking out the source, run:
|
43
|
+
|
44
|
+
$ rake newb
|
45
|
+
|
46
|
+
This task will install any missing dependencies, run the tests/specs,
|
47
|
+
and generate the RDoc.
|
48
|
+
|
49
|
+
== LICENSE:
|
50
|
+
|
51
|
+
(The MIT License)
|
52
|
+
|
53
|
+
Copyright (c) 2012 Tom Counsell
|
54
|
+
|
55
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
56
|
+
a copy of this software and associated documentation files (the
|
57
|
+
'Software'), to deal in the Software without restriction, including
|
58
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
59
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
60
|
+
permit persons to whom the Software is furnished to do so, subject to
|
61
|
+
the following conditions:
|
62
|
+
|
63
|
+
The above copyright notice and this permission notice shall be
|
64
|
+
included in all copies or substantial portions of the Software.
|
65
|
+
|
66
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
67
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
68
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
69
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
70
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
71
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
72
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
Hoe.plugin :minitest
|
7
|
+
Hoe.plugin :git
|
8
|
+
|
9
|
+
Hoe.spec 'zenweb-autolink' do
|
10
|
+
developer 'tamc', 'tamc@greenonblack.com'
|
11
|
+
self.extra_deps << ['zenweb','3.0.0.b3']
|
12
|
+
self.extra_deps << ['nokogiri', '~> 1.5.2']
|
13
|
+
end
|
14
|
+
|
15
|
+
# vim: syntax=ruby
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'zenweb'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
class ZenwebAutolink
|
5
|
+
VERSION = '0.0.1'
|
6
|
+
end
|
7
|
+
|
8
|
+
module Zenweb
|
9
|
+
class Site
|
10
|
+
|
11
|
+
# Returns all pages in the site that have a title
|
12
|
+
# configured.
|
13
|
+
def pages_with_titles
|
14
|
+
html_pages.select {|page| page.config["title"] }
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns all the pages in the site that have a title
|
18
|
+
# as an array of arrays, where each array's first
|
19
|
+
# element is a regular expression matching the page's
|
20
|
+
# title and the second element is that page itself.
|
21
|
+
# these are sorted so that the longest title is first
|
22
|
+
# e.g., [[/\blong title/i,page1],[/\btitle\b/i,page2]]
|
23
|
+
# FIXME: In the end may want to memoize this
|
24
|
+
def pages_with_titles_as_sorted_regular_expressions
|
25
|
+
pages_with_titles.sort_by do |page|
|
26
|
+
page.title.size
|
27
|
+
end.reverse.map do |page|
|
28
|
+
[/\b#{Regexp.escape(page.title)}\b/i, page]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Page
|
34
|
+
|
35
|
+
# Autolinks any text in the page that matches the
|
36
|
+
# title of another page on the site
|
37
|
+
def render_autolink page, content
|
38
|
+
autolinked_html content
|
39
|
+
end
|
40
|
+
|
41
|
+
# Take the html and creates links to from any text
|
42
|
+
# that matches a page's title to that page. Note that
|
43
|
+
# it is reasonably intelligent and only makes the
|
44
|
+
# link if the text isn't already linked and is inside
|
45
|
+
# a span, b, p or li element.
|
46
|
+
# FIXME: Make it possible to override the elements
|
47
|
+
# in which it is acceptable to autolink
|
48
|
+
def autolinked_html(html)
|
49
|
+
nodes = Nokogiri::HTML::fragment(html)
|
50
|
+
acceptable_nodes_for_autolinking = %w{p li b em i}
|
51
|
+
nodes.traverse do |node|
|
52
|
+
next unless node.text?
|
53
|
+
next unless acceptable_nodes_for_autolinking.include?(node.parent.name)
|
54
|
+
node.replace(autolinked_html_fragment(node.text))
|
55
|
+
end
|
56
|
+
nodes.to_html
|
57
|
+
end
|
58
|
+
|
59
|
+
# Takes a fragment of text and creates links from any
|
60
|
+
# text that matches a page's title in that text. It
|
61
|
+
# matches the longest titles first.
|
62
|
+
# FIXME: Need a way of dealing with duplicate titles
|
63
|
+
def autolinked_html_fragment(text)
|
64
|
+
links = []
|
65
|
+
site.pages_with_titles_as_sorted_regular_expressions.each do |regexp,page|
|
66
|
+
next if page == self
|
67
|
+
next if page.title.length > text.length
|
68
|
+
text.gsub!(regexp) do |match|
|
69
|
+
links << "<a href='#{page.url}'>#{match}</a>"
|
70
|
+
"%!#{links.size-1}!%"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
text.gsub!(/%!(\d+)!%/) do |match|
|
74
|
+
links[$1.to_i]
|
75
|
+
end
|
76
|
+
text
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "zenweb-autolink"
|
3
|
+
|
4
|
+
class TestZenwebAutolink < Test::Unit::TestCase
|
5
|
+
|
6
|
+
attr_accessor :site, :page
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@old_working_dir = Dir.pwd
|
10
|
+
Dir.chdir(File.join(File.dirname(__FILE__),'..','test_site'))
|
11
|
+
self.site = Zenweb::Site.new
|
12
|
+
site.scan
|
13
|
+
site.wire
|
14
|
+
self.page = site.html_pages.find { |p| p.title == 'Example Page 3' }
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
Dir.chdir(@old_working_dir)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_pages_with_titles
|
22
|
+
assert_equal 3, site.pages_with_titles.size
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_pages_with_titles_as_sorted_regular_expressions
|
26
|
+
regular_expresions = site.pages_with_titles_as_sorted_regular_expressions
|
27
|
+
assert_equal '/\bExample\\ Page\\ 2\b/i', regular_expresions.first.first.inspect
|
28
|
+
assert_kind_of Zenweb::Page, regular_expresions.first.last
|
29
|
+
assert_equal '/\bZenweb\b/i', regular_expresions.last.first.inspect
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_autolinked_html_fragment
|
33
|
+
actual = page.autolinked_html_fragment("zenweb")
|
34
|
+
expected = "<a href='/zenweb.html'>zenweb</a>"
|
35
|
+
assert_equal expected, actual
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_autolinked_html
|
39
|
+
actual = page.autolinked_html("<h1>zenweb</h1><p>zenweb</p>")
|
40
|
+
expected = '<h1>zenweb</h1><p><a href="/zenweb.html">zenweb</a></p>'
|
41
|
+
assert_equal expected, actual
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_render_autolink
|
45
|
+
actual = page.render
|
46
|
+
expected = %r|<p>Not really much here to see except a link to <a href="/page2\.html">example page 2</a>\.</p>|
|
47
|
+
assert actual =~ expected
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/test_site/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
layout: site
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zenweb-autolink
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- tamc
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: zenweb
|
16
|
+
requirement: &70219613929400 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - =
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0.b3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70219613929400
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: nokogiri
|
27
|
+
requirement: &70219613928960 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.5.2
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70219613928960
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: minitest
|
38
|
+
requirement: &70219613928520 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '3.0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70219613928520
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rdoc
|
49
|
+
requirement: &70219613928080 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.10'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70219613928080
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: hoe
|
60
|
+
requirement: &70219613927640 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '3.0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70219613927640
|
69
|
+
description: ! "A plugin for zenweb that automatically generates links between pages.\n\nFor
|
70
|
+
example: If a page has a title attribute 'my page about zebweb' then\nany other
|
71
|
+
page that contains text like 'see my page about zenweb' would\nhave some of the
|
72
|
+
text replaced with a link to that page: \n'see <a href='/zenweb.html'>my page about
|
73
|
+
zenweb</a>'"
|
74
|
+
email:
|
75
|
+
- tamc@greenonblack.com
|
76
|
+
executables: []
|
77
|
+
extensions: []
|
78
|
+
extra_rdoc_files:
|
79
|
+
- History.txt
|
80
|
+
- Manifest.txt
|
81
|
+
- README.txt
|
82
|
+
files:
|
83
|
+
- History.txt
|
84
|
+
- Manifest.txt
|
85
|
+
- README.txt
|
86
|
+
- Rakefile
|
87
|
+
- lib/zenweb-autolink.rb
|
88
|
+
- test/test_zenweb_autolink.rb
|
89
|
+
- test_site/Rakefile
|
90
|
+
- test_site/_config.yml
|
91
|
+
- test_site/_layouts/site.erb
|
92
|
+
- test_site/page2.html.md
|
93
|
+
- test_site/page3.html.autolink.md
|
94
|
+
- test_site/zenweb.html.md
|
95
|
+
- .gemtest
|
96
|
+
homepage: http://github.com/tamc/zenweb-autolink
|
97
|
+
licenses: []
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options:
|
100
|
+
- --main
|
101
|
+
- README.txt
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project: zenweb-autolink
|
118
|
+
rubygems_version: 1.8.10
|
119
|
+
signing_key:
|
120
|
+
specification_version: 3
|
121
|
+
summary: A plugin for zenweb that automatically generates links between pages
|
122
|
+
test_files:
|
123
|
+
- test/test_zenweb_autolink.rb
|