Class: RDF::NTriples::Reader
- Includes:
- Util::Logger
- Defined in:
- lib/rdf/ntriples/reader.rb
Overview
N-Triples parser.
Direct Known Subclasses
Constant Summary collapse
- ESCAPE_CHARS =
["\b", "\f", "\t", "\n", "\r", "\"", "\\"].freeze
- UCHAR4 =
/\\u([0-9A-Fa-f]{4,4})/.freeze
- UCHAR8 =
/\\U([0-9A-Fa-f]{8,8})/.freeze
- UCHAR =
Regexp.union(UCHAR4, UCHAR8).freeze
- U_CHARS1 =
Terminals from rdf-turtle.
Unicode regular expressions.
Regexp.compile(<<-EOS.gsub(/\s+/, '')) [\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]| [\\u0370-\\u037D]|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]| [\\u2070-\\u218F]|[\\u2C00-\\u2FEF]|[\\u3001-\\uD7FF]| [\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]|[\\u{10000}-\\u{EFFFF}] EOS
- U_CHARS2 =
Regexp.compile("\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]").freeze
- IRI_RANGE =
Regexp.compile("[[^<>\"{}\|\^`\\\\]&&[^\\x00-\\x20]]").freeze
- PN_CHARS_BASE =
163s
/[A-Z]|[a-z]|#{U_CHARS1}/.freeze
- PN_CHARS_U =
164s
/_|#{PN_CHARS_BASE}/.freeze
- PN_CHARS =
166s
/-|[0-9]|#{PN_CHARS_U}|#{U_CHARS2}/.freeze
- ECHAR =
159s
/\\[tbnrf\\"]/.freeze
- IRIREF =
18
/<((?:#{IRI_RANGE}|#{UCHAR})*)>/.freeze
- BLANK_NODE_LABEL =
141s
/_:((?:[0-9]|#{PN_CHARS_U})(?:(?:#{PN_CHARS}|\.)*#{PN_CHARS})?)/.freeze
- LANGTAG =
144s
/@([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)/.freeze
- STRING_LITERAL_QUOTE =
22
/"((?:[^\"\\\n\r]|#{ECHAR}|#{UCHAR})*)"/.freeze
- COMMENT =
/^#\s*(.*)$/.freeze
- NODEID =
/^#{BLANK_NODE_LABEL}/.freeze
- URIREF =
/^#{IRIREF}/.freeze
- LITERAL_PLAIN =
/^#{STRING_LITERAL_QUOTE}/.freeze
- LITERAL_WITH_LANGUAGE =
/^#{STRING_LITERAL_QUOTE}#{LANGTAG}/.freeze
- LITERAL_WITH_DATATYPE =
/^#{STRING_LITERAL_QUOTE}\^\^#{IRIREF}/.freeze
- DATATYPE_URI =
/^\^\^#{IRIREF}/.freeze
- LITERAL =
Regexp.union(LITERAL_WITH_LANGUAGE, LITERAL_WITH_DATATYPE, LITERAL_PLAIN).freeze
- SUBJECT =
Regexp.union(URIREF, NODEID).freeze
- PREDICATE =
Regexp.union(URIREF).freeze
- OBJECT =
Regexp.union(URIREF, NODEID, LITERAL).freeze
- END_OF_STATEMENT =
/^\s*\.\s*(?:#.*)?$/.freeze
Instance Attribute Summary
Attributes inherited from Reader
Class Method Summary collapse
-
.parse_literal(input, options = {}) ⇒ RDF::Term, RDF::Literal
Reconstructs an RDF value from its serialized N-Triples representation.
-
.parse_node(input, options = {}) ⇒ RDF::Term, RDF::Node
Reconstructs an RDF value from its serialized N-Triples representation.
-
.parse_object(input, options = {}) ⇒ RDF::Term
Reconstructs an RDF value from its serialized N-Triples representation.
-
.parse_predicate(input, options = {}) ⇒ RDF::Term, RDF::URI
Reconstructs an RDF value from its serialized N-Triples representation.
-
.parse_subject(input, options = {}) ⇒ RDF::Term, RDF::Resource
Reconstructs an RDF value from its serialized N-Triples representation.
-
.parse_uri(input, options = {}) ⇒ RDF::Term, RDF::URI
Reconstructs an RDF value from its serialized N-Triples representation.
- .unescape(string) ⇒ String
-
.unserialize(input, options = {}) ⇒ RDF::Term
Reconstructs an RDF value from its serialized N-Triples representation.
Instance Method Summary collapse
- #read_comment ⇒ Boolean
- #read_eos ⇒ Boolean
- #read_literal ⇒ RDF::Literal
- #read_node ⇒ RDF::Node
- #read_triple ⇒ Array
- #read_uriref(options = {}) ⇒ RDF::URI
- #read_value ⇒ RDF::Term
Methods included from Util::Logger
#log_debug, #log_depth, #log_error, #log_fatal, #log_info, #log_recover, #log_recovering?, #log_statistics, #log_warn, #logger
Methods inherited from Reader
#base_uri, #canonicalize?, #close, each, #each_statement, #each_triple, #encoding, for, format, #initialize, #intern?, #lineno, open, options, #prefix, #prefixes, #prefixes=, #rewind, #to_sym, to_sym, #valid?, #validate?
Methods included from Util::Aliasing::LateBound
Methods included from Enumerable
#dump, #each_graph, #each_object, #each_predicate, #each_quad, #each_statement, #each_subject, #each_term, #each_triple, #enum_for, #enum_graph, #enum_object, #enum_predicate, #enum_quad, #enum_statement, #enum_subject, #enum_term, #enum_triple, #graph_names, #has_graph?, #has_object?, #has_predicate?, #has_quad?, #has_statement?, #has_subject?, #has_term?, #has_triple?, #invalid?, #method_missing, #objects, #predicates, #project_graph, #quads, #respond_to_missing?, #statements, #subjects, #supports?, #terms, #to_a, #to_hash, #to_set, #triples, #valid?, #validate!
Methods included from Countable
Methods included from Readable
Constructor Details
This class inherits a constructor from RDF::Reader
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class RDF::Enumerable
Class Method Details
.parse_literal(input, options = {}) ⇒ RDF::Term, RDF::Literal
Reconstructs an RDF value from its serialized N-Triples representation.
144 145 146 147 148 149 150 151 152 153 |
# File 'lib/rdf/ntriples/reader.rb', line 144 def self.parse_literal(input, = {}) case input when LITERAL_WITH_LANGUAGE RDF::Literal.new(unescape($1), language: $4) when LITERAL_WITH_DATATYPE RDF::Literal.new(unescape($1), datatype: $4) when LITERAL_PLAIN RDF::Literal.new(unescape($1)) end end |
.parse_node(input, options = {}) ⇒ RDF::Term, RDF::Node
Reconstructs an RDF value from its serialized N-Triples representation.
125 126 127 128 129 |
# File 'lib/rdf/ntriples/reader.rb', line 125 def self.parse_node(input, = {}) if input =~ NODEID RDF::Node.new($1) end end |
.parse_object(input, options = {}) ⇒ RDF::Term
Reconstructs an RDF value from its serialized N-Triples representation.
118 119 120 |
# File 'lib/rdf/ntriples/reader.rb', line 118 def self.parse_object(input, = {}) parse_uri(input, ) || parse_node(input, ) || parse_literal(input, ) end |
.parse_predicate(input, options = {}) ⇒ RDF::Term, RDF::URI
Reconstructs an RDF value from its serialized N-Triples representation.
112 113 114 |
# File 'lib/rdf/ntriples/reader.rb', line 112 def self.parse_predicate(input, = {}) parse_uri(input, intern: true) end |
.parse_subject(input, options = {}) ⇒ RDF::Term, RDF::Resource
Reconstructs an RDF value from its serialized N-Triples representation.
105 106 107 |
# File 'lib/rdf/ntriples/reader.rb', line 105 def self.parse_subject(input, = {}) parse_uri(input, ) || parse_node(input, ) end |
.parse_uri(input, options = {}) ⇒ RDF::Term, RDF::URI
Reconstructs an RDF value from its serialized N-Triples representation.
134 135 136 137 138 139 |
# File 'lib/rdf/ntriples/reader.rb', line 134 def self.parse_uri(input, = {}) if input =~ URIREF uri_str = unescape($1) RDF::URI.send([:intern] ? :intern : :new, unescape($1)) end end |
.unescape(string) ⇒ String
161 162 163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/rdf/ntriples/reader.rb', line 161 def self.unescape(string) string = string.dup.force_encoding(Encoding::UTF_8) # Decode \t|\n|\r|\"|\\ character escapes: ESCAPE_CHARS.each { |escape| string.gsub!(escape.inspect[1...-1], escape) } # Decode \uXXXX and \UXXXXXXXX code points: string.gsub!(UCHAR) do [($1 || $2).hex].pack('U*') end string end |
.unserialize(input, options = {}) ⇒ RDF::Term
Reconstructs an RDF value from its serialized N-Triples representation.
95 96 97 98 99 100 |
# File 'lib/rdf/ntriples/reader.rb', line 95 def self.unserialize(input, = {}) case input when nil then nil else self.new(input, {logger: []}.merge()).read_value end end |
Instance Method Details
#read_comment ⇒ Boolean
216 217 218 |
# File 'lib/rdf/ntriples/reader.rb', line 216 def read_comment match(COMMENT) end |
#read_eos ⇒ Boolean
268 269 270 |
# File 'lib/rdf/ntriples/reader.rb', line 268 def read_eos match(END_OF_STATEMENT) end |
#read_literal ⇒ RDF::Literal
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/rdf/ntriples/reader.rb', line 248 def read_literal if literal_str = match(LITERAL_PLAIN) literal_str = self.class.unescape(literal_str) literal = case when language = match(LANGTAG) RDF::Literal.new(literal_str, language: language) when datatype = match(/^(\^\^)/) # FIXME RDF::Literal.new(literal_str, datatype: read_uriref || fail_object) else RDF::Literal.new(literal_str) # plain string literal end literal.validate! if validate? literal.canonicalize! if canonicalize? literal end end |
#read_node ⇒ RDF::Node
238 239 240 241 242 243 |
# File 'lib/rdf/ntriples/reader.rb', line 238 def read_node if node_id = match(NODEID) @nodes ||= {} @nodes[node_id] ||= RDF::Node.new(node_id) end end |
#read_triple ⇒ Array
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/rdf/ntriples/reader.rb', line 190 def read_triple loop do readline.strip! # EOFError thrown on end of input line = @line # for backtracking input in case of parse error begin unless blank? || read_comment subject = read_uriref || read_node || fail_subject predicate = read_uriref(intern: true) || fail_predicate object = read_uriref || read_node || read_literal || fail_object if validate? && !read_eos log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError) end return [subject, predicate, object] end rescue RDF::ReaderError => e @line = line # this allows #read_value to work raise e end end end |
#read_uriref(options = {}) ⇒ RDF::URI
223 224 225 226 227 228 229 230 231 232 233 |
# File 'lib/rdf/ntriples/reader.rb', line 223 def read_uriref( = {}) if uri_str = match(URIREF) uri_str = self.class.unescape(uri_str) uri = RDF::URI.send(intern? && [:intern] ? :intern : :new, uri_str) uri.validate! if validate? uri.canonicalize! if canonicalize? uri end rescue ArgumentError => e log_error("Invalid URI (found: \"<#{uri_str}>\")", lineno: lineno, token: "<#{uri_str}>", exception: RDF::ReaderError) end |
#read_value ⇒ RDF::Term
177 178 179 180 181 182 183 184 185 |
# File 'lib/rdf/ntriples/reader.rb', line 177 def read_value begin read_statement rescue RDF::ReaderError value = read_uriref || read_node || read_literal log_recover value end end |