mok2html 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mok2html (0.1.0)
5
+ mok-parser (>= 0.3.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ mimemagic (0.2.1)
11
+ mok-parser (0.3.0)
12
+ mimemagic
13
+ rake (10.1.0)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ bundler (~> 1.3)
20
+ mok2html!
21
+ rake
data/History.rdoc ADDED
@@ -0,0 +1,35 @@
1
+ == 0.1.0 (2013-12-12)
2
+ * プロジェクト名を raf2html から mok2html に変更
3
+
4
+ * new: 新しいQUITE構文の追加
5
+ * change: Referenceエレメントの拡張子オプション名を extension から reference_extension に変更
6
+ * change: Quoteエレメントの名前をPreformatに変更
7
+
8
+ == 0.0.8 (2013-12-10)
9
+ * new: Reference の 拡張子書式(.%) に対応(@options[:extension])
10
+ * new: LabelLink エレメントに対応
11
+ * new: エレメント(タグ)をカスタマイズできる機能を追加
12
+ * new: スタイルシート指定のオプション(--css)にショートネーム(-c)を追加
13
+ * new: javascript を読み込むコマンドラインオプションを追加
14
+ * new: Quote クラスに出力に google prettify のコードを追加
15
+ * change: IMAGE エレメントを廃止して、MEDIA エレメントに対応
16
+ * change: メタデータの項目を変更
17
+ * change: manuedo の出力フォーマットを変更
18
+ * change: css, javascript, custom_element オプションのデフォルト値を nil から ""(empty) に変更
19
+ * fix: Label エレメントのリンクが name ではなく href になっていたのを修正
20
+
21
+ == 0.0.7 (2013-12-05)
22
+ * Variable に対応
23
+
24
+ == 0.0.6 (2013-12-05)
25
+ * 設定ファイル(~/.raf2html.yaml)を追加
26
+
27
+ == 0.0.5 (2013-12-04)
28
+ * kbd書式 ((%...%)) に対応
29
+ * code書式 (({...})) に対応
30
+
31
+ == 0.0.4 (2013-12-03)
32
+ * minar fix
33
+
34
+ == 0.0.3 2013-12-01
35
+ * raf-parser プロジェクトから独立
data/LICENSE.txt ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (C) garin <garin54@gmail.com> 2013
2
+
3
+ This program is free software: you can redistribute it and/or modify
4
+ it under the terms of the GNU General Public License as published by
5
+ the Free Software Foundation, either version 3 of the License, or
6
+ (at your option) any later version.
7
+
8
+ This program is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU General Public License for more details.
12
+
13
+ You should have received a copy of the GNU General Public License
14
+ along with Foobar. If not, see <http://www.gnu.org/licenses/>.
data/README.rdoc ADDED
@@ -0,0 +1,36 @@
1
+ = mok2html
2
+ "mok2html" is mok document convert to HTML.
3
+
4
+ == Require
5
+ * ruby-2.0.0p353 or later
6
+
7
+ == Installation
8
+ // package install
9
+ $ gem install mok2html
10
+
11
+ == Getting Started
12
+ === Edit mok document
13
+
14
+ $ vi mydoc.mok
15
+ = This is My document
16
+ mok is simple document format.
17
+
18
+ format manutal : http://garin.jp/doc/mok/mok (this page is japanese)
19
+
20
+ === to HTML
21
+ $ mok2html mydoc.mok
22
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
23
+ ...
24
+ <h1>This is My document</h1> ...
25
+ <p>mok is simple document format.<br /></p>
26
+ ...
27
+
28
+ === Print Help
29
+ $ mok2html --help
30
+
31
+ == Read more
32
+ Official Web Site : http://garin.jp/doc/mok/mok2html (this page is japanese)
33
+
34
+ == Copyright
35
+ Copyright (c) 2011-2013 garin. See LICENSE.txt for
36
+ further details.
data/RELEASE ADDED
@@ -0,0 +1 @@
1
+ 2013-12-12
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bin/mok2html ADDED
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ # Copyright (C) garin <garin54@gmail.com> 2011-2013
4
+ # See the included file COPYING for details.
5
+ $:.unshift File.join(File.dirname(__FILE__), "../lib")
6
+ require "yaml"
7
+ require "optparse"
8
+ require "mok2html"
9
+
10
+ # 設定ファイル
11
+ CONFIG_FILE="~/.mok2html.yaml"
12
+ config_file_path = File.expand_path(CONFIG_FILE)
13
+
14
+ # デフォルトの設定値
15
+ options = {:css => "", :js => "", :reference_extension => '.html', :media_directory => "", :custom_element => "" , :language => 'ja', :index => true, :quiet => false}
16
+
17
+ # 設定ファイルの読み込み
18
+ if File.exist?(config_file_path)
19
+ config = YAML.load_file( config_file_path )
20
+ if config
21
+ options.each do |key,val|
22
+ options[key.to_sym] = config[key.to_s] unless config[key.to_s].nil?
23
+ end
24
+ end
25
+ end
26
+
27
+ # 使い方
28
+ def usage(opt)
29
+ puts opt.help
30
+ exit 0
31
+ end
32
+
33
+ # コマンドラインオプション
34
+ opt = OptionParser.new do |opt|
35
+ opt.banner = "Usage: mok2html [options] file"
36
+ opt.version = Mok::Mok2Html::VERSION
37
+ opt.release = Mok::Mok2Html::RELEASE
38
+ opt.on("-c", "--css file", "HTMLに埋め込むスタイルシートを指定") {|f| options[:css] = f}
39
+ opt.on("-j", "--javascript file", "HTMLに埋め込むJavaScriptを指定") {|f| options[:js] = f}
40
+ opt.on("-L", "--language LANG", "言語(デフォルトは #{options[:language]} 。ドキュメント側で指定されていればそちらを優先)"){|l| options[:language] = l}
41
+ opt.on("--[no-]index", "目次を生成する(デフォルトは生成する)"){|v| options[:index] = v }
42
+ opt.on("--[no-]metadata", "メタ情報を出力しない(デフォルトは出力する)"){|v| options[:metadata] = v }
43
+ opt.on("-q","--quiet", "本文だけを出力する(ヘッダやフッタは出力しない)"){ options[:quiet] = true }
44
+ opt.on("-s","--reference_extension string", "リファレンス記法で「.%」を置換する拡張子(デフォルト .html)"){|s| options[:reference_extension] = s }
45
+ opt.on("-m", "--media_directory directory", "画像や動画などのメディアファイルを配置する基底ディレクトリ"){|d| options[:media_directory] = d }
46
+ opt.on("--custom_element file", "HTMLタグをカスタマイズするためのRubyファイル)"){|f| options[:custom_element] = f }
47
+ opt.on("-V","--parser-version", "使用する mok-parser のバージョンを表示"){
48
+ puts "mok-parser: #{Mok::VERSION} (#{Mok::RELEASE})"
49
+ exit 0
50
+ }
51
+ end
52
+ opt.parse!(ARGV)
53
+ usage(opt) unless ARGV[0]
54
+
55
+ # main
56
+ src = File.open(ARGV[0],"r").readlines
57
+ mok = Mok::Mok2Html.new(src, options)
58
+ puts mok.to_html
data/lib/mok2html.rb ADDED
@@ -0,0 +1,157 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) garin <garin54@gmail.com> 2011
3
+ # See the included file COPYING for details.
4
+ require "mok2html_element"
5
+ require "cgi"
6
+
7
+ module Mok
8
+ class Mok2Html
9
+ VERSION = File.readlines(File.join(File.dirname(__FILE__),"../VERSION"))[0].strip
10
+ RELEASE = File.readlines(File.join(File.dirname(__FILE__),"../RELEASE"))[0].strip
11
+
12
+ def initialize(src, options = {})
13
+ @debug = true
14
+
15
+ # options
16
+ @css = File.open(File.expand_path(options[:css])).readlines.to_s unless options[:css].empty?
17
+ @js = File.open(File.expand_path(options[:js])).readlines.to_s unless options[:js].empty?
18
+ @language = options[:language]
19
+ @index = options[:index]
20
+ @metadata = options[:metadata]
21
+ @quiet = options[:quiet]
22
+
23
+ get_customized_element(options[:custom_element]) unless options[:custom_element].empty?
24
+ @mok = BlockParser.new(options)
25
+ @metadata = setup_metadata
26
+ @nodes = @mok.parse src
27
+ end
28
+
29
+ # エレメントのカスタム用ファイルを読み込む
30
+ def get_customized_element(file)
31
+ require File.expand_path(file)
32
+ end
33
+
34
+ def setup_metadata
35
+ metadata = @mok.metadata
36
+ metadata[:language] = @language if metadata[:language].nil?
37
+ metadata
38
+ end
39
+
40
+ def to_html
41
+ html = ""
42
+ html += header unless @quiet
43
+ html += header_title
44
+ html += metadata if @metadata
45
+ html += index if @index
46
+ html += body
47
+ html += footnote
48
+ html += footer unless @quiet
49
+ html
50
+ end
51
+
52
+ def body
53
+ @nodes.map do |node| node.apply end.join
54
+ end
55
+
56
+ def index
57
+ return "" if @mok.index[:head].nil?
58
+ str = "<div id='mok-index'>"
59
+ level_pre = 1
60
+ @mok.index[:head].each_with_index do |h,i|
61
+ next if h[:level] == 1 or h[:level] == 6
62
+
63
+ if h[:level] == 5
64
+ str += %[<div class="nonum"><a href="#mok-head#{h[:level]}-#{i+1}"><span class="space" />#{h[:title]}</a></div>\n]
65
+ else
66
+ str += index_terminate(h[:level], level_pre)
67
+ str += "<li><a href='#mok-head#{h[:level]}-#{i+1}'>#{h[:index]}#{h[:title]}</a>\n"
68
+ level_pre = h[:level]
69
+ end
70
+ end
71
+ str += index_terminate(2, level_pre) + "</ul>"
72
+ str += "</div>"
73
+ str
74
+ end
75
+
76
+ def index_terminate(level, level_pre)
77
+ str = ""
78
+ case level <=> level_pre
79
+ when 1
80
+ (level - level_pre).times do
81
+ str += "<ul>"
82
+ end
83
+ when -1
84
+ (level_pre - level).times do
85
+ str += "</ul></li>"
86
+ end
87
+ else
88
+ str += "</li>"
89
+ end
90
+ str
91
+ end
92
+
93
+ def metadata
94
+ str = "<div id='mok-metadata'>"
95
+ str += %[<div>#{CGI.escapeHTML(@metadata[:description])}</div>] unless @metadata[:description].nil?
96
+ str += %[<ul class="list-inline">]
97
+ %w{ author create update publisher version tag }.each do |m|
98
+ str += %[<li><strong>#{m}</strong>:#{CGI.escapeHTML(@metadata[m.to_sym])}</li>] unless @metadata[m.to_sym].nil?
99
+ end
100
+ str += "</ul>"
101
+ str += "</div>"
102
+ str
103
+ end
104
+
105
+ def footnote
106
+ return "" if @mok.inline_index[:footnote].nil?
107
+ str = "<div id='mok-footnote'>"
108
+ @mok.inline_index[:footnote].each_with_index do |f,i|
109
+ str += "<a id='mok-footnote-#{i+1}' class='footnote' />"
110
+ str += "<a href='#mok-footnote-#{i+1}-reverse' class='footnote-reverse'>*#{i+1}</a>"
111
+ str += " #{f[:content].map{|c| c.apply}}<br />"
112
+ end
113
+ str += "</div>"
114
+ str
115
+ end
116
+
117
+ def header
118
+ str = <<EOL
119
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
120
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
121
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="#{@metadata[:language]}">
122
+ <head>
123
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
124
+ EOL
125
+ str += css
126
+ str += javascript
127
+ str += <<EOL
128
+ <title>#{@metadata[:subject]}</title>
129
+ </head>
130
+ <body>
131
+ EOL
132
+ end
133
+
134
+ def header_title
135
+ "<h1>#{@metadata[:subject]}</h1>\n"
136
+ end
137
+
138
+ def css
139
+ str = ""
140
+ str += %[<style type="text/css"><!--\n#{@css}\n--></style>\n] unless @css.nil?
141
+ str
142
+ end
143
+
144
+ def javascript
145
+ str = ""
146
+ str += %[<script type="text/javascript">#{@js}</script>\n] unless @js.nil?
147
+ str
148
+ end
149
+
150
+ def footer
151
+ str = "\n"
152
+ str += "<div id='rights'>#{@metadata[:rights]}</div>\n" unless @metadata[:rights].nil?
153
+ str += "</body>\n</html>"
154
+ str
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,236 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (C) garin <garin54@gmail.com> 2011-2013
3
+ # See the included file COPYING for details.
4
+ require 'bundler/setup'
5
+ require 'mok-parser'
6
+
7
+ module Mok
8
+ class Element
9
+ def newline_to_br(str)
10
+ str.gsub("\n", "<br />\n")
11
+ end
12
+
13
+ # @inline_parser.parse の配列を文字列に変換する
14
+ def inline_parse_to_str(array)
15
+ str = ""
16
+ array.each do |obj|
17
+ str += obj.apply
18
+ end
19
+ str
20
+ end
21
+ end
22
+
23
+ # ----- Blocks
24
+ class WhiteLine < Element
25
+ def apply
26
+ "\n"
27
+ end
28
+ end
29
+
30
+ class PlainTextBlock < Element
31
+ def apply
32
+ @contents.map {|c| c.apply }
33
+ end
34
+ end
35
+
36
+ class HeadLine < Element
37
+ # @contents = [level, title, id, index]
38
+ def apply
39
+ return "" if @contents[0] == 1
40
+ str = ""
41
+ str += "<h#{@contents[0]} id='mok-head#{@contents[0]}-#{@contents[2]}'>"
42
+ str += "<a id='#{@contents[1].to_code}'></a>"
43
+ str += " #{@contents[3]}" unless @contents[0] == 1 or @contents[0] == 5 or @contents[0] == 6
44
+ str += "#{@contents[1]}</h#{@contents[0]}>\n"
45
+ str
46
+ end
47
+ end
48
+
49
+ class Paragraph < Element
50
+ def apply
51
+ "<p>#{@contents.map{|c| c.apply}}</p>\n"
52
+ end
53
+ end
54
+
55
+ class Quote < Element
56
+ def apply
57
+ "<blockquote>#{@contents.map{|c|c.apply}}</blockquote>\n"
58
+ end
59
+ end
60
+
61
+ class Preformat < Element
62
+ def apply
63
+ %[<pre class="prettyprint linenums">#{CGI.escapeHTML(@contents.join)}</pre>\n]
64
+ end
65
+ end
66
+
67
+ class ItemList < Element
68
+ def apply
69
+ return "" if @contents.empty?
70
+ type = :dummy
71
+ str = "<ul>\n"
72
+ @contents.each do |item|
73
+ type_pre = type
74
+ case item
75
+ when :INDENT
76
+ type = :indent
77
+ str += "\n<ul>\n"
78
+ when :DEDENT
79
+ type = :dedent
80
+ str += "</li>\n" if type_pre == :item
81
+ str += "</ul>\n</li>\n"
82
+ else
83
+ type = :item
84
+ str += "</li>\n" if type_pre == :item
85
+ str += "<li>#{item.apply}"
86
+ end
87
+ end
88
+ str += "\n</li>" if type == :item
89
+ str += "\n</ul>\n"
90
+ str
91
+ end
92
+ end
93
+
94
+ class NumList < Element
95
+ def apply
96
+ str = "<ol>\n"
97
+ @contents.map do |item|
98
+ if item == :INDENT
99
+ str += "<ol>\n"
100
+ elsif item == :DEDENT
101
+ str += "</ol>\n"
102
+ else
103
+ str += "<li>#{item.apply}</li>\n"
104
+ end
105
+ end
106
+ str += "</ol>\n"
107
+ str
108
+ end
109
+ end
110
+
111
+ class Desc < Element
112
+ # @contents = [title, lines]
113
+ def apply
114
+ str = %[<dl id="#{@contents[0].to_code}">\n<dt>#{@contents[0]}</dt>\n]
115
+ str += "<dd>#{inline_parse_to_str(@contents[1])}</dd>\n" unless inline_parse_to_str(@contents[1]).empty?
116
+ str += "</dl>"
117
+ str
118
+ end
119
+ end
120
+
121
+ class Table < Element
122
+ def apply
123
+ str = %[<table class="table table-hover">]
124
+ @contents.each do |line|
125
+ str += "\n<tr>"
126
+ line.each do |item|
127
+ if item =~ /^\s*\*/
128
+ str += "<th>#{item.sub(/^\s*\*/, "").sub(/\*\s*$/,"")}</th>"
129
+ else
130
+ str += "<td>#{item}</td>"
131
+ end
132
+ end
133
+ str += "\n</tr>"
134
+ end
135
+ str += "\n</table>"
136
+ str
137
+ end
138
+ end
139
+ # --- Blocks end
140
+
141
+ # --- Inlines
142
+ class Label < Element
143
+ # @contents = [label, title]
144
+ def apply
145
+ %[<a name="#{@contents[0]}" id="#{@contents[0]}">#{@contents[1]}</a>]
146
+ end
147
+ end
148
+
149
+ class LabelLink < Element
150
+ # @contents = [label, title]
151
+ def apply
152
+ %[<a href="##{@contents[0]}">#{@contents[1]}</a>]
153
+ end
154
+ end
155
+
156
+ class Reference < Element
157
+ def apply
158
+ %[<a href="#{@contents[1]}" title="#{@contents[1]}">#{@contents[0]}</a>]
159
+ end
160
+ end
161
+
162
+ class Plain < Element
163
+ def apply
164
+ "#{newline_to_br(CGI.escapeHTML(@contents.join))}"
165
+ end
166
+ end
167
+
168
+ class Emphasis < Element
169
+ def apply
170
+ "<strong>#{@contents.map{|c| c.apply}}</strong>"
171
+ end
172
+ end
173
+ class Italic < Element
174
+ def apply
175
+ "<em>#{@contents.map{|c| c.apply}}</em>"
176
+ end
177
+ end
178
+ class Strike < Element
179
+ def apply
180
+ "<del>#{@contents.map{|c| c.apply}}</del>"
181
+ end
182
+ end
183
+ class Code < Element
184
+ def apply
185
+ "<code>#{@contents.map{|c| c.apply}}</code>"
186
+ end
187
+ end
188
+ class Kbd < Element
189
+ def apply
190
+ "<kbd>#{@contents.map{|c| c.apply}}</kbd>"
191
+ end
192
+ end
193
+ class Verb < Element
194
+ def apply
195
+ "#{@contents}"
196
+ end
197
+ end
198
+
199
+ class Manuedo < Element
200
+ def apply
201
+ %{<span class="manuedo">[#{@contents.map{|c| c.apply}}]</span>}
202
+ end
203
+ end
204
+ class Ruby < Element
205
+ def apply
206
+ "<ruby><rb>#{@contents[0]}</rb><rp>(</rp><rt>#{@contents[1]}</rt><rp>)</rp></ruby>"
207
+ end
208
+ end
209
+ class Variable < Element
210
+ def apply
211
+ "#{@contents}"
212
+ end
213
+ end
214
+
215
+ class Footnote < Element
216
+ def apply
217
+ "<a href='#mok-footnote-#{@contents[1]}' name='mok-footnote-#{@contents[1]}-reverse' title='#{@contents[0].map {|c| c.apply}}' class='footnote-reverse'><sup><small>*#{@contents[1]}</small></sup></a>"
218
+ end
219
+ end
220
+
221
+ class Media < Element
222
+ def apply
223
+ # @contents = [Name, Mime::MediaType, Mime::SubType]
224
+ case @contents[1]
225
+ when 'image'
226
+ %[<a href="#{@contents[0]}"><img src="#{@contents[0]}" alt="#{@contents[0]}" class="img-rounded img-responsive" /></a>]
227
+ when 'video'
228
+ %[<video src="#{@contents[0]}" controls></video>]
229
+ when 'audio'
230
+ %[<audio src="#{@contents[0]}" controls></audio>]
231
+ else
232
+ %[<a href="#{@contents[0]}">#{@contents[0].split("/").last}</a>]
233
+ end
234
+ end
235
+ end
236
+ end
data/mok2html.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "mok2html"
5
+ spec.version = `cat VERSION`
6
+ spec.authors = ["garin"]
7
+ spec.email = ["garin54@gmail.com"]
8
+ spec.description = %q{mok is simple document format}
9
+ spec.summary = %q{mok is simple document format}
10
+ spec.homepage = ""
11
+ spec.license = "GPLv3"
12
+
13
+ spec.files = `git ls-files`.split($/)
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_development_dependency "bundler", "~> 1.3"
19
+ spec.add_development_dependency "rake"
20
+ spec.add_dependency('mok-parser', '>=0.3.0')
21
+ end
@@ -0,0 +1,35 @@
1
+ # = mok2html.yaml.sample
2
+ # mok2html 設定ファイルのサンプルです
3
+ #
4
+ # == 使い方
5
+ # 自身のホームディレクトリに .mok2html.yaml というファイル名で設置して値を編集します
6
+ # $ cp mok2html.yaml.sample ~/.mok2html.yaml
7
+ # $ vi ~/.mok2html.yaml
8
+ #
9
+ # == 設定項目
10
+ # コンバート時にHTMLファイルに埋め込むスタイルシート(デフォルト:"")
11
+ #css: "~/mok2html.css"
12
+
13
+ # コンバート時にHTMLファイルに埋め込むjavascript(デフォルト:"")
14
+ #js: "~/mok2html.js"
15
+
16
+ # リファレンス記法の「.%」を変換する拡張子(デフォルト:.html)
17
+ #reference_extension: ".html"
18
+
19
+ # 画像やビデオ、音声などを配置するディレクトリ(デフォルト:"")
20
+ #media_directory: "/usr/local/media"
21
+
22
+ # HTMLタグをカスタマイズするためのRubyファイル(デフォルト:"")
23
+ #custom_element: "/home/myname/mok2html/mycustom.rb"
24
+
25
+ # ドキュメントのフォーマット(デフォルト:ja)
26
+ #language: "ja"
27
+
28
+ # 目次(index)を作成するかどうか(デフォルト: true)
29
+ #index: true
30
+
31
+ # メタデータを作成するかどうか(デフォルト: true)
32
+ #metadata: true
33
+
34
+ # HTMLヘッダを出力"しない"かどうか(デフォルト: false)
35
+ #quiet: false