ConvertDitaRelatedFeature.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('XML');
  4. class Route_Test_ConvertDitaRelatedFeature extends RouteBase {
  5. function defaultAction() {
  6. UI::layout( [ $this, 'defaultView' ], [ 'showMenu' => false ] );
  7. }
  8. function defaultView() {
  9. $inputPath = APP_PATH_ROOT . DS . 'schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/IN7_DZIENNIK_KORESP.dita';
  10. $inputBody = file_get_contents($inputPath);
  11. DBG::nicePrint(htmlspecialchars($inputBody), "input");
  12. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  13. $inputXmlArray = XML::readXmlFileToArray($inputPath); // tag
  14. // tag => [ 0 => tagName, 1 => attributes, 2 => childrens ]
  15. // tagName string
  16. // attributes => [ name => value ]
  17. // childrens => [ childTag, ... ]
  18. // childTag => tag | string
  19. DBG::nicePrint($inputXmlArray, "inputXmlArray");
  20. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  21. { // find all RelatedFeature recurse
  22. $rootTag = $inputXmlArray;
  23. $relTagsReader = new RelatedFeatureTagReader($rootTag);
  24. $allRelatedFeature = $relTagsReader->findRelatedFeatureRecurse($rootTag);
  25. DBG::nicePrint($allRelatedFeature, "allRelatedFeature");
  26. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  27. $ogcSelectFields = $relTagsReader->findRelatedFeatureRecurse($rootTag);
  28. DBG::nicePrint($allRelatedFeature, "allRelatedFeature");
  29. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  30. }
  31. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  32. die('.EOF');
  33. }
  34. }
  35. class RelatedFeatureTagReader {
  36. function __construct() {
  37. $this->_parsedTags = [];
  38. }
  39. function findRelatedFeatureRecurse($tag, $parentTagId = 0, $parsedTags = []) {
  40. if (!is_array($tag)) return $parsedTags; // string
  41. DBG::nicePrint([ 'tag' => $tag[0], 'attrs' => $tag[1], '$parsedTags' => $parsedTags ], "findRelatedFeatureRecurse({$tag[0]})");
  42. if (empty($tag)) return [];
  43. if ('RelatedFeature' === $tag[0]) {
  44. $parsedTags[] = [ 'tag' => $tag[0], 'attrs' => $tag[1], 'parentTagId' => $parentTagId ];
  45. $parentTagId = count($parsedTags) - 1;
  46. }
  47. else if (!empty($tag[1]['xpath'])) $parsedTags[] = [ 'tag' => $tag[0], 'attrs' => $tag[1], 'parentTagId' => $parentTagId ];
  48. if (empty($tag[2])) return $parsedTags;
  49. return array_reduce($tag[2], function ($ret, $childTag) use ($parentTagId) {
  50. return $this->findRelatedFeatureRecurse($childTag, $parentTagId, $ret);
  51. }, $parsedTags);
  52. }
  53. }