coradoc 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.docker/Dockerfile +1 -1
  3. data/.docker/docker-compose.yml +2 -2
  4. data/.editorconfig +15 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Rakefile +10 -0
  7. data/coradoc.gemspec +11 -2
  8. data/exe/reverse_adoc +70 -0
  9. data/exe/w2a +72 -0
  10. data/lib/coradoc/document.rb +5 -6
  11. data/lib/coradoc/element/admonition.rb +8 -6
  12. data/lib/coradoc/element/attribute_list.rb +2 -2
  13. data/lib/coradoc/element/audio.rb +1 -1
  14. data/lib/coradoc/element/author.rb +16 -14
  15. data/lib/coradoc/element/base.rb +0 -2
  16. data/lib/coradoc/element/block/core.rb +2 -2
  17. data/lib/coradoc/element/block/literal.rb +1 -1
  18. data/lib/coradoc/element/block/sourcecode.rb +2 -2
  19. data/lib/coradoc/element/image/core.rb +1 -0
  20. data/lib/coradoc/element/image.rb +0 -1
  21. data/lib/coradoc/element/inline/bold.rb +1 -0
  22. data/lib/coradoc/element/inline/highlight.rb +1 -0
  23. data/lib/coradoc/element/inline/image.rb +1 -0
  24. data/lib/coradoc/element/inline/italic.rb +1 -0
  25. data/lib/coradoc/element/inline/link.rb +9 -9
  26. data/lib/coradoc/element/inline/monospace.rb +1 -0
  27. data/lib/coradoc/element/inline/quotation.rb +1 -0
  28. data/lib/coradoc/element/inline/subscript.rb +1 -0
  29. data/lib/coradoc/element/inline/superscript.rb +1 -0
  30. data/lib/coradoc/element/inline.rb +0 -1
  31. data/lib/coradoc/element/list/core.rb +3 -4
  32. data/lib/coradoc/element/list.rb +0 -1
  33. data/lib/coradoc/element/list_item.rb +1 -1
  34. data/lib/coradoc/element/paragraph.rb +1 -1
  35. data/lib/coradoc/element/revision.rb +18 -16
  36. data/lib/coradoc/element/table.rb +10 -10
  37. data/lib/coradoc/element/text_element.rb +21 -15
  38. data/lib/coradoc/element/title.rb +2 -2
  39. data/lib/coradoc/element/video.rb +1 -1
  40. data/lib/coradoc/generator.rb +2 -2
  41. data/lib/coradoc/legacy_parser.rb +41 -41
  42. data/lib/coradoc/oscal.rb +2 -4
  43. data/lib/coradoc/parser/asciidoc/content.rb +15 -15
  44. data/lib/coradoc/parser/asciidoc/document_attributes.rb +1 -1
  45. data/lib/coradoc/parser/asciidoc/header.rb +6 -6
  46. data/lib/coradoc/parser/asciidoc/section.rb +1 -1
  47. data/lib/coradoc/reverse_adoc/LICENSE.txt +25 -0
  48. data/lib/coradoc/reverse_adoc/README.adoc +302 -0
  49. data/lib/coradoc/reverse_adoc/cleaner.rb +113 -0
  50. data/lib/coradoc/reverse_adoc/config.rb +54 -0
  51. data/lib/coradoc/reverse_adoc/converters/a.rb +42 -0
  52. data/lib/coradoc/reverse_adoc/converters/aside.rb +16 -0
  53. data/lib/coradoc/reverse_adoc/converters/audio.rb +29 -0
  54. data/lib/coradoc/reverse_adoc/converters/base.rb +100 -0
  55. data/lib/coradoc/reverse_adoc/converters/blockquote.rb +27 -0
  56. data/lib/coradoc/reverse_adoc/converters/br.rb +15 -0
  57. data/lib/coradoc/reverse_adoc/converters/bypass.rb +81 -0
  58. data/lib/coradoc/reverse_adoc/converters/code.rb +56 -0
  59. data/lib/coradoc/reverse_adoc/converters/div.rb +18 -0
  60. data/lib/coradoc/reverse_adoc/converters/drop.rb +22 -0
  61. data/lib/coradoc/reverse_adoc/converters/em.rb +55 -0
  62. data/lib/coradoc/reverse_adoc/converters/figure.rb +25 -0
  63. data/lib/coradoc/reverse_adoc/converters/h.rb +42 -0
  64. data/lib/coradoc/reverse_adoc/converters/head.rb +23 -0
  65. data/lib/coradoc/reverse_adoc/converters/hr.rb +15 -0
  66. data/lib/coradoc/reverse_adoc/converters/ignore.rb +16 -0
  67. data/lib/coradoc/reverse_adoc/converters/img.rb +93 -0
  68. data/lib/coradoc/reverse_adoc/converters/li.rb +17 -0
  69. data/lib/coradoc/reverse_adoc/converters/mark.rb +21 -0
  70. data/lib/coradoc/reverse_adoc/converters/math.rb +31 -0
  71. data/lib/coradoc/reverse_adoc/converters/ol.rb +64 -0
  72. data/lib/coradoc/reverse_adoc/converters/p.rb +23 -0
  73. data/lib/coradoc/reverse_adoc/converters/pass_through.rb +13 -0
  74. data/lib/coradoc/reverse_adoc/converters/pre.rb +55 -0
  75. data/lib/coradoc/reverse_adoc/converters/q.rb +16 -0
  76. data/lib/coradoc/reverse_adoc/converters/strong.rb +52 -0
  77. data/lib/coradoc/reverse_adoc/converters/sub.rb +16 -0
  78. data/lib/coradoc/reverse_adoc/converters/sup.rb +16 -0
  79. data/lib/coradoc/reverse_adoc/converters/table.rb +69 -0
  80. data/lib/coradoc/reverse_adoc/converters/td.rb +83 -0
  81. data/lib/coradoc/reverse_adoc/converters/text.rb +65 -0
  82. data/lib/coradoc/reverse_adoc/converters/th.rb +14 -0
  83. data/lib/coradoc/reverse_adoc/converters/tr.rb +22 -0
  84. data/lib/coradoc/reverse_adoc/converters/video.rb +29 -0
  85. data/lib/coradoc/reverse_adoc/converters.rb +32 -0
  86. data/lib/coradoc/reverse_adoc/errors.rb +10 -0
  87. data/lib/coradoc/reverse_adoc/html_converter.rb +61 -0
  88. data/lib/coradoc/reverse_adoc.rb +27 -0
  89. data/lib/coradoc/transformer.rb +24 -14
  90. data/lib/coradoc/version.rb +1 -1
  91. data/lib/reverse_adoc.rb +20 -0
  92. metadata +178 -4
