syobocal 0.12.0 → 0.13.0

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: d0398de2d798888a3de127fc65f3d5b7e80571e9ce0fb14a5167787dae9714d4
4
- data.tar.gz: 4851e93fe58065998cbecba8ea6c598b2e0971c145a755157636aa5f2f91ed11
3
+ metadata.gz: a2b86d38d425a78a79903d700e893f1bf830a862ac4cd088124ad613d24890f3
4
+ data.tar.gz: b911625bb75f55c90efd4cdf3ab66aa64501ce0cf329f01a022bc3e3ee131834
5
5
  SHA512:
6
- metadata.gz: 4b617073199d1f4e2ecb320e908d9874cbc67ad4a3154b268ff35466712397f4e802b07aa4fd30697f5803feb2cea9bbae3b2f92cfd7ea3d0f5a04c8536e9603
7
- data.tar.gz: 3d8cde4777e1de49b68fcf533e3171fbc658e48292ab75970c428ed5dcadc8302d0fe37d428492c7fe34a9dfa86072abedc115d005472c8a0b2f339f66b61411
6
+ metadata.gz: 6efb4dad943bdffd02a0e75c1b9a21cfd25637e84f9d4822ffaab15a7eff5360669580ad22955d8d04cb5f79966d9292a1f9ad5c27d5aec1644e0b8d8060ad3b
7
+ data.tar.gz: 55590f077651aa76520e8d076cf8b122d8c1c7ea8dc2e06fc65c7e3a2bf9f0f58731c0a4cb44e3bb148084e051b6b4293ce97475a40d3944edf9244c33f67ffc
data/README.md CHANGED
@@ -135,20 +135,39 @@ pp parser.casts.first
135
135
  # [#<Syobocal::Comment::Person:0x0000564600051cd8 @name="悠木碧", @note=nil>]>
136
136
 
137
137
  pp parser.musics.first
138
- # #<Syobocal::Comment::Music:0x00005646000afc98
138
+ # #<Syobocal::Comment::Music:0x0000561287c8f1a0
139
139
  # @category="オープニングテーマ",
140
140
  # @data_list=
141
- # [#<Syobocal::Comment::MusicData:0x00005646000a0b30
141
+ # [#<Syobocal::Comment::MusicData:0x0000561287c8b8e8
142
142
  # @attr="作詞・作曲",
143
+ # @attr_note=nil,
144
+ # @attr_text="作詞・作曲",
145
+ # @people=
146
+ # [#<Syobocal::Comment::Person:0x0000561287c8ba28 @name="渡辺翔", @note=nil>],
143
147
  # @value="渡辺翔">,
144
- # #<Syobocal::Comment::MusicData:0x00005646000a06a8
148
+ # #<Syobocal::Comment::MusicData:0x0000561287c8a3d0
145
149
  # @attr="主題歌協力",
150
+ # @attr_note=nil,
151
+ # @attr_text="主題歌協力",
152
+ # @people=
153
+ # [#<Syobocal::Comment::Person:0x0000561287c8a510 @name="外村敬一", @note=nil>],
146
154
  # @value="外村敬一">,
147
- # #<Syobocal::Comment::MusicData:0x00005646000a0428
155
+ # #<Syobocal::Comment::MusicData:0x0000561287c88e90
148
156
  # @attr="歌",
157
+ # @attr_note=nil,
158
+ # @attr_text="歌",
159
+ # @people=
160
+ # [#<Syobocal::Comment::Person:0x0000561287c88fd0
161
+ # @name="ClariS",
162
+ # @note=nil>],
149
163
  # @value="ClariS">,
150
- # #<Syobocal::Comment::MusicData:0x00005646000afd38
164
+ # #<Syobocal::Comment::MusicData:0x0000561287c8f2e0
151
165
  # @attr="使用話数",
166
+ # @attr_note=nil,
167
+ # @attr_text="使用話数",
168
+ # @people=
169
+ # [#<Syobocal::Comment::Person:0x0000561287c8f560 @name="#1~#9", @note=nil>,
170
+ # #<Syobocal::Comment::Person:0x0000561287c8f420 @name="#11", @note=nil>],
152
171
  # @value="#1~#9、#11">],
153
172
  # @title="コネクト">
