guider 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|