@@ -8,10 +8,9 @@ module Coradoc
8
8
  @title = title
9
9
  @id = options.fetch(:id, nil)
10
10
  @anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
11
- @attrs = options.fetch(:attrs, '')
11
+ @attrs = options.fetch(:attrs, "")
12
12
  end
13
13
 
14
-
15
14
  def to_adoc
16
15
  anchor = @anchor.nil? ? "" : "#{@anchor.to_adoc}\n"
17
16
  attrs = @attrs.to_s.empty? ? "" : "#{@attrs.to_adoc}\n"
@@ -28,7 +27,7 @@ module Coradoc
28
27
  @columns = columns
29
28
  @header = header
30
29
  end
31
-
30
+
32
31
  def table_header_row?
33
32
  @header
34
33
  end
@@ -42,22 +41,23 @@ module Coradoc
42
41
  def underline_for
43
42
  "\n"
44
43
  end
45
-
46
44
  end
45
+
47
46
  class Cell
48
47
  attr_reader :anchor
48
+
49
49
  def initialize(options = {})
50
50
  @id = options.fetch(:id, nil)
51
51
  @anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
52
- @colrowattr = options.fetch(:colrowattr, '')
53
- @alignattr = options.fetch(:alignattr, '')
54
- @style = options.fetch(:style, '')
55
- @content = options.fetch(:content, '')
56
- @delim = options.fetch(:delim, '')
52
+ @colrowattr = options.fetch(:colrowattr, "")
53
+ @alignattr = options.fetch(:alignattr, "")
54
+ @style = options.fetch(:style, "")
55
+ @content = options.fetch(:content, "")
56
+ @delim = options.fetch(:delim, "")
57
57
  end
