wp/wp-includes/atomlib.php
author ymh <ymh.work@gmail.com>
Tue, 09 Jun 2015 03:35:32 +0200
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 7 cf61fcea0001
permissions -rw-r--r--
upgrade wordpress + plugins
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * Atom Syndication Format PHP Library
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * @package AtomLib
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * @link http://code.google.com/p/phpatomlib/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * @author Elias Torres <elias@torrez.us>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * @version 0.4
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
    10
 * @since 2.3.0
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * Structure that store common Atom Feed Properties
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * @package AtomLib
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class AtomFeed {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
	 * Stores Links
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    var $links = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    /**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
     * Stores Categories
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
     * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
     * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
     */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    var $categories = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
	 * Stores Entries
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    var $entries = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
 * Structure that store Atom Entry Properties
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
 * @package AtomLib
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
class AtomEntry {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
	 * Stores Links
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    var $links = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    /**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
     * Stores Categories
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    var $categories = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
 * AtomLib Atom Parser API
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
 * @package AtomLib
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
class AtomParser {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    var $NS = 'http://www.w3.org/2005/Atom';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    var $debug = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    var $depth = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    var $indent = 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    var $in_content;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    var $ns_contexts = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    var $ns_decls = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    var $content_ns_decls = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    var $content_ns_contexts = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    var $is_xhtml = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    var $is_html = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    var $is_text = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    var $skipped_div = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    var $FILE = "php://input";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    var $feed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    var $current;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    function AtomParser() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        $this->feed = new AtomFeed();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        $this->current = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        $this->map_attrs_func = create_function('$k,$v', 'return "$k=\"$v\"";');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
        $this->map_xmlns_func = create_function('$p,$n', '$xd = "xmlns"; if(strlen($n[0])>0) $xd .= ":{$n[0]}"; return "{$xd}=\"{$n[1]}\"";');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    function _p($msg) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        if($this->debug) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    function error_handler($log_level, $log_text, $error_file, $error_line) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        $this->error = $log_text;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    function parse() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        set_error_handler(array(&$this, 'error_handler'));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        array_unshift($this->ns_contexts, array());
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        $parser = xml_parser_create_ns();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        xml_set_object($parser, $this);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
        xml_set_element_handler($parser, "start_element", "end_element");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        xml_set_character_data_handler($parser, "cdata");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        xml_set_default_handler($parser, "_default");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        xml_set_start_namespace_decl_handler($parser, "start_ns");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        xml_set_end_namespace_decl_handler($parser, "end_ns");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        $this->content = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        $ret = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        $fp = fopen($this->FILE, "r");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        while ($data = fread($fp, 4096)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
            if($this->debug) $this->content .= $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
            if(!xml_parse($parser, $data, feof($fp))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
                trigger_error(sprintf(__('XML error: %s at line %d')."\n",
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
                    xml_error_string(xml_get_error_code($parser)),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
                    xml_get_current_line_number($parser)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
                $ret = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
                break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        fclose($fp);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        xml_parser_free($parser);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
        restore_error_handler();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        return $ret;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    function start_element($parser, $name, $attrs) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
        $tag = array_pop(split(":", $name));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
        switch($name) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
            case $this->NS . ':feed':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
                $this->current = $this->feed;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
                break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
            case $this->NS . ':entry':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
                $this->current = new AtomEntry();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
                break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
        };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
        $this->_p("start_element('$name')");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
        #$this->_p(print_r($this->ns_contexts,true));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
        #$this->_p('current(' . $this->current . ')');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
        array_unshift($this->ns_contexts, $this->ns_decls);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
        $this->depth++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
        if(!empty($this->in_content)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
            $this->content_ns_decls = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
            if($this->is_html || $this->is_text)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
                trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup.");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
            $attrs_prefix = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
            // resolve prefixes for attributes
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
            foreach($attrs as $key => $value) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
                $with_prefix = $this->ns_to_prefix($key, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
                $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
            $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
            if(strlen($attrs_str) > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
                $attrs_str = " " . $attrs_str;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
            $with_prefix = $this->ns_to_prefix($name);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
            if(!$this->is_declared_content_ns($with_prefix[0])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
                array_push($this->content_ns_decls, $with_prefix[0]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
            $xmlns_str = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
            if(count($this->content_ns_decls) > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
                array_unshift($this->content_ns_contexts, $this->content_ns_decls);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
                $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0])));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
                if(strlen($xmlns_str) > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
                    $xmlns_str = " " . $xmlns_str;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
                }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
            array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">"));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
            $this->in_content = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
            $this->is_xhtml = $attrs['type'] == 'xhtml';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
            $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
            $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
            $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
            if(in_array('src',array_keys($attrs))) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
                $this->current->$tag = $attrs;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
            } else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
                array_push($this->in_content, array($tag,$this->depth, $type));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
        } else if($tag == 'link') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
            array_push($this->current->links, $attrs);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
        } else if($tag == 'category') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
            array_push($this->current->categories, $attrs);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        $this->ns_decls = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
    function end_element($parser, $name) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
        $tag = array_pop(split(":", $name));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
        $ccount = count($this->in_content);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        # if we are *in* content, then let's proceed to serialize it
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        if(!empty($this->in_content)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
            # if we are ending the original content element
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
            # then let's finalize the content
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
            if($this->in_content[0][0] == $tag &&
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
                $this->in_content[0][1] == $this->depth) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
                $origtype = $this->in_content[0][2];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
                array_shift($this->in_content);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
                $newcontent = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
                foreach($this->in_content as $c) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
                    if(count($c) == 3) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
                        array_push($newcontent, $c[2]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
                    } else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
                        if($this->is_xhtml || $this->is_text) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
                            array_push($newcontent, $this->xml_escape($c));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
                        } else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
                            array_push($newcontent, $c);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
                        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
                    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
                }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
                if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
                    $this->current->$tag = array($origtype, join('',$newcontent));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
                } else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
                    $this->current->$tag = join('',$newcontent);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
                }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
                $this->in_content = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
            } else if($this->in_content[$ccount-1][0] == $tag &&
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
                $this->in_content[$ccount-1][1] == $this->depth) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
                $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
            } else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
                # else, just finalize the current element's content
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
                $endtag = $this->ns_to_prefix($name);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
                array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>"));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        array_shift($this->ns_contexts);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        $this->depth--;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
        if($name == ($this->NS . ':entry')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
            array_push($this->feed->entries, $this->current);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
            $this->current = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
        $this->_p("end_element('$name')");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    function start_ns($parser, $prefix, $uri) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
        $this->_p("starting: " . $prefix . ":" . $uri);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
        array_push($this->ns_decls, array($prefix,$uri));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
    function end_ns($parser, $prefix) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
        $this->_p("ending: #" . $prefix . "#");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
    function cdata($parser, $data) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
        $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        if(!empty($this->in_content)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
            array_push($this->in_content, $data);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
    function _default($parser, $data) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
        # when does this gets called?
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
    function ns_to_prefix($qname, $attr=false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
        # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div')
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
        $components = split(":", $qname);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
        # grab the last one (e.g 'div')
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
        $name = array_pop($components);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        if(!empty($components)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
            # re-join back the namespace component
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
            $ns = join(":",$components);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
            foreach($this->ns_contexts as $context) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
                foreach($context as $mapping) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
                    if($mapping[1] == $ns && strlen($mapping[0]) > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
                        return array($mapping, "$mapping[0]:$name");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
                    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
                }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
        if($attr) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
            return array(null, $name);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
        } else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
            foreach($this->ns_contexts as $context) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
                foreach($context as $mapping) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
                    if(strlen($mapping[0]) == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
                        return array($mapping, $name);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
                    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
                }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
    function is_declared_content_ns($new_mapping) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
        foreach($this->content_ns_contexts as $context) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
            foreach($context as $mapping) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
                if($new_mapping == $mapping) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
                    return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
                }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
            }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
    function xml_escape($string)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
    {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
             return str_replace(array('&','"',"'",'<','>'),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
                array('&amp;','&quot;','&apos;','&lt;','&gt;'),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
                $string );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
}