hershey 0.0.6 → 0.0.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e1d369a961b88080090e905175732f71280ba796
4
- data.tar.gz: f74a3fd226e961b6f0e35c14dcf1b18f9fbc2c41
3
+ metadata.gz: 9b24545d2a0e0d007d513ce0503af4b8629054a4
4
+ data.tar.gz: e5a24d52e8c171e2fa92f4d98ed39cb13378c84d
5
5
  SHA512:
6
- metadata.gz: 802d3d453dd9036a60d5b71fd313b401dbd063375570bf939713c3c18f79f3d20119b332e65ddac6e5e8782803e3fe2081110e64ed79c2441afe7d3b778b7a6d
7
- data.tar.gz: f8a2e3db4d69ce7a5f6e5ffd88bbeba0ea428dfb1c0940019412e904d1c24fab1d86b42bf4e834fcc25a0f83aa5aee2a4a88062f08edd070ffa47fe2738ef46b
6
+ metadata.gz: d4226c797de0ce2a83db348fdb6beb88b959750b54c40137b8445540090ad9f8b83e9e9e3221bd2ba6ef4f3fec1f38efbe957f809e08a2c735c2dec247b773cb
7
+ data.tar.gz: 1098108380a568961ca20afb29a9c0daf080077ce881725aedc4b8c230195a77f41862fae35e614d32539a3c0eb7d09e2d306dab22b052eb56402dd6dc60921b
data/bin/hershey CHANGED
@@ -1,9 +1,61 @@
1
- #!/usr/bin/env ruby -w
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require 'hershey'
4
+ require 'optparse'
4
5
 
5
- file = ARGV.shift
6
- width = ARGV.shift.to_i
7
- text = ARGV.join(' ')
6
+ options = {}
7
+ OptionParser.new do |opts|
8
+ opts.banner = "Usage: hershey [options]"
8
9
 
9
- open(file, 'w') {|f| f.write(Hershey.svg(text, width: width))}
10
+ opts.on("-w", "--width WIDTH", Integer, "Width of the pages") do |vars|
11
+ options[:width] = vars
12
+ end
13
+
14
+ opts.on("-h", "--height HEIGHT", Integer, "The height per page (defaults to 8.5x11 ratio)") do |f|
15
+ options[:height] = f
16
+ end
17
+
18
+
19
+ opts.on("-i", "--input INFILE", "The input file (required)") do |f|
20
+ options[:input] = f
21
+ end
22
+
23
+ opts.on("-o", "--output OUTFILE", "The output file base name (required)") do |f|
24
+ options[:output] = f
25
+ end
26
+
27
+ options[:max] = 100
28
+ opts.on("-m", "--max MAX", Integer, "Max pages") do |range|
29
+ options[:max] = range
30
+ end
31
+
32
+ opts.on("-o", "--output OUTFILE", "The output file base name") do |f|
33
+ options[:output] = f
34
+ end
35
+
36
+ opts.on("-f", "--font FONT", Hershey::FONTS.keys, "The font to use") do |f|
37
+ options[:font] = f.downcase
38
+ end
39
+ opts.separator("Fonts: #{Hershey::FONTS.keys.map {|k| k.to_s}.join(', ')}")
40
+
41
+ opts.on("--help", "Shows this help message") do
42
+ puts opts
43
+ exit
44
+ end
45
+ end.parse!
46
+
47
+ unless options[:width].is_a?(Integer)
48
+ puts "Missing number of variables for equation"
49
+ puts "Call with -h or --help for help"
50
+ exit(1)
51
+ end
52
+
53
+ options[:height] ||= (options[:width] / 8.5 * 11 / 20).ceil * 20
54
+
55
+ pages = Hershey.svgs(File.read(options[:input]), options.select{|k,_| [:width,:height,:font].include?(k)})
56
+
57
+ pages.each_with_index do |page, i|
58
+ f = "#{options[:output]}_#{i}.svg"
59
+ puts "#{f}: #{page.each_char.inject(0) {|m,s| s == 'L' ? m + 1 : m}} line segments."
60
+ open(f, 'w') {|f| f.write(page)}
61
+ end
data/lib/hershey.rb CHANGED
@@ -6,9 +6,20 @@ require_relative "hershey/version"
6
6
  require_relative "hershey/word"
7
7
 
8
8
  module Hershey
9
+ def self.new(options = {})
10
+ doc = Document.new(options)
11
+ end
12
+
9
13
  def self.svg(text, options = {})