58
58
 
59
59
  def to_adoc
60
- anchor = @anchor.nil? ? "" : "#{@anchor.to_adoc}"
60
+ anchor = @anchor.nil? ? "" : @anchor.to_adoc.to_s
61
61
  content = Coradoc::Generator.gen_adoc(@content)
62
62
  "#{@colrowattr}#{@alignattr}#{@style}| #{anchor}#{content}#{@delim}"
63
63
  end
@@ -1,26 +1,32 @@
1
1
  module Coradoc
2
- class Element::TextElement
3
- attr_reader :id, :content, :line_break
2
+ module Element
3
+ class TextElement
4
+ attr_reader :id, :content, :line_break
4
5
 
5
- def initialize(content, options = {})
6
- @content = content#.to_s
7
- @id = options.fetch(:id, nil)
8
- @line_break = options.fetch(:line_break, "")
9
- end
10
-
11
- def to_adoc
12
- Coradoc::Generator.gen_adoc(@content)
6
+ def initialize(content, options = {})
7
+ @content = content # .to_s
8
+ @id = options.fetch(:id, nil)
9
+ @line_break = options.fetch(:line_break, "")
10
+ end
11
+
12
+ def to_adoc
13
+ Coradoc::Generator.gen_adoc(@content)
14
+ end
13
15
  end
14
16
  end
15
17
 
16
- class Element::LineBreak
17
- attr_reader :line_break
18
+ module Element
19
+ class LineBreak
20
+ attr_reader :line_break
18
21
 
19
- def initialize(line_break)
20
- @line_break = line_break
22
+ def initialize(line_break)
23
+ @line_break = line_break
24
+ end
21
25
  end
22
26
  end
23
27
 
24
- class Element::Highlight < Element::TextElement
28
+ module Element
29
+ class Highlight < Element::TextElement
30
+ end
25
31
  end
26
32
  end
@@ -13,14 +13,14 @@ module Coradoc
13
13
  end
14
14
 
15
15
  def level
16
- @level_str ||= level_from_string
16
+ @level ||= level_from_string
17
17
  end
18
18
 
19
19
  def to_adoc
20
20
  anchor = @anchor.nil? ? "" : "#{@anchor.to_adoc}\n"
21
21
  content = Coradoc::Generator.gen_adoc(@content)
22
22
  level_str = "=" * (@level_int + 1)
23
- content = ["\n", anchor, level_str, ' ', content, "\n"].join("")
23
+ ["\n", anchor, level_str, " ", content, "\n"].join("")
24
24
  end
25
25
 
26
26
  alias :text :content
@@ -7,7 +7,7 @@ module Coradoc
7
7
  @title = title
8
8
  @id = options.fetch(:id, nil)
9
9
  @anchor = @id.nil? ? nil : Inline::Anchor.new(@id)
10
- @src = options.fetch(:src, '')
10
+ @src = options.fetch(:src, "")
11
11
  @attributes = options.fetch(:attributes, [])
12
12
  # @attributes.add_valid_named('opts')
13
13
  end
@@ -4,13 +4,13 @@ module Coradoc
4
4
  if content.is_a?(Array)
5
5
  content.map do |elem|
6
6
  Coradoc::Generator.gen_adoc(elem)
7
- end.join('')
7
+ end.join("")
8
8
  elsif content.respond_to? :to_adoc
9
9
  content.to_adoc
10
10
  elsif content.is_a?(String)
11
11
  content
12
12
  elsif content.nil?
13
- ''
13
+ ""
14
14
  end
15
15
  end
16
16
  end
