m2m 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ <div class="posts">
2
+ {{#articles}}
3
+ <div class="post">
4
+ <h1><a href="{{root/relative_path}}{{relative_url}}">{{meta.title}}</a></h1>
5
+ <span class="post-date">{{meta.publish_date}}</span>
6
+ <p>{{excerpt}}&hellip;</p>
7
+ </div>
8
+ {{/articles}}
9
+ </div>
10
+
11
+ <!-- Pagination links -->
12
+ <div class="pagination">
13
+ {{#nav.previous}}
14
+ <a class="previous" href="{{nav.previous}}">&larr; 上一页</a>
15
+ {{/nav.previous}}
16
+
17
+ {{#nav.next}}
18
+ <a class="next" href="{{nav.next}}">下一页 &rarr;</a>
19
+ {{/nav.next}}
20
+ </div>
@@ -0,0 +1,55 @@
1
+ #读取文件内容
2
+
3
+ require 'kramdown'
4
+
5
+ class TOC
6
+ DISPATCHER = Hash.new {|h,k| h[k] = "convert_#{k}"}
7
+
8
+ include ::Kramdown::Utils::Html
9
+ include ::Kramdown::Parser::Html::Constants
10
+
11
+ def convert_children(element, index)
12
+ result = ""
13
+ index += 2
14
+ element.children.each do |inner_element|
15
+ result += send(DISPATCHER[inner_element.type], inner_element, index)
16
+ end
17
+ result
18
+ end
19
+
20
+ def convert_text(element, index)
21
+ escape_html(element.value, :text)
22
+ end
23
+
24
+ def convert_toc(element, index)
25
+ # result = Hash.new
26
+ # result['href'] = element.attr[:id]
27
+ # result['title'] = element.value.children.first.value
28
+ #
29
+ # if (element.children.length > 1)
30
+ # result['items'] = self.inner(element, ind)
31
+ # end
32
+
33
+ # return result
34
+
35
+ title = element.value.children.first.value
36
+ result = (" " * index) + "<li><a href=\"##{element.attr[:id]}\">#{title}</a>"
37
+ if (element.children.length > 1)
38
+ result += "\n<ul>\n"
39
+ result += "#{self.convert_children(element, index)}"
40
+ result += (" " * index) + "</ul>"
41
+ end
42
+
43
+ result += "</li>\n"
44
+ result
45
+ end
46
+
47
+ #转换文件
48
+ def to_html(element)
49
+ return nil if element.children.length == 0
50
+ result = "<ul class='toc'>"
51
+ result += self.convert_children(element, 0)
52
+ result += "</ul>"
53
+ result
54
+ end
55
+ end
@@ -0,0 +1,119 @@
1
+ require 'yaml'
2
+ require 'fileutils'
3
+ require 'singleton'
4
+ require 'aescrypt'
5
+ require 'base64'
6
+
7
+ require_relative './product'
8
+
9
+ class Util
10
+ include Singleton
11
+
12
+ attr :config_file
13
+ attr :local_theme_dir
14
+ attr :project_name
15
+ attr :workbench
16
+ attr :encrypt_key
17
+
18
+ def initialize
19
+ #本地主题的目录
20
+ @local_theme_dir = 'm2m-theme'
21
+ #当前的工作目录
22
+ @workbench = nil
23
+
24
+ #配置文件的文件名
25
+ @config_file = 'm2m.config'
26
+ @encrypt_key = 'm2m'
27
+ end
28
+
29
+ #################### 属性 ####################
30
+
31
+ #获取产品相关的信息
32
+ def get_product
33
+ {
34
+ 'name' => M2M::NAME,
35
+ 'version' => M2M::VERSION,
36
+ 'homepage' => M2M::HOMEPAGE,
37
+ 'repos' => M2M::REPOS
38
+ }
39
+ end
40
+
41
+ #设置workbench
42
+ def workbench=(dir)
43
+ #工作目录
44
+ @workbench = dir
45
+ #项目名称
46
+ @project_name = File::basename dir
47
+ end
48
+
49
+ #################### 获取 ####################
50
+ #临时目录
51
+ def get_temp_dir
52
+ dir = File.join(Dir.home, ".m2m")
53
+ #如果不存在则创建一个
54
+ Dir::mkdir(dir) if(!File::exists?(dir))
55
+ dir
56
+ end
57
+
58
+ #获取一个相对路径离root有几个..
59
+ def get_relative_dot(relative_url)
60
+ depth = relative_url.split('/').length - 1
61
+ return './' if depth == 0
62
+ return '../' * (relative_url.split('/').length - 1)
63
+ end
64
+
65
+ #合并两个路径
66
+ def get_merge_path(relative_path, base_path = Dir::pwd)
67
+ base_path = Pathname.new base_path
68
+ return base_path if not relative_path
69
+ base_path + Pathname.new(relative_path)
70
+ end
71
+
72
+ #获取相对路径,如果没有设定source,则使用当前的工作目录
73
+ def get_relative_path(target, source = Dir::pwd)
74
+ target = Pathname.new(target) if target.class == String
75
+ source = Pathname.new(source) if source.class == String
76
+ target.relative_path_from(source).to_s
77
+ end
78
+
79
+ #################### 操作 ####################
80
+
81
+ def write_file(file, content)
82
+ dir = File::dirname file
83
+ #如果不在存文件夹, 则先创建
84
+ # puts dir
85
+ FileUtils.mkpath(dir) if not File::exists?(dir)
86
+ #写入文件
87
+ IO.write(file, content)
88
+ end
89
+
90
+ def error(log, level = 1)
91
+ puts log
92
+ exit level
93
+ end
94
+
95
+ #################### 判断 ####################
96
+ #判断一个文件是否为配置文件
97
+ def is_config_file?(file)
98
+ filename = self.get_relative_path file, @workbench
99
+ filename == @config_file
100
+ end
101
+ #检查一个文件是否为markdown
102
+ def is_markdown_file?(file)
103
+ (/\.(md)|(markdown)$/i =~ file) != nil
104
+ end
105
+
106
+ #检查文件是否为.开头的文件
107
+ def is_shadow_file?(file)
108
+ (/^\./ =~ file) != nil
109
+ end
110
+
111
+ #################### 加解密 ####################
112
+ def encrypt(str, encrypt_key = @encrypt_key)
113
+ AESCrypt.encrypt(str, encrypt_key)
114
+ end
115
+
116
+ def decrypt(str, encrypt_key = @encrypt_key)
117
+ AESCrypt.decrypt(str, encrypt_key)
118
+ end
119
+ end
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('./lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require './lib/product'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.executables = [M2M::NAME]
8
+ spec.name = M2M::NAME
9
+ spec.version = M2M::VERSION
10
+ spec.authors = ["wvv8oo"]
11
+ spec.email = ["wvv8oo@gmail.com"]
12
+
13
+ spec.summary = %q{Markdown to More}
14
+ spec.description = %q{将Markdown转换为Blog,邮件或者PDF}
15
+ spec.homepage = M2M::HOMEPAGE
16
+
17
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
+ # delete this section to allow pushing this gem to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = 'm2m'
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.11"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+
33
+ spec.add_runtime_dependency('commander', '4.4.0')
34
+ spec.add_runtime_dependency('nokogiri', '1.6.7')
35
+ spec.add_runtime_dependency('mustache', '1.0.3')
36
+ spec.add_runtime_dependency('kramdown', '1.10.0')
37
+ spec.add_runtime_dependency('mail', '2.6.4')
38
+ spec.add_runtime_dependency('aescrypt', '1.0.0')
39
+ spec.add_runtime_dependency('webrick', '1.3.1')
40
+ end
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: m2m
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - wvv8oo
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: commander
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 4.4.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 4.4.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.7
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.7
69
+ - !ruby/object:Gem::Dependency
70
+ name: mustache
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.0.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: kramdown
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.10.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.10.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: mail
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 2.6.4
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 2.6.4
111
+ - !ruby/object:Gem::Dependency
112
+ name: aescrypt
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 1.0.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: webrick
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.3.1
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 1.3.1
139
+ description: 将Markdown转换为Blog,邮件或者PDF
140
+ email:
141
+ - wvv8oo@gmail.com
142
+ executables:
143
+ - m2m
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - .gitignore
148
+ - Gemfile
149
+ - Gemfile.lock
150
+ - LICENSE
151
+ - README.md
152
+ - bin/console
153
+ - exe/m2m
154
+ - exe/mailer.rb
155
+ - exe/server.rb
156
+ - exe/setup.rb
157
+ - exe/site.rb
158
+ - lib/article.rb
159
+ - lib/compiler.rb
160
+ - lib/generator.rb
161
+ - lib/mailer.rb
162
+ - lib/meta.rb
163
+ - lib/product.rb
164
+ - lib/scan.rb
165
+ - lib/server.rb
166
+ - lib/setup.rb
167
+ - lib/store.rb
168
+ - lib/themes/hyde/static/hyde.css
169
+ - lib/themes/hyde/template/article.mustache
170
+ - lib/themes/hyde/template/home.mustache
171
+ - lib/themes/hyde/template/index.mustache
172
+ - lib/themes/hyde/template/mail.mustache
173
+ - lib/themes/hyde/template/page.mustache
174
+ - lib/themes/hyde/template/partials/footer.mustache
175
+ - lib/themes/hyde/template/partials/head.mustache
176
+ - lib/themes/hyde/template/partials/header.mustache
177
+ - lib/themes/hyde/template/partials/list.mustache
178
+ - lib/toc.rb
179
+ - lib/util.rb
180
+ - m2m.gemspec
181
+ homepage: http://m2m.wvv8oo.com/
182
+ licenses: []
183
+ metadata: {}
184
+ post_install_message:
185
+ rdoc_options: []
186
+ require_paths:
187
+ - lib
188
+ required_ruby_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ requirements: []
199
+ rubyforge_project:
200
+ rubygems_version: 2.4.2
201
+ signing_key:
202
+ specification_version: 4
203
+ summary: Markdown to More
204
+ test_files: []