m2h 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c26564fb711fae98eb38a5798b8ac51102f0fba6
4
+ data.tar.gz: b751f65f0c2065b22a6d9a40de25cf6fed0afe72
5
+ SHA512:
6
+ metadata.gz: 03d70cd766e084eee531a2c4f97291cd15b08658a920170e391a65928d7f43c8102625c6eed7826de9f462cad656cfedea7e48803a713378f4b2aa7dd75240cc
7
+ data.tar.gz: 1021748158389f2c93a359a2f888683306d209b81ed5c185aa58e5cc00f5de5bd930710dfb5c4661a41079a4587273c916c986cf2d6747817924d92beedfe61d
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "redcarpet"
4
+ gem "test-unit"
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Masahiro Arakane
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,36 @@
1
+ # m2h
2
+
3
+ markdown to html compiler.
4
+
5
+ ## feature
6
+
7
+ - page-break
8
+ - '////' 4 or more slashes.
9
+ - header style
10
+ - with title and page-number
11
+ - cover
12
+
13
+ ## Installation
14
+
15
+ Install it yourself as:
16
+
17
+ $ gem install m2h
18
+
19
+ Or dd this line to your application's Gemfile:
20
+
21
+ gem 'm2h'
22
+
23
+ And then execute:
24
+
25
+ $ bundle
26
+
27
+
28
+ ## Usage
29
+
30
+ Usage : m2h <markdonw_file1> <markdonw_file2> ...
31
+ Options:
32
+ -s, --serif : font-family -> serif
33
+ -c, --cover : with cover page
34
+ -h, --help : show this messages
35
+ -v, --version : show version infomation
36
+
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/m2h ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.dirname(__FILE__) + "/../lib")
4
+ require 'm2h'
5
+
6
+ option = {
7
+ serif: false,
8
+ toc: false,
9
+ }
10
+
11
+ M2H::OptParser.new do |opt|
12
+ opt.on('-s', '--serif') {|v| option[:serif] = true}
13
+ opt.on('-c', '--cover') {|v| option[:cover] = true}
14
+ opt.on('-d', '--header') {|v| option[:header] = true}
15
+ opt.on('-t', '--toc') {|v| option[:toc] = true}
16
+ opt.on('-h', '--help') {|v| puts opt.help; exit}
17
+ opt.on('-v', '--version') {|v| puts "M2H::VERSION => #{M2H::VERSION}"; exit}
18
+
19
+ begin
20
+ opt.parse!(ARGV)
21
+ if ARGV.empty?
22
+ puts opt.help
23
+ exit 0
24
+ end
25
+ M2H::Render.render! M2H::Base.new(ARGV, option)
26
+ rescue OptionParser::InvalidOption => e
27
+ M2H::OptionError.new(e.message)
28
+ puts opt.help
29
+ exit 3
30
+ end
31
+ end
32
+
33
+ # vim set: ft=ruby fenc= utf-8 ff=unix
@@ -0,0 +1,8 @@
1
+ require "m2h/base"
2
+ require "m2h/optparser"
3
+ require "m2h/render"
4
+ require "m2h/version"
5
+
6
+ module M2H
7
+
8
+ end
@@ -0,0 +1,304 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title><%= @title %></title>
6
+ <style type="text/css">
7
+ body {
8
+ color: #333333;
9
+ font-family: "Century Gothic", Helvetica, Meiryo, arial, sans-serif;
10
+ <%= "font-family: serif;" if @serif %>
11
+ font-size: 13px;
12
+ line-height: 1.6;
13
+ background-color: white;
14
+ padding: 10px 20px;
15
+ margin: 0;
16
+ padding-top: 0;}
17
+
18
+ body > *:first-child {
19
+ margin-top: 0 !important; }
20
+ body > *:last-child {
21
+ margin-bottom: 0 !important; }
22
+
23
+ a {
24
+ color: #4183C4; }
25
+ a.absent {
26
+ color: #cc0000; }
27
+ a.anchor {
28
+ display: block;
29
+ padding-left: 30px;
30
+ margin-left: -30px;
31
+ cursor: pointer;
32
+ position: absolute;
33
+ top: 0;
34
+ left: 0;
35
+ bottom: 0; }
36
+
37
+ h1, h2, h3, h4, h5, h6 {
38
+ margin: 10px 0;
39
+ padding: 0;
40
+ font-weight: normal;
41
+ -webkit-font-smoothing: antialiased;
42
+ cursor: text;
43
+ position: relative; }
44
+ h4, h5, h6 {
45
+ font-weight: normal;}
46
+
47
+ h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
48
+ text-decoration: none; }
49
+ h1 tt, h1 code {
50
+ font-size: inherit; }
51
+ h2 tt, h2 code {
52
+ font-size: inherit; }
53
+ h3 tt, h3 code {
54
+ font-size: inherit; }
55
+ h4 tt, h4 code {
56
+ font-size: inherit; }
57
+ h5 tt, h5 code {
58
+ font-size: inherit; }
59
+ h6 tt, h6 code {
60
+ font-size: inherit; }
61
+
62
+ h1 {
63
+ font-size: 25px;
64
+ border-bottom: 1px solid #ddd;
65
+ color: black; }
66
+ h2 {
67
+ font-size: 20px;
68
+ border-bottom: 1px solid #eee;
69
+ color: black; }
70
+ h3 {
71
+ font-size: 16px; }
72
+ h4 {
73
+ font-size: 15px; }
74
+ h5 {
75
+ font-size: 14px; }
76
+ h6 {
77
+ color: #777777;
78
+ font-size: 13px; }
79
+ p, blockquote, ul, ol, dl, li, table, pre {
80
+ margin: 15px 0; }
81
+
82
+ hr {
83
+ border: 0 none;
84
+ color: #cccccc;
85
+ height: 4px;
86
+ padding: 0; }
87
+
88
+ body > h2:first-child {
89
+ margin-top: 0;
90
+ padding-top: 0; }
91
+ body > h1:first-child {
92
+ margin-top: 0;
93
+ padding-top: 0; }
94
+ body > h1:first-child + h2 {
95
+ margin-top: 0;
96
+ padding-top: 0; }
97
+ body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
98
+ margin-top: 0;
99
+ padding-top: 0; }
100
+
101
+ a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
102
+ margin-top: 0;
103
+ padding-top: 0; }
104
+
105
+ h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
106
+ margin-top: 0; }
107
+
108
+ li p.first {
109
+ display: inline-block; }
110
+ ul, ol {
111
+ padding-left: 30px; }
112
+ ul :first-child, ol :first-child {
113
+ margin-top: 0; }
114
+ ul :last-child, ol :last-child {
115
+ margin-bottom: 0; }
116
+ dl {
117
+ padding: 0; }
118
+ dl dt {
119
+ font-size: 14px;
120
+ font-weight: bold;
121
+ font-style: italic;
122
+ padding: 0;
123
+ margin: 15px 0 5px; }
124
+ dl dt:first-child {
125
+ padding: 0; }
126
+ dl dt > :first-child {
127
+ margin-top: 0; }
128
+ dl dt > :last-child {
129
+ margin-bottom: 0; }
130
+ dl dd {
131
+ margin: 0 0 15px;
132
+ padding: 0 15px; }
133
+ dl dd > :first-child {
134
+ margin-top: 0; }
135
+ dl dd > :last-child {
136
+ margin-bottom: 0; }
137
+
138
+ blockquote {
139
+ border-left: 4px solid #dddddd;
140
+ padding: 0 15px;
141
+ color: #555555; }
142
+ blockquote > :first-child {
143
+ margin-top: 0; }
144
+ blockquote > :last-child {
145
+ margin-bottom: 0; }
146
+
147
+ table {
148
+ border-collapse: collapse;
149
+ padding: 0; }
150
+ table tr {
151
+ border-top: 1px solid #cccccc;
152
+ background-color: white;
153
+ margin: 0;
154
+ padding: 0; }
155
+ table tr:nth-child(2n) {
156
+ background-color: #f8f8f8; }
157
+ table tr th {
158
+ font-weight: bold;
159
+ background: #fbfbfb;
160
+ border: 1px solid #cccccc;
161
+ text-align: left;
162
+ margin: 0;
163
+ padding: 6px 13px; }
164
+ table tr td {
165
+ border: 1px solid #cccccc;
166
+ text-align: left;
167
+ margin: 0;
168
+ padding: 6px 13px; }
169
+ table tr th :first-child, table tr td :first-child {
170
+ margin-top: 0; }
171
+ table tr th :last-child, table tr td :last-child {
172
+ margin-bottom: 0; }
173
+
174
+ img {
175
+ max-width: 100%; }
176
+
177
+ span.frame {
178
+ display: block;
179
+ overflow: hidden; }
180
+ span.frame > span {
181
+ border: 1px solid #dddddd;
182
+ display: block;
183
+ float: left;
184
+ overflow: hidden;
185
+ margin: 13px 0 0;
186
+ padding: 7px;
187
+ width: auto; }
188
+ span.frame span img {
189
+ display: block;
190
+ float: left; }
191
+ span.frame span span {
192
+ clear: both;
193
+ color: #333333;
194
+ display: block;
195
+ padding: 5px 0 0; }
196
+ span.align-center {
197
+ display: block;
198
+ overflow: hidden;
199
+ clear: both; }
200
+ span.align-center > span {
201
+ display: block;
202
+ overflow: hidden;
203
+ margin: 13px auto 0;
204
+ text-align: center; }
205
+ span.align-center span img {
206
+ margin: 0 auto;
207
+ text-align: center; }
208
+ span.align-right {
209
+ display: block;
210
+ overflow: hidden;
211
+ clear: both; }
212
+ span.align-right > span {
213
+ display: block;
214
+ overflow: hidden;
215
+ margin: 13px 0 0;
216
+ text-align: right; }
217
+ span.align-right span img {
218
+ margin: 0;
219
+ text-align: right; }
220
+ span.float-left {
221
+ display: block;
222
+ margin-right: 13px;
223
+ overflow: hidden;
224
+ float: left; }
225
+ span.float-left span {
226
+ margin: 13px 0 0; }
227
+ span.float-right {
228
+ display: block;
229
+ margin-left: 13px;
230
+ overflow: hidden;
231
+ float: right; }
232
+ span.float-right > span {
233
+ display: block;
234
+ overflow: hidden;
235
+ margin: 13px auto 0;
236
+ text-align: right; }
237
+
238
+ code, tt {
239
+ margin: 0 2px;
240
+ padding: 0 5px;
241
+ white-space: nowrap;
242
+ border: 1px solid #eaeaea;
243
+ background-color: #f8f8f8;
244
+ border-radius: 3px; }
245
+ pre code {
246
+ margin: 0;
247
+ padding: 0;
248
+ white-space: pre;
249
+ border: none;
250
+ background: transparent; }
251
+ .highlight pre {
252
+ background-color: #f8f8f8;
253
+ border: 1px solid #cccccc;
254
+ font-size: 13px;
255
+ line-height: 19px;
256
+ overflow: auto;
257
+ padding: 6px 10px;
258
+ border-radius: 3px; }
259
+ pre {
260
+ background-color: #f8f8f8;
261
+ border: 1px solid #cccccc;
262
+ font-size: 13px;
263
+ line-height: 19px;
264
+ overflow: auto;
265
+ padding: 6px 10px;
266
+ border-radius: 3px; }
267
+ pre code, pre tt {
268
+ background-color: transparent;
269
+ border: none; }
270
+
271
+ .page_number {
272
+ margin: 0;
273
+ padding: 0;
274
+ text-align: right;
275
+ font-size: small;
276
+ color: #555555;
277
+ border-bottom: 1px solid #e1e1e1;}
278
+ .break {
279
+ page-break-before: always;}
280
+
281
+ @media screen {
282
+ .cover {
283
+ display: none;}
284
+ }
285
+
286
+ @media print {
287
+ .cover h1 {
288
+ margin-top: 50%;
289
+ border-bottom: 0;
290
+ text-align: center;}
291
+ }
292
+
293
+ <%= ".page_number {display: none;}" unless @header %>
294
+
295
+ </style>
296
+ </head>
297
+ <body>
298
+
299
+ <%= @cover %>
300
+
301
+ <%= @html %>
302
+
303
+ </body>
304
+ </html>
@@ -0,0 +1,37 @@
1
+ module M2H
2
+ class Base
3
+ attr_reader :files, :sys_enc, :serif, :header, :cover, :toc
4
+
5
+ def initialize(argv, option)
6
+ @errors = []
7
+ @files = path_inspect(argv)
8
+ @sys_enc = Encoding.locale_charmap
9
+ @serif = option[:serif] ? true : false
10
+ @header = option[:header] ? true : false
11
+ @cover = option[:cover] ? true : false
12
+ @toc = option[:toc] ? true : false
13
+ if @errors.empty?
14
+ return self
15
+ else
16
+ @errors.each do |e|
17
+ puts e
18
+ end
19
+ exit 3
20
+ end
21
+ end
22
+
23
+ def path_inspect(files)
24
+ is_valid = true
25
+ expanded_paths = []
26
+ files.each { |f|
27
+ unless File.exists?(File.expand_path(f))
28
+ is_valid = false
29
+ @errors.push("PathError: Could not found #{f}")
30
+ else
31
+ expanded_paths.push(File.expand_path(f))
32
+ end
33
+ }
34
+ return expanded_paths
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ module M2H
2
+ require "optparse"
3
+
4
+ class OptParser < OptionParser
5
+ attr_reader :help
6
+
7
+ def initialize
8
+ @help = <<-HELP
9
+ Usage : m2h <markdonw_file1> <markdonw_file2> ...
10
+ Options:
11
+ -s, --serif : font-family -> serif
12
+ -d, --header : with header
13
+ -c, --cover : with cover page
14
+ -t, --toc : use tocify.js
15
+ -h, --help : show this messages
16
+ -v, --version : show version infomation
17
+ HELP
18
+ super
19
+ end
20
+ end
21
+
22
+ class OptionError
23
+ def initialize(message)
24
+ $stderr.puts "!!! " << message << " !!!"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,82 @@
1
+ module M2H
2
+ class Render
3
+ require "redcarpet"
4
+ require "erb"
5
+
6
+ class Document
7
+ attr_accessor :html_body
8
+
9
+ def initialize(html_body)
10
+ @erb_template = File.open(File.dirname(__FILE__) + "/_layout.erb").read
11
+ @html = generate_html(html_body)
12
+ @header = false
13
+ end
14
+
15
+ def generate_html(html_body)
16
+ @title = $1 if /h1>(.+)\<\/h1./ =~ html_body
17
+ @pages = html_body.split(/\/{4,}/) # page_break
18
+ @page_count = @pages.size
19
+ html = @pages.map.with_index { |page, i|
20
+ unless (i + 1) == @page_count
21
+ "<div class='page_number'>#{i+1}/#{@page_count}</div>\n" + page + "\n<div class='break'/>\n"
22
+ else
23
+ "<div class='page_number'>#{i+1}/#{@page_count}</div>\n" + page
24
+ end
25
+ }.join
26
+ html.gsub!(/page_number'>/, "page_number'>#{@title}&nbsp;")
27
+ return html
28
+ end
29
+
30
+ def bind!
31
+ return ERB.new(@erb_template).result(binding)
32
+ end
33
+
34
+ def set_header
35
+ @header = true
36
+ end
37
+
38
+ def write(path, enc)
39
+ File.open(path, enc).write(self.bind!)
40
+ end
41
+
42
+ def set_serif
43
+ @serif = "serif, "
44
+ end
45
+
46
+ def set_cover
47
+ cover = "\n<div class='cover'><h1>#{@title}</h1></div>\n"
48
+ cover += "<div class='break'/>\n"
49
+ @cover = cover
50
+ end
51
+
52
+ def set_toc
53
+ @toc = true
54
+ end
55
+ end
56
+
57
+ def self.render!(base)
58
+ markdown = Redcarpet::Markdown.new(
59
+ Redcarpet::Render::HTML,
60
+ space_after_headers: true,
61
+ fenced_code_blocks: true,
62
+ no_intra_emphasis: true,
63
+ strikethrough: true,
64
+ footnotes: true,
65
+ autolink: true,
66
+ tables: true,
67
+ with_toc_data: true,
68
+ )
69
+
70
+ base.files.each { |bf|
71
+ doc = Document.new(markdown.render(File.open(bf, "r:utf-8").read))
72
+ doc.set_serif if base.serif
73
+ doc.set_header if base.header
74
+ doc.set_cover if base.cover
75
+ doc.set_toc if base.toc
76
+ doc.write("#{bf}.html".encode(base.sys_enc), "w:#{base.sys_enc}")
77
+ puts "render: #{bf}.html"
78
+ }
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,3 @@
1
+ module M2H
2
+ VERSION = "0.2.0"
3
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'm2h/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "m2h"
8
+ s.version = "0.2.0"
9
+ s.authors = ["arakanemacs"]
10
+ s.email = ["arakanemacs@gmail.com"]
11
+ s.description = %q{styled markdown parser}
12
+ s.summary = %q{markdown to html}
13
+ s.homepage = "https://github.com/arakanemacs/m2h"
14
+ s.license = "MIT"
15
+
16
+ s.add_runtime_dependency "redcarpet", [">= 3.0.0"]
17
+
18
+ s.files = %w[
19
+ Gemfile
20
+ LICENSE
21
+ README.md
22
+ Rakefile
23
+ bin/m2h
24
+ lib/m2h.rb
25
+ lib/m2h/_layout.erb
26
+ lib/m2h/base.rb
27
+ lib/m2h/optparser.rb
28
+ lib/m2h/render.rb
29
+ lib/m2h/version.rb
30
+ m2h.gemspec
31
+ ]
32
+ s.executables = 'm2h'
33
+ s.require_paths = ["lib"]
34
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: m2h
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - arakanemacs
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redcarpet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.0.0
27
+ description: styled markdown parser
28
+ email:
29
+ - arakanemacs@gmail.com
30
+ executables:
31
+ - m2h
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - Gemfile
36
+ - LICENSE
37
+ - README.md
38
+ - Rakefile
39
+ - bin/m2h
40
+ - lib/m2h.rb
41
+ - lib/m2h/_layout.erb
42
+ - lib/m2h/base.rb
43
+ - lib/m2h/optparser.rb
44
+ - lib/m2h/render.rb
45
+ - lib/m2h/version.rb
46
+ - m2h.gemspec
47
+ homepage: https://github.com/arakanemacs/m2h
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.1.11
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: markdown to html
71
+ test_files: []