154
173
  ```
@@ -20,6 +20,7 @@ require "syobocal/comment/element/row"
20
20
  require "syobocal/comment/element/text"
21
21
  require "syobocal/comment/element/text_node"
22
22
  require "syobocal/comment/element/root"
23
+ require "syobocal/comment/helper/fragment"
23
24
  require "syobocal/comment/parser"
24
25
  require "syobocal/comment/staff"
25
26
  require "syobocal/comment/cast"
@@ -0,0 +1,80 @@
1
+ module Syobocal
2
+ module Comment
3
+ module Helper
4
+ class Fragment
5
+ CHILD_BEGIN = '('
6
+ CHILD_END = ')'
7
+ SEPARATOR = '、'
8
+
9
+ attr_reader :text, :child, :following
10
+
11
+ def initialize(text, child, following)
12
+ @text, @child, @following = text, child, following
13
+ end
14
+
15
+ def self.parse(str)
16
+ chars = str.each_char.to_a
17
+
18
+ parse_chars(chars)
19
+ end
20
+
21
+ def self.parse_chars(chars)
22
+ text = ""
23
+ child = nil
24
+ following = nil
25
+
26
+ until chars.empty?
27
+ c = chars.shift
28
+
29
+ case c
30
+ when CHILD_BEGIN
31
+ child = parse_chars(chars)
32
+ when CHILD_END
33
+ return Fragment.new(text, child, following)
34
+ when SEPARATOR
35
+ following = parse_chars(chars)
36
+ else
37
+ text << c
38
+ end
39
+ end
40
+
41
+ Fragment.new(text, child, following)
42
+ end
43
+
44
+ def pretty_output(level = 0)
45
+ line = level.times.map{' '}.join
46
+
47
+ line << text
48
+
49
+ puts line
50
+
51
+ child&.pretty_output(level + 1)
52
+
53
+ following&.pretty_output(level)
54
+ end
55
+
56
+ def to_a
57
+ array = [self]
58
+ target = self
59
+
60
+ while target.following
61
+ array << target.following
62
+ target = target.following
63
+ end
64
+
65
+ array
66
+ end
67
+
68
+ def to_s
69
+ to_a.map{|f|
70
+ if f.child
71
+ "#{f.text}(#{f.child.to_s})"
72
+ else
73
+ "#{f.text}"
74
+ end
75
+ }.join(SEPARATOR)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,14 +1,14 @@
1
1
  module Syobocal
2
2
  module Comment
3
3
  class MusicData
4
- attr_reader :attr, :value
4
+ attr_reader :attr, :attr_text, :attr_note, :value, :people
5
5
 
6
- def initialize(attr, value)
7
- @attr, @value = attr, value
6
+ def initialize(attr, attr_text, attr_note, value, people)
7
+ @attr, @attr_text, @attr_note, @value, @people = attr, attr_text, attr_note, value, people
8
8
  end
9
9
 
10
10
  def ==(other)
11
- other.instance_of?(self.class) && other.attr == attr && other.value == value
11
+ other.instance_of?(self.class) && other.attr == attr && other.attr_text == attr_text && other.attr_note == other.attr_note && other.value == value && other.people == people
12
12
  end
13
13
  end
14
14
  end
@@ -19,6 +19,15 @@ module Syobocal
19
19
 
20
20
  Person.new(name, note)
21
21
  end
22
+
23
+ def self.multi_parse(str)
24
+ Helper::Fragment.parse(str).to_a.map{|f|
25
+ name = f.text
26
+ note = f&.child&.to_s
27
+
28
+ Person.new(name, note)
29
+ }
30
+ end
22
31
  end
23
32
  end
24
33
  end
@@ -52,8 +52,21 @@ module Syobocal
52
52
 
53
53
  data_list = rows.map do |row|
54
54
  attr = row.attr_node.inner_text
55
+
56
+ attr_fragment = Helper::Fragment.parse(attr)
57
+
58
+ if attr_fragment.to_a.size == 1
59
+ attr_text = attr_fragment.text
60
+ attr_note = attr_fragment&.child&.to_s
61
+ else
62
+ attr_text = attr_fragment.to_s
63
+ attr_note = nil
64
+ end
65
+
55
66
  value = row.value_node.inner_text
56
- MusicData.new(attr, value)
67
+ people = Person.multi_parse(value)
68
+
69
+ MusicData.new(attr, attr_text, attr_note, value, people)
57
70
  end
58
71
 
59
72
  Music.new(title, category, data_list)
@@ -1,3 +1,3 @@
1
1
  module Syobocal
2
- VERSION = "0.12.0"
2
+ VERSION = "0.13.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syobocal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - xmisao
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-10 00:00:00.000000000 Z
11
+ date: 2020-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,6 +100,7 @@ files:
100
100
  - lib/syobocal/comment/element/row.rb
101
101
  - lib/syobocal/comment/element/text.rb
102
102
  - lib/syobocal/comment/element/text_node.rb
103
+ - lib/syobocal/comment/helper/fragment.rb
103
104
  - lib/syobocal/comment/music.rb
104
105
  - lib/syobocal/comment/music_data.rb
105
106
  - lib/syobocal/comment/parser.rb