scribedown 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3493d9a579a7cb5cfb48987431d573d247f81e2e
4
+ data.tar.gz: f8c2f8412822c383ddc0064f319765dab602b796
5
+ SHA512:
6
+ metadata.gz: 4c2f1a1d58274426b75f4a8af7010c6416a677af90ba9e07ce70ca20f48f77c192b0e22f88e9bea054d2c11251c7192d10830114df7fc09ea4a9f0c1ca354641
7
+ data.tar.gz: a2ddf98487a151031a8203533b69fcee56cb1ad4f1b5f66b3778fd78a2bfb42eaa82c1c4bbd5ada5e0d9f2bdf5f34a4e7ccbd1d9991a902d8c62f8a4153e96c1
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'scribedown'
4
+
5
+ primary_arg = ARGV[0]
6
+
7
+ case primary_arg
8
+ when 'i', 'init'
9
+ ScribeDown.init
10
+ when 'g', 'generate'
11
+ ScribeDown.generate
12
+ when 'c', 'create'
13
+ ARGV[1..-1].each do |name|
14
+ ScribeDown.new_section(name)
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../res/resources'
2
+
3
+ module ScribeDown
4
+ module Renderer
5
+ def self.link_to(text, url, options={})
6
+ extras = options.map {|k,v| "#{k}=\"#{v}\"" }.join ' '
7
+ "<a href=\"#{url}\" #{extras}>#{text}</a>"
8
+ end
9
+
10
+ def self.stylesheet_tag(file_name)
11
+ "<style>\n" + Res.read_file(file_name) + "\n</style>"
12
+ end
13
+
14
+ def self.image_tag(url, options={})
15
+ extras = options.map {|k,v| "#{k}=\"#{v}\"" }.join ' '
16
+ "<img src=\"#{url}\" #{extras}/>"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../res/resources'
2
+ require_relative 'helpers'
3
+ require 'pdfkit'
4
+
5
+ module ScribeDown
6
+ module Renderer
7
+ @@settings = nil
8
+ @@sections = nil
9
+ @@templates = nil
10
+
11
+ def self.head_tags
12
+ rendered = Array.new
13
+ @@settings[:styles].each do |style|
14
+ rendered.push(stylesheet_tag style)
15
+ end
16
+ rendered.join "\n\n"
17
+ end
18
+
19
+ def self.content
20
+ rendered_sections = Array.new
21
+ @@sections.each do |section|
22
+ rendered_sections.push render_section(section)
23
+ end
24
+ rendered_sections.join "\n\n"
25
+ end
26
+
27
+ def self.render_section(section)
28
+ if @@templates.has_key? section.container
29
+ template = @@templates[section.container]
30
+ else
31
+ template = Res.read_file(section.container, format: :plain)
32
+ @@templates[section.container] = template
33
+ end
34
+ content = Res.read_file(section.path, format: section.format.to_sym, binding: binding)
35
+ Res.erb_contents(template, binding)
36
+ end
37
+
38
+ def self.add(file_name, options={})
39
+ options[:binding] = binding
40
+ Res.read_file(file_name, options)
41
+ end
42
+
43
+ def self.to_html(sections, settings)
44
+ @@settings = settings
45
+ @@sections = sections
46
+ @@templates = Hash.new
47
+ title ||= settings[:title]
48
+ return Res.read_file(settings[:base], binding: binding)
49
+ end
50
+
51
+ def self.to_pdf(html_content)
52
+ PDFKit.new(html_content).to_pdf
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,89 @@
1
+ require 'kramdown'
2
+ require 'yaml'
3
+ require 'erb'
4
+ require 'csv'
5
+
6
+ module ScribeDown
7
+ module Res
8
+ def self.root(file=nil)
9
+ path = File.expand_path '../..', File.dirname(__FILE__)
10
+ if file
11
+ path += '/' + file
12
+ end
13
+ return path
14
+ end
15
+
16
+ def self.read_res(res_name)
17
+ File.open(self.root + '/resources/' + res_name).read()
18
+ end
19
+
20
+ def self.read_file(file_name, options={})
21
+ binding = options[:binding]
22
+ format = options[:format]
23
+ only_in_fs = options[:in_fs]
24
+
25
+ if File.exist? file_name
26
+ name = file_name
27
+ elsif File.exist?(root('resources/' + file_name)) && !only_in_fs
28
+ name = root('resources/' + file_name)
29
+ else
30
+ raise "File or resource does not exist: #{file_name}"
31
+ end
32
+
33
+ contents = File.open(name).read()
34
+ if format == :plain
35
+ return contents
36
+ end
37
+ if binding && (name.end_with?('.erb') || format == :erb)
38
+ name = name.chomp('.erb')
39
+ contents = erb_contents(contents, binding)
40
+ end
41
+ if name.end_with?('.md') || name.end_with?('.markdown') || format == :markdown
42
+ contents = markdown_contents(contents)
43
+ end
44
+ if name.end_with?('.csv') || format == :csv
45
+ contents = csv_contents(contents)
46
+ end
47
+ return contents
48
+ end
49
+
50
+ def self.markdown_contents(content)
51
+ Kramdown::Document.new(content, :auto_ids => true).to_html
52
+ end
53
+
54
+ def self.erb_contents(contents, bind)
55
+ ERB.new(contents).result bind
56
+ end
57
+
58
+ def self.yaml_contents(contents)
59
+ res = YAML.load(contents)
60
+ symbolize(res)
61
+ return res
62
+ end
63
+
64
+ def self.csv_contents(contents)
65
+ all = CSV.parse(contents)
66
+ headers = all[0]
67
+ return if headers == nil
68
+ data = all[1..-1]
69
+ data_classes = headers.map {|h| h.gsub(/\W+/, '-') }
70
+
71
+ read_file('csv_template.html.erb', binding: binding)
72
+ end
73
+
74
+ def self.symbolize(hash)
75
+ hash.default_proc = proc do |h, k|
76
+ case k
77
+ when String then sym = k.to_sym; h[sym] if h.key?(sym)
78
+ when Symbol then str = k.to_s; h[str] if h.key?(str)
79
+ end
80
+ end
81
+ end
82
+
83
+ def self.create_file(path, contents='')
84
+ File.open(path, 'w') do |file|
85
+ file.write(contents)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,92 @@
1
+ require 'fileutils'
2
+ require_relative 'res/resources'
3
+ require_relative 'generate/helpers'
4
+ require_relative 'generate/renderer'
5
+ require_relative 'section'
6
+
7
+ module ScribeDown
8
+ def self.generate(options={})
9
+ begin
10
+ settings = Res.yaml_contents(Res.read_file('scribe.yml', in_fs: true))
11
+ rescue Exception => e
12
+ abort "FATAL: Not a scribedown directory. Unable to read scribe.yml.\n" + e.message
13
+ end
14
+ sections_yaml = settings[:sections]
15
+ sections = Array.new
16
+
17
+ lookup = lookup_files()
18
+ failed = Array.new
19
+
20
+ glob_default = Res.yaml_contents(Res.read_file('default.yml'))[:default]
21
+ defaults = settings[:default] || {}
22
+
23
+ if glob_default
24
+ defaults.merge! glob_default
25
+ end
26
+ Res.symbolize(defaults)
27
+ # Extra styles don't override the defaults
28
+ defaults[:styles] += defaults[:extra_styles] || []
29
+
30
+ sections_yaml.each do |section|
31
+ name = section
32
+ ops = defaults.clone
33
+ if section.is_a? Hash
34
+ name = section.select {|k, v| v == nil }.first.first
35
+ ops = ops.merge(section)
36
+ ops.delete(name)
37
+ end
38
+ path = lookup[name.downcase]
39
+ if path
40
+ ops[:path] = path
41
+ ops[:name] = name
42
+ sections.push Section.new(ops)
43
+ else
44
+ failed.push section
45
+ end
46
+ end
47
+
48
+ output = defaults[:output]
49
+ type = output['default']
50
+ html = Renderer.to_html sections, defaults
51
+ if type == 'all' || type == 'html'
52
+ Res.create_file(defaults[:output]['html'], html)
53
+ end
54
+ if type == 'all' || type == 'pdf'
55
+ pdf = Renderer.to_pdf html
56
+ Res.create_file(defaults[:output]['pdf'], pdf)
57
+ end
58
+ end
59
+
60
+ def self.lookup_files
61
+ file_lookup = Hash.new
62
+ Dir['**/*'].each do |file|
63
+ name = File.basename(file).split('.').first.downcase
64
+ file_lookup[name] = file
65
+ end
66
+ file_lookup
67
+ end
68
+
69
+ def self.init
70
+ if File.exist? 'scribe.yml'
71
+ abort 'ScribeDown already initialised: scribe.yml exists'
72
+ end
73
+ FileUtils.cp_r(Res.root('resources/init/.'), '.')
74
+ # Res.create_file('scribe.yml', Res.read_res('scribe.yml'))
75
+ # Res.create_file('sections/default_section.md', Res.read_res('default_section.md'))
76
+ end
77
+
78
+ def self.new_section(name)
79
+ begin
80
+ settings = Res.yaml_contents(Res.read_file('scribe.yml', in_fs: true))
81
+ rescue
82
+ abort 'FATAL: Not a scribedown directory. Unable to read scribe.yml.'
83
+ end
84
+ new_name = name.split('.').first
85
+ if new_name == name
86
+ name = name + '.md'
87
+ end
88
+ settings[:sections].push new_name
89
+ Res.create_file('sections/' + name, '# ' + new_name)
90
+ Res.create_file('scribe.yml', settings.to_yaml)
91
+ end
92
+ end
@@ -0,0 +1,23 @@
1
+ module ScribeDown
2
+ class Section
3
+ attr_accessor :options
4
+
5
+ def initialize(options={})
6
+ self.options = options
7
+ end
8
+
9
+ def to_s
10
+ "(#{path}: #{options})"
11
+ end
12
+
13
+ def method_missing(method)
14
+ if options.has_key?(method.to_sym)
15
+ return self.options[method.to_sym]
16
+ elsif options.has_key?(method.to_s)
17
+ return self.options[method.to_s]
18
+ else
19
+ super.method_missing(method)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ <table id="<%= name.gsub(/\W+/, '-') %>">
2
+ <thead>
3
+ <tr>
4
+ <% headers.each do |header| %>
5
+ <th><%= header %></th>
6
+ <% end %>
7
+ </tr>
8
+ </thead>
9
+ <tbody>
10
+ <% data.each do |line| %>
11
+ <tr>
12
+ <% line.each_with_index do |el, idx| %>
13
+ <td class="<%= data_classes[idx] %>">
14
+ <%= el %>
15
+ </td>
16
+ <% end %>
17
+ </tr>
18
+ <% end %>
19
+ </tbody>
20
+ </table>
@@ -0,0 +1,12 @@
1
+ default:
2
+ format: auto
3
+ base: index.html.erb
4
+ container: section.html.erb
5
+ styles:
6
+ - style.css
7
+ output:
8
+ default: all
9
+ html: index.html
10
+ pdf: document.pdf
11
+ classes: ''
12
+
@@ -0,0 +1,9 @@
1
+ <html>
2
+ <head>
3
+ <title><%= title %></title>
4
+ <%= head_tags %>
5
+ </head>
6
+ <body>
7
+ <%= content %>
8
+ </body>
9
+ </html>
@@ -0,0 +1,3 @@
1
+ sections:
2
+ - default_section
3
+ - info
@@ -0,0 +1,5 @@
1
+ # Welcome to ScribeDown
2
+
3
+ This is the default section. You can turn it into HTML or PDF by running `scribe generate`.
4
+
5
+ You can add more files by adding to the _sections_ folder and appending the name to _scribe.yml_. This config file defines the order of the sections and how they should appear.
@@ -0,0 +1,3 @@
1
+ Thing,Command
2
+ Make a new ScribeDown document,scribe init
3
+ Turn a ScribeDown doc into html,scribe generate
@@ -0,0 +1,3 @@
1
+ <div id="<%= section.name %>" class="<%= section.classes.join(' ') rescue '' %>">
2
+ <%= content %>
3
+ </div>
@@ -0,0 +1,13 @@
1
+ body {
2
+ width: 95%;
3
+ margin: auto;
4
+ font-family: sans-serif;
5
+ }
6
+
7
+ code {
8
+ font-family: "Anonymous Pro", "Menlo", monospace;
9
+ }
10
+
11
+ table {
12
+ width: 100%;
13
+ }
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scribedown
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Will Richardson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: kramdown
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pdfkit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.8'
41
+ description: Markdown for report writing
42
+ email: william.hamish@gmail.com
43
+ executables:
44
+ - scribe
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - bin/scribe
49
+ - lib/generate/helpers.rb
50
+ - lib/generate/renderer.rb
51
+ - lib/res/resources.rb
52
+ - lib/scribedown.rb
53
+ - lib/section.rb
54
+ - resources/csv_template.html.erb
55
+ - resources/default.yml
56
+ - resources/index.html.erb
57
+ - resources/init/scribe.yml
58
+ - resources/init/sections/default_section.md
59
+ - resources/init/sections/info.csv
60
+ - resources/section.html.erb
61
+ - resources/style.css
62
+ homepage: http://javanut.net/scribedown
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.4.8
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Markdown into a PDF
86
+ test_files: []