10
14
  doc = Document.new(options)
11
15
  doc.write(text)
12
16
  doc.svg
13
17
  end
18
+
19
+ def self.svgs(text, options = {})
20
+ puts options
21
+ doc = Document.new(options)
22
+ doc.write(text)
23
+ doc.svgs
24
+ end
14
25
  end
@@ -4,7 +4,7 @@ module Hershey
4
4
  SIDE = 10.freeze
5
5
  HEIGHT_STRING = "jfdsklahfdjksjhaljfdskahj".freeze
6
6
 
7
- def initialize(width: 500, height: 500, spacing: 3, vertical: 20, font: :futural)
7
+ def initialize(width: 1000, height: 1300, spacing: 3, vertical: 20, font: :futural, stroke: 1)
8
8
  @words = []
9
9
  @pages = []
10
10
  @width = width
@@ -14,13 +14,15 @@ module Hershey
14
14
  @vertical = vertical
15
15
  @closed = false
16
16
  @font = font
17
- @svg = <<-HEADER
18
- <?xml version="1.0" standalone="no"?>
19
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
20
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
21
- <svg width="#{@width}" height="#{HEIGHT_STRING}" version="1.1"
22
- xmlns="http://www.w3.org/2000/svg">
23
- HEADER
17
+ @stroke = stroke
18
+ end
19
+
20
+ def [](page)
21
+ @pages[page].svg
22
+ end
23
+
24
+ def length
25
+ @pages.length
24
26
  end
25
27
 
26
28
  def <<(text)
@@ -45,41 +47,30 @@ module Hershey
45
47
 
46
48
  def svg
47
49
  write_out unless @closed
48
- @svg
50
+ self[0]
51
+ end
52
+
53
+ def svgs
54
+ write_out unless @closed
55
+ @pages.map {|page| page.svg}
49
56
  end
50
57
 
51
58
  private
52
59
 
53
60
  def write_out
54
- # new_page
55
- space = Character.new(' ').spacing
56
- current_offset = SIDE
57
- @svg << %Q{<g transform="translate(#{SIDE},#{@line})">}
61
+ new_page
58
62
  @words.each do |word|
59
- if word.is_a?(Word)
60
- if word.spacing + current_offset > @width
61
- @line += BUFFER * 2
62
- current_offset = SIDE
63
- @svg << %Q{</g><g transform="translate(#{SIDE},#{@line})">}
64
- end
65
- @svg << word.to_path(current_offset)
66
- current_offset += word.spacing
67
- elsif word == :space
68
- current_offset += space
69
- elsif word == :break
70
- @line += BUFFER * 2
71
- current_offset = SIDE
72
- @svg << %Q{</g><g transform="translate(#{SIDE},#{@line})">}
63
+ begin
64
+ @pages.last.write(word)
65
+ rescue PageFullError => e
66
+ new_page
67
+ retry
73
68
  end
74
69
  end
75
- @svg << "</g></svg>"
76
- @svg.gsub!(HEIGHT_STRING, (@line + BUFFER).to_s)
77
- @closed = true
78
70
  end
79
71
 
80
72
  def new_page
81
- @pages << Page.new(width: @width, height: @height)
82
- @line = BUFFER
73
+ @pages << Page.new(width: @width, height: @height, stroke: @stroke)
83
74
  end
84
75
  end
85
76
  end
data/lib/hershey/page.rb CHANGED
@@ -1,22 +1,66 @@
1
1
  module Hershey
2
2
  class Page
3
- def initialize(width: 400, heigth: 400)
4
- @text = "<g>"
3
+ SPACE = Character.new(' ').spacing.freeze
4
+ BUFFER = 20.freeze
5
+ SIDE = 10.freeze
6
+ HEIGHT_STRING = "jfdsklahfdjksjhaljfdskahj".freeze
7
+
8
+ def initialize(width: 1000, height: 1300, stroke: 1)
5
9
  @close = false
10
+ @height = height
11
+ @width = width
12
+ @current_offset = SIDE
13
+ @line = BUFFER
14
+ @svg = <<-HEADER
15
+ <?xml version="1.0" standalone="no"?>
16
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
17
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
18
+ <svg width="#{@width}" height="#{HEIGHT_STRING}" version="1.1"
19
+ xmlns="http://www.w3.org/2000/svg" style="stroke-width:#{stroke};">
20
+ HEADER
21
+ @svg << %Q{<g transform="translate(#{SIDE},#{@line})">}
6
22
  end
