ConvertDitaRelatedFeature.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('XML');
  4. // @see Route_Test_XslRecurse for example use of php function inside xsl
  5. // - TODO: input file should have another extension, it is not correct dita file, it has tags RelatedFeature
  6. // IDEA: make object (DitaRelatedFeatureParser) with state to parse input file (dita RelatedFeature tmpl)
  7. // - at the beginning od tag RelatedFeature run php function to set current xpath in Parse object
  8. // - at the end od tag RelatedFeature run php function to unset current xpath in Parse object (go up in doc tree)
  9. class Route_Test_ConvertDitaRelatedFeature extends RouteBase {
  10. function defaultAction() {
  11. UI::layout( [ $this, 'defaultView' ], [ 'showMenu' => false ] );
  12. }
  13. function defaultView() {
  14. $inputPath = APP_PATH_ROOT . DS . 'schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/IN7_DZIENNIK_KORESP.dita'; // TODO: it is not correct dita file - has tags RelatedFeature
  15. $inputBody = file_get_contents($inputPath);
  16. DBG::nicePrint(htmlspecialchars($inputBody), "input");
  17. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  18. $inputXmlArray = XML::readXmlFileToArray($inputPath); // tag
  19. // tag => [ 0 => tagName, 1 => attributes, 2 => childrens ]
  20. // tagName string
  21. // attributes => [ name => value ]
  22. // childrens => [ childTag, ... ]
  23. // childTag => tag | string
  24. DBG::nicePrint($inputXmlArray, "inputXmlArray");
  25. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  26. { // find all RelatedFeature recurse
  27. $rootTag = $inputXmlArray;
  28. $relTagsReader = new RelatedFeatureTagReader($rootTag);
  29. $allRelatedFeature = $relTagsReader->findRelatedFeatureRecurse($rootTag);
  30. DBG::nicePrint($allRelatedFeature, "allRelatedFeature");
  31. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  32. $ogcSelectFields = $relTagsReader->findRelatedFeatureRecurse($rootTag);
  33. DBG::nicePrint($allRelatedFeature, "allRelatedFeature");
  34. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  35. }
  36. DBG::nicePrint(null, "memory_get_usage: " . round(memory_get_usage() / 1024) . " KB");
  37. die('.EOF');
  38. }
  39. }
  40. class RelatedFeatureTagReader {
  41. function __construct() {
  42. $this->_parsedTags = [];
  43. }
  44. function findRelatedFeatureRecurse($tag, $parentTagId = 0, $parsedTags = []) {
  45. if (!is_array($tag)) return $parsedTags; // string
  46. DBG::nicePrint([ 'tag' => $tag[0], 'attrs' => $tag[1], '$parsedTags' => $parsedTags ], "findRelatedFeatureRecurse({$tag[0]})");
  47. if (empty($tag)) return [];
  48. if ('RelatedFeature' === $tag[0]) {
  49. $parsedTags[] = [ 'tag' => $tag[0], 'attrs' => $tag[1], 'parentTagId' => $parentTagId ];
  50. $parentTagId = count($parsedTags) - 1;
  51. }
  52. else if (!empty($tag[1]['xpath'])) $parsedTags[] = [ 'tag' => $tag[0], 'attrs' => $tag[1], 'parentTagId' => $parentTagId ];
  53. if (empty($tag[2])) return $parsedTags;
  54. return array_reduce($tag[2], function ($ret, $childTag) use ($parentTagId) {
  55. return $this->findRelatedFeatureRecurse($childTag, $parentTagId, $ret);
  56. }, $parsedTags);
  57. }
  58. }