pangrid 0.4.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be115d7cba3bf82d65d241afb1fedb1becfa8085d447590960447fc479b57d90
4
- data.tar.gz: 5520cd33d623bb0f55f11d0eb3fe4c9e2187dc437e3675bd2b97d40bb60cef08
3
+ metadata.gz: e04bea2f4ebdb7947ec122f28a4a8feaa9cb4e7c4a27206abb6ef0fe7e6f254c
4
+ data.tar.gz: d5f32ec895146fe2141c5f68dcf775477b7a381577239e8225d8d8a155fe0c10
5
5
  SHA512:
6
- metadata.gz: 607c19e615b28a3ad2117765ebba9d5003aaec081e04b0dac4793fdc3a32e88d99b9fbe6c40b3739c116b20a0bcb7e263f00c223dca6898b35f65729c358fed9
7
- data.tar.gz: 6df6cf0d9a78dbaef9213722a80538e0da262dcdb2026e862da07f0235154d2688f2bfc26397b67bd9a2e8a9975ff2a8a3c453fd6427a098d6dc912c011a1643
6
+ metadata.gz: d8057bad79f07c4d761f136a8258171b5b7a3711d5d72d589282d7219153fbf6bbb28c29315ab0ee99eba74ef465d334dbef71fd7657e8881dfe42ad944076ac
7
+ data.tar.gz: e8bf9a1582e69ab4279505d19f957dbe3668cb471cd2644660fbaff073a08f3b608de57db830f637c6a97ada3f255e79bcbc59bab45f0e8d9e9ff345cc0636f8
@@ -40,7 +40,7 @@ class CSV < Plugin
40
40
  h = s.shift.map {|c| c.split(/:\s*/)}
41
41
  header = OpenStruct.new
42
42
  h.each do |k, v|
43
- header[k.downcase] = v
43
+ header[k.downcase.strip] = v
44
44
  end
45
45
 
46
46
  header.clues = header.clues.to_i
@@ -33,7 +33,7 @@ module ExolveWriter
33
33
  end
34
34
 
35
35
  def format_clues(numbers, clues)
36
- numbers.zip(clues).map {|n, c| "#{n.to_s.rjust(2)}. #{c}"}
36
+ numbers.zip(clues).map {|n, c| "#{n.to_s.rjust(2)} #{c}"}
37
37
  end
38
38
 
39
39
  def indent(lines)
@@ -41,7 +41,71 @@ module ExolveWriter
41
41
  end
42
42
  end
43
43
 
