table_analysis 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/demo.rb +5 -0
- data/lib/table_analysis/{main.rb → core.rb} +4 -5
- data/lib/table_analysis/header.rb +7 -3
- data/lib/table_analysis/version.rb +1 -1
- data/lib/table_analysis.rb +52 -3
- data/table_analysis.gemspec +17 -17
- metadata +17 -4
- data/demo1.rb +0 -28
- data/demo2.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d14e89ab00de3db0ebfb32f5e28e32991c4ed82b9c2f47ba7591412dbe46668
|
4
|
+
data.tar.gz: e1dfa8cb739efed8ab5a1bf46b72ea6de6f7acdab2aef07945d3460a8f139340
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0ea4f6fe0d62f2b12935c1811629385bdc5c6b54cfce504a1890e2cac2cedbbe64760e9dc9d6e01e0a701ca77915347b1a19fece3f21e5bcd6a52f8b3e4bcb3
|
7
|
+
data.tar.gz: c7c8f0124b653386f472c2a76a90c60a7a2462a45372dcf22571524631ae0526bb4bb30f23f4797a550dc4cdac1a53f65dbc15095ca209334d3f5239ec07b45b
|
data/demo.rb
ADDED
@@ -3,7 +3,7 @@ require_relative 'body'
|
|
3
3
|
require_relative 'table'
|
4
4
|
|
5
5
|
module TableAnalysis
|
6
|
-
class
|
6
|
+
class Core
|
7
7
|
attr_accessor :header, :table, :body_tds, :pointer, :x_max, :y_max
|
8
8
|
|
9
9
|
def initialize(header, table, body_tds)
|
@@ -21,7 +21,6 @@ module TableAnalysis
|
|
21
21
|
current_seat_position = seat_down
|
22
22
|
reserved_seat(current_seat_position, body_td.rowspan, body_td.colspan) if body_td.reserved_seat?
|
23
23
|
end
|
24
|
-
|
25
24
|
@table
|
26
25
|
end
|
27
26
|
|
@@ -33,7 +32,7 @@ module TableAnalysis
|
|
33
32
|
# 坐下
|
34
33
|
def seat_down
|
35
34
|
if is_unreserved_seat?
|
36
|
-
@table[@pointer[0]][@pointer[1]] = seat_down_value
|
35
|
+
@table[@pointer[0]][@pointer[1]] = seat_down_value
|
37
36
|
current_seat_position = @pointer.dup
|
38
37
|
pointer_increase
|
39
38
|
current_seat_position
|
@@ -57,8 +56,8 @@ module TableAnalysis
|
|
57
56
|
end
|
58
57
|
|
59
58
|
# 身份值
|
60
|
-
def seat_down_value
|
61
|
-
@header[
|
59
|
+
def seat_down_value
|
60
|
+
@header[@pointer[1]]
|
62
61
|
end
|
63
62
|
|
64
63
|
def pointer_increase
|
@@ -1,11 +1,15 @@
|
|
1
1
|
module TableAnalysis
|
2
2
|
class Header
|
3
|
-
def self.config(
|
3
|
+
def self.config(selected_cols, *trs)
|
4
4
|
result = []
|
5
5
|
trs.flatten.each do |tr|
|
6
|
-
result << Array.new(tr.length)
|
6
|
+
result << Array.new(tr.length)
|
7
7
|
end
|
8
|
-
result.flatten
|
8
|
+
result = result.flatten
|
9
|
+
selected_cols.each do |selected_col|
|
10
|
+
result[selected_col - 1] = 1
|
11
|
+
end
|
12
|
+
result.map! { |r| r.nil? ? 0 : r }
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
data/lib/table_analysis.rb
CHANGED
@@ -1,7 +1,56 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require_relative 'table_analysis/core'
|
2
|
+
require_relative 'table_analysis/version'
|
3
|
+
require 'nokogiri'
|
4
4
|
module TableAnalysis
|
5
|
+
class Main
|
6
|
+
def self.generator(html, *selected_cols)
|
7
|
+
selected_cols = selected_cols.flatten
|
8
|
+
doc = Nokogiri::HTML(html, nil, 'utf-8')
|
9
|
+
# 多个table,仅处理第一个
|
10
|
+
table = doc.xpath('//table')[0]
|
11
|
+
|
12
|
+
header_content_tds = []
|
13
|
+
body_content_tds = []
|
14
|
+
body_tr_size = 0
|
15
|
+
table.xpath('./tr').each_with_index do |tr, tr_index|
|
16
|
+
if tr_index == 0
|
17
|
+
tr.xpath('./td').each do |td|
|
18
|
+
header_name = td.content
|
19
|
+
colspan = td.attribute('colspan')&.value
|
20
|
+
header_content_tds << [header_name, colspan]
|
21
|
+
end
|
22
|
+
else
|
23
|
+
body_tr_size += 1
|
24
|
+
tr.xpath('./td').each_with_index do |td, td_index|
|
25
|
+
rowspan = td.attribute('rowspan')&.value
|
26
|
+
colspan = td.attribute('colspan')&.value
|
27
|
+
body_content_tds << [rowspan, colspan]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
header_tds = header_content_tds.map do |header_content_td|
|
33
|
+
TableAnalysis::HeaderTd.config(header_content_td[0], header_content_td[1])
|
34
|
+
end
|
35
|
+
|
36
|
+
header = TableAnalysis::Header.config(selected_cols, header_tds)
|
37
|
+
table = TableAnalysis::Table.config(body_tr_size, header)
|
38
|
+
|
39
|
+
body_tds = body_content_tds.map do |body_td|
|
40
|
+
TableAnalysis::BodyTd.config(body_td[0], body_td[1])
|
41
|
+
end
|
42
|
+
|
43
|
+
content_maps = TableAnalysis::Core.new(header, table, body_tds).entrance
|
44
|
+
|
45
|
+
header_map = [Array.new(header_tds.size){0}]
|
46
|
+
|
47
|
+
table_maps = header_map + content_maps
|
48
|
+
|
49
|
+
p table_maps
|
50
|
+
table_maps
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
5
54
|
class Error < StandardError; end
|
6
55
|
# Your code goes here...
|
7
56
|
end
|
data/table_analysis.gemspec
CHANGED
@@ -1,18 +1,17 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'table_analysis/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'table_analysis'
|
8
7
|
spec.version = TableAnalysis::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
8
|
+
spec.authors = ['mico_xiaozhen@sina.com']
|
9
|
+
spec.email = ['mico_xiaozhen@sina.com']
|
11
10
|
|
12
|
-
spec.summary =
|
11
|
+
spec.summary = '进行表格分析'
|
13
12
|
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
13
|
+
spec.homepage = 'https://github.com/mico-xiaozhen/table_analysis'
|
14
|
+
spec.license = 'MIT'
|
16
15
|
|
17
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
17
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
@@ -23,20 +22,21 @@ Gem::Specification.new do |spec|
|
|
23
22
|
# spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
24
23
|
# spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
|
25
24
|
else
|
26
|
-
raise
|
27
|
-
|
25
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
26
|
+
'public gem pushes.'
|
28
27
|
end
|
29
28
|
|
30
29
|
# Specify which files should be added to the gem when it is released.
|
31
30
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
32
|
-
spec.files
|
31
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
33
32
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
34
33
|
end
|
35
|
-
spec.bindir =
|
34
|
+
spec.bindir = 'exe'
|
36
35
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
|
-
spec.require_paths = [
|
36
|
+
spec.require_paths = ['lib']
|
38
37
|
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
41
|
-
spec.add_development_dependency
|
38
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
39
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
40
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
41
|
+
spec.add_development_dependency 'nokogirl', '~> 1.0'
|
42
42
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_analysis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mico_xiaozhen@sina.com
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: nokogirl
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
55
69
|
description:
|
56
70
|
email:
|
57
71
|
- mico_xiaozhen@sina.com
|
@@ -70,14 +84,13 @@ files:
|
|
70
84
|
- Rakefile
|
71
85
|
- bin/console
|
72
86
|
- bin/setup
|
73
|
-
-
|
74
|
-
- demo2.rb
|
87
|
+
- demo.rb
|
75
88
|
- file/demo2.html
|
76
89
|
- lib/table_analysis.rb
|
77
90
|
- lib/table_analysis/body.rb
|
91
|
+
- lib/table_analysis/core.rb
|
78
92
|
- lib/table_analysis/double_dimensional_array.rb
|
79
93
|
- lib/table_analysis/header.rb
|
80
|
-
- lib/table_analysis/main.rb
|
81
94
|
- lib/table_analysis/table.rb
|
82
95
|
- lib/table_analysis/version.rb
|
83
96
|
- table_analysis.gemspec
|
data/demo1.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require_relative 'main'
|
2
|
-
|
3
|
-
header_content_tds = [
|
4
|
-
['姓名', 1], ['年龄', 1], ['内容', 2] # [name, colspan]
|
5
|
-
]
|
6
|
-
|
7
|
-
body_content_tds = [
|
8
|
-
[1, 1], [1, 1], [1, 1], [1, 1], # //tr//td [rowspan, colspan]
|
9
|
-
[1, 1], [3, 1], [1, 2],
|
10
|
-
[2, 1], [1, 2],
|
11
|
-
[1, 1], [1, 1]
|
12
|
-
]
|
13
|
-
|
14
|
-
find_name = '姓名'
|
15
|
-
tr_sizes = 4
|
16
|
-
|
17
|
-
headerTds = header_content_tds.map do |header_content_td|
|
18
|
-
TableAnalysis::HeaderTd.config(header_content_td[0], header_content_td[1])
|
19
|
-
end
|
20
|
-
|
21
|
-
header = TableAnalysis::Header.config(find_name, headerTds)
|
22
|
-
table = TableAnalysis::Table.config(tr_sizes, header)
|
23
|
-
|
24
|
-
body_tds = body_content_tds.map do |body_td|
|
25
|
-
TableAnalysis::BodyTd.config(body_td[0], body_td[1])
|
26
|
-
end
|
27
|
-
|
28
|
-
p TableAnalysis::Main.new(header, table, body_tds).entrance
|
data/demo2.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require_relative 'main'
|
2
|
-
require 'nokogiri'
|
3
|
-
|
4
|
-
doc = File.open('file/demo2.html') { |f| Nokogiri::HTML(f, nil, 'utf-8') }
|
5
|
-
tables = doc.xpath('//table')
|
6
|
-
tables.each do |table|
|
7
|
-
header_content_tds = []
|
8
|
-
body_content_tds = []
|
9
|
-
tr_sizes = 0
|
10
|
-
table.xpath('./tr').each_with_index do |tr, index|
|
11
|
-
if index == 0
|
12
|
-
tr.xpath('./td').each do |td|
|
13
|
-
header_name = td.content
|
14
|
-
colspan = td.attribute('colspan')&.value
|
15
|
-
header_content_tds << [header_name, colspan]
|
16
|
-
end
|
17
|
-
else
|
18
|
-
tr_sizes += 1
|
19
|
-
tr.xpath('./td').each do |td|
|
20
|
-
rowspan = td.attribute('rowspan')&.value
|
21
|
-
colspan = td.attribute('colspan')&.value
|
22
|
-
body_content_tds << [rowspan, colspan]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
# p header_content_tds
|
27
|
-
# p body_content_tds
|
28
|
-
p find_name = header_content_tds[1][0].delete('\n').strip
|
29
|
-
headerTds = header_content_tds.map do |header_content_td|
|
30
|
-
TableAnalysis::HeaderTd.config(header_content_td[0], header_content_td[1])
|
31
|
-
end
|
32
|
-
# p headerTds
|
33
|
-
header = TableAnalysis::Header.config(find_name, headerTds)
|
34
|
-
table = TableAnalysis::Table.config(tr_sizes, header)
|
35
|
-
# p header
|
36
|
-
body_tds = body_content_tds.map do |body_td|
|
37
|
-
TableAnalysis::BodyTd.config(body_td[0], body_td[1])
|
38
|
-
end
|
39
|
-
# p body_tds
|
40
|
-
p TableAnalysis::Main.new(header, table, body_tds).entrance
|
41
|
-
end
|