39fbc92000-02-13Martin Stjernholm //! Variant of PXml that parses only entities.
5e5d862000-01-28Martin Stjernholm //! //! This parser is the default for arguments. //! //! Created 2000-01-28 by Martin Stjernholm. //!
cd7d5f2000-02-16Martin Stjernholm //! $Id: PEnt.pike,v 1.11 2000/02/16 16:21:42 mast Exp $
5e5d862000-01-28Martin Stjernholm 
d8769c2000-02-08Martin Stjernholm //#pragma strict_types // Disabled for now since it doesn't work well enough.
5e5d862000-01-28Martin Stjernholm 
cd7d5f2000-02-16Martin Stjernholm #include <config.h>
9f74bb2000-02-15Martin Stjernholm 
39fbc92000-02-13Martin Stjernholm inherit RXML.PXml;
5e5d862000-01-28Martin Stjernholm  // Block these to avoid confusion. constant add_tag = 0; constant add_tags = 0; constant add_container = 0; constant add_containers = 0;
9f74bb2000-02-15Martin Stjernholm static void init_entities() { if (type->quoting_scheme != "xml") { // Don't decode entities if we're outputting xml-like stuff. #ifdef OLD_RXML_COMPAT
cede492000-02-15Martin Stjernholm  clear_entities();
9f74bb2000-02-15Martin Stjernholm  if (not_compat) { #endif array(RXML.TagSet) list = ({tag_set}); for (int i = 0; i < sizeof (list); i++) { array(RXML.TagSet) sublist = list[i]->imported; if (sizeof (sublist)) list = list[..i] + sublist + list[i + 1..]; } for (int i = sizeof (list) - 1; i >= 0; i--) if (list[i]->low_entities) add_entities (list[i]->low_entities); #ifdef OLD_RXML_COMPAT } #endif } #ifdef OLD_RXML_COMPAT if (not_compat) #endif _set_entity_callback (.utils.p_xml_entity_cb); #ifdef OLD_RXML_COMPAT else _set_entity_callback (.utils.p_xml_compat_entity_cb); #endif } void reset (RXML.Context ctx, RXML.Type _type, RXML.TagSet _tag_set) { context = ctx; #ifdef DEBUG if (type != _type) error ("Internal error: Type change in reset().\n"); if (tag_set != _tag_set) error ("Internal error: Tag set change in reset().\n"); #endif #ifdef OLD_RXML_COMPAT
cede492000-02-15Martin Stjernholm  if (!ctx) ctx = RXML.get_context();
fd94692000-02-15Martin Stjernholm  int new_not_compat = !(ctx && ctx->id && ctx->id->conf->parse_html_compat);
9f74bb2000-02-15Martin Stjernholm  if (new_not_compat == not_compat) return; not_compat = new_not_compat; init_entities(); #endif }
5e5d862000-01-28Martin Stjernholm this_program clone (RXML.Context ctx, RXML.Type type, RXML.TagSet tag_set) {
9f74bb2000-02-15Martin Stjernholm  return [object(this_program)] _low_clone (ctx, type, tag_set, 1, #ifdef OLD_RXML_COMPAT not_compat #endif );
5e5d862000-01-28Martin Stjernholm } static void create (
9f74bb2000-02-15Martin Stjernholm  RXML.Context ctx, RXML.Type type, RXML.TagSet tag_set, void|int cloned, #ifdef OLD_RXML_COMPAT void|int orig_not_compat #endif )
5e5d862000-01-28Martin Stjernholm {
9f74bb2000-02-15Martin Stjernholm #ifdef OLD_RXML_COMPAT
cede492000-02-15Martin Stjernholm  if (!ctx) ctx = RXML.get_context();
fd94692000-02-15Martin Stjernholm  not_compat = !(ctx && ctx->id && ctx->id->conf->parse_html_compat);
9f74bb2000-02-15Martin Stjernholm #endif
5e5d862000-01-28Martin Stjernholm  _tag_set_parser_create (ctx, type, tag_set);
9f74bb2000-02-15Martin Stjernholm  if (cloned #ifdef OLD_RXML_COMPAT && not_compat == orig_not_compat #endif ) // We're cloned. return;
0923e92000-02-08Martin Stjernholm 
9f74bb2000-02-15Martin Stjernholm  if (!type->free_text) { mixed_mode (1); _set_data_callback (.utils.return_empty_array); }
4703fd2000-02-11Martin Stjernholm  ignore_tags (1);
5e5d862000-01-28Martin Stjernholm  lazy_entity_end (1); match_tag (0);
9f74bb2000-02-15Martin Stjernholm  init_entities();
5e5d862000-01-28Martin Stjernholm } // These have no effect since we don't parse tags.
9f74bb2000-02-15Martin Stjernholm constant add_runtime_tag = 0; constant remove_runtime_tag = 0;
5e5d862000-01-28Martin Stjernholm  #ifdef OBJ_COUNT_DEBUG string _sprintf() {return "RXML.PEnt(" + __count + ")";} #else string _sprintf() {return "RXML.PEnt";} #endif