octopress-ink 1.0.0.alpha.31 → 1.0.0.alpha.32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/octopress-ink.rb +92 -37
- data/lib/octopress-ink/assets.rb +12 -10
- data/lib/octopress-ink/assets/asset.rb +91 -80
- data/lib/octopress-ink/assets/config.rb +29 -27
- data/lib/octopress-ink/assets/include.rb +11 -9
- data/lib/octopress-ink/assets/javascript.rb +7 -4
- data/lib/octopress-ink/assets/layout.rb +16 -11
- data/lib/octopress-ink/assets/page.rb +32 -30
- data/lib/octopress-ink/assets/root.rb +17 -15
- data/lib/octopress-ink/assets/sass.rb +48 -46
- data/lib/octopress-ink/assets/stylesheet.rb +25 -23
- data/lib/octopress-ink/commands.rb +23 -0
- data/lib/octopress-ink/commands/helpers.rb +19 -0
- data/lib/octopress-ink/commands/info.rb +24 -0
- data/lib/octopress-ink/filters.rb +112 -109
- data/lib/octopress-ink/generators/plugin_assets.rb +8 -6
- data/lib/octopress-ink/helpers.rb +7 -5
- data/lib/octopress-ink/helpers/conditional.rb +16 -14
- data/lib/octopress-ink/helpers/content_for.rb +23 -20
- data/lib/octopress-ink/helpers/path.rb +51 -48
- data/lib/octopress-ink/helpers/var.rb +82 -80
- data/lib/octopress-ink/jekyll/hooks.rb +2 -2
- data/lib/octopress-ink/jekyll/page.rb +38 -35
- data/lib/octopress-ink/jekyll/static_file.rb +18 -16
- data/lib/octopress-ink/jekyll/static_file_content.rb +8 -6
- data/lib/octopress-ink/plugin.rb +189 -144
- data/lib/octopress-ink/plugins.rb +249 -230
- data/lib/octopress-ink/plugins/stylesheets.rb +37 -35
- data/lib/octopress-ink/tags.rb +16 -14
- data/lib/octopress-ink/tags/abort.rb +15 -12
- data/lib/octopress-ink/tags/assign.rb +21 -19
- data/lib/octopress-ink/tags/capture.rb +26 -24
- data/lib/octopress-ink/tags/content_for.rb +15 -12
- data/lib/octopress-ink/tags/filter.rb +16 -13
- data/lib/octopress-ink/tags/include.rb +40 -38
- data/lib/octopress-ink/tags/javascript.rb +6 -4
- data/lib/octopress-ink/tags/line_comment.rb +6 -3
- data/lib/octopress-ink/tags/render.rb +53 -51
- data/lib/octopress-ink/tags/return.rb +12 -9
- data/lib/octopress-ink/tags/stylesheet.rb +6 -4
- data/lib/octopress-ink/tags/wrap.rb +62 -60
- data/lib/octopress-ink/tags/yield.rb +23 -20
- data/lib/octopress-ink/version.rb +1 -1
- data/octopress-ink.gemspec +1 -1
- data/test/Gemfile +3 -2
- data/test/_config.yml +2 -0
- data/test/plugins/awesome-sauce/plugin.rb +3 -2
- data/test/plugins/test-theme/plugin.rb +3 -2
- metadata +7 -4
@@ -1,9 +1,12 @@
|
|
1
1
|
module Octopress
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
module Ink
|
3
|
+
module Assets
|
4
|
+
class Javascript < Asset
|
5
|
+
def tag
|
6
|
+
"<script src='#{Filters.expand_url(File.join(@dir, @file))}'></script>"
|
7
|
+
end
|
6
8
|
end
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
12
|
+
|
@@ -1,19 +1,24 @@
|
|
1
1
|
module Octopress
|
2
|
-
module
|
3
|
-
|
2
|
+
module Ink
|
3
|
+
module Assets
|
4
|
+
class Layout < Asset
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
def register
|
7
|
+
file = user_path
|
8
|
+
dir = user_dir
|
9
|
+
if !exists?(file)
|
10
|
+
file = plugin_path
|
11
|
+
dir = plugin_dir
|
12
|
+
end
|
8
13
|
|
9
|
-
|
10
|
-
dir = user_dir
|
11
|
-
if !exists?(file)
|
12
|
-
file = plugin_path
|
13
|
-
dir = plugin_dir
|
14
|
+
Plugins.site.layouts[name] = Jekyll::Layout.new(Plugins.site, dir, @file)
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
+
def name
|
18
|
+
name = "#{@plugin.slug}:#{@file}"
|
19
|
+
# remove extension
|
20
|
+
name = name.split(".")[0..-2].join(".")
|
21
|
+
end
|
17
22
|
end
|
18
23
|
end
|
19
24
|
end
|
@@ -2,38 +2,40 @@
|
|
2
2
|
# Use root assets for files like robots.text or favicon.ico
|
3
3
|
|
4
4
|
module Octopress
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
5
|
+
module Ink
|
6
|
+
module Assets
|
7
|
+
class PageAsset < Asset
|
8
|
+
|
9
|
+
def initialize(plugin, type, file)
|
10
|
+
@root = plugin.assets_path
|
11
|
+
@plugin = plugin
|
12
|
+
@type = type
|
13
|
+
@dir = File.dirname(file)
|
14
|
+
@file = File.basename(file)
|
15
|
+
@exists = {}
|
16
|
+
file_check
|
17
|
+
end
|
18
|
+
|
19
|
+
def page_dir
|
20
|
+
@dir == '.' ? '' : @dir
|
21
|
+
end
|
22
|
+
|
23
|
+
def plugin_path
|
24
|
+
File.join(plugin_dir, @dir, @file)
|
25
|
+
end
|
26
|
+
|
27
|
+
def page
|
28
|
+
@page ||= Page.new(Plugins.site, plugin_dir, page_dir, @file, @plugin.config)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Add page to Jekyll pages if no other page has a conflicting destination
|
32
|
+
#
|
33
|
+
def copy
|
34
|
+
return unless page.url
|
35
|
+
Plugins.site.pages << page unless Helpers::Path.find_page(page)
|
36
|
+
end
|
29
37
|
|
30
|
-
# Add page to Jekyll pages if no other page has a conflicting destination
|
31
|
-
#
|
32
|
-
def copy
|
33
|
-
return unless page.url
|
34
|
-
Plugins.site.pages << page unless Helpers::Path.find_page(page)
|
35
38
|
end
|
36
|
-
|
37
39
|
end
|
38
40
|
end
|
39
41
|
end
|
@@ -2,25 +2,27 @@
|
|
2
2
|
# Use root assets for files like robots.text or favicon.ico
|
3
3
|
|
4
4
|
module Octopress
|
5
|
-
module
|
6
|
-
|
5
|
+
module Ink
|
6
|
+
module Assets
|
7
|
+
class RootAsset < Asset
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
def initialize(plugin, type, file)
|
10
|
+
@root = plugin.assets_path
|
11
|
+
@plugin = plugin
|
12
|
+
@dir = ''
|
13
|
+
@type = type
|
14
|
+
@file = file
|
15
|
+
@exists = {}
|
16
|
+
file_check
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
def copy
|
20
|
+
unless exists? local_plugin_path
|
21
|
+
Plugins.site.static_files << StaticFile.new(plugin_path, destination)
|
22
|
+
end
|
21
23
|
end
|
22
|
-
end
|
23
24
|
|
25
|
+
end
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
@@ -1,60 +1,62 @@
|
|
1
1
|
module Octopress
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
2
|
+
module Ink
|
3
|
+
module Assets
|
4
|
+
class Sass < Stylesheet
|
5
|
+
def initialize(plugin, type, file, media)
|
6
|
+
@plugin = plugin
|
7
|
+
@type = type
|
8
|
+
@file = file
|
9
|
+
@media = media || 'all'
|
10
|
+
@root = plugin.assets_path
|
11
|
+
@dir = File.join(plugin.slug, type)
|
12
|
+
@exists = {}
|
13
|
+
file_check
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
def tag
|
17
|
+
"<link href='#{Filters.expand_url(File.join(@dir, @file))}' media='#{media}' rel='stylesheet' type='text/css'>"
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
# TODO: see if this is done TODO: choose user path before local path.
|
21
|
+
def user_load_path
|
22
|
+
File.join(Plugins.site.source, Plugins.custom_dir, @dir, File.dirname(@file)).sub /\/\.$/, ''
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
def theme_load_path
|
26
|
+
File.expand_path(File.join(@root, @type))
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
29
|
+
def compile
|
30
|
+
unless @compiled
|
31
|
+
options = Plugins.sass_options
|
32
|
+
if @plugin.type == 'local_plugin'
|
33
|
+
@compiled = Plugins.compile_sass_file(path.to_s, options)
|
34
|
+
else
|
35
|
+
# If the plugin isn't a local plugin, add source paths to allow overrieds on @imports.
|
36
|
+
#
|
37
|
+
options[:load_paths] = [user_load_path, theme_load_path]
|
38
|
+
@compiled = Plugins.compile_sass(path.read, options)
|
39
|
+
end
|
38
40
|
end
|
41
|
+
@compiled
|
39
42
|
end
|
40
|
-
@compiled
|
41
|
-
end
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
def user_override_path
|
45
|
+
# Allow Sass overrides to use either syntax
|
46
|
+
if @file =~ /s[ac]ss$/
|
47
|
+
[File.join(user_dir, @file), File.join(user_dir, alt_syntax_file)]
|
48
|
+
else
|
49
|
+
File.join user_dir, @file
|
50
|
+
end
|
49
51
|
end
|
50
|
-
end
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
def destination
|
54
|
+
File.join(@dir, @file.sub(/s.ss/, 'css'))
|
55
|
+
end
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
def copy
|
58
|
+
Plugins.site.static_files << StaticFileContent.new(compile, destination)
|
59
|
+
end
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
@@ -1,31 +1,33 @@
|
|
1
1
|
module Octopress
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
2
|
+
module Ink
|
3
|
+
module Assets
|
4
|
+
class Stylesheet < Asset
|
5
|
+
def initialize(plugin, type, file, media)
|
6
|
+
@plugin = plugin
|
7
|
+
@file = file
|
8
|
+
@type = type
|
9
|
+
@media = media || 'all'
|
10
|
+
@root = plugin.assets_path
|
11
|
+
@dir = File.join(plugin.slug, type)
|
12
|
+
@exists = {}
|
13
|
+
file_check
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def media
|
17
|
+
m = @media
|
18
|
+
if @file =~ /@(.+?)\./
|
19
|
+
m = $1
|
20
|
+
end
|
21
|
+
m
|
19
22
|
end
|
20
|
-
m
|
21
|
-
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
def destination
|
25
|
+
File.join(@dir, @file.sub(/@(.+?)\./,'.'))
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
def tag
|
29
|
+
"<link href='#{Filters.expand_url(File.join(@dir, @file))}' media='#{media}' rel='stylesheet' type='text/css'>"
|
30
|
+
end
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Commands
|
4
|
+
require 'octopress-ink/commands/info'
|
5
|
+
|
6
|
+
class Ink < Octopress::Command
|
7
|
+
|
8
|
+
def self.init_with_program(p)
|
9
|
+
p.command(:ink) do |c|
|
10
|
+
c.syntax "octopress ink [options]"
|
11
|
+
c.description "Get about octopress ink plugins"
|
12
|
+
|
13
|
+
Info.process_command(c)
|
14
|
+
|
15
|
+
c.action do |args, options|
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Commands
|
4
|
+
module CommandHelpers
|
5
|
+
def self.add_asset_options(c)
|
6
|
+
c.option "layouts", "--layouts", "List only layouts"
|
7
|
+
c.option "includes", "--includes", "List only includes"
|
8
|
+
c.option "pages", "--pages", "List only pages"
|
9
|
+
c.option "stylesheets", "--stylesheets", "List only stylesheets"
|
10
|
+
c.option "sass", "--sass", "List only Sass files"
|
11
|
+
c.option "javascripts", "--javascripts", "List only Javascripts"
|
12
|
+
c.option "images", "--images", "List only images"
|
13
|
+
c.option "fonts", "--fonts", "List only fonts"
|
14
|
+
c.option "files", "--files", "List only files"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Ink
|
3
|
+
module Commands
|
4
|
+
class Info
|
5
|
+
def self.process_command(p)
|
6
|
+
p.command(:info) do |c|
|
7
|
+
c.syntax "octopress ink info [plugin] [options]"
|
8
|
+
c.description "Get info about octopress ink plugins"
|
9
|
+
CommandHelpers.add_asset_options(c)
|
10
|
+
|
11
|
+
c.action do |args, options|
|
12
|
+
if args.empty?
|
13
|
+
Octopress::Ink.info
|
14
|
+
else
|
15
|
+
name = args.first
|
16
|
+
puts Octopress::Ink.plugin_info(name, options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,130 +1,133 @@
|
|
1
1
|
module Octopress
|
2
|
-
module
|
3
|
-
|
2
|
+
module Ink
|
3
|
+
module Filters
|
4
|
+
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
# Returns the site's config root or '/' if the config isn't set
|
7
|
+
#
|
8
|
+
def root
|
9
|
+
root_url = Plugins.site.config['root']
|
10
|
+
root_url.nil? ? '/' : File.join('/', root_url)
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
# Prepends input with a url fragment
|
14
|
+
#
|
15
|
+
# input - An absolute url, e.g. /images/awesome.gif
|
16
|
+
# url - The fragment to prepend the input, e.g. /blog
|
17
|
+
#
|
18
|
+
# Returns the modified url, e.g /blog
|
19
|
+
#
|
20
|
+
def expand_url(input, url=nil)
|
21
|
+
url ||= root
|
22
|
+
if input =~ /^#{url}/
|
23
|
+
input
|
24
|
+
else
|
25
|
+
File.join(url, input)
|
26
|
+
end
|
25
27
|
end
|
26
|
-
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
# Prevent orphans in text by inserting a non-breaking space between the two last words of a string.
|
30
|
+
def unorphan(input)
|
31
|
+
input.sub(/\s+(\S+)\s*$/, ' \1')
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
# Prepend all absolute urls with a url fragment
|
35
|
+
#
|
36
|
+
# input - The content of a page or post
|
37
|
+
# url - The fragment to prepend absolute urls
|
38
|
+
#
|
39
|
+
# Returns input with modified urls
|
40
|
+
#
|
41
|
+
def expand_urls(input, url=nil)
|
42
|
+
url ||= root
|
43
|
+
input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\"'>]*)/ do
|
44
|
+
$1 + expand_url($3, url)
|
45
|
+
end
|
44
46
|
end
|
45
|
-
end
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
48
|
+
# Prepend all urls with the full site url
|
49
|
+
#
|
50
|
+
# input - The content of a page or post
|
51
|
+
#
|
52
|
+
# Returns input with all urls expanded to include the full site url
|
53
|
+
# e.g. /images/awesome.gif => http://example.com/images/awesome.gif
|
54
|
+
#
|
55
|
+
def full_urls(input)
|
56
|
+
url = Plugins.site.config['url']
|
57
|
+
if url.nil?
|
58
|
+
raise IOError.new "Could not expand urls: Please add your published url to your _config.yml, eg url: http://example.com/"
|
59
|
+
else
|
60
|
+
expand_urls(input, url)
|
61
|
+
end
|
60
62
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
63
|
+
|
64
|
+
# Prepend a url with the full site url
|
65
|
+
#
|
66
|
+
# input - a url
|
67
|
+
#
|
68
|
+
# Returns input with all urls expanded to include the full site url
|
69
|
+
# e.g. /images/awesome.gif => http://example.com/images/awesome.gif
|
70
|
+
#
|
71
|
+
def full_url(input)
|
72
|
+
url = Plugins.site.config['url']
|
73
|
+
if url.nil?
|
74
|
+
raise IOError.new "Could not expand url in #{input}: Please add your site's published url to your _config.yml, eg url: http://example.com/"
|
75
|
+
else
|
76
|
+
expand_url(input, url)
|
77
|
+
end
|
76
78
|
end
|
77
|
-
end
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
80
|
+
# Truncate a string at the <!--more--> marker
|
81
|
+
# input - The content of a post or page
|
82
|
+
#
|
83
|
+
# Returns only the content preceeding the marker
|
84
|
+
#
|
85
|
+
def excerpt(input)
|
86
|
+
if input.index(/<!--\s*more\s*-->/i)
|
87
|
+
input.split(/<!--\s*more\s*-->/i)[0]
|
88
|
+
else
|
89
|
+
input
|
90
|
+
end
|
89
91
|
end
|
90
|
-
end
|
91
92
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
93
|
+
# Checks for excerpt markers (helpful for template conditionals)
|
94
|
+
#
|
95
|
+
# input - The content of a page or post
|
96
|
+
#
|
97
|
+
# Returns true/false if the excerpt marker is found
|
98
|
+
#
|
99
|
+
def has_excerpt(input)
|
100
|
+
input =~ /<!--\s*more\s*-->/i ? true : false
|
101
|
+
end
|
101
102
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
103
|
+
# Escapes HTML content for XML
|
104
|
+
def cdata_escape(input)
|
105
|
+
input.gsub(/<!\[CDATA\[/, '<![CDATA[').gsub(/\]\]>/, ']]>')
|
106
|
+
end
|
106
107
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
108
|
+
# Returns a title cased string based on John Gruber's title case http://daringfireball.net/2008/08/title_case_update
|
109
|
+
def titlecase(input)
|
110
|
+
input.titlecase
|
111
|
+
end
|
111
112
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
113
|
+
# Formats a string for use as a css classname, removing illegal characters
|
114
|
+
def classify(input)
|
115
|
+
input.gsub(/ /,'-').gsub(/[^\w-]/,'').downcase
|
116
|
+
end
|
116
117
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
118
|
+
# Remove empty lines
|
119
|
+
def compact_newlines(input)
|
120
|
+
input.gsub(/\n{2,}/, "\n").gsub(/^ +\n/,"")
|
121
|
+
end
|
121
122
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
123
|
+
# Join newlines
|
124
|
+
def join_lines(input, separator='')
|
125
|
+
compact_newlines(input).strip.gsub(/\s*\n\s*/, separator)
|
126
|
+
end
|
126
127
|
|
127
|
-
|
128
|
-
|
128
|
+
module_function :root, :expand_url, :expand_urls, :full_url, :full_urls, :excerpt, :cdata_escape, :titlecase, :classify, :join_lines, :compact_newlines, :unorphan
|
129
|
+
public :expand_url, :expand_urls, :full_url, :full_urls, :excerpt, :cdata_escape, :titlecase, :classify, :join_lines, :compact_newlines, :unorphan
|
130
|
+
end
|
129
131
|
end
|
130
132
|
end
|
133
|
+
|