guider 0.0.2 → 0.0.3
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/bin/guider +18 -41
- data/guider.gemspec +2 -2
- data/lib/guider/app.rb +52 -0
- data/lib/guider/config.rb +22 -27
- data/lib/guider/guide.rb +19 -35
- data/lib/guider/guide_factory.rb +25 -0
- data/lib/guider/index.rb +10 -19
- data/lib/guider/template.rb +0 -2
- data/template/guide.html +4 -4
- metadata +4 -2
data/bin/guider
CHANGED
@@ -5,67 +5,44 @@ $:.unshift File.dirname(File.dirname(__FILE__)) + "/lib"
|
|
5
5
|
|
6
6
|
require "rubygems"
|
7
7
|
require "optparse"
|
8
|
-
require "
|
9
|
-
require "guider/guide"
|
10
|
-
require "guider/config"
|
11
|
-
require "guider/template"
|
12
|
-
require "guider/index"
|
13
|
-
require "guider/inline_tags"
|
8
|
+
require "guider/app"
|
14
9
|
|
15
10
|
options = {
|
16
11
|
:output => Dir.pwd + "/out",
|
17
12
|
:link_url => "http://localhost/extjs/",
|
13
|
+
:tpl_dir => File.dirname(File.dirname(__FILE__)) + "/template",
|
18
14
|
}
|
19
15
|
|
20
16
|
input_files = OptionParser.new do |opts|
|
21
17
|
opts.banner = "Generates a guide.\n\n" +
|
22
|
-
"Usage: guider <guides
|
18
|
+
"Usage: guider <guides/dir/>\n\n"
|
23
19
|
|
24
|
-
opts.on("-o", "--output=DIR", "Where to output the guides."
|
25
|
-
|
20
|
+
opts.on("-o", "--output=DIR", "Where to output the guides.",
|
21
|
+
"Defaults to ./out") do |dir|
|
22
|
+
options[:output] = File.absolute_path(dir)
|
26
23
|
end
|
27
24
|
|
28
|
-
opts.on("--link-url=URL", "Base path for links created by {@link} tags."
|
25
|
+
opts.on("--link-url=URL", "Base path for links created by {@link} tags.",
|
26
|
+
"Defaults to http://localhost/extjs/") do |url|
|
29
27
|
options[:link_url] = url
|
30
28
|
end
|
31
29
|
|
30
|
+
opts.on("--index=PATH", "The guides.json file to create index.html from.") do |path|
|
31
|
+
options[:index] = path
|
32
|
+
end
|
33
|
+
|
32
34
|
opts.on("-h", "--help", "Show this help message") do
|
33
35
|
puts opts
|
34
36
|
exit
|
35
37
|
end
|
36
38
|
end.parse!
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
# copy over main template resources
|
44
|
-
tpl_dir = File.dirname(File.dirname(__FILE__)) + "/template"
|
45
|
-
Dir[tpl_dir+"/*.{js,css,ico}"].each do |fname|
|
46
|
-
FileUtils.cp(fname, options[:output])
|
47
|
-
end
|
48
|
-
|
49
|
-
# Configure {@link} tags.
|
50
|
-
inline_tags = Guider::InlineTags.new
|
51
|
-
inline_tags.link_url = options[:link_url]
|
52
|
-
|
53
|
-
# Read the template HTML file
|
54
|
-
tpl = Guider::Template.new(tpl_dir + "/guide.html")
|
55
|
-
|
56
|
-
# The guides.json file
|
57
|
-
config_file = input_files[0]
|
58
|
-
|
59
|
-
guides = Guider::Config.new(config_file, tpl, inline_tags).guides
|
60
|
-
|
61
|
-
guides.each do |guide|
|
62
|
-
guide.write(options[:output])
|
40
|
+
if input_files.length == 1
|
41
|
+
options[:input] = File.absolute_path(input_files[0])
|
42
|
+
else
|
43
|
+
$stderr.puts "ERROR: Exactly one input directory must be specified."
|
44
|
+
exit(1)
|
63
45
|
end
|
64
46
|
|
65
|
-
index_tpl = Guider::Template.new(tpl_dir + "/index.html")
|
66
|
-
Guider::Index.new(guides, index_tpl).write(options[:output])
|
67
47
|
|
68
|
-
|
69
|
-
:title => "Guides",
|
70
|
-
:content => "blah",
|
71
|
-
})
|
48
|
+
Guider::App.new(options).run
|
data/guider.gemspec
CHANGED
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
|
|
2
2
|
s.required_rubygems_version = ">= 1.3.5"
|
3
3
|
|
4
4
|
s.name = 'guider'
|
5
|
-
s.version = '0.0.
|
6
|
-
s.date = '2013-03-
|
5
|
+
s.version = '0.0.3'
|
6
|
+
s.date = '2013-03-18'
|
7
7
|
s.summary = "Sencha guide generator"
|
8
8
|
s.description = "JSDuck-compatible guides generator"
|
9
9
|
s.homepage = "https://github.com/nene/guider"
|
data/lib/guider/app.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "guider/guide_factory"
|
3
|
+
require "guider/index"
|
4
|
+
|
5
|
+
module Guider
|
6
|
+
class App
|
7
|
+
def initialize(options)
|
8
|
+
@options = options
|
9
|
+
@guide_factory = Guider::GuideFactory.new(@options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
# clean output dir
|
14
|
+
FileUtils.rm_rf(@options[:output])
|
15
|
+
|
16
|
+
copy_dir(@options[:input], @options[:output])
|
17
|
+
|
18
|
+
copy_template_files
|
19
|
+
|
20
|
+
Index.new(@options).write if @options[:index]
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# Copies all files and directories in source dir over to
|
26
|
+
# destination dir. Processes all .md files.
|
27
|
+
def copy_dir(src, dest)
|
28
|
+
FileUtils.mkdir(dest)
|
29
|
+
|
30
|
+
Dir[src+"/*"].each do |filename|
|
31
|
+
target = dest+"/"+File.basename(filename)
|
32
|
+
|
33
|
+
if filename =~ /\/README\.md$/
|
34
|
+
@guide_factory.create(filename).write(target.sub(/\/README\.md$/, "/index.html"))
|
35
|
+
elsif filename =~ /\.md$/
|
36
|
+
@guide_factory.create(filename).write(target.sub(/.md$/, ".html"))
|
37
|
+
elsif File.directory?(filename)
|
38
|
+
copy_dir(filename, target)
|
39
|
+
else
|
40
|
+
FileUtils.cp_r(filename, target)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Copies over main template resources
|
46
|
+
def copy_template_files
|
47
|
+
Dir[@options[:tpl_dir]+"/*.{js,css,ico}"].each do |fname|
|
48
|
+
FileUtils.cp(fname, @options[:output])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/guider/config.rb
CHANGED
@@ -1,48 +1,43 @@
|
|
1
1
|
require "json"
|
2
|
-
require "guider/guide"
|
3
2
|
|
4
3
|
module Guider
|
5
4
|
# Reads the guides config file.
|
6
|
-
# Turns it into
|
5
|
+
# Turns it into HTML table of contents.
|
7
6
|
class Config
|
8
|
-
def initialize(path
|
9
|
-
|
10
|
-
guide_cfgs.each {|g| keys_to_symbols(g) }
|
11
|
-
guide_cfgs.each {|g| add_path(g, path) }
|
12
|
-
@guides = to_guides(guide_cfgs, tpl, inline_tags)
|
7
|
+
def initialize(path)
|
8
|
+
@guides = flatten(JSON.parse(IO.read(path)))
|
13
9
|
end
|
14
10
|
|
15
|
-
#
|
16
|
-
|
11
|
+
# Returns flat HTML list of guide titles.
|
12
|
+
def to_html
|
13
|
+
"<ul>" + @guides.map {|g| to_link(g) }.join("\n") + "</ul>"
|
14
|
+
end
|
17
15
|
|
18
16
|
private
|
19
17
|
|
20
18
|
# Turns grouped guides structure into flat list.
|
21
|
-
def flatten(
|
19
|
+
def flatten(group)
|
22
20
|
arr = []
|
23
|
-
|
24
|
-
|
21
|
+
group.each do |guide|
|
22
|
+
if guide["items"]
|
23
|
+
arr += flatten(guide["items"])
|
24
|
+
else
|
25
|
+
arr << guide
|
26
|
+
end
|
25
27
|
end
|
26
28
|
arr
|
27
29
|
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
hash.keys.each do |k|
|
32
|
-
hash[k.to_sym] = hash[k]
|
33
|
-
hash.delete(k)
|
34
|
-
end
|
35
|
-
hash
|
31
|
+
def to_link(guide)
|
32
|
+
"<li><a href='#{to_href(guide)}'>#{guide['title']}</a></li>"
|
36
33
|
end
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
def to_guides(guide_cfgs, tpl, inline_tags)
|
45
|
-
guide_cfgs.find_all {|g| File.exists?(g[:path]) }.map {|g| Guide.new(g, tpl, inline_tags) }
|
35
|
+
def to_href(guide)
|
36
|
+
if guide['url']
|
37
|
+
guide['url'].sub(/^guides\//)
|
38
|
+
else
|
39
|
+
guide['name']
|
40
|
+
end
|
46
41
|
end
|
47
42
|
|
48
43
|
end
|
data/lib/guider/guide.rb
CHANGED
@@ -1,62 +1,46 @@
|
|
1
1
|
require "kramdown"
|
2
|
-
require "
|
2
|
+
require "pathname"
|
3
3
|
|
4
4
|
module Guider
|
5
5
|
class Guide
|
6
|
-
def initialize(
|
7
|
-
@cfg = cfg
|
6
|
+
def initialize(filename, tpl, inline_tags, options)
|
8
7
|
@template = tpl
|
9
8
|
@inline_tags = inline_tags
|
10
|
-
@markdown = IO.read(
|
9
|
+
@markdown = IO.read(filename)
|
10
|
+
@rel_path = relative_path(options[:input], filename)
|
11
11
|
@html = Kramdown::Document.new(@markdown).to_html
|
12
12
|
end
|
13
13
|
|
14
|
-
def write(
|
15
|
-
guide_path = path + "/" + @cfg[:name]
|
16
|
-
FileUtils.mkdir(guide_path)
|
17
|
-
write_html(guide_path+"/index.html")
|
18
|
-
copy_images(@cfg[:path], guide_path)
|
19
|
-
end
|
20
|
-
|
21
|
-
def write_html(filename)
|
14
|
+
def write(filename)
|
22
15
|
html = @inline_tags.replace(@html)
|
23
|
-
html = @template.apply(
|
16
|
+
html = @template.apply({
|
17
|
+
:content => html,
|
18
|
+
:title => title,
|
19
|
+
:path => @rel_path,
|
20
|
+
})
|
24
21
|
File.open(filename, 'w') {|f| f.write(html) }
|
25
22
|
end
|
26
23
|
|
24
|
+
def relative_path(filename, base_dir)
|
25
|
+
Pathname.new(filename).relative_path_from(Pathname.new(base_dir)).dirname
|
26
|
+
end
|
27
|
+
|
27
28
|
# Extracts the first line from markdown
|
28
29
|
def title
|
29
30
|
@markdown =~ /\A(.*?)$/
|
30
31
|
result = $1.sub(/^#/, '').strip
|
31
32
|
|
32
|
-
|
33
|
-
if result == ""
|
34
|
-
@cfg[:title]
|
35
|
-
else
|
36
|
-
result
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Returns the name of a guide, for use in links
|
41
|
-
def name
|
42
|
-
@cfg[:name]
|
33
|
+
return (result == "") ? "Untitled" : result
|
43
34
|
end
|
44
35
|
|
45
36
|
# Lists all h2 level headings within the guide
|
46
|
-
|
37
|
+
#
|
38
|
+
# XXX: Currently this is dead code.
|
39
|
+
def toc
|
47
40
|
@html.scan(/<h2[^>]*id="(\S*)"[^>]*>([^\n]*)<\/h2>/).map do |m|
|
48
|
-
{:href =>
|
41
|
+
{:href => "#" + m[0], :title => m[1]}
|
49
42
|
end
|
50
43
|
end
|
51
44
|
|
52
|
-
# Copies all files and directories in source dir over to
|
53
|
-
# destination dir. Skips README.md, which is treated separately.
|
54
|
-
def copy_images(src, dest)
|
55
|
-
Dir[src+"/*"].each do |img|
|
56
|
-
if !["README.md"].include?(File.basename(img))
|
57
|
-
FileUtils.cp_r(img, dest+"/"+File.basename(img))
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
45
|
end
|
62
46
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "guider/template"
|
2
|
+
require "guider/inline_tags"
|
3
|
+
require "guider/guide"
|
4
|
+
|
5
|
+
module Guider
|
6
|
+
# Creates Guide instances
|
7
|
+
class GuideFactory
|
8
|
+
def initialize(options)
|
9
|
+
# Configure {@link} tags.
|
10
|
+
@inline_tags = InlineTags.new
|
11
|
+
@inline_tags.link_url = options[:link_url]
|
12
|
+
|
13
|
+
# Create guide rendering template
|
14
|
+
@tpl = Template.new(options[:tpl_dir] + "/guide.html")
|
15
|
+
|
16
|
+
@options = options
|
17
|
+
end
|
18
|
+
|
19
|
+
# Creates new Guide instance from filename
|
20
|
+
def create(filename)
|
21
|
+
Guide.new(filename, @tpl, @inline_tags, @options)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/guider/index.rb
CHANGED
@@ -1,26 +1,17 @@
|
|
1
|
+
require 'guider/template'
|
2
|
+
require 'guider/config'
|
3
|
+
|
1
4
|
module Guider
|
2
5
|
class Index
|
3
|
-
def initialize(
|
4
|
-
@
|
5
|
-
@
|
6
|
-
|
7
|
-
|
8
|
-
def write(path)
|
9
|
-
html = @template.apply(:title => "Guides", :content => guide_list)
|
10
|
-
File.open(path + "/index.html", 'w') {|f| f.write(html) }
|
6
|
+
def initialize(options)
|
7
|
+
@options = options
|
8
|
+
@config = Config.new(@options[:index])
|
9
|
+
@tpl = Template.new(@options[:tpl_dir] + "/index.html")
|
11
10
|
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
list = @guides.map {|g| "<li><a href='#{g.name}'>#{g.title}</a>#{chapters_list(g.chapters)}</li>" }.join("\n")
|
17
|
-
"<ul>#{list}</ul>"
|
18
|
-
end
|
19
|
-
|
20
|
-
def chapters_list(chapters)
|
21
|
-
return "" if chapters.length == 0
|
22
|
-
|
23
|
-
"\n<ul>" + chapters.map {|c| "<li><a href='#{c[:href]}'>#{c[:title]}</a></li>" }.join("\n") + "</ul>\n"
|
12
|
+
def write
|
13
|
+
html = @tpl.apply(:title => "Guides", :content => @config.to_html)
|
14
|
+
File.open(@options[:output] + "/index.html", 'w') {|f| f.write(html) }
|
24
15
|
end
|
25
16
|
|
26
17
|
end
|
data/lib/guider/template.rb
CHANGED
data/template/guide.html
CHANGED
@@ -3,10 +3,10 @@
|
|
3
3
|
<head>
|
4
4
|
<title>{title}</title>
|
5
5
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6
|
-
<link rel="shortcut icon" type="image/ico" href="
|
7
|
-
<link rel="stylesheet" type="text/css" href="
|
8
|
-
<link rel="stylesheet" type="text/css" href="
|
9
|
-
<script type="text/javascript" src="
|
6
|
+
<link rel="shortcut icon" type="image/ico" href="{path}/favicon.ico" />
|
7
|
+
<link rel="stylesheet" type="text/css" href="{path}/styles.css" />
|
8
|
+
<link rel="stylesheet" type="text/css" href="{path}/prettify.css" />
|
9
|
+
<script type="text/javascript" src="{path}/prettify.js"></script>
|
10
10
|
</head>
|
11
11
|
<body>
|
12
12
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guider
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: kramdown
|
@@ -55,8 +55,10 @@ files:
|
|
55
55
|
- README.md
|
56
56
|
- bin/guider
|
57
57
|
- guider.gemspec
|
58
|
+
- lib/guider/app.rb
|
58
59
|
- lib/guider/config.rb
|
59
60
|
- lib/guider/guide.rb
|
61
|
+
- lib/guider/guide_factory.rb
|
60
62
|
- lib/guider/index.rb
|
61
63
|
- lib/guider/inline_tags.rb
|
62
64
|
- lib/guider/template.rb
|