public function run()
 {
     // default vars
     $options = array();
     $options["patternPaths"] = $this->patternPaths;
     $patternExtension = Config::getOption("patternExtension");
     $patternSourceDir = Config::getOption("patternSourceDir");
     $htmlHead = Template::getHTMLHead();
     $htmlFoot = Template::getHTMLFoot();
     $patternHead = Template::getPatternHead();
     $patternFoot = Template::getPatternFoot();
     $stringLoader = Template::getStringLoader();
     // re-load the pattern data since we modified it
     $store = PatternData::get();
     // load the pattern loader
     $patternEngineBasePath = PatternEngine::getInstance()->getBasePath();
     $patternLoaderClass = $patternEngineBasePath . "\\Loaders\\PatternLoader";
     $patternLoader = new $patternLoaderClass($options);
     // iterate to process each pattern
     FileChangeList::touchParentPatterns($store);
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && !$patternStoreData["hidden"]) {
             $fileName = FileChangeList::getFileNameByPatternData($patternStoreData);
             if (!Config::getOption("update") || FileChangeList::hasChanged($fileName)) {
                 $data = Data::getPatternSpecificData($patternStoreKey);
                 // add the pattern data so it can be exported
                 $patternData = array();
                 //$patternFooterData["patternFooterData"]["cssEnabled"]      = (Config::$options["enableCSS"] && isset($this->patternCSS[$p])) ? "true" : "false";
                 $patternData["cssEnabled"] = false;
                 $patternData["lineage"] = isset($patternStoreData["lineages"]) ? $patternStoreData["lineages"] : array();
                 $patternData["lineageR"] = isset($patternStoreData["lineagesR"]) ? $patternStoreData["lineagesR"] : array();
                 $patternData["patternBreadcrumb"] = $patternStoreData["breadcrumb"];
                 $patternData["patternDesc"] = isset($patternStoreData["desc"]) ? $patternStoreData["desc"] : "";
                 $patternData["patternExtension"] = $patternExtension;
                 $patternData["patternName"] = $patternStoreData["nameClean"];
                 $patternData["patternPartial"] = $patternStoreData["partial"];
                 $patternData["patternState"] = $patternStoreData["state"];
                 // extra copy for the code view
                 $patternData["extraOutput"] = isset($patternStoreData["extraOutput"]) ? $patternStoreData["extraOutput"] : array();
                 // add the pattern lab specific mark-up
                 // set a default var
                 $exportClean = isset($options["exportClean"]) ? $options["exportClean"] : false;
                 $data["patternLabHead"] = !$this->exportFiles ? $stringLoader->render(array("string" => $htmlHead, "data" => array("cacheBuster" => $data["cacheBuster"]))) : "";
                 $data["patternLabFoot"] = !$this->exportFiles ? $stringLoader->render(array("string" => $htmlFoot, "data" => array("cacheBuster" => $data["cacheBuster"], "patternData" => json_encode($patternData)))) : "";
                 if (isset($patternStoreData["patternRaw"])) {
                     $header = !$this->exportClean ? $stringLoader->render(array("string" => $patternHead, "data" => $data)) : "";
                     $code = $patternLoader->render(array("pattern" => $patternStoreData["patternRaw"], "data" => $data));
                     $footer = !$this->exportClean ? $stringLoader->render(array("string" => $patternFoot, "data" => $data)) : "";
                     PatternData::setPatternOption($patternStoreKey, "header", $header);
                     PatternData::setPatternOption($patternStoreKey, "code", $code);
                     PatternData::setPatternOption($patternStoreKey, "footer", $footer);
                 }
             }
         }
     }
 }
 public function run()
 {
     // load default vars
     $patternExtension = Config::getOption("patternExtension");
     $patternSourceDir = Config::getOption("patternSourceDir");
     // load the pattern data
     $store = PatternData::get();
     // iterate to get raw data loaded into the PatternData Store
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && !$patternStoreData["hidden"]) {
             // figure out the source path for the pattern to render
             $srcPath = isset($patternStoreData["pseudo"]) ? PatternData::getPatternOption($patternStoreData["original"], "pathName") : $patternStoreData["pathName"];
             // load the raw data so it can be modified/rendered
             $path = $patternSourceDir . "/" . $srcPath . "." . $patternExtension;
             if (file_exists($path)) {
                 PatternData::setPatternOption($patternStoreKey, "patternRaw", file_get_contents($path));
             } else {
                 Console::writeError($patternStoreData["partial"] . " wasn't found for loading. the given path: " . $path);
             }
         }
     }
 }
 public function run()
 {
     // set-up default vars
     $foundLineages = array();
     $patternSourceDir = Config::getOption("patternSourceDir");
     $patternExtension = Config::getOption("patternExtension");
     // check for the regular lineages in only normal patterns
     $store = PatternData::get();
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && !isset($patternStoreData["pseudo"])) {
             $patternLineages = array();
             $fileData = isset($patternStoreData["patternRaw"]) ? $patternStoreData["patternRaw"] : "";
             $foundLineages = $this->findLineages($fileData);
             if (!empty($foundLineages)) {
                 foreach ($foundLineages as $lineage) {
                     $lineageData = PatternData::getOption($lineage);
                     if ($lineageData) {
                         $patternLineages[] = array("lineagePattern" => $lineage, "lineagePath" => "../../patterns/" . $lineageData["pathDash"] . "/" . $lineageData["pathDash"] . ".html");
                     } else {
                         if (strpos($lineage, '/') === false) {
                             $fileName = $patternStoreData["pathName"] . "." . $patternExtension;
                             Console::writeWarning("you may have a typo in " . $fileName . ". {{> " . $lineage . " }} is not a valid pattern...");
                         }
                     }
                 }
                 // add the lineages to the PatternData::$store
                 PatternData::setPatternOption($patternStoreKey, "lineages", $patternLineages);
             }
         }
     }
     // handle all of those pseudo patterns
     $store = PatternData::get();
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && isset($patternStoreData["pseudo"])) {
             // add the lineages to the PatternData::$store
             $patternStoreKeyOriginal = $patternStoreData["original"];
             PatternData::setPatternOption($patternStoreKey, "lineages", PatternData::getPatternOption($patternStoreKeyOriginal, "lineages"));
         }
     }
     // check for the reverse lineages and skip pseudo patterns
     $store = PatternData::get();
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && !isset($patternStoreData["pseudo"])) {
             $patternLineagesR = array();
             $storeTake2 = PatternData::get();
             foreach ($storeTake2 as $haystackKey => $haystackData) {
                 if ($haystackData["category"] == "pattern" && isset($haystackData["lineages"]) && !empty($haystackData["lineages"])) {
                     foreach ($haystackData["lineages"] as $haystackLineage) {
                         if ($haystackLineage["lineagePattern"] == $patternStoreData["partial"]) {
                             $foundAlready = false;
                             foreach ($patternLineagesR as $patternCheck) {
                                 if ($patternCheck["lineagePattern"] == $patternStoreData["partial"]) {
                                     $foundAlready = true;
                                     break;
                                 }
                             }
                             if (!$foundAlready) {
                                 if (PatternData::getOption($haystackKey)) {
                                     $path = PatternData::getPatternOption($haystackKey, "pathDash");
                                     $patternLineagesR[] = array("lineagePattern" => $haystackKey, "lineagePath" => "../../patterns/" . $path . "/" . $path . ".html");
                                 }
                             }
                         }
                     }
                 }
             }
             PatternData::setPatternOption($patternStoreKey, "lineagesR", $patternLineagesR);
         }
     }
     // handle all of those pseudo patterns
     $store = PatternData::get();
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && isset($patternStoreData["pseudo"])) {
             // add the lineages to the PatternData::$store
             $patternStoreKeyOriginal = $patternStoreData["original"];
             PatternData::setPatternOption($patternStoreKey, "lineagesR", PatternData::getPatternOption($patternStoreKeyOriginal, "lineagesR"));
         }
     }
 }
 public function run()
 {
     // check on the states of the patterns
     $patternStates = Config::getOption("patternStates");
     $patternStateLast = count($patternStates) - 1;
     // run through each item in the store and only look at patterns
     $store = PatternData::get();
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern") {
             $patternState = $patternStoreData["state"];
             // make sure the pattern has a given state
             if ($patternState != "") {
                 $patternStateDigit = array_search($patternState, $patternStates);
                 // if this is a true pattern state update various patterns
                 if ($patternStateDigit !== false) {
                     $storeTake2 = PatternData::get();
                     foreach ($storeTake2 as $patternStoreKey2 => $patternStoreData2) {
                         if ($patternStoreData2["category"] == "pattern" && isset($patternStoreData2["lineagesR"])) {
                             foreach ($patternStoreData2["lineagesR"] as $patternCheckInfo) {
                                 $lineagePatternPartial = $patternCheckInfo["lineagePattern"];
                                 // if the found pattern's lineage is empty and the pattern state isn't the last (e.g. complete) add the pattern state
                                 // otherwise, if the pattern state is less than the one being checked update the pattern
                                 if (PatternData::getPatternOption($lineagePatternPartial, "state") == "" && $patternStateDigit != $patternStateLast) {
                                     PatternData::setPatternOption($lineagePatternPartial, "state", $patternState);
                                 } else {
                                     $patternStateCheck = array_search(PatternData::getPatternOption($lineagePatternPartial, "state"), $patternStates);
                                     if ($patternStateDigit < $patternStateCheck) {
                                         PatternData::setPatternOption($lineagePatternPartial, "state", $patternState);
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // make sure we update the lineages with the pattern state if appropriate
     $store = PatternData::get();
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern") {
             if (isset($patternStoreData["lineages"]) && !empty($patternStoreData["lineages"])) {
                 foreach ($patternStoreData["lineages"] as $patternLineageKey => $patternLineageInfo) {
                     $lineagePattern = $patternLineageInfo["lineagePattern"];
                     $patternState = PatternData::getPatternOption($lineagePattern, "state");
                     if ($patternState != "" && $patternState != null) {
                         PatternData::setPatternSubOption($patternStoreKey, "lineages", $patternLineageKey, "lineageState", $patternState);
                     }
                 }
             }
             if (isset($patternStoreData["lineagesR"]) && !empty($patternStoreData["lineagesR"])) {
                 foreach ($patternStoreData["lineagesR"] as $patternLineageKey => $patternLineageInfo) {
                     $lineagePattern = $patternLineageInfo["lineagePattern"];
                     $patternState = PatternData::getPatternOption($lineagePattern, "state");
                     if ($patternState != "" && $patternState != null) {
                         PatternData::setPatternSubOption($patternStoreKey, "lineages", $patternLineageKey, "lineageState", $patternState);
                     }
                 }
             }
         }
     }
 }
 public function run()
 {
     // default vars
     $options = array();
     $options["patternPaths"] = $this->patternPaths;
     $patternExtension = Config::getOption("patternExtension");
     $patternSourceDir = Config::getOption("patternSourceDir");
     $htmlHead = Template::getHTMLHead();
     $htmlFoot = Template::getHTMLFoot();
     $patternHead = Template::getPatternHead();
     $patternFoot = Template::getPatternFoot();
     $stringLoader = Template::getStringLoader();
     // re-load the pattern data since we modified it
     $store = PatternData::get();
     /* rtl support start */
     foreach (array_keys($store) as $patternStoreKey) {
         if ($store[$patternStoreKey]['isFile']) {
             $store[$patternStoreKey]['patternTextDirection'] = 'ltr';
             $store[$patternStoreKey . '-rtl'] = $store[$patternStoreKey];
             $store[$patternStoreKey . '-rtl']['name'] .= '-rtl';
             $store[$patternStoreKey . '-rtl']['pathDash'] .= '-rtl';
             $store[$patternStoreKey . '-rtl']['patternTextDirection'] = 'rtl';
             $store[$patternStoreKey . '-rtl']['nameDash'] .= '-rtl';
             $store[$patternStoreKey . '-rtl']['nameClean'] .= ' (RTL)';
             $store[$patternStoreKey . '-rtl']['partial'] .= '-rtl';
         }
     }
     foreach ($store as $patternStoreKey => $patternStoreData) {
         PatternData::setOption($patternStoreKey, $patternStoreData);
     }
     /* rtl support end */
     // load the pattern loader
     $patternEngineBasePath = PatternEngine::getInstance()->getBasePath();
     $patternLoaderClass = $patternEngineBasePath . "\\Loaders\\PatternLoader";
     $patternLoader = new $patternLoaderClass($options);
     // iterate to process each pattern
     foreach ($store as $patternStoreKey => $patternStoreData) {
         if ($patternStoreData["category"] == "pattern" && !$patternStoreData["hidden"]) {
             $data = Data::getPatternSpecificData($patternStoreKey);
             // add the pattern data so it can be exported
             $patternData = array();
             //$patternFooterData["patternFooterData"]["cssEnabled"]      = (Config::$options["enableCSS"] && isset($this->patternCSS[$p])) ? "true" : "false";
             $patternData["cssEnabled"] = false;
             $patternData["lineage"] = isset($patternStoreData["lineages"]) ? $patternStoreData["lineages"] : array();
             $patternData["lineageR"] = isset($patternStoreData["lineagesR"]) ? $patternStoreData["lineagesR"] : array();
             $patternData["patternBreadcrumb"] = $patternStoreData["breadcrumb"];
             $patternData["patternDesc"] = isset($patternStoreData["desc"]) ? $patternStoreData["desc"] : "";
             $patternData["patternExtension"] = $patternExtension;
             $patternData["patternName"] = $patternStoreData["nameClean"];
             $patternData["patternPartial"] = $patternStoreData["partial"];
             $patternData["patternState"] = $patternStoreData["state"];
             // extra copy for the code view
             $patternData["extraOutput"] = isset($patternStoreData["extraOutput"]) ? $patternStoreData["extraOutput"] : array();
             // add the pattern lab specific mark-up
             // set a default var
             $exportClean = isset($options["exportClean"]) ? $options["exportClean"] : false;
             $data["patternLabHead"] = !$this->exportFiles ? $stringLoader->render(array("string" => $htmlHead, "data" => array("cacheBuster" => $data["cacheBuster"]))) : "";
             $data["patternLabFoot"] = !$this->exportFiles ? $stringLoader->render(array("string" => $htmlFoot, "data" => array("cacheBuster" => $data["cacheBuster"], "patternData" => json_encode($patternData)))) : "";
             /* add text-direction */
             $data['patternTextDirection'] = $store[$patternStoreKey]['patternTextDirection'];
             /* add text-direction end */
             if (isset($patternStoreData["patternRaw"])) {
                 $header = !$this->exportClean ? $stringLoader->render(array("string" => $patternHead, "data" => $data)) : "";
                 $code = $patternLoader->render(array("pattern" => $patternStoreData["patternRaw"], "data" => $data));
                 $footer = !$this->exportClean ? $stringLoader->render(array("string" => $patternFoot, "data" => $data)) : "";
                 PatternData::setPatternOption($patternStoreKey, "header", $header);
                 PatternData::setPatternOption($patternStoreKey, "code", $code);
                 PatternData::setPatternOption($patternStoreKey, "footer", $footer);
             }
         }
     }
 }