docubot 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/docubot ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'docubot'
5
+
6
+ USAGE = <<ENDUSAGE
7
+ Usage:
8
+ docubot [-t template_name] directory
9
+ ENDUSAGE
10
+
11
+ ARGS = { :template=>'default' }
12
+ UNFLAGGED_ARGS = [ :directory ]
13
+ next_arg = UNFLAGGED_ARGS.first
14
+ ARGV.each{ |arg|
15
+ case arg
16
+ when '-h','--help'
17
+ ARGS[:help] = true
18
+ when '-t','--template'
19
+ next_arg = :template
20
+ else
21
+ if next_arg
22
+ ARGS[next_arg] = arg
23
+ UNFLAGGED_ARGS.delete( next_arg )
24
+ end
25
+ next_arg = UNFLAGGED_ARGS.first
26
+ end
27
+ }
28
+
29
+ if ARGS[:help] or !ARGS[:directory]
30
+ puts USAGE
31
+ #puts EXAMPLES if ARGS[:help]
32
+ exit
33
+ end
34
+
35
+ DocuBot.generate( ARGS[:directory], ARGS )
36
+
data/lib/docubot.rb ADDED
@@ -0,0 +1,14 @@
1
+ module DocuBot
2
+ VERSION = '0.0.1'
3
+ DIR = File.dirname( __FILE__ )
4
+ def self.name( file_path )
5
+ no_extension = File.basename( file_path ).sub( /\.[^.]+$/, '' )
6
+ no_ordering = no_extension.sub( /^\d*\s/, '' )
7
+ end
8
+ end
9
+ require 'docubot/converter'
10
+ require 'docubot/section'
11
+ require 'docubot/page'
12
+ require 'docubot/template'
13
+ require 'docubot/snippet'
14
+ require 'docubot/generator'
@@ -0,0 +1,21 @@
1
+ module DocuBot
2
+ module Converter
3
+ @@by_type = {}
4
+ def converts_for( *types )
5
+ types.each{ |type| @@by_type[type.to_s] = self }
6
+ end
7
+ def self.by_type
8
+ @@by_type
9
+ end
10
+ end
11
+
12
+ def self.convert_to_html( source, type )
13
+ converter = DocuBot::Converter.by_type[ type.to_s ]
14
+ raise "No converter found for type #{type}" unless converter
15
+ converter.new( source ).to_html
16
+ end
17
+ end
18
+
19
+ Dir[ File.join( DocuBot::DIR, 'docubot/converters/*.rb' ) ].each do |converter|
20
+ require converter
21
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'bluecloth'
3
+ class BlueCloth
4
+ extend DocuBot::Converter
5
+ converts_for :md, :markdown
6
+ end
@@ -0,0 +1,35 @@
1
+ module DocuBot
2
+ GENERATOR_DEFAULTS = {
3
+ :template => 'default'
4
+ }
5
+ def self.generate( directory, options={} )
6
+ options = GENERATOR_DEFAULTS.merge( options )
7
+
8
+ if !File.exists?( directory )
9
+ raise "DocuBot cannot find directory #{File.expand_path(directory)}. Exiting."
10
+ end
11
+
12
+ use_template( options[:template] )
13
+
14
+ @toc = DocuBot::Section.new( 'Table of Contents' )
15
+ sections_by_path = {}
16
+
17
+ Dir[ File.join( directory, '**/*' ) ].each do |item|
18
+ parent = sections_by_path[ File.dirname( item ) ] || @toc
19
+ if File.directory?( item )
20
+ section = DocuBot::Section.new( DocuBot.name( item ) )
21
+ sections_by_path[ item ] = section
22
+ parent << section
23
+ else
24
+ parent << DocuBot::Page.from_file( item )
25
+ end
26
+ end
27
+
28
+ puts @toc
29
+
30
+ output = "#{directory}_html"
31
+ Dir.mkdir(output) unless File.exists?(output)
32
+
33
+ # TODO: CHM the results
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ require 'yaml'
2
+ class DocuBot::Page
3
+ META_SEPARATOR = /^\+\+\+$/ # Sort of like +++ATH0
4
+
5
+ attr_reader :html
6
+
7
+ def self.from_file( filename, title=nil, type=:md )
8
+ title ||= DocuBot.name( filename )
9
+ type ||= File.extname( filename )[ 1..-1 ]
10
+ new( File.read(filename), title, type )
11
+ end
12
+
13
+ def initialize( source, title=nil, type=:md )
14
+ parts = source.split( META_SEPARATOR, 2 )
15
+ @meta = { 'title'=>title }
16
+ @meta.merge!( YAML.load( parts.first ) ) if parts.length > 1
17
+ @html = DocuBot::convert_to_html( parts.last, type )
18
+ @html = DocuBot::process_snippets( @html )
19
+ end
20
+
21
+ def method_missing( method, *args )
22
+ key=method.to_s
23
+ case key[-1..-1]
24
+ when '?' then @meta.has_key?( key[0..-2] )
25
+ when '!', '=' then super
26
+ else @meta[ key ]
27
+ end
28
+ end
29
+
30
+ def to_s( depth=0 )
31
+ "#{' '*depth}#{@meta['title']}"
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ class DocuBot::Section
2
+ attr_reader :entries, :title
3
+ def initialize( title )
4
+ @entries = []
5
+ @title = title
6
+ end
7
+ def sub_sections
8
+ @entries.select{ |e| e.is_a?( DocuBot::Section ) }
9
+ end
10
+ def <<( entry )
11
+ @entries << entry
12
+ end
13
+ def to_s( depth=0 )
14
+ (["#{' '*depth}#@title"] + @entries.map{ |e| e.to_s(depth+1) }).join("\n")
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module DocuBot
2
+ @snippets = {}
3
+
4
+ def self.handle_snippet( regexp, &handler )
5
+ @snippets[ regexp ] = handler
6
+ end
7
+
8
+ def self.process_snippets( html )
9
+ @snippets.inject(html){ |html,regexp,handler| html.gsub( regexp, &handler ) }
10
+ end
11
+
12
+ Dir[ File.join( DocuBot::DIR, 'docubot/snippets/*.rb' ) ].each do |snippet|
13
+ require snippet
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,4 @@
1
+ DocuBot.handle_snippet /\$\$(\w[\w ]*\w)\$\$/ do
2
+ # TODO: look up glossary terms
3
+ "<span class='glossary'>#{$1}</span>"
4
+ end
@@ -0,0 +1,13 @@
1
+ module DocuBot
2
+ TEMPLATE_DIR = File.expand_path( File.join( DocuBot::DIR, 'docubot/templates' ) )
3
+ Dir.chdir TEMPLATE_DIR do
4
+ @available_templates = Dir[ '*' ]
5
+ end
6
+ def self.use_template( template_name )
7
+ @template = template_name
8
+ unless @available_templates.include?( template_name )
9
+ warn "No template named '#{template_name}' exists in #{TEMPLATE_DIR}; using 'default' instead."
10
+ use 'default' unless template_name=='default'
11
+ end
12
+ end
13
+ end
File without changes
File without changes
data/test/all.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'docubot'
2
+ # I'm too lazy to enter the syntax for directory with spaces
3
+ # So just find the 3_more_crap.md file that has metadata.
4
+ file = Dir['**/**'].grep( /3/ ).first
5
+ x = DocuBot::Page.from_file( file )
6
+ p x.title?, x.title, x.foo?, x.foo
@@ -0,0 +1 @@
1
+ The title of this should be "Ze First Page in Ze Section"
@@ -0,0 +1 @@
1
+ The title of this page should be "Another Page in the Section".
@@ -0,0 +1,5 @@
1
+ title : Additional Helpful Information
2
+ author : Gavin Kistner
3
+ date : 2010-1-4
4
+ +++
5
+ The title of this page should be "Additional Helpful Information", not "More Crap".
@@ -0,0 +1,10 @@
1
+ # I like Chicken, I like Liver
2
+ MeowMix MeowMix, please deliver.
3
+
4
+ ## Delivery Options
5
+ You could just put it in my bowl. Or you could:
6
+
7
+ * Put it on a fancy plate.
8
+ * Let me eat it out of your hand.
9
+ * Just dump it all over the floor and let me lick up dust
10
+ at the same time as I scarf the food.
data/test/site1/raw.md ADDED
@@ -0,0 +1,3 @@
1
+ This is a simple two paragraph page.
2
+
3
+ This is the second paragraph.
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: docubot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gavin Kistner
8
+ - Harold Hausman
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2010-01-05 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: bluecloth
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ version:
26
+ - !ruby/object:Gem::Dependency
27
+ name: haml
28
+ type: :runtime
29
+ version_requirement:
30
+ version_requirements: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ version:
36
+ description: Create CHM documentation from a simple hierarchy of text files.
37
+ email: gavin@phrogz.net
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - bin/docubot
46
+ - lib/docubot/converter.rb
47
+ - lib/docubot/converters/markdown.rb
48
+ - lib/docubot/generator.rb
49
+ - lib/docubot/page.rb
50
+ - lib/docubot/section.rb
51
+ - lib/docubot/snippet.rb
52
+ - lib/docubot/snippets/glossary.rb
53
+ - lib/docubot/template.rb
54
+ - lib/docubot/templates/default/page.haml
55
+ - lib/docubot/templates/default/section.haml
56
+ - lib/docubot.rb
57
+ - test/all.rb
58
+ - test/site1/A Slight Change of Heart/1 Ze First Page in Ze Section.md
59
+ - test/site1/A Slight Change of Heart/2 Another Page in the Section.md
60
+ - test/site1/A Slight Change of Heart/3_more_crap.md
61
+ - test/site1/headers.md
62
+ - test/site1/raw.md
63
+ has_rdoc: true
64
+ homepage: http://github.com/Phrogz/docubot
65
+ licenses: []
66
+
67
+ post_install_message:
68
+ rdoc_options: []
69
+
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: "0"
83
+ version:
84
+ requirements:
85
+ - Windows with HTML Help Workshop installed.
86
+ - BlueCloth gem for Markdown conversion.
87
+ - Haml gem for template interpretation.
88
+ rubyforge_project: docubot
89
+ rubygems_version: 1.3.5
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: Create CHM documentation from a simple hierarchy of text files.
93
+ test_files:
94
+ - test/all.rb