7
23
 
8
24
  def <<(word)
9
-
25
+ if word.is_a?(Word)
26
+ if word.spacing + @current_offset > @width
27
+ new_line
28
+ end
29
+ @svg << word.to_path(@current_offset)
30
+ @current_offset += word.spacing
31
+ elsif word == :space
32
+ @current_offset += SPACE
33
+ elsif word == :break
34
+ new_line
35
+ end
10
36
  end
11
37
  alias_method :write, :<<
12
38
 
13
39
  def write_out
14
40
  close
15
- @text
41
+ @svg
42
+ end
43
+ alias_method :svg, :write_out
44
+
45
+ private
46
+
47
+ def new_line
48
+ @line += BUFFER * 2
49
+ if @line > @height
50
+ @line -= BUFFER
51
+ raise PageFullError, "The page is full"
52
+ else
53
+ @current_offset = SIDE
54
+ @svg << %Q{</g><g transform="translate(#{SIDE},#{@line})">}
55
+ end
16
56
  end
17
57
 
18
58
  def close
19
- @text << "</g>" unless @close
59
+ unless @close
60
+ @svg << "</g></svg>"
61
+ @svg.gsub!(HEIGHT_STRING, (@line + BUFFER).to_s)
62
+ @close = true
63
+ end
20
64
  end
21
65
  end
22
66
 
@@ -1,3 +1,3 @@
1
1
  module Hershey
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
data/spec/ex.svg CHANGED
@@ -2,5 +2,5 @@
2
2
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
3
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
4
  <svg width="500" height="40" version="1.1"
5
- xmlns="http://www.w3.org/2000/svg">
5
+ xmlns="http://www.w3.org/2000/svg" style="stroke-width:1;">
6
6
  <g transform="translate(10,20)"><g transform="translate(10,0)"><path stroke="black" fill="none" d="M0 -12 L0 9" transform="translate(4,0)"></path><path stroke="black" fill="none" d="M0 -12 L0 5 L1 8 L3 9 L5 9 M-3 -5 L4 -5" transform="translate(13,0)"></path><path stroke="black" fill="none" d="M0 -10 L-1 -11 L0 -12 L1 -11 L1 -9 L0 -7 L-1 -6" transform="translate(25,0)"></path><path stroke="black" fill="none" d="M6 -2 L5 -4 L2 -5 L-1 -5 L-4 -4 L-5 -2 L-4 0 L-2 1 L3 2 L5 3 L6 5 L6 6 L5 8 L2 9 L-1 9 L-4 8 L-5 6" transform="translate(38,0)"></path></g><g transform="translate(73,0)"><path stroke="black" fill="none" d="M6 -5 L6 9 M6 -2 L4 -4 L2 -5 L-1 -5 L-3 -4 L-5 -2 L-6 1 L-6 3 L-5 6 L-3 8 L-1 9 L2 9 L4 8 L6 6" transform="translate(9,0)"></path><path stroke="black" fill="none" d="M0 -12 L0 9" transform="translate(23,0)"></path><path stroke="black" fill="none" d="M0 -12 L0 9" transform="translate(31,0)"></path></g><g transform="translate(124,0)"><path stroke="black" fill="none" d="M-2 -12 L-4 -11 L-6 -9 L-7 -7 L-8 -4 L-8 1 L-7 4 L-6 6 L-4 8 L-2 9 L2 9 L4 8 L6 6 L7 4 L8 1 L8 -4 L7 -7 L6 -9 L4 -11 L2 -12 L-2 -12" transform="translate(11,0)"></path><path stroke="black" fill="none" d="M-7 -12 L-7 9 M7 -12 L-7 2 M-2 -3 L7 9" transform="translate(33,0)"></path><path stroke="black" fill="none" d="M0 -12 L-8 9 M0 -12 L8 9 M-5 2 L5 2" transform="translate(52,0)"></path><path stroke="black" fill="none" d="M-8 -12 L0 -2 L0 9 M8 -12 L0 -2" transform="translate(70,0)"></path><path stroke="black" fill="none" d="M0 -12 L0 2 M0 7 L-1 8 L0 9 L1 8 L0 7" transform="translate(84,0)"></path></g></g></svg>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hershey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Winston Durand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-31 00:00:00.000000000 Z
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler