textutils 0.8.4 → 0.8.5
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/Manifest.txt +1 -0
- data/lib/textutils/page.rb +197 -0
- data/lib/textutils/utils.rb +1 -3
- data/lib/textutils/version.rb +2 -1
- data/lib/textutils.rb +21 -0
- metadata +9 -8
data/Manifest.txt
CHANGED
@@ -16,6 +16,7 @@ lib/textutils/helper/title_helper.rb
|
|
16
16
|
lib/textutils/helper/unicode_helper.rb
|
17
17
|
lib/textutils/helper/value_helper.rb
|
18
18
|
lib/textutils/helper/xml_helper.rb
|
19
|
+
lib/textutils/page.rb
|
19
20
|
lib/textutils/patterns.rb
|
20
21
|
lib/textutils/reader/code_reader.rb
|
21
22
|
lib/textutils/reader/fixture_reader.rb
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
##
|
4
|
+
## page template class for book production w/ markdown
|
5
|
+
## and static site compiler (e.g. jekyll)
|
6
|
+
##
|
7
|
+
## todo: move filters to filter for public reuse!!!
|
8
|
+
|
9
|
+
module TextUtils
|
10
|
+
|
11
|
+
|
12
|
+
############
|
13
|
+
## fix:
|
14
|
+
### add some unit tests!!!!!!!!!!!!!!!!!
|
15
|
+
###
|
16
|
+
|
17
|
+
class Page
|
18
|
+
|
19
|
+
### convenience helper; use like:
|
20
|
+
## Page.open() do |page|
|
21
|
+
## page.write( text )
|
22
|
+
## page.write( text )
|
23
|
+
## end
|
24
|
+
|
25
|
+
def self.open( path, mode, opts={} )
|
26
|
+
page = self.new( path, mode, opts )
|
27
|
+
yield( page )
|
28
|
+
page.close
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.create( path, opts={} )
|
32
|
+
## todo: check if 'w' is good enough?? do NOT need to add +
|
33
|
+
page = self.new( path, 'w+', opts )
|
34
|
+
yield( page )
|
35
|
+
page.close
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.update( path, opts={} )
|
39
|
+
## todo: check if 'a' is good enough?? do NOT need to add +
|
40
|
+
page = self.new( path, 'a+', opts )
|
41
|
+
yield( page )
|
42
|
+
page.close
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def initialize( path, mode, opts={} )
|
47
|
+
## check if folders exists? if not create folder in path
|
48
|
+
FileUtils.mkdir_p( File.dirname(path) )
|
49
|
+
|
50
|
+
@file = File.new( path, mode )
|
51
|
+
|
52
|
+
## add frontmatter if passed in
|
53
|
+
## todo: assert check if mode = 'w' and NOT 'a' !!!
|
54
|
+
@file.write render_frontmatter( opts[:frontmatter] ) if opts[:frontmatter]
|
55
|
+
end
|
56
|
+
|
57
|
+
def write( text )
|
58
|
+
@file.write( text )
|
59
|
+
end
|
60
|
+
|
61
|
+
def close
|
62
|
+
@file.close
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
###########################
|
68
|
+
# helpers
|
69
|
+
# - make public for reuse !!!!!
|
70
|
+
|
71
|
+
def render_frontmatter( h )
|
72
|
+
buf = ''
|
73
|
+
buf += "---\n"
|
74
|
+
|
75
|
+
h.each do |key,value|
|
76
|
+
buf += "#{key}: #{value}\n"
|
77
|
+
end
|
78
|
+
|
79
|
+
buf += "---\n\n"
|
80
|
+
buf
|
81
|
+
end
|
82
|
+
|
83
|
+
end # class Page
|
84
|
+
|
85
|
+
|
86
|
+
class PageTemplate
|
87
|
+
|
88
|
+
|
89
|
+
###
|
90
|
+
## todo: what is the best convention for loading file and handling string
|
91
|
+
## for now it its:
|
92
|
+
#
|
93
|
+
# PageTemplate.read( 'to/path ' ) or --- use load ???? instead of read??
|
94
|
+
# PageTemplate.new( 'template content' )
|
95
|
+
|
96
|
+
|
97
|
+
def self.read( path )
|
98
|
+
self.new( File.read_utf8( path ) )
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def initialize( tmpl )
|
103
|
+
@tmpl = tmpl.dup # make a copy; just to be sure no one will change text
|
104
|
+
end
|
105
|
+
|
106
|
+
def render( ctx )
|
107
|
+
# note: erb offers the following trim modes:
|
108
|
+
# 1) <> omit newline for lines starting with <% and ending in %>
|
109
|
+
# 2) > omit newline for lines ending in %>
|
110
|
+
# 3) omit blank lines ending in -%>
|
111
|
+
## run filters
|
112
|
+
tmpl = remove_html_comments( @tmpl )
|
113
|
+
tmpl = remove_blanks( tmpl )
|
114
|
+
|
115
|
+
tmpl = django_to_erb( tmpl ) ## allow django/jinja style templates
|
116
|
+
|
117
|
+
tmpl = remove_leading_spaces( tmpl )
|
118
|
+
tmpl = concat_lines( tmpl )
|
119
|
+
|
120
|
+
text = ERB.new( tmpl, nil, '<>' ).result( ctx )
|
121
|
+
|
122
|
+
### text = cleanup_newlines( text )
|
123
|
+
text
|
124
|
+
end
|
125
|
+
|
126
|
+
#######################
|
127
|
+
# filters
|
128
|
+
# - use better names and make public for reuse!!!!
|
129
|
+
|
130
|
+
def django_to_erb( text )
|
131
|
+
## convert django style markers to erb style marker e.g
|
132
|
+
# {% %} becomes <% %> -- supports multi-line
|
133
|
+
# {{ }} becomes <%= %> - does NOT support multi-line
|
134
|
+
|
135
|
+
## comments (support multi-line)
|
136
|
+
text = text.gsub( /\{#(.+?)#\}/m ) do |_|
|
137
|
+
"<%# #{1} %>"
|
138
|
+
end
|
139
|
+
|
140
|
+
text = text.gsub( /\{%(.+?)%\}/m ) do |_|
|
141
|
+
## note: also replace newlines w/ %>\n<% to split
|
142
|
+
# multi-line stmts into single-line stmts
|
143
|
+
# lets us use
|
144
|
+
# {%
|
145
|
+
# %} will become
|
146
|
+
# <% %>
|
147
|
+
# <% %>
|
148
|
+
"<% #{$1} %>".gsub( "\n", " %>\n<% " )
|
149
|
+
end
|
150
|
+
|
151
|
+
# note: for now {{ }} will NOT support multi-line
|
152
|
+
text = text.gsub( /\{\{(.+?)\}\}/ ) do |_|
|
153
|
+
"<%= #{$1} %>"
|
154
|
+
end
|
155
|
+
|
156
|
+
text
|
157
|
+
end
|
158
|
+
|
159
|
+
def remove_html_comments( text )
|
160
|
+
text.gsub( /<!--.+?-->/, '' )
|
161
|
+
end
|
162
|
+
|
163
|
+
def remove_leading_spaces( text )
|
164
|
+
# remove leading spaces if less than four !!!
|
165
|
+
text.gsub( /^[ \t]+(?![ \t])/, '' ) # use negative regex lookahead e.g. (?!)
|
166
|
+
end
|
167
|
+
|
168
|
+
def remove_blanks( text )
|
169
|
+
# remove lines only with ..
|
170
|
+
text.gsub( /^[ \t]*\.{2}[ \t]*\n/, '' )
|
171
|
+
end
|
172
|
+
|
173
|
+
def cleanup_newlines( text )
|
174
|
+
# remove all blank lines that go over three
|
175
|
+
text.gsub( /\n{4,}/, "\n\n\n" )
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
def concat_lines( text )
|
180
|
+
# lines ending with ++ will get newlines get removed
|
181
|
+
# e.g.
|
182
|
+
# >| hello1 ++
|
183
|
+
# >1 hello2
|
184
|
+
# becomes
|
185
|
+
# >| hello1 hello2
|
186
|
+
|
187
|
+
#
|
188
|
+
# note: do NOT use \s - will include \n (newline) ??
|
189
|
+
|
190
|
+
text.gsub( /[ \t]+\+{2}[ \t]*\n[ \t]*/, ' ' ) # note: replace with single space
|
191
|
+
end
|
192
|
+
|
193
|
+
|
194
|
+
end # class PageTemplate
|
195
|
+
|
196
|
+
end # module TextUtils
|
197
|
+
|
data/lib/textutils/utils.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
3
|
module TextUtils
|
6
4
|
# make helpers available as class methods e.g. TextUtils.convert_unicode_dashes_to_plain_ascii
|
7
5
|
extend UnicodeHelper
|
@@ -33,7 +31,7 @@ end
|
|
33
31
|
|
34
32
|
|
35
33
|
def find_data_path_from_gemfile_gitref( name )
|
36
|
-
puts "[
|
34
|
+
puts "[textutils] find_data_path( name='#{name}' )..."
|
37
35
|
puts "load path:"
|
38
36
|
pp $LOAD_PATH
|
39
37
|
|
data/lib/textutils/version.rb
CHANGED
data/lib/textutils.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
|
2
4
|
# core and stlibs
|
3
5
|
|
@@ -43,3 +45,22 @@ require 'textutils/reader/fixture_reader'
|
|
43
45
|
|
44
46
|
require 'textutils/classifier'
|
45
47
|
|
48
|
+
require 'textutils/page' # for book pages and page templates
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
module TextUtils
|
53
|
+
|
54
|
+
def self.banner
|
55
|
+
"textutils/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.root
|
59
|
+
"#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
puts TextUtils.banner if $DEBUG # say hello
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: textutils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: logutils
|
16
|
-
requirement: &
|
16
|
+
requirement: &21250380 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0.5'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *21250380
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rdoc
|
27
|
-
requirement: &
|
27
|
+
requirement: &21250032 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '4.0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *21250032
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: hoe
|
38
|
-
requirement: &
|
38
|
+
requirement: &21249564 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '3.7'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *21249564
|
47
47
|
description: textutils - Text Filters, Helpers, Readers and More
|
48
48
|
email: ruby-talk@ruby-lang.org
|
49
49
|
executables: []
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- lib/textutils/helper/unicode_helper.rb
|
72
72
|
- lib/textutils/helper/value_helper.rb
|
73
73
|
- lib/textutils/helper/xml_helper.rb
|
74
|
+
- lib/textutils/page.rb
|
74
75
|
- lib/textutils/patterns.rb
|
75
76
|
- lib/textutils/reader/code_reader.rb
|
76
77
|
- lib/textutils/reader/fixture_reader.rb
|