1: <?php
   2:    3:    4:    5:    6:    7:    8:    9:   10: 
  11: 
  12:   13:   14:   15:   16:   17:   18: 
  19: 
  20: defined('XOOPS_ROOT_PATH') || exit('XOOPS root path not defined');
  21: require_once(XOOPS_ROOT_PATH . '/class/xml/saxparser.php');
  22: require_once(XOOPS_ROOT_PATH . '/class/xml/xmltaghandler.php');
  23: 
  24:   25:   26: 
  27: class XoopsXmlRss2Parser extends SaxParser
  28: {
  29:     public $_tempArr     = array();
  30:     public $_channelData = array();
  31:     public $_imageData   = array();
  32:     public $_items       = array();
  33: 
  34:       35:   36: 
  37:     public function __construct($input)
  38:     {
  39:         parent::__construct($input);
  40:         $this->useUtfEncoding();
  41:         $this->addTagHandler(new RssChannelHandler());
  42:         $this->addTagHandler(new RssTitleHandler());
  43:         $this->addTagHandler(new RssLinkHandler());
  44:         $this->addTagHandler(new RssGeneratorHandler());
  45:         $this->addTagHandler(new RssDescriptionHandler());
  46:         $this->addTagHandler(new RssCopyrightHandler());
  47:         $this->addTagHandler(new RssNameHandler());
  48:         $this->addTagHandler(new RssManagingEditorHandler());
  49:         $this->addTagHandler(new RssLanguageHandler());
  50:         $this->addTagHandler(new RssLastBuildDateHandler());
  51:         $this->addTagHandler(new RssWebMasterHandler());
  52:         $this->addTagHandler(new RssImageHandler());
  53:         $this->addTagHandler(new RssUrlHandler());
  54:         $this->addTagHandler(new RssWidthHandler());
  55:         $this->addTagHandler(new RssHeightHandler());
  56:         $this->addTagHandler(new RssItemHandler());
  57:         $this->addTagHandler(new RssCategoryHandler());
  58:         $this->addTagHandler(new RssPubDateHandler());
  59:         $this->addTagHandler(new RssCommentsHandler());
  60:         $this->addTagHandler(new RssSourceHandler());
  61:         $this->addTagHandler(new RssAuthorHandler());
  62:         $this->addTagHandler(new RssGuidHandler());
  63:         $this->addTagHandler(new RssTextInputHandler());
  64:     }
  65: 
  66:       67:   68:   69: 
  70:     public function setChannelData($name, &$value)
  71:     {
  72:         if (!isset($this->_channelData[$name])) {
  73:             $this->_channelData[$name] =& $value;
  74:         } else {
  75:             $this->_channelData[$name] .= $value;
  76:         }
  77:     }
  78: 
  79:       80:   81:   82:   83: 
  84:     public function &getChannelData($name = null)
  85:     {
  86:         if (isset($name)) {
  87:             if (isset($this->_channelData[$name])) {
  88:                 return $this->_channelData[$name];
  89:             }
  90: 
  91:             return false;
  92:         }
  93: 
  94:         return $this->_channelData;
  95:     }
  96: 
  97:       98:   99:  100: 
 101:     public function setImageData($name, &$value)
 102:     {
 103:         $this->_imageData[$name] =& $value;
 104:     }
 105: 
 106:      107:  108:  109:  110: 
 111:     public function &getImageData($name = null)
 112:     {
 113:         if (isset($name)) {
 114:             if (isset($this->_imageData[$name])) {
 115:                 return $this->_imageData[$name];
 116:             }
 117:             $return = false;
 118: 
 119:             return $return;
 120:         }
 121: 
 122:         return $this->_imageData;
 123:     }
 124: 
 125:      126:  127: 
 128:     public function setItems(&$itemarr)
 129:     {
 130:         $this->_items[] =& $itemarr;
 131:     }
 132: 
 133:      134:  135: 
 136:     public function &getItems()
 137:     {
 138:         return $this->_items;
 139:     }
 140: 
 141:      142:  143:  144:  145: 
 146:     public function setTempArr($name, &$value, $delim = '')
 147:     {
 148:         if (!isset($this->_tempArr[$name])) {
 149:             $this->_tempArr[$name] =& $value;
 150:         } else {
 151:             $this->_tempArr[$name] .= $delim . $value;
 152:         }
 153:     }
 154: 
 155:      156:  157: 
 158:     public function getTempArr()
 159:     {
 160:         return $this->_tempArr;
 161:     }
 162: 
 163:     public function resetTempArr()
 164:     {
 165:         unset($this->_tempArr);
 166:         $this->_tempArr = array();
 167:     }
 168: }
 169: 
 170:  171:  172: 
 173: class RssChannelHandler extends XmlTagHandler
 174: {
 175:      176:  177: 
 178:     public function __construct()
 179:     {
 180:     }
 181: 
 182:      183:  184: 
 185:     public function getName()
 186:     {
 187:         return 'channel';
 188:     }
 189: }
 190: 
 191:  192:  193: 
 194: class RssTitleHandler extends XmlTagHandler
 195: {
 196:      197:  198: 
 199:     public function __construct()
 200:     {
 201:     }
 202: 
 203:      204:  205: 
 206:     public function getName()
 207:     {
 208:         return 'title';
 209:     }
 210: 
 211:      212:  213:  214: 
 215:     public function handleCharacterData($parser, &$data)
 216:     {
 217:         switch ($parser->getParentTag()) {
 218:             case 'channel':
 219:                 $parser->setChannelData('title', $data);
 220:                 break;
 221:             case 'image':
 222:                 $parser->setImageData('title', $data);
 223:                 break;
 224:             case 'item':
 225:             case 'textInput':
 226:                 $parser->setTempArr('title', $data);
 227:                 break;
 228:             default:
 229:                 break;
 230:         }
 231:     }
 232: }
 233: 
 234:  235:  236: 
 237: class RssLinkHandler extends XmlTagHandler
 238: {
 239:      240:  241: 
 242:     public function __construct()
 243:     {
 244:     }
 245: 
 246:      247:  248: 
 249:     public function getName()
 250:     {
 251:         return 'link';
 252:     }
 253: 
 254:      255:  256:  257: 
 258:     public function handleCharacterData($parser, &$data)
 259:     {
 260:         switch ($parser->getParentTag()) {
 261:             case 'channel':
 262:                 $parser->setChannelData('link', $data);
 263:                 break;
 264:             case 'image':
 265:                 $parser->setImageData('link', $data);
 266:                 break;
 267:             case 'item':
 268:             case 'textInput':
 269:                 $parser->setTempArr('link', $data);
 270:                 break;
 271:             default:
 272:                 break;
 273:         }
 274:     }
 275: }
 276: 
 277:  278:  279: 
 280: class RssDescriptionHandler extends XmlTagHandler
 281: {
 282:      283:  284: 
 285:     public function __construct()
 286:     {
 287:     }
 288: 
 289:      290:  291: 
 292:     public function getName()
 293:     {
 294:         return 'description';
 295:     }
 296: 
 297:      298:  299:  300: 
 301:     public function handleCharacterData($parser, &$data)
 302:     {
 303:         switch ($parser->getParentTag()) {
 304:             case 'channel':
 305:                 $parser->setChannelData('description', $data);
 306:                 break;
 307:             case 'image':
 308:                 $parser->setImageData('description', $data);
 309:                 break;
 310:             case 'item':
 311:             case 'textInput':
 312:                 $parser->setTempArr('description', $data);
 313:                 break;
 314:             default:
 315:                 break;
 316:         }
 317:     }
 318: }
 319: 
 320:  321:  322: 
 323: class RssGeneratorHandler extends XmlTagHandler
 324: {
 325:      326:  327: 
 328:     public function __construct()
 329:     {
 330:     }
 331: 
 332:      333:  334: 
 335:     public function getName()
 336:     {
 337:         return 'generator';
 338:     }
 339: 
 340:      341:  342:  343: 
 344:     public function handleCharacterData($parser, &$data)
 345:     {
 346:         switch ($parser->getParentTag()) {
 347:             case 'channel':
 348:                 $parser->setChannelData('generator', $data);
 349:                 break;
 350:             default:
 351:                 break;
 352:         }
 353:     }
 354: }
 355: 
 356:  357:  358: 
 359: class RssCopyrightHandler extends XmlTagHandler
 360: {
 361:      362:  363: 
 364:     public function __construct()
 365:     {
 366:     }
 367: 
 368:      369:  370: 
 371:     public function getName()
 372:     {
 373:         return 'copyright';
 374:     }
 375: 
 376:      377:  378:  379: 
 380:     public function handleCharacterData($parser, &$data)
 381:     {
 382:         switch ($parser->getParentTag()) {
 383:             case 'channel':
 384:                 $parser->setChannelData('copyright', $data);
 385:                 break;
 386:             default:
 387:                 break;
 388:         }
 389:     }
 390: }
 391: 
 392:  393:  394: 
 395: class RssNameHandler extends XmlTagHandler
 396: {
 397:      398:  399: 
 400:     public function __construct()
 401:     {
 402:     }
 403: 
 404:      405:  406: 
 407:     public function getName()
 408:     {
 409:         return 'name';
 410:     }
 411: 
 412:      413:  414:  415: 
 416:     public function handleCharacterData($parser, &$data)
 417:     {
 418:         switch ($parser->getParentTag()) {
 419:             case 'textInput':
 420:                 $parser->setTempArr('name', $data);
 421:                 break;
 422:             default:
 423:                 break;
 424:         }
 425:     }
 426: }
 427: 
 428:  429:  430: 
 431: class RssManagingEditorHandler extends XmlTagHandler
 432: {
 433:      434:  435: 
 436:     public function __construct()
 437:     {
 438:     }
 439: 
 440:      441:  442: 
 443:     public function getName()
 444:     {
 445:         return 'managingEditor';
 446:     }
 447: 
 448:      449:  450:  451: 
 452:     public function handleCharacterData($parser, &$data)
 453:     {
 454:         switch ($parser->getParentTag()) {
 455:             case 'channel':
 456:                 $parser->setChannelData('editor', $data);
 457:                 break;
 458:             default:
 459:                 break;
 460:         }
 461:     }
 462: }
 463: 
 464:  465:  466: 
 467: class RssLanguageHandler extends XmlTagHandler
 468: {
 469:      470:  471: 
 472:     public function __construct()
 473:     {
 474:     }
 475: 
 476:      477:  478: 
 479:     public function getName()
 480:     {
 481:         return 'language';
 482:     }
 483: 
 484:      485:  486:  487: 
 488:     public function handleCharacterData($parser, &$data)
 489:     {
 490:         switch ($parser->getParentTag()) {
 491:             case 'channel':
 492:                 $parser->setChannelData('language', $data);
 493:                 break;
 494:             default:
 495:                 break;
 496:         }
 497:     }
 498: }
 499: 
 500:  501:  502: 
 503: class RssWebMasterHandler extends XmlTagHandler
 504: {
 505:      506:  507: 
 508:     public function __construct()
 509:     {
 510:     }
 511: 
 512:      513:  514: 
 515:     public function getName()
 516:     {
 517:         return 'webMaster';
 518:     }
 519: 
 520:      521:  522:  523: 
 524:     public function handleCharacterData($parser, &$data)
 525:     {
 526:         switch ($parser->getParentTag()) {
 527:             case 'channel':
 528:                 $parser->setChannelData('webmaster', $data);
 529:                 break;
 530:             default:
 531:                 break;
 532:         }
 533:     }
 534: }
 535: 
 536:  537:  538: 
 539: class RssDocsHandler extends XmlTagHandler
 540: {
 541:      542:  543: 
 544:     public function __construct()
 545:     {
 546:     }
 547: 
 548:      549:  550: 
 551:     public function getName()
 552:     {
 553:         return 'docs';
 554:     }
 555: 
 556:      557:  558:  559: 
 560:     public function handleCharacterData($parser, &$data)
 561:     {
 562:         switch ($parser->getParentTag()) {
 563:             case 'channel':
 564:                 $parser->setChannelData('docs', $data);
 565:                 break;
 566:             default:
 567:                 break;
 568:         }
 569:     }
 570: }
 571: 
 572:  573:  574: 
 575: class RssTtlHandler extends XmlTagHandler
 576: {
 577:      578:  579: 
 580:     public function __construct()
 581:     {
 582:     }
 583: 
 584:      585:  586: 
 587:     public function getName()
 588:     {
 589:         return 'ttl';
 590:     }
 591: 
 592:      593:  594:  595: 
 596:     public function handleCharacterData($parser, &$data)
 597:     {
 598:         switch ($parser->getParentTag()) {
 599:             case 'channel':
 600:                 $parser->setChannelData('ttl', $data);
 601:                 break;
 602:             default:
 603:                 break;
 604:         }
 605:     }
 606: }
 607: 
 608:  609:  610: 
 611: class RssTextInputHandler extends XmlTagHandler
 612: {
 613:     public function RssWebMasterHandler()
 614:     {
 615:     }
 616: 
 617:      618:  619: 
 620:     public function getName()
 621:     {
 622:         return 'textInput';
 623:     }
 624: 
 625:      626:  627:  628: 
 629:     public function handleBeginElement($parser, &$attributes)
 630:     {
 631:         $parser->resetTempArr();
 632:     }
 633: 
 634:      635:  636: 
 637:     public function handleEndElement($parser)
 638:     {
 639:         $parser->setChannelData('textinput', $parser->getTempArr());
 640:     }
 641: }
 642: 
 643:  644:  645: 
 646: class RssLastBuildDateHandler extends XmlTagHandler
 647: {
 648:      649:  650: 
 651:     public function __construct()
 652:     {
 653:     }
 654: 
 655:      656:  657: 
 658:     public function getName()
 659:     {
 660:         return 'lastBuildDate';
 661:     }
 662: 
 663:      664:  665:  666: 
 667:     public function handleCharacterData($parser, &$data)
 668:     {
 669:         switch ($parser->getParentTag()) {
 670:             case 'channel':
 671:                 $parser->setChannelData('lastbuilddate', $data);
 672:                 break;
 673:             default:
 674:                 break;
 675:         }
 676:     }
 677: }
 678: 
 679:  680:  681: 
 682: class RssImageHandler extends XmlTagHandler
 683: {
 684:      685:  686: 
 687:     public function __construct()
 688:     {
 689:     }
 690: 
 691:      692:  693: 
 694:     public function getName()
 695:     {
 696:         return 'image';
 697:     }
 698: }
 699: 
 700:  701:  702: 
 703: class RssUrlHandler extends XmlTagHandler
 704: {
 705:      706:  707: 
 708:     public function __construct()
 709:     {
 710:     }
 711: 
 712:      713:  714: 
 715:     public function getName()
 716:     {
 717:         return 'url';
 718:     }
 719: 
 720:      721:  722:  723: 
 724:     public function handleCharacterData($parser, &$data)
 725:     {
 726:         if ($parser->getParentTag() === 'image') {
 727:             $parser->setImageData('url', $data);
 728:         }
 729:     }
 730: }
 731: 
 732:  733:  734: 
 735: class RssWidthHandler extends XmlTagHandler
 736: {
 737:      738:  739: 
 740:     public function __construct()
 741:     {
 742:     }
 743: 
 744:      745:  746: 
 747:     public function getName()
 748:     {
 749:         return 'width';
 750:     }
 751: 
 752:      753:  754:  755: 
 756:     public function handleCharacterData($parser, &$data)
 757:     {
 758:         if ($parser->getParentTag() === 'image') {
 759:             $parser->setImageData('width', $data);
 760:         }
 761:     }
 762: }
 763: 
 764:  765:  766: 
 767: class RssHeightHandler extends XmlTagHandler
 768: {
 769:      770:  771: 
 772:     public function __construct()
 773:     {
 774:     }
 775: 
 776:      777:  778: 
 779:     public function getName()
 780:     {
 781:         return 'height';
 782:     }
 783: 
 784:      785:  786:  787: 
 788:     public function handleCharacterData($parser, &$data)
 789:     {
 790:         if ($parser->getParentTag() === 'image') {
 791:             $parser->setImageData('height', $data);
 792:         }
 793:     }
 794: }
 795: 
 796:  797:  798: 
 799: class RssItemHandler extends XmlTagHandler
 800: {
 801:      802:  803: 
 804:     public function __construct()
 805:     {
 806:     }
 807: 
 808:      809:  810: 
 811:     public function getName()
 812:     {
 813:         return 'item';
 814:     }
 815: 
 816:      817:  818:  819: 
 820:     public function handleBeginElement($parser, &$attributes)
 821:     {
 822:         $parser->resetTempArr();
 823:     }
 824: 
 825:      826:  827: 
 828:     public function handleEndElement($parser)
 829:     {
 830:         $items = $parser->getTempArr();
 831:         $parser->setItems($items);
 832:     }
 833: }
 834: 
 835:  836:  837: 
 838: class RssCategoryHandler extends XmlTagHandler
 839: {
 840:      841:  842: 
 843:     public function __construct()
 844:     {
 845:     }
 846: 
 847:      848:  849: 
 850:     public function getName()
 851:     {
 852:         return 'category';
 853:     }
 854: 
 855:      856:  857:  858: 
 859:     public function handleCharacterData($parser, &$data)
 860:     {
 861:         switch ($parser->getParentTag()) {
 862:             case 'channel':
 863:                 $parser->setChannelData('category', $data);
 864:                 break;
 865:             case 'item':
 866:                 $parser->setTempArr('category', $data, ', ');
 867:                 break;
 868:             default:
 869:                 break;
 870:         }
 871:     }
 872: }
 873: 
 874:  875:  876: 
 877: class RssCommentsHandler extends XmlTagHandler
 878: {
 879:      880:  881: 
 882:     public function __construct()
 883:     {
 884:     }
 885: 
 886:      887:  888: 
 889:     public function getName()
 890:     {
 891:         return 'comments';
 892:     }
 893: 
 894:      895:  896:  897: 
 898:     public function handleCharacterData($parser, &$data)
 899:     {
 900:         if ($parser->getParentTag() === 'item') {
 901:             $parser->setTempArr('comments', $data);
 902:         }
 903:     }
 904: }
 905: 
 906:  907:  908: 
 909: class RssPubDateHandler extends XmlTagHandler
 910: {
 911:      912:  913: 
 914:     public function __construct()
 915:     {
 916:     }
 917: 
 918:      919:  920: 
 921:     public function getName()
 922:     {
 923:         return 'pubDate';
 924:     }
 925: 
 926:      927:  928:  929: 
 930:     public function handleCharacterData($parser, &$data)
 931:     {
 932:         switch ($parser->getParentTag()) {
 933:             case 'channel':
 934:                 $parser->setChannelData('pubdate', $data);
 935:                 break;
 936:             case 'item':
 937:                 $parser->setTempArr('pubdate', $data);
 938:                 break;
 939:             default:
 940:                 break;
 941:         }
 942:     }
 943: }
 944: 
 945:  946:  947: 
 948: class RssGuidHandler extends XmlTagHandler
 949: {
 950:      951:  952: 
 953:     public function __construct()
 954:     {
 955:     }
 956: 
 957:      958:  959: 
 960:     public function getName()
 961:     {
 962:         return 'guid';
 963:     }
 964: 
 965:      966:  967:  968: 
 969:     public function handleCharacterData($parser, &$data)
 970:     {
 971:         if ($parser->getParentTag() === 'item') {
 972:             $parser->setTempArr('guid', $data);
 973:         }
 974:     }
 975: }
 976: 
 977:  978:  979: 
 980: class RssAuthorHandler extends XmlTagHandler
 981: {
 982:     public function RssGuidHandler()
 983:     {
 984:     }
 985: 
 986:      987:  988: 
 989:     public function getName()
 990:     {
 991:         return 'author';
 992:     }
 993: 
 994:      995:  996:  997: 
 998:     public function handleCharacterData($parser, &$data)
 999:     {
1000:         if ($parser->getParentTag() === 'item') {
1001:             $parser->setTempArr('author', $data);
1002:         }
1003:     }
1004: }
1005: 
1006: 1007: 1008: 
1009: class RssSourceHandler extends XmlTagHandler
1010: {
1011:     1012: 1013: 
1014:     public function __construct()
1015:     {
1016:     }
1017: 
1018:     1019: 1020: 
1021:     public function getName()
1022:     {
1023:         return 'source';
1024:     }
1025: 
1026:     1027: 1028: 1029: 
1030:     public function handleBeginElement($parser, &$attributes)
1031:     {
1032:         if ($parser->getParentTag() === 'item') {
1033:             $parser->setTempArr('source_url', $attributes['url']);
1034:         }
1035:     }
1036: 
1037:     1038: 1039: 1040: 
1041:     public function handleCharacterData($parser, &$data)
1042:     {
1043:         if ($parser->getParentTag() === 'item') {
1044:             $parser->setTempArr('source', $data);
1045:         }
1046:     }
1047: }
1048: