piki_doc 0.0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +12 -0
- data/README.ja.hiki +71 -0
- data/Rakefile +98 -0
- data/features/asin_plugin.feature +25 -0
- data/features/gist_plugin.feature +28 -0
- data/features/step_definitions/pluggable_hikidoc_steps.rb +28 -0
- data/features/support/env.rb +5 -0
- data/lib/piki_doc.rb +11 -0
- data/lib/piki_doc/bundles/asin.rb +25 -0
- data/lib/piki_doc/bundles/gist.rb +19 -0
- data/lib/piki_doc/bundles/plugin_adapter.rb +34 -0
- data/lib/piki_doc/document.rb +32 -0
- data/lib/piki_doc/image_uri_autolink_fix.rb +12 -0
- data/lib/piki_doc/output.rb +27 -0
- data/lib/vendor/hikidoc.rb +902 -0
- data/spec/piki_doc/document_spec.rb +19 -0
- data/spec/piki_doc/output_spec.rb +45 -0
- data/spec/piki_doc_spec.rb +82 -0
- metadata +100 -0
data/Changelog
ADDED
data/README.ja.hiki
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
! PikiDocについて
|
2
|
+
|
3
|
+
!! はじめに
|
4
|
+
|
5
|
+
[[HikiDoc|http://hikidoc.rubyforge.org/svn/trunk/README.ja]]を拡張し、
|
6
|
+
HikiDocの機能の一つである「プラグイン」機能を簡単にを追加できるようにした
|
7
|
+
ライブラリです。
|
8
|
+
|
9
|
+
本家HikiDocライブラリもバンドルしているため、このライブラリを入れるだけで
|
10
|
+
使えます。
|
11
|
+
|
12
|
+
!! 使い方
|
13
|
+
|
14
|
+
プラグインを追加する部分以外は、本家の機能がそのまま使えます。
|
15
|
+
|
16
|
+
require 'piki_doc'
|
17
|
+
PikiDoc.to_xhtml(<<-EOS
|
18
|
+
! PikiDocについて
|
19
|
+
|
20
|
+
!! はじめに
|
21
|
+
EOS
|
22
|
+
|
23
|
+
!!! プラグインの使い方
|
24
|
+
|
25
|
+
あらかじめPikiDoc.register()にプラグインを指定してください。今のところ、Gist
|
26
|
+
プラグインとASINプラグインがバンドルされています。
|
27
|
+
|
28
|
+
PikiDoc.register(PikiDoc::Bundles::Gist.new, PikiDoc::Bundles::Asin.new)
|
29
|
+
PikiDoc.to_xhtml(<<-HTML)
|
30
|
+
!!!! ASIN
|
31
|
+
|
32
|
+
インライン {{asin('4797336625', 'morodiary05-22')}}
|
33
|
+
|
34
|
+
{{asin('4797336625', 'morodiary05-22')}}
|
35
|
+
|
36
|
+
!!!! Gist
|
37
|
+
|
38
|
+
インライン {{gist('88086')}}
|
39
|
+
|
40
|
+
{{gist('88086')}}
|
41
|
+
HTML
|
42
|
+
|
43
|
+
次のように出力されます
|
44
|
+
|
45
|
+
!!!! ASIN
|
46
|
+
|
47
|
+
インライン {{asin('4797336625', 'morodiary05-22')}}
|
48
|
+
|
49
|
+
{{asin('4797336625', 'morodiary05-22')}}
|
50
|
+
|
51
|
+
!!!! Gist
|
52
|
+
|
53
|
+
インライン {{gist(88086)}}
|
54
|
+
|
55
|
+
{{gist(88086)}}
|
56
|
+
|
57
|
+
!! プラグインの自作方法
|
58
|
+
|
59
|
+
lib/piki_doc/bundles/内のサンプルと、features/*内の外部仕様を参考にしてください。
|
60
|
+
|
61
|
+
!! Thanks
|
62
|
+
|
63
|
+
!!! HikiDoc authors
|
64
|
+
|
65
|
+
- 2005, Kazuhiko <kazuhiko@fdiary.net>
|
66
|
+
- 2007, Minero Aoki
|
67
|
+
|
68
|
+
!! ライセンス
|
69
|
+
|
70
|
+
HikiDoc本家と同じ修正BSDライセンスです。
|
71
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
$: << "./lib"
|
2
|
+
require 'rubygems'
|
3
|
+
require 'piki_doc'
|
4
|
+
|
5
|
+
require 'rake/clean'
|
6
|
+
require 'rake/testtask'
|
7
|
+
require 'rake/packagetask'
|
8
|
+
require 'rake/gempackagetask'
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
require 'cucumber/rake/task'
|
11
|
+
|
12
|
+
NAME = ENV["GEMNAME"] || "piki_doc"
|
13
|
+
HOMEPAGE = "http://github.com/moro/#{NAME}/"
|
14
|
+
AUTHOR = "MOROHASHI Kyosuke"
|
15
|
+
EMAIL = "moronatural@gmail.com"
|
16
|
+
DESCRIPTION = "extended HikiDoc to able to plug plugins."
|
17
|
+
VERS = PikiDoc::Version
|
18
|
+
|
19
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
20
|
+
RDOC_OPTS = [
|
21
|
+
'--title', "#{NAME} documentation",
|
22
|
+
"--charset", "utf-8",
|
23
|
+
"--opname", "index.html",
|
24
|
+
"--line-numbers",
|
25
|
+
"--main", "README.ja.hiki",
|
26
|
+
"--inline-source",
|
27
|
+
]
|
28
|
+
|
29
|
+
RSpec::Core::RakeTask.new do |t|
|
30
|
+
t.ruby_opts = "-w"
|
31
|
+
t.rspec_opts = %w[--format progress --color]
|
32
|
+
end
|
33
|
+
|
34
|
+
Cucumber::Rake::Task.new do |t|
|
35
|
+
t.cucumber_opts = "--format progress"
|
36
|
+
end
|
37
|
+
|
38
|
+
gemspec = Gem::Specification.new do |s|
|
39
|
+
s.name = NAME
|
40
|
+
s.version = VERS
|
41
|
+
s.platform = Gem::Platform::RUBY
|
42
|
+
s.has_rdoc = false
|
43
|
+
s.extra_rdoc_files = ["README.ja.hiki", "Changelog"]
|
44
|
+
s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
|
45
|
+
s.summary = DESCRIPTION
|
46
|
+
s.description = DESCRIPTION
|
47
|
+
s.author = AUTHOR
|
48
|
+
s.email = EMAIL
|
49
|
+
s.homepage = HOMEPAGE
|
50
|
+
s.executables = []
|
51
|
+
s.require_path = "lib"
|
52
|
+
s.test_files = Dir["spec/**/*_spec.rb"] + Dir["features/**/*.rb"] + Dir["features/*.feature"]
|
53
|
+
|
54
|
+
s.files = %w(README.ja.hiki Changelog Rakefile) +
|
55
|
+
Dir.glob("{bin,doc,lib,templates,generators,extras,website,script}/**/*") +
|
56
|
+
Dir.glob("ext/**/*.{h,c,rb}") +
|
57
|
+
Dir.glob("examples/**/*.rb") +
|
58
|
+
Dir.glob("tools/*.rb") +
|
59
|
+
Dir.glob("rails/*.rb")
|
60
|
+
|
61
|
+
s.extensions = FileList["ext/**/extconf.rb"].to_a
|
62
|
+
end
|
63
|
+
|
64
|
+
Rake::GemPackageTask.new(gemspec) do |p|
|
65
|
+
p.need_tar = true
|
66
|
+
p.gem_spec = gemspec
|
67
|
+
end
|
68
|
+
|
69
|
+
task :install do
|
70
|
+
name = "#{NAME}-#{VERS}.gem"
|
71
|
+
sh %{rake package}
|
72
|
+
sh %{gem install pkg/#{name}}
|
73
|
+
end
|
74
|
+
|
75
|
+
task :uninstall => [:clean] do
|
76
|
+
sh %{gem uninstall #{NAME}}
|
77
|
+
end
|
78
|
+
|
79
|
+
desc 'Show information about the gem.'
|
80
|
+
task :debug_gem do
|
81
|
+
puts gemspec.to_ruby
|
82
|
+
end
|
83
|
+
|
84
|
+
desc 'Update gem spec'
|
85
|
+
task :gemspec do
|
86
|
+
open("#{NAME}.gemspec", 'w').write gemspec.to_ruby
|
87
|
+
end
|
88
|
+
|
89
|
+
desc "output example from README.ja.hiki"
|
90
|
+
task "readme_example" do
|
91
|
+
require 'piki_doc'
|
92
|
+
require 'piki_doc/bundles/gist'
|
93
|
+
require 'piki_doc/bundles/asin'
|
94
|
+
|
95
|
+
PikiDoc.register(PikiDoc::Bundles::Gist.new, PikiDoc::Bundles::Asin.new)
|
96
|
+
puts PikiDoc.to_xhtml(File.read("README.ja.hiki"))
|
97
|
+
end
|
98
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# language: ja
|
2
|
+
フィーチャ: Asinプラグインを試す
|
3
|
+
プラグイン作者として
|
4
|
+
Asinプラグインがちゃんと動いていることを確認したい
|
5
|
+
|
6
|
+
背景:
|
7
|
+
前提 "Asin"プラグインを登録する
|
8
|
+
|
9
|
+
シナリオ: ブロックプラグイン
|
10
|
+
もし 以下のHiki記法テキストをXHTMLにする
|
11
|
+
"""
|
12
|
+
! ASIN Railsレシピブック
|
13
|
+
{{asin('4797336625', 'morodiary05-22')}}
|
14
|
+
"""
|
15
|
+
# かつ 結果を目視
|
16
|
+
ならば "div.plugin.asin > iframe"要素が含まれること
|
17
|
+
|
18
|
+
シナリオ: インラインプラグイン
|
19
|
+
もし 以下のHiki記法テキストをXHTMLにする
|
20
|
+
"""
|
21
|
+
Railsレシピブック {{asin('4797336625', 'morodiary05-22')}}を書きました。
|
22
|
+
"""
|
23
|
+
# かつ 結果を目視
|
24
|
+
ならば "span.plugin.asin > a[href='http://www.amazon.co.jp/exec/obidos/ASIN/4797336625/morodiary05-22/ref=nosim']"要素が含まれること
|
25
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# language: ja
|
2
|
+
フィーチャ: Gistプラグインを試す
|
3
|
+
プラグイン作者として
|
4
|
+
Gistプラグインがちゃんと動いていることを確認したい
|
5
|
+
|
6
|
+
背景:
|
7
|
+
前提 "Gist"プラグインを登録する
|
8
|
+
|
9
|
+
シナリオ: ブロックプラグイン
|
10
|
+
もし 以下のHiki記法テキストをXHTMLにする
|
11
|
+
"""
|
12
|
+
! Gist
|
13
|
+
{{gist(123456)}}
|
14
|
+
"""
|
15
|
+
# かつ 結果を目視
|
16
|
+
ならば "div.plugin.gist > script[src='http://gist.github.com/123456.js']"要素が含まれること
|
17
|
+
かつ "h1"要素のテキストは"Gist"であること
|
18
|
+
|
19
|
+
シナリオ: インラインプラグイン
|
20
|
+
もし 以下のHiki記法テキストをXHTMLにする
|
21
|
+
"""
|
22
|
+
! Gist
|
23
|
+
こちらをご覧ください。{{gist(123456)}}
|
24
|
+
"""
|
25
|
+
# かつ 結果を目視
|
26
|
+
ならば "a[href='http://gist.github.com/123456']"要素が含まれること
|
27
|
+
かつ "h1"要素のテキストは"Gist"であること
|
28
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#coding:utf-8
|
2
|
+
require 'piki_doc'
|
3
|
+
require 'piki_doc/bundles/gist'
|
4
|
+
require 'piki_doc/bundles/asin'
|
5
|
+
require 'nokogiri'
|
6
|
+
|
7
|
+
When /^"([^\"]*)"プラグインを登録する$/ do |name|
|
8
|
+
PikiDoc.register(PikiDoc::Bundles.const_get(name).new)
|
9
|
+
end
|
10
|
+
|
11
|
+
When /^以下のHiki記法テキストをXHTMLにする$/ do |text|
|
12
|
+
@out = PikiDoc.to_xhtml(text)
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^"([^\"]*)"要素が含まれること$/ do |selector|
|
16
|
+
@doc ||= Nokogiri::HTML(@out)
|
17
|
+
@doc.css(selector).should_not be_empty
|
18
|
+
end
|
19
|
+
|
20
|
+
When /^"([^\"]*)"要素のテキストは"([^\"]*)"であること$/ do |selector, text|
|
21
|
+
@doc ||= Nokogiri::HTML(@out)
|
22
|
+
@doc.css(selector).text.should == text
|
23
|
+
end
|
24
|
+
|
25
|
+
When /^結果を目視$/ do
|
26
|
+
at_exit{ ["-" * 80, @out, "-" * 80].each{|s| puts s } }
|
27
|
+
end
|
28
|
+
|
data/lib/piki_doc.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
|
2
|
+
module PikiDoc
|
3
|
+
Version = "0.0.2.2"
|
4
|
+
|
5
|
+
autoload "Document", "piki_doc/document"
|
6
|
+
def register(*plugins); PikiDoc::Document.register(*plugins); end
|
7
|
+
def to_html(src, options={}); PikiDoc::Document.to_html(src, options) ; end
|
8
|
+
def to_xhtml(src, options={}); PikiDoc::Document.to_xhtml(src, options) ; end
|
9
|
+
module_function :register, :to_html, :to_xhtml
|
10
|
+
end
|
11
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module PikiDoc
|
2
|
+
module Bundles
|
3
|
+
class Asin
|
4
|
+
include PluginAdapter
|
5
|
+
def initialize(host = "www.amazon.co.jp", iframe_host = "rcm-jp.amazon.co.jp")
|
6
|
+
@host = host
|
7
|
+
@iframe_host = iframe_host
|
8
|
+
end
|
9
|
+
|
10
|
+
def inline_plugin(src)
|
11
|
+
(asin, id), = src.scan(/\(\s*'(\d+)',\s*'([a-z0-9\-]+)'\s*\)/)
|
12
|
+
plugin_dom("span", <<-HTML)
|
13
|
+
<a href="http://#{@host}/exec/obidos/ASIN/#{asin}/#{id}/ref=nosim">Amazon</a>
|
14
|
+
HTML
|
15
|
+
end
|
16
|
+
def block_plugin(src)
|
17
|
+
(asin, id), = src.scan(/\(\s*'(\d+)',\s*'([a-z0-9\-]+)'\s*\)/)
|
18
|
+
plugin_dom("div", <<-HTML)
|
19
|
+
<iframe src="http://#{@iframe_host}/e/cm?t=#{id}&o=9&p=8&l=as1&asins=#{asin}&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr&nou=1"
|
20
|
+
style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
|
21
|
+
HTML
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'piki_doc/bundles/plugin_adapter'
|
2
|
+
|
3
|
+
module PikiDoc
|
4
|
+
module Bundles
|
5
|
+
class Gist
|
6
|
+
include PluginAdapter
|
7
|
+
def inline_plugin(src)
|
8
|
+
(id,), = src.scan(/gist\((\d+)\)/)
|
9
|
+
%Q[<a href="http://gist.github.com/#{id}">Gist:#{id}</a>]
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def plugin(src)
|
14
|
+
(id,), = src.scan(/gist\((\d+)\)/)
|
15
|
+
%Q[<script src="http://gist.github.com/#{id}.js"></script>]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module PikiDoc
|
2
|
+
module Bundles
|
3
|
+
module PluginAdapter
|
4
|
+
RE = /\A([a-z]+)\(.[^\)]+\)/
|
5
|
+
def accept?(src)
|
6
|
+
(name,_), = src.scan(RE)
|
7
|
+
name == plugin_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def inline_plugin(src)
|
11
|
+
plugin_dom("span", plugin(src))
|
12
|
+
end
|
13
|
+
|
14
|
+
def block_plugin(src)
|
15
|
+
plugin_dom("div", plugin(src))
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def plugin(src); raise NotImplementedError; end
|
20
|
+
|
21
|
+
def plugin_name
|
22
|
+
self.class.name.split("::").last.
|
23
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
24
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
25
|
+
downcase
|
26
|
+
end
|
27
|
+
|
28
|
+
def plugin_dom(tag, content)
|
29
|
+
%Q[<#{tag} class='plugin #{plugin_name}'>#{content}</#{tag}>]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'piki_doc/output'
|
3
|
+
require 'piki_doc/image_uri_autolink_fix'
|
4
|
+
require 'vendor/hikidoc'
|
5
|
+
|
6
|
+
module PikiDoc
|
7
|
+
class Document < ::HikiDoc
|
8
|
+
@@plugins ||= []
|
9
|
+
include ImageUriAutolinkFix
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def plugins; @@plugins; end
|
13
|
+
def register(*plugins)
|
14
|
+
@@plugins.concat(plugins)
|
15
|
+
end
|
16
|
+
|
17
|
+
def lint(plugin)
|
18
|
+
[:inline_plugin, :block_plugin].any?{|m| plugin.respond_to?(m) } && \
|
19
|
+
plugin.respond_to?(:accept?)
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_xhtml(src, options = {})
|
23
|
+
new(::PikiDoc::HTMLOutput.new(" />", @@plugins), options).compile(src)
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_html(src, options = {})
|
27
|
+
new(::PikiDoc::HTMLOutput.new(">", @@plugins), options).compile(src)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'vendor/hikidoc'
|
2
|
+
|
3
|
+
module PikiDoc
|
4
|
+
class HTMLOutput < ::HikiDoc::HTMLOutput
|
5
|
+
def initialize(suffix, plugins)
|
6
|
+
super(suffix)
|
7
|
+
@inlines = plugins.select{|p| p.respond_to?(:inline_plugin) }
|
8
|
+
@blocks = plugins.select{|p| p.respond_to?(:block_plugin) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def inline_plugin(src)
|
12
|
+
if plugin = @inlines.detect{|p| p.accept?(src) }
|
13
|
+
plugin.inline_plugin(src)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def block_plugin(src)
|
20
|
+
if plugin = @blocks.detect{|p| p.accept?(src) }
|
21
|
+
@f.puts plugin.block_plugin(src)
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|