Esempio n. 1
0
 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;
 }