neapolitan 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.rdoc +19 -1
- data/LICENSE +199 -17
- data/README.rdoc +3 -1
- data/bin/neapolitan +2 -2
- data/lib/neapolitan.rb +423 -1
- data/lib/neapolitan/meta/data.rb +8 -9
- data/lib/neapolitan/meta/package +12 -0
- data/meta/data.rb +8 -9
- data/meta/package +12 -0
- metadata +18 -42
- data/lib/neapolitan/command.rb +0 -84
- data/lib/neapolitan/config.rb +0 -30
- data/lib/neapolitan/document.rb +0 -76
- data/lib/neapolitan/factory.rb +0 -209
- data/lib/neapolitan/meta/gemfile +0 -13
- data/lib/neapolitan/part.rb +0 -36
- data/lib/neapolitan/template.rb +0 -150
- data/meta/gemfile +0 -13
- data/qed/fixtures/example.html +0 -39
- data/qed/fixtures/example.npt +0 -33
- data/qed/fixtures/example.yaml +0 -5
- data/qed/overview.rdoc +0 -81
data/lib/neapolitan/meta/data.rb
CHANGED
@@ -1,27 +1,26 @@
|
|
1
|
-
Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION) # becuase Ruby 1.8~ gets in the way
|
2
|
-
|
3
1
|
module Neapolitan
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
def self.gemfile
|
8
|
-
@gemfile ||= (
|
3
|
+
def self.package
|
4
|
+
@package ||= (
|
9
5
|
require 'yaml'
|
10
|
-
YAML.load(File.new(
|
6
|
+
YAML.load(File.new(File.dirname(__FILE__) + '/package'))
|
11
7
|
)
|
12
8
|
end
|
13
9
|
|
14
10
|
def self.profile
|
15
11
|
@profile ||= (
|
16
12
|
require 'yaml'
|
17
|
-
YAML.load(File.new(
|
13
|
+
YAML.load(File.new(File.dirname(__FILE__) + '/profile'))
|
18
14
|
)
|
19
15
|
end
|
20
16
|
|
21
17
|
def self.const_missing(name)
|
22
18
|
key = name.to_s.downcase
|
23
|
-
|
19
|
+
package[key] || profile[key] || super(name)
|
24
20
|
end
|
25
21
|
|
26
22
|
end
|
27
23
|
|
24
|
+
# Becuase Ruby 1.8~ gets in the way
|
25
|
+
Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION)
|
26
|
+
|
data/meta/data.rb
CHANGED
@@ -1,27 +1,26 @@
|
|
1
|
-
Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION) # becuase Ruby 1.8~ gets in the way
|
2
|
-
|
3
1
|
module Neapolitan
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
def self.gemfile
|
8
|
-
@gemfile ||= (
|
3
|
+
def self.package
|
4
|
+
@package ||= (
|
9
5
|
require 'yaml'
|
10
|
-
YAML.load(File.new(
|
6
|
+
YAML.load(File.new(File.dirname(__FILE__) + '/package'))
|
11
7
|
)
|
12
8
|
end
|
13
9
|
|
14
10
|
def self.profile
|
15
11
|
@profile ||= (
|
16
12
|
require 'yaml'
|
17
|
-
YAML.load(File.new(
|
13
|
+
YAML.load(File.new(File.dirname(__FILE__) + '/profile'))
|
18
14
|
)
|
19
15
|
end
|
20
16
|
|
21
17
|
def self.const_missing(name)
|
22
18
|
key = name.to_s.downcase
|
23
|
-
|
19
|
+
package[key] || profile[key] || super(name)
|
24
20
|
end
|
25
21
|
|
26
22
|
end
|
27
23
|
|
24
|
+
# Becuase Ruby 1.8~ gets in the way
|
25
|
+
Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION)
|
26
|
+
|
data/meta/package
ADDED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neapolitan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Thomas Sawyer
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09
|
18
|
+
date: 2010-11-09 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: syckle
|
37
37
|
prerelease: false
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
@@ -47,7 +47,7 @@ dependencies:
|
|
47
47
|
type: :development
|
48
48
|
version_requirements: *id002
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
50
|
+
name: qed
|
51
51
|
prerelease: false
|
52
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
53
|
none: false
|
@@ -61,7 +61,7 @@ dependencies:
|
|
61
61
|
type: :development
|
62
62
|
version_requirements: *id003
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
|
-
name:
|
64
|
+
name: rdiscount
|
65
65
|
prerelease: false
|
66
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
67
|
none: false
|
@@ -75,24 +75,9 @@ dependencies:
|
|
75
75
|
type: :development
|
76
76
|
version_requirements: *id004
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
|
-
name:
|
78
|
+
name: redcloth
|
79
79
|
prerelease: false
|
80
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ">="
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
hash: 9
|
86
|
-
segments:
|
87
|
-
- 2
|
88
|
-
- 5
|
89
|
-
version: "2.5"
|
90
|
-
type: :development
|
91
|
-
version_requirements: *id005
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: syckle
|
94
|
-
prerelease: false
|
95
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
96
81
|
none: false
|
97
82
|
requirements:
|
98
83
|
- - ">="
|
@@ -102,21 +87,22 @@ dependencies:
|
|
102
87
|
- 0
|
103
88
|
version: "0"
|
104
89
|
type: :development
|
105
|
-
version_requirements: *
|
90
|
+
version_requirements: *id005
|
106
91
|
- !ruby/object:Gem::Dependency
|
107
|
-
name:
|
92
|
+
name: rdoc
|
108
93
|
prerelease: false
|
109
|
-
requirement: &
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
110
95
|
none: false
|
111
96
|
requirements:
|
112
97
|
- - ">="
|
113
98
|
- !ruby/object:Gem::Version
|
114
|
-
hash:
|
99
|
+
hash: 9
|
115
100
|
segments:
|
116
|
-
-
|
117
|
-
|
101
|
+
- 2
|
102
|
+
- 5
|
103
|
+
version: "2.5"
|
118
104
|
type: :development
|
119
|
-
version_requirements: *
|
105
|
+
version_requirements: *id006
|
120
106
|
description: Neapolitan is a meta-templating engine. Like a candy store it allows you to pick and choose from a variety of rendering formats in the construction of a single document. Selections include eruby, textile, markdown and many others.
|
121
107
|
email: rubyworks-mailinglist@googlegroups.com
|
122
108
|
executables:
|
@@ -127,23 +113,13 @@ extra_rdoc_files:
|
|
127
113
|
- README.rdoc
|
128
114
|
files:
|
129
115
|
- bin/neapolitan
|
130
|
-
- lib/neapolitan/command.rb
|
131
|
-
- lib/neapolitan/config.rb
|
132
|
-
- lib/neapolitan/document.rb
|
133
|
-
- lib/neapolitan/factory.rb
|
134
116
|
- lib/neapolitan/meta/data.rb
|
135
|
-
- lib/neapolitan/meta/
|
117
|
+
- lib/neapolitan/meta/package
|
136
118
|
- lib/neapolitan/meta/profile
|
137
|
-
- lib/neapolitan/part.rb
|
138
|
-
- lib/neapolitan/template.rb
|
139
119
|
- lib/neapolitan.rb
|
140
120
|
- meta/data.rb
|
141
|
-
- meta/
|
121
|
+
- meta/package
|
142
122
|
- meta/profile
|
143
|
-
- qed/fixtures/example.html
|
144
|
-
- qed/fixtures/example.npt
|
145
|
-
- qed/fixtures/example.yaml
|
146
|
-
- qed/overview.rdoc
|
147
123
|
- HISTORY.rdoc
|
148
124
|
- LICENSE
|
149
125
|
- README.rdoc
|
data/lib/neapolitan/command.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'neapolitan'
|
2
|
-
|
3
|
-
module Neapolitan
|
4
|
-
|
5
|
-
# Command line interface.
|
6
|
-
|
7
|
-
class Command
|
8
|
-
|
9
|
-
def self.main(*argv)
|
10
|
-
new(*argv).call
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize(*argv)
|
14
|
-
@output = nil
|
15
|
-
@noharm = false
|
16
|
-
@trace = false
|
17
|
-
@data_file = nil
|
18
|
-
|
19
|
-
parser.parse!(argv)
|
20
|
-
|
21
|
-
@files = argv
|
22
|
-
end
|
23
|
-
|
24
|
-
def parser
|
25
|
-
OptionParser.new do |opt|
|
26
|
-
opt.banner = "neapolitan [file1 file2 ...]"
|
27
|
-
|
28
|
-
opt.on("--output", "-o [PATH]", "save output to specified directory") do |path|
|
29
|
-
@output = path
|
30
|
-
end
|
31
|
-
|
32
|
-
opt.on("--source", "-s [FILE]", "source data file") do |file|
|
33
|
-
@data_file = file
|
34
|
-
end
|
35
|
-
|
36
|
-
opt.on("--trace", "show extra operational information") do
|
37
|
-
$TRACE = true
|
38
|
-
end
|
39
|
-
|
40
|
-
opt.on("--dryrun", "-n", "don't actually write to disk") do
|
41
|
-
$DRYRUN = true
|
42
|
-
end
|
43
|
-
|
44
|
-
opt.on("--debug", "run in debug mode") do
|
45
|
-
$DEBUG = true
|
46
|
-
$VERBOSE = true
|
47
|
-
end
|
48
|
-
|
49
|
-
opt.on_tail("--help", "display this help message") do
|
50
|
-
puts opt
|
51
|
-
exit
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
#
|
57
|
-
def call
|
58
|
-
begin
|
59
|
-
@files.each do |file|
|
60
|
-
doc = Document.new(file, data)
|
61
|
-
if @output
|
62
|
-
#doc.save
|
63
|
-
else
|
64
|
-
puts doc
|
65
|
-
end
|
66
|
-
end
|
67
|
-
rescue => e
|
68
|
-
$DEBUG ? raise(e) : puts(e.message)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
#
|
73
|
-
def data
|
74
|
-
if @data_file
|
75
|
-
YAML.load(File.new(@data_file))
|
76
|
-
else
|
77
|
-
{} #@source ||= YAML.load(STDIN.read)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
|
data/lib/neapolitan/config.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
|
3
|
-
module Neapolitan
|
4
|
-
|
5
|
-
# Configuration
|
6
|
-
class Config
|
7
|
-
|
8
|
-
#
|
9
|
-
DEFAULTS = {
|
10
|
-
:stencil => 'rhtml',
|
11
|
-
#:format => 'html',
|
12
|
-
:pagelayout => 'page',
|
13
|
-
:postlayout => 'post',
|
14
|
-
:maxchars => 500,
|
15
|
-
}
|
16
|
-
|
17
|
-
attr :defaults
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
if File.exist?('.config/defaults')
|
21
|
-
custom_defaults = YAML.load(File.new('.config/defaults'))
|
22
|
-
else
|
23
|
-
custom_defaults = {}
|
24
|
-
end
|
25
|
-
@defaults = OpenStruct.new(DEFAULTS.merge(custom_defaults))
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
data/lib/neapolitan/document.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'neapolitan/template'
|
2
|
-
|
3
|
-
module Neapolitan
|
4
|
-
|
5
|
-
# = Neapolitan Document
|
6
|
-
#
|
7
|
-
# The Document class encapsulates a file which
|
8
|
-
# can be then be rendered via a Neapolitan::Template.
|
9
|
-
class Document
|
10
|
-
|
11
|
-
# File path.
|
12
|
-
attr :file
|
13
|
-
|
14
|
-
#
|
15
|
-
attr :template
|
16
|
-
|
17
|
-
# New Document object.
|
18
|
-
#
|
19
|
-
# file - path to neapolitan formatted file
|
20
|
-
# options - configuration passed on to the Template class
|
21
|
-
#
|
22
|
-
# Returns a new Document object.
|
23
|
-
def initialize(file, options={})
|
24
|
-
case file
|
25
|
-
when File
|
26
|
-
@file = file.name
|
27
|
-
@text = file.read
|
28
|
-
@file.close
|
29
|
-
when String
|
30
|
-
@file = file
|
31
|
-
@text = File.read(file)
|
32
|
-
end
|
33
|
-
|
34
|
-
@template = Template.new(@text, options)
|
35
|
-
end
|
36
|
-
|
37
|
-
#
|
38
|
-
def inspect
|
39
|
-
"<#{self.class}: @file='#{file}'>"
|
40
|
-
end
|
41
|
-
|
42
|
-
# Name of file less extname.
|
43
|
-
#def name
|
44
|
-
# @name ||= file.chomp(File.extname(file))
|
45
|
-
#end
|
46
|
-
|
47
|
-
#
|
48
|
-
def render(data={}, &block)
|
49
|
-
@template.render(data, &block)
|
50
|
-
end
|
51
|
-
|
52
|
-
# TODO: how to handle extension?
|
53
|
-
def save(*path_and_data, &block)
|
54
|
-
data = Hash===path_and_data.last ? path_and_data.pop : {}
|
55
|
-
path = path_and_data
|
56
|
-
|
57
|
-
rendering = render(data, &block)
|
58
|
-
extension = rendering.header['extension'] || '.html'
|
59
|
-
|
60
|
-
path = Dir.pwd unless path
|
61
|
-
if File.directory?(path)
|
62
|
-
file = File.join(path, file.chomp(File.extname(file)) + extension)
|
63
|
-
else
|
64
|
-
file = path
|
65
|
-
end
|
66
|
-
|
67
|
-
if $DRYRUN
|
68
|
-
$stderr << "[DRYRUN] write #{fname}"
|
69
|
-
else
|
70
|
-
File.open(fname, 'w'){ |f| f << rendering.to_s }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
data/lib/neapolitan/factory.rb
DELETED
@@ -1,209 +0,0 @@
|
|
1
|
-
#require 'tilt'
|
2
|
-
require 'malt'
|
3
|
-
|
4
|
-
module Neapolitan
|
5
|
-
|
6
|
-
# Controls rendering to a variety of back-end templating
|
7
|
-
# and markup systems.
|
8
|
-
#
|
9
|
-
module Factory
|
10
|
-
extend self
|
11
|
-
|
12
|
-
#
|
13
|
-
def render(format, text, source, &yld)
|
14
|
-
#table = {}
|
15
|
-
#scope = Object.new
|
16
|
-
|
17
|
-
case source
|
18
|
-
when Hash
|
19
|
-
db = source
|
20
|
-
when Binding
|
21
|
-
db = source
|
22
|
-
else # object scope
|
23
|
-
db = source
|
24
|
-
end
|
25
|
-
|
26
|
-
case format
|
27
|
-
when /^coderay/
|
28
|
-
coderay(text, format)
|
29
|
-
when /^syntax/
|
30
|
-
syntax(text, format)
|
31
|
-
else
|
32
|
-
doc = Malt.text(text, :format=>format.to_sym)
|
33
|
-
doc.render(db, &yld)
|
34
|
-
#if engine = Tilt[format]
|
35
|
-
# engine.new{text}.render(scope, table, &yld)
|
36
|
-
#else
|
37
|
-
# text
|
38
|
-
#end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
#
|
43
|
-
#def redcloth(input)
|
44
|
-
# RedCloth.new(input).to_html
|
45
|
-
#end
|
46
|
-
|
47
|
-
#def bluecloth(input)
|
48
|
-
# BlueCloth.new(input).to_html
|
49
|
-
#end
|
50
|
-
|
51
|
-
#def rdiscount(input)
|
52
|
-
# RDiscount.new(input).to_html
|
53
|
-
#end
|
54
|
-
|
55
|
-
def rdoc(input)
|
56
|
-
markup = RDoc::Markup::ToHtml.new
|
57
|
-
markup.convert(input)
|
58
|
-
end
|
59
|
-
|
60
|
-
#def haml(input)
|
61
|
-
# Haml::Engine.new(input).render
|
62
|
-
#end
|
63
|
-
|
64
|
-
def coderay(input, format)
|
65
|
-
require 'coderay'
|
66
|
-
format = format.split('.')[1] || :ruby #:plaintext
|
67
|
-
tokens = CodeRay.scan(input, format.to_sym) #:ruby
|
68
|
-
tokens.div()
|
69
|
-
end
|
70
|
-
|
71
|
-
#
|
72
|
-
def syntax(input, format)
|
73
|
-
require 'syntax/convertors/html'
|
74
|
-
format = format.split('.')[1] || 'ruby' #:plaintext
|
75
|
-
lines = true
|
76
|
-
conv = Syntax::Convertors::HTML.for_syntax(format)
|
77
|
-
conv.convert(input,lines)
|
78
|
-
end
|
79
|
-
|
80
|
-
# Stencil Rendering
|
81
|
-
# -----------------
|
82
|
-
|
83
|
-
#
|
84
|
-
#def render_stencil(stencil, text, attributes)
|
85
|
-
# case stencil
|
86
|
-
# when 'rhtml'
|
87
|
-
# erb(text, attributes)
|
88
|
-
# when 'liquid'
|
89
|
-
# liquid(text, attributes)
|
90
|
-
# else
|
91
|
-
# text
|
92
|
-
# end
|
93
|
-
#end
|
94
|
-
|
95
|
-
#
|
96
|
-
#def erb(input, attributes)
|
97
|
-
# template = ERB.new(input)
|
98
|
-
# context = TemplateContext.new(attributes)
|
99
|
-
# result = template.result(context.__binding__)
|
100
|
-
# result
|
101
|
-
#end
|
102
|
-
|
103
|
-
#def liquid(input, attributes)
|
104
|
-
# template = Liquid::Template.parse(input)
|
105
|
-
# result = template.render(attributes, :filters => [TemplateFilters])
|
106
|
-
# result
|
107
|
-
#end
|
108
|
-
|
109
|
-
=begin
|
110
|
-
# Require Dependencies
|
111
|
-
# --------------------
|
112
|
-
|
113
|
-
# TODO: Load engines only if used.
|
114
|
-
|
115
|
-
begin ; require 'rubygems' ; rescue LoadError ; end
|
116
|
-
begin ; require 'erb' ; rescue LoadError ; end
|
117
|
-
begin ; require 'redcloth' ; rescue LoadError ; end
|
118
|
-
begin ; require 'bluecloth' ; rescue LoadError ; end
|
119
|
-
begin ; require 'rdiscount' ; rescue LoadError ; end
|
120
|
-
|
121
|
-
begin
|
122
|
-
require 'liquid'
|
123
|
-
#Liquid::Template.register_filter(TemplateFilters)
|
124
|
-
rescue LoadError
|
125
|
-
end
|
126
|
-
|
127
|
-
begin
|
128
|
-
require 'haml'
|
129
|
-
#Haml::Template.options[:format] = :html5
|
130
|
-
rescue LoadError
|
131
|
-
end
|
132
|
-
=end
|
133
|
-
|
134
|
-
begin
|
135
|
-
require 'rdoc/markup'
|
136
|
-
require 'rdoc/markup/to_html'
|
137
|
-
rescue LoadError
|
138
|
-
end
|
139
|
-
|
140
|
-
end
|
141
|
-
|
142
|
-
=begin
|
143
|
-
# = Clean Rendering Context
|
144
|
-
#
|
145
|
-
# The Factory Context is is used by ERB.
|
146
|
-
|
147
|
-
class Context
|
148
|
-
#include TemplateFilters
|
149
|
-
|
150
|
-
instance_methods(true).each{ |m| private m unless m =~ /^__/ }
|
151
|
-
|
152
|
-
def initialize(attributes={})
|
153
|
-
@attributes = attributes
|
154
|
-
end
|
155
|
-
|
156
|
-
def __binding__
|
157
|
-
binding
|
158
|
-
end
|
159
|
-
|
160
|
-
def to_h
|
161
|
-
@attributes
|
162
|
-
end
|
163
|
-
|
164
|
-
def method_missing(s, *a)
|
165
|
-
s = s.to_s
|
166
|
-
@attributes.key?(s) ? @attributes[s] : super
|
167
|
-
end
|
168
|
-
end
|
169
|
-
=end
|
170
|
-
|
171
|
-
#
|
172
|
-
#
|
173
|
-
#
|
174
|
-
|
175
|
-
#module TemplateFilters
|
176
|
-
|
177
|
-
# NOTE: HTML truncate did not work well.
|
178
|
-
|
179
|
-
# # HTML comment regular expression
|
180
|
-
# REM_RE = %r{<\!--(.*?)-->}
|
181
|
-
#
|
182
|
-
# # HTML tag regular expression
|
183
|
-
# TAG_RE = %r{</?\w+((\s+\w+(\s*=\s*(?:"(.|\n)*?"|'(.|\n)*?'|[^'">\s]+))?)+\s*|\s*)/?>} #'
|
184
|
-
#
|
185
|
-
# #
|
186
|
-
# def truncate_html(html, limit)
|
187
|
-
# return html unless limit
|
188
|
-
#
|
189
|
-
# mask = html.gsub(REM_RE){ |m| "\0" * m.size }
|
190
|
-
# mask = mask.gsub(TAG_RE){ |m| "\0" * m.size }
|
191
|
-
#
|
192
|
-
# i, x = 0, 0
|
193
|
-
#
|
194
|
-
# while i < mask.size && x < limit
|
195
|
-
# x += 1 if mask[i] != "\0"
|
196
|
-
# i += 1
|
197
|
-
# end
|
198
|
-
#
|
199
|
-
# while x > 0 && mask[x,1] == "\0"
|
200
|
-
# x -= 1
|
201
|
-
# end
|
202
|
-
#
|
203
|
-
# return html[0..x]
|
204
|
-
# end
|
205
|
-
|
206
|
-
#end
|
207
|
-
|
208
|
-
end
|
209
|
-
|