public static function parseCMDLString($cmdl, $dataTypeName = null, $dataTypeTitle = null, $dataType = 'content') { switch ($dataType) { case 'content': $dataTypeDefinition = new ContentTypeDefinition(); break; case 'config': $dataTypeDefinition = new ConfigTypeDefinition(); break; case 'data': $dataTypeDefinition = new DataTypeDefinition(); break; default: throw new CMDLParserException('Unknown data type ' . $dataType . '. Must be one of content,config,data.', CMDLParserException::CMDL_UNKNOWN_DATATYPE); break; } $dataTypeDefinition->setCMDL($cmdl); $currentFormElementDefinitionCollection = new ViewDefinition('default', $dataTypeDefinition); $dataTypeDefinition->addViewDefinition($currentFormElementDefinitionCollection); $cmdl = preg_split('/$\\R?^/m', $cmdl); $sectionOpened = false; $tabOpened = false; $currentTabLabel = ''; foreach ($cmdl as $line) { $line = trim($line); if (isset($line[0])) { switch ($line[0]) { case '@': // annotation $dataTypeDefinition = self::parseAnnotation($dataTypeDefinition, $currentFormElementDefinitionCollection, $line); break; case '#': // comment break; case ' ': // ignore empty lines // ignore empty lines case '': break; case '=': // start of a view definition if ($tabOpened) { self::closeTab($currentFormElementDefinitionCollection, $currentTabLabel); $tabOpened = false; } $viewName = Util::generateValidIdentifier(trim($line, '-')); if ($viewName == 'default') { // get the already created and added definition of view "default" $currentFormElementDefinitionCollection = $dataTypeDefinition->getViewDefinition('default'); } else { $currentFormElementDefinitionCollection = new ViewDefinition($viewName); $dataTypeDefinition->addViewDefinition($currentFormElementDefinitionCollection); } break; case '+': // start of an clipping definition if ($tabOpened) { self::closeTab($currentFormElementDefinitionCollection, $currentTabLabel); $tabOpened = false; } $clippingName = Util::generateValidIdentifier($line); $currentFormElementDefinitionCollection = new ClippingDefinition($clippingName); $dataTypeDefinition->addClippingDefinition($currentFormElementDefinitionCollection); break; case '[': if (substr($line, 0, 3) == '[[[') { $currentTabLabel = rtrim(substr($line, 3), ']'); if ($tabOpened === true) { $formElementDefinition = new TabNextFormElementDefinition(); } else { $formElementDefinition = new TabStartFormElementDefinition(); } $formElementDefinition->setLabel($currentTabLabel); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); $tabOpened = true; } elseif (substr($line, 0, 2) == '[[') { if ($sectionOpened === true) { $formElementDefinition = new SectionEndFormElementDefinition(); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); } $formElementDefinition = new SectionStartFormElementDefinition(); if (substr($line, -1) == '+') { $line = substr($line, 0, -1); $formElementDefinition->setOpened(true); } $formElementDefinition->setLabel(rtrim(substr($line, 2), ']')); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); $sectionOpened = true; } else { $formElementDefinition = new HeadlineFormElementDefinition(); $formElementDefinition->setLabel(rtrim(substr($line, 1), ']')); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); } break; case ']': if (substr($line, 0, 3) == ']]]') { self::closeTab($currentFormElementDefinitionCollection, $currentTabLabel); $tabOpened = false; $currentTabLabel = ''; } elseif ($sectionOpened === true) { $formElementDefinition = new SectionEndFormElementDefinition(); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); $sectionOpened = false; } break; case '>': $formElementDefinition = new PrintFormElementDefinition(); $p = strpos($line, ' '); $display = ''; if ($p) { $display = trim(substr($line, $p)); } $formElementDefinition->setDisplay($display); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); break; default: $formElementDefinition = self::parseFormElementDefinition($line); $currentFormElementDefinitionCollection->addFormElementDefinition($formElementDefinition); break; } } } if ($dataTypeName != '') { $dataTypeDefinition->setName($dataTypeName); } if ($dataTypeTitle != '') { $dataTypeDefinition->setTitle($dataTypeTitle); } if ($tabOpened) { self::closeTab($currentFormElementDefinitionCollection, $currentTabLabel); } return $dataTypeDefinition; }