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