@@ -23,8 +23,8 @@ module Coradoc
23
23
 
24
24
  rule(:text_line) do
25
25
  special_character.absent? >>
26
- match("[^\n]").repeat(1).as(:text) >>
27
- line_ending.as(:break)
26
+ match("[^\n]").repeat(1).as(:text) >>
27
+ line_ending.as(:break)
28
28
  end
29
29
 
30
30
  # Common Helpers
@@ -33,52 +33,52 @@ module Coradoc
33
33
 
34
34
  # Document
35
35
  rule(:document) do
36
- (
37
- document_attributes.repeat(1).as(:document_attributes) |
38
- section.as(:section) |
39
- header.as(:header) |
40
- block_with_title.as(:block) |
41
- empty_line.repeat(1) |
42
- any.as(:unparsed)
43
- ).repeat(1).as(:document)
36
+ (
37
+ document_attributes.repeat(1).as(:document_attributes) |
38
+ section.as(:section) |
39
+ header.as(:header) |
40
+ block_with_title.as(:block) |
41
+ empty_line.repeat(1) |
42
+ any.as(:unparsed)
43
+ ).repeat(1).as(:document)
44
44
  end
45
45
 
46
46
  # Header
47
47
  rule(:header) do
48
48
  match("=") >> space? >> text.as(:title) >> newline >>
49
- author.maybe.as(:author) >> revision.maybe.as(:revision)
49
+ author.maybe.as(:author) >> revision.maybe.as(:revision)
50
50
  end
51
51
 
52
52
  rule(:author) do
53
53
  words.as(:first_name) >> str(",") >> space? >> words.as(:last_name) >>
54
- space? >> str("<") >> email.as(:email) >> str(">") >> endline
54
+ space? >> str("<") >> email.as(:email) >> str(">") >> endline
55
55
  end
56
56
 
57
57
  rule(:revision) do
58
58
  (word >> (str(".") >> word).maybe).as(:number) >>
59
- str(",") >> space? >> word.as(:date) >>
60
- str(":") >> space? >> words.as(:remark) >> newline
59
+ str(",") >> space? >> word.as(:date) >>
60
+ str(":") >> space? >> words.as(:remark) >> newline
61
61
  end
62
62
 
63
63
  # DocumentAttributes
64
64
  rule(:document_attributes) do
65
65
  str(":") >> attribute_name.as(:key) >> str(":") >>
66
- space? >> attribute_value.as(:value) >> endline
66
+ space? >> attribute_value.as(:value) >> endline
67
67
  end
68
68
 
69
69
  # Section
70
70
  rule(:section) do
71
71
  heading.as(:title) >>
72
- (list.as(:list) |
73
- blocks.as(:blocks) |
74
- paragraphs.as(:paragraphs)).maybe
72
+ (list.as(:list) |
73
+ blocks.as(:blocks) |
74
+ paragraphs.as(:paragraphs)).maybe
75
75
  end
76
76
 
77
77
  # Heading
78
78
  rule(:heading) do
79
79
  (anchor_name >> newline).maybe >>
80
- match("=").repeat(2, 8).as(:level) >>
81
- space? >> text.as(:text) >> endline.as(:break)
80
+ match("=").repeat(2, 8).as(:level) >>
81
+ space? >> text.as(:text) >> endline.as(:break)
82
82
  end
83
83
 
84
84
  rule(:anchor_name) { str("[#") >> keyword.as(:name) >> str("]") }
@@ -110,51 +110,51 @@ module Coradoc
110
110
  rule(:block_type) { str("[") >> keyword.as(:type) >> str("]") >> newline }
111
111
 
112
112
  rule(:block_attribute) do
113
- str("[") >> keyword.as(:key) >>
114
- str("=") >> keyword.as(:value) >> str("]")
113
+ str("[") >> keyword.as(:key) >>
114
+ str("=") >> keyword.as(:value) >> str("]")
115
115
  end
116
116
 
117
117
  rule(:simple_block) do
118
118
  block_attribute.as(:attributes) >> newline >>
119
- text_line.repeat(1).as(:lines)
119
+ text_line.repeat(1).as(:lines)
120
120
  end
121
121
 
122
122
  rule(:open_block) do
123
123
  block_title >>
124
- block_type >>
125
- str("--").as(:delimiter) >> newline >>
126
- text_line.repeat.as(:lines) >>
127
- str("--") >> line_ending
124
+ block_type >>
125
+ str("--").as(:delimiter) >> newline >>
126
+ text_line.repeat.as(:lines) >>
127
+ str("--") >> line_ending
128
128
  end
129
129
 
130
130
  rule(:example_block) do
131
131
  block_title >>
132
- block_type >>
133
- str("====").as(:delimiter) >> newline >>
134
- text_line.repeat(1).as(:lines) >>
135
- str("====") >> newline
132
+ block_type >>
133
+ str("====").as(:delimiter) >> newline >>
134
+ text_line.repeat(1).as(:lines) >>
135
+ str("====") >> newline
136
136
  end
137
137
 
138
138
  rule(:sidebar_block) do
139
139
  block_title >>
140
- block_type.maybe >>
141
- str("****").as(:delimiter) >> newline >>
142
- text_line.repeat(1).as(:lines) >>
143
- str("****") >> newline
140
+ block_type.maybe >>
141
+ str("****").as(:delimiter) >> newline >>
142
+ text_line.repeat(1).as(:lines) >>
143
+ str("****") >> newline
144
144
  end
145
145
 
146
146
  rule(:source_block) do
147
147
  block_title >>
148
- str("----").as(:delimiter) >> newline >>
149
- text_line.repeat(1).as(:lines) >>
150
- str("----") >> newline
148
+ str("----").as(:delimiter) >> newline >>
149
+ text_line.repeat(1).as(:lines) >>
150
+ str("----") >> newline
151
151
  end
152
152
 
153
153
  rule(:quote_block) do
154
154
  block_title >>
155
- str("____").as(:delimiter) >> newline >>
156
- text_line.repeat.as(:lines) >>
157
- str("____") >> newline
155
+ str("____").as(:delimiter) >> newline >>
156
+ text_line.repeat.as(:lines) >>
157
+ str("____") >> newline
158
158
  end
159
159
 
160
160
  rule(:block_with_title) do
data/lib/coradoc/oscal.rb CHANGED
@@ -15,7 +15,7 @@ module Coradoc
15
15
  def to_oscal
16
16
  {
17
17
  "metadata" => _doc.document_attributes.to_hash,
18
- "groups" => sections_as_groups
18
+ "groups" => sections_as_groups,
19
19
  }
20
20
  end
21
21
 
@@ -80,9 +80,7 @@ module Coradoc
80
80
  end
81
81
 
82
82
  def build_oscal_prose(paragraph)
83
- if paragraph
84
- paragraph.texts.join(" ")
85
- end
83
+ paragraph&.texts&.join(" ")
86
84
  end
87
85
  end
88
86
  end
@@ -50,13 +50,13 @@ module Coradoc
50
50
  block_style("=")
51
51
  end
52
52
 
53
- def block_style(delimiter="*", repeater = 4)
53
+ def block_style(delimiter = "*", repeater = 4)
54
54
  block_title.maybe >>
55
- newline.maybe >>
56
- block_type.maybe >>
57
- str(delimiter).repeat(repeater).as(:delimiter) >> newline >>
58
- text_line.repeat(1).as(:lines) >>
59
- str(delimiter).repeat(repeater) >> newline
55
+ newline.maybe >>
56
+ block_type.maybe >>
57
+ str(delimiter).repeat(repeater).as(:delimiter) >> newline >>
58
+ text_line.repeat(1).as(:lines) >>
59
+ str(delimiter).repeat(repeater) >> newline
60
60
  end
61
61
 
62
62
  def block_type
@@ -65,7 +65,7 @@ module Coradoc
65
65
 
66
66
  def highlight
67
67
  text_id >> newline >>
68
- underline >> highlight_text >> newline
68
+ underline >> highlight_text >> newline
69
69
  end
70
70
 
71
71
  def underline
@@ -79,14 +79,14 @@ module Coradoc
79
79
  # Table
80
80
  def table
81
81
  block_title >>
82
- str("|===") >> line_ending >>
83
- table_row.repeat(1).as(:rows) >>
84
- str("|===") >> line_ending
82
+ str("|===") >> line_ending >>
83
+ table_row.repeat(1).as(:rows) >>
84
+ str("|===") >> line_ending
85
85
  end
86
86
 
87
87
  def table_row
88
- (literal_space? >> str("|") >> (cell_content | empty_cell_content)).
89
- repeat(1).as(:cols) >> line_ending
88
+ (literal_space? >> str("|") >> (cell_content | empty_cell_content))
89
+ .repeat(1).as(:cols) >> line_ending
90
90
  end
91
91
 
92
92
  def empty_cell_content
@@ -98,7 +98,7 @@ module Coradoc
98
98
  end
99
99
 
100
100
  def literal_space
101
- (match[' '] | match[' \t']).repeat(1)
101
+ (match[" "] | match[' \t']).repeat(1)
102
102
  end
103
103
 
104
104
  # Override
@@ -113,7 +113,7 @@ module Coradoc
113
113
  # Text
114
114
  def text_line
115
115
  (asciidoc_char_with_id.absent? | text_id) >> literal_space? >>
116
- text.as(:text) >> line_ending.as(:break)
116
+ text.as(:text) >> line_ending.as(:break)
117
117
  end
118
118
 
119
119
  def asciidoc_char
@@ -137,7 +137,7 @@ module Coradoc
137
137
 
138
138
  def glossary
139
139
  keyword.as(:key) >> str("::") >> space? >>
140
- text.as(:value) >> line_ending.as(:break)
140
+ text.as(:value) >> line_ending.as(:break)
141
141
  end
142
142
 
143
143
  def ordered_list
@@ -11,7 +11,7 @@ module Coradoc
11
11
 
12
12
  def document_attributes
13
13
  str(":") >> attribute_name.as(:key) >> str(":") >>
14
- space? >> attribute_value.as(:value) >> line_ending
14
+ space? >> attribute_value.as(:value) >> line_ending
15
15
  end
16
16
  end
17
17
  end
@@ -8,8 +8,8 @@ module Coradoc
8
8
 
9
9
  def header
10
10
  header_title >>
11
- author.maybe.as(:author) >>
12
- revision.maybe.as(:revision) >> newline.maybe
11
+ author.maybe.as(:author) >>
12
+ revision.maybe.as(:revision) >> newline.maybe
13
13
  end
14
14
 
15
15
  def header_title
@@ -18,14 +18,14 @@ module Coradoc
18
18
 
19
19
  def author
20
20
  words.as(:first_name) >> str(",") >>
21
- space? >> words.as(:last_name) >>
22
- space? >> str("<") >> email.as(:email) >> str(">") >> newline
21
+ space? >> words.as(:last_name) >>
22
+ space? >> str("<") >> email.as(:email) >> str(">") >> newline
23
23
  end
24
24
 
25
25
  def revision
26
26
  (word >> (str(".") >> word).maybe).as(:number) >>
27
- str(",") >> space? >> date.as(:date ) >> str(":") >>
28
- space? >> words.as(:remark) >> newline
27
+ str(",") >> space? >> date.as(:date) >> str(":") >>
28
+ space? >> words.as(:remark) >> newline
29
29
  end
30
30
  end
31
31
  end
@@ -23,7 +23,7 @@ module Coradoc
23
23
  # Heading
24
24
  def section_title(level = 2, max_level = 8)
25
25
  match("=").repeat(level, max_level).as(:level) >>
26
- space? >> text.as(:text) >> endline.as(:break)
26
+ space? >> text.as(:text) >> endline.as(:break)
27
27
  end
28
28
 
29
29
  # section
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2018, Ribose
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.