markdown-tables 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/markdown-tables.rb +89 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d81c56a6b5704f57fe1b02ecf891051306873b50
|
4
|
+
data.tar.gz: 78e3d1343aaadb46e5ea768b498960c73f1ea699
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f31cc74738da99e034bfef0791247d24c7bba6425295c183f95cd2f4ff0928f78bfec11747ebb078c2de6d6cec314a4f8fdec350200458f0721120658dfcb0c5
|
7
|
+
data.tar.gz: 6295dd0283ae39e794cec164469114faa379331271c46ee364d8b7d4c9b88909a7bc8e28e0e5ec68ce78bac94264b2429fe20b49055872c52ba55ce24657b1e3
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# Sanity checks for make_table.
|
2
|
+
def validate(labels, data, align, is_rows)
|
3
|
+
if labels.class != Array
|
4
|
+
raise('labels must be an Array')
|
5
|
+
elsif data.class != Array || data.any? {|datum| datum.class != Array}
|
6
|
+
raise('data must be a two-dimensional array')
|
7
|
+
elsif labels.empty?
|
8
|
+
raise('No column labels given')
|
9
|
+
elsif data.empty?
|
10
|
+
raise('No columns given')
|
11
|
+
elsif data.all? {|datum| datum.empty?}
|
12
|
+
raise('No cells given')
|
13
|
+
elsif labels.any? {|label| !label.respond_to?(:to_s)}
|
14
|
+
raise('One or more column labels cannot be made into a string')
|
15
|
+
elsif data.any? {|datum| datum.any? {|cell| !cell.respond_to?(:to_s)}}
|
16
|
+
raise('One or more cells cannot be made into a string')
|
17
|
+
elsif ![String, Array].include?(align.class)
|
18
|
+
raise('align must be a String or Array')
|
19
|
+
elsif align.class == Array && align.any? {|val| val.class != String}
|
20
|
+
raise('One or more align values is not a String')
|
21
|
+
elsif !is_rows && data.length > labels.length
|
22
|
+
raise('Too many data columns given')
|
23
|
+
elsif is_rows && data.any? {|row| row.length > labels.length}
|
24
|
+
raise('One or more rows has too many cells')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Convert all input to strings and replace any '|' characters with
|
29
|
+
# non-breaking equivalents,
|
30
|
+
def sanitize!(labels, data)
|
31
|
+
bar = '|' # Non-breaking HTML vertical bar.
|
32
|
+
labels.map! {|label| label.to_s.gsub('|', bar)}
|
33
|
+
data.length.times {|i| data[i].map! {|cell| cell.to_s.gsub('|', bar)}}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Generate the alignment line from a string or array.
|
37
|
+
# align must be a string or array or strings.
|
38
|
+
# n: number of labels in the table to be created.
|
39
|
+
def alignment(align, n)
|
40
|
+
if align.class == String
|
41
|
+
alignment = align == 'l' ? ':-' : align == 'r' ? '-:' : ':-:'
|
42
|
+
alignment_line = ([alignment] * n).join('|')
|
43
|
+
else
|
44
|
+
alignments = align.map {
|
45
|
+
|a| a.downcase == 'l' ? ':-' : a.downcase == 'r' ? '-:' : ':-l'
|
46
|
+
}
|
47
|
+
if alignments.length < n
|
48
|
+
alignments += [':-:'] * (n - alignments.length)
|
49
|
+
end
|
50
|
+
alignment_line = alignments.join('|')
|
51
|
+
end
|
52
|
+
return alignment_line
|
53
|
+
end
|
54
|
+
|
55
|
+
# Generate a Markdown table.
|
56
|
+
# labels and data are one and two-dimensional arrays, respectively.
|
57
|
+
# All input must have a to_s method.
|
58
|
+
# Pass align: 'l' for left alignment or 'r' for right alignment. Anything
|
59
|
+
# else will result in cells being centered. Pass an array of align values
|
60
|
+
# to specify alignment per column.
|
61
|
+
# If is_rows is true, then each sub-array represents a row.
|
62
|
+
# Conversely, if is_rows is false, each sub-array of data represents a column.
|
63
|
+
# Empty cells can be given with nil or an empty string.
|
64
|
+
def make_table(labels, data, align: '', is_rows: false)
|
65
|
+
labels = Marshal.load(Marshal.dump(labels))
|
66
|
+
data = Marshal.load(Marshal.dump(data))
|
67
|
+
validate(labels, data, align, is_rows)
|
68
|
+
sanitize!(labels, data)
|
69
|
+
|
70
|
+
header_line = labels.join('|')
|
71
|
+
alignment_line = alignment(align, labels.length)
|
72
|
+
|
73
|
+
if is_rows
|
74
|
+
rows = data.map {|row| row.join('|')}
|
75
|
+
else
|
76
|
+
max_len = data.map(&:size).max
|
77
|
+
rows = []
|
78
|
+
max_len.times do |i|
|
79
|
+
row = []
|
80
|
+
data.each {|col| row.push(col[i])}
|
81
|
+
rows.push(row.join('|'))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
return [header_line, alignment_line, rows.join("\n")].join("\n")
|
86
|
+
end
|
87
|
+
|
88
|
+
# Print out a Markdown table in human-readable form.
|
89
|
+
def print_table(table) end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: markdown-tables
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris de Graaf
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: chrisadegraaf@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/markdown-tables.rb
|
20
|
+
homepage: https://github.com/christopher-dG/markdown-tables
|
21
|
+
licenses:
|
22
|
+
- MIT
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubyforge_project:
|
40
|
+
rubygems_version: 2.6.8
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Utilities for creating and displaying Markdown tables in Ruby
|
44
|
+
test_files: []
|