44
+ module ExolveReader
45
+ def read(data)
46
+ s = data.each_line.map(&:rstrip)
47
+ first = s.index('exolve-begin')
48
+ check("exolve-begin missing") { first }
49
+ last = s.index('exolve-end')
50
+ check("exolve-end missing") { last }
51
+ lines = s[(first + 1)...last]
52
+ xw = XWord.new
53
+ s = sections(lines)
54
+ s.each do |_, field, data|
55
+ if %w(title setter copyright prelude).include? field
56
+ xw[field] = data
57
+ elsif %w(height width).include? field
58
+ xw[field] = data.to_i
59
+ elsif %(across down).include? field
60
+ xw["#{field}_clues"] = data
61
+ elsif field == "grid"
62
+ xw.solution = parse_grid(data)
63
+ end
64
+ end
65
+ xw
66
+ end
67
+
68
+ def sections(lines)
69
+ headers = lines.each.with_index.map do |l, i|
70
+ m = l.match(/^(\s+)exolve-(\w+):(.*)$/)
71
+ if m
72
+ _, indent, field, data = m.to_a
73
+ [i, field, data.strip]
74
+ else
75
+ nil
76
+ end
77
+ end
78
+ headers.compact!
79
+ headers.push([lines.length, "", ""])
80
+ headers.each_cons(2) do |i, j|
81
+ if i[2].empty?
82
+ i[2] = lines[(i[0] + 1)...j[0]].map(&:strip)
83
+ end
84
+ end
85
+ headers.pop
86
+ headers
87
+ end
88
+
89
+ def parse_grid_char(char)
90
+ case char
91
+ when '0'; :null
92
+ when '.'; :black
93
+ else; char
94
+ end
95
+ end
96
+
97
+ def parse_grid(lines)
98
+ grid = lines.map {|x| x.gsub(/\s/, '').split(//)}
99
+ grid.map do |col|
100
+ col.map do |c|
101
+ Cell.new(:solution => parse_grid_char(c))
102
+ end
103
+ end
104
+ end
105
+ end
106
+
44
107
  class ExolveFilled < Plugin
108
+ include ExolveReader
45
109
  include ExolveWriter
46
110
 
47
111
  DESCRIPTION = "Exolve writer with solutions"
@@ -0,0 +1,34 @@
1
+ require 'chunky_png'
2
+
3
+ module Pangrid
4
+
5
+ class PNGThumbnail < Plugin
6
+ attr_reader :scale, :border
7
+
8
+ def initialize(scale = 4, border = [128, 0, 0])
9
+ @scale = scale
10
+ @border = border
11
+ end
12
+
13
+ def write(xw)
14
+ black = ChunkyPNG::Color::BLACK
15
+ white = ChunkyPNG::Color::WHITE
16
+ grey = ChunkyPNG::Color::rgb(128, 128, 128)
17
+ xdim = xw.width * scale + 2
18
+ ydim = xw.height * scale + 2
19
+ png = ChunkyPNG::Image.new(xdim, ydim, ChunkyPNG::Color::TRANSPARENT)
20
+ xw.each_cell_with_coords do |x, y, cell|
21
+ c = cell.black? ? black : white
22
+ png.rect(
23
+ x * scale, y * scale, (x + 1) * scale, (y + 1) * scale,
24
+ stroke_color = grey, fill_color = c)
25
+ end
26
+ if border
27
+ stroke = ChunkyPNG::Color::rgb(*border)
28
+ png.rect(0, 0, xw.width * scale, xw.height * scale, stroke_color = stroke)
29
+ end
30
+ png.to_blob
31
+ end
32
+ end
33
+
34
+ end # module Pangrid
@@ -92,6 +92,7 @@ class RedditBlank < Plugin
92
92
  #
93
93
  # we have to be careful about leading/trailing |s
94
94
  ix = lines.find_index {|row| row =~ /^[|\s-]+$/}
95
+ check("Could not find grid") { not ix.nil? }
95
96
  width = lines[ix].gsub(/\s/, '').split('|').reject(&:empty?).length
96
97
  lines = [lines[(ix - 1)]] + lines[(ix + 1) .. -1]
97
98
  grid = lines.take_while {|i| is_grid_row(i)}
@@ -1,3 +1,3 @@
1
1
  module Pangrid
2
- VERSION='0.4.0'
2
+ VERSION='0.5.2'
3
3
  end
data/lib/pangrid/xw.rb CHANGED
@@ -139,6 +139,14 @@ class XWord < OpenStruct
139
139
  end
140
140
  end
141
141
 
142
+ def each_cell_with_coords
143
+ (0 ... height).each do |y|
144
+ (0 ... width).each do |x|
145
+ yield [x, y, solution[y][x]]
146
+ end
147
+ end
148
+ end
149
+
142
150
  # {:black => char, :null => char} -> Any[][]
143
151
  def to_array(opts = {})
144
152
  opts = {:black => '#', :null => ' '}.merge(opts)
metadata CHANGED
@@ -1,16 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pangrid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin DeMello
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-13 00:00:00.000000000 Z
12
- dependencies: []
13
- description:
11
+ date: 2022-02-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: webrick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.7.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.7.0
27
+ description:
14
28
  email: martindemello@gmail.com
15
29
  executables:
16
30
  - pangrid
@@ -31,6 +45,7 @@ files:
31
45
  - lib/pangrid/plugins/excel.rb
32
46
  - lib/pangrid/plugins/exolve.rb
33
47
  - lib/pangrid/plugins/json.rb
48
+ - lib/pangrid/plugins/png.rb
34
49
  - lib/pangrid/plugins/qxw.rb
35
50
  - lib/pangrid/plugins/reddit.rb
36
51
  - lib/pangrid/plugins/text.rb
@@ -41,7 +56,7 @@ homepage: https://github.com/martindemello/pangrid
41
56
  licenses:
42
57
  - MIT
43
58
  metadata: {}
44
- post_install_message:
59
+ post_install_message:
45
60
  rdoc_options:
46
61
  - "--main"
47
62
  - README
@@ -58,8 +73,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
73
  - !ruby/object:Gem::Version
59
74
  version: '0'
60
75
  requirements: []
61
- rubygems_version: 3.0.3
62
- signing_key:
76
+ rubygems_version: 3.2.22
77
+ signing_key:
63
78
  specification_version: 4
64
79
  summary: A crossword file format converter
65
80
  test_files: []