Class: Nokogiri::XML::SAX::ParserContext

Inherits:
Object
  • Object
show all
Defined in:
lib/nokogiri/xml/sax/parser_context.rb,
ext/nokogiri/xml_sax_parser_context.c

Overview

Context for XML SAX parsers. This class is usually not instantiated by the user. Instead, you should be looking at Nokogiri::XML::SAX::Parser

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.parse_file(filename) ⇒ Object

Parse file given filename



80
81
82
83
84
85
86
87
88
89
90
91
# File 'ext/nokogiri/xml_sax_parser_context.c', line 80

static VALUE
parse_file(VALUE klass, VALUE filename)
{
  xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(StringValueCStr(filename));

  if (ctxt->sax) {
    xmlFree(ctxt->sax);
    ctxt->sax = NULL;
  }

  return noko_xml_sax_parser_context_wrap(klass, ctxt);
}

.parse_io(io, encoding) ⇒ Object

Parse io object with encoding



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'ext/nokogiri/xml_sax_parser_context.c', line 48

static VALUE
parse_io(VALUE klass, VALUE io, VALUE encoding)
{
  xmlParserCtxtPtr ctxt;
  xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding);

  if (!rb_respond_to(io, id_read)) {
    rb_raise(rb_eTypeError, "argument expected to respond to :read");
  }

  ctxt = xmlCreateIOParserCtxt(NULL, NULL,
                               (xmlInputReadCallback)noko_io_read,
                               (xmlInputCloseCallback)noko_io_close,
                               (void *)io, enc);
  if (!ctxt) {
    rb_raise(rb_eRuntimeError, "failed to create xml sax parser context");
  }

  if (ctxt->sax) {
    xmlFree(ctxt->sax);
    ctxt->sax = NULL;
  }

  return noko_xml_sax_parser_context_wrap(klass, ctxt);
}

.parse_memory(data) ⇒ Object

Parse the XML stored in memory in data



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'ext/nokogiri/xml_sax_parser_context.c', line 99

static VALUE
parse_memory(VALUE klass, VALUE data)
{
  xmlParserCtxtPtr ctxt;

  Check_Type(data, T_STRING);

  if (!(int)RSTRING_LEN(data)) {
    rb_raise(rb_eRuntimeError, "data cannot be empty");
  }

  ctxt = xmlCreateMemoryParserCtxt(StringValuePtr(data),
                                   (int)RSTRING_LEN(data));
  if (ctxt->sax) {
    xmlFree(ctxt->sax);
    ctxt->sax = NULL;
  }

  return noko_xml_sax_parser_context_wrap(klass, ctxt);
}

.new(thing, encoding = "UTF-8") ⇒ Object



11
12
13
14
15
16
17
# File 'lib/nokogiri/xml/sax/parser_context.rb', line 11

def self.new(thing, encoding = "UTF-8")
  if [:read, :close].all? { |x| thing.respond_to?(x) }
    io(thing, Parser::ENCODINGS[encoding])
  else
    memory(thing)
  end
end

Instance Method Details

#columnObject

Get the current column the parser context is processing.



234
235
236
237
238
239
240
241
242
243
244
245
246
# File 'ext/nokogiri/xml_sax_parser_context.c', line 234

static VALUE
column(VALUE self)
{
  xmlParserCtxtPtr ctxt = noko_xml_sax_parser_context_unwrap(self);
  xmlParserInputPtr io;

  io = ctxt->input;
  if (io) {
    return INT2NUM(io->col);
  }

  return Qnil;
}

#lineObject

Get the current line the parser context is processing.



215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'ext/nokogiri/xml_sax_parser_context.c', line 215

static VALUE
line(VALUE self)
{
  xmlParserInputPtr io;
  xmlParserCtxtPtr ctxt = noko_xml_sax_parser_context_unwrap(self);

  io = ctxt->input;
  if (io) {
    return INT2NUM(io->line);
  }

  return Qnil;
}

#parse_with(sax_handler) ⇒ Object

Use sax_handler and parse the current document



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'ext/nokogiri/xml_sax_parser_context.c', line 147

static VALUE
parse_with(VALUE self, VALUE sax_handler)
{
  xmlParserCtxtPtr ctxt;
  xmlSAXHandlerPtr sax;

  if (!rb_obj_is_kind_of(sax_handler, cNokogiriXmlSaxParser)) {
    rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::SAX::Parser");
  }

  ctxt = noko_xml_sax_parser_context_unwrap(self);
  sax = noko_sax_handler_unwrap(sax_handler);

  ctxt->sax = sax;
  ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler);

  xmlSetStructuredErrorFunc(NULL, NULL);

  rb_ensure(parse_doc, (VALUE)ctxt, parse_doc_finalize, (VALUE)ctxt);

  return Qnil;
}

#recoveryObject

Should this parser recover from structural errors? It will not stop processing file on structural errors if set to true



276
277
278
279
280
281
282
283
284
285
286
# File 'ext/nokogiri/xml_sax_parser_context.c', line 276

static VALUE
get_recovery(VALUE self)
{
  xmlParserCtxtPtr ctxt = noko_xml_sax_parser_context_unwrap(self);

  if (ctxt->recovery == 0) {
    return Qfalse;
  } else {
    return Qtrue;
  }
}

#recovery=(boolean) ⇒ Object

Should this parser recover from structural errors? It will not stop processing file on structural errors if set to true



255
256
257
258
259
260
261
262
263
264
265
266
267
# File 'ext/nokogiri/xml_sax_parser_context.c', line 255

static VALUE
set_recovery(VALUE self, VALUE value)
{
  xmlParserCtxtPtr ctxt = noko_xml_sax_parser_context_unwrap(self);

  if (value == Qfalse) {
    ctxt->recovery = 0;
  } else {
    ctxt->recovery = 1;
  }

  return value;
}

#replace_entitiesObject

Should this parser replace entities? & will get converted to ‘&’ if set to true



198
199
200
201
202
203
204
205
206
207
208
# File 'ext/nokogiri/xml_sax_parser_context.c', line 198

static VALUE
get_replace_entities(VALUE self)
{
  xmlParserCtxtPtr ctxt = noko_xml_sax_parser_context_unwrap(self);

  if (0 == ctxt->replaceEntities) {
    return Qfalse;
  } else {
    return Qtrue;
  }
}

#replace_entities=(boolean) ⇒ Object

Should this parser replace entities? & will get converted to ‘&’ if set to true



177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'ext/nokogiri/xml_sax_parser_context.c', line 177

static VALUE
set_replace_entities(VALUE self, VALUE value)
{
  xmlParserCtxtPtr ctxt = noko_xml_sax_parser_context_unwrap(self);

  if (Qfalse == value) {
    ctxt->replaceEntities = 0;
  } else {
    ctxt->replaceEntities = 1;
  }

  return value;
}