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($depth, $ext, $path, $pathName, $name)
 {
     // load default vars
     $patternSubtype = PatternData::getPatternSubtype();
     $patternSubtypeClean = PatternData::getPatternSubtypeClean();
     $patternSubtypeDash = PatternData::getPatternSubtypeDash();
     $patternType = PatternData::getPatternType();
     $patternTypeClean = PatternData::getPatternTypeClean();
     $patternTypeDash = PatternData::getPatternTypeDash();
     $dirSep = PatternData::getDirSep();
     $frontMeta = PatternData::getFrontMeta();
     // should this pattern get rendered?
     $hidden = $name[0] == "_";
     $noviewall = $name[0] == "-";
     // set-up the names
     $patternFull = in_array($name[0], $frontMeta) ? substr($name, 1) : $name;
     // 00-colors~foo.mustache
     $patternState = "";
     // check for pattern state
     if (strpos($patternFull, "@") !== false) {
         $patternBits = explode("@", $patternFull, 2);
         $patternState = str_replace("." . $ext, "", $patternBits[1]);
         $patternFull = preg_replace("/@(.*?)\\./", ".", $patternFull);
     }
     // finish setting up vars
     $patternBits = explode("~", $patternFull);
     $patternBase = $patternBits[0] . "." . Config::getOption("patternExtension");
     // 00-homepage.mustache
     $patternBaseDash = $this->getPatternName($patternBits[0], false);
     // homepage
     $patternBaseOrig = $patternTypeDash . "-" . $patternBaseDash;
     // pages-homepage
     $patternBaseData = $patternBits[0] . "." . $ext;
     // 00-homepage.json
     $stripJSON = str_replace("." . $ext, "", $patternBits[1]);
     $patternBitClean = preg_replace("/@(.*?)/", "", $patternBits[0]);
     $pattern = $patternBitClean . "-" . $stripJSON;
     // 00-homepage-00-emergency
     $patternInt = $patternBitClean . "-" . $this->getPatternName($stripJSON, false);
     // 00-homepage-emergency
     $patternDash = $this->getPatternName($patternInt, false);
     // homepage-emergency
     $patternClean = str_replace("-", " ", $patternDash);
     // homepage emergency
     $patternPartial = $patternTypeDash . "-" . $patternDash;
     // pages-homepage-emergency
     $patternPath = str_replace("." . $ext, "", str_replace("~", "-", $pathName));
     // 00-atoms/01-global/00-colors
     $patternPathDash = str_replace($dirSep, "-", $patternPath);
     // 00-atoms-01-global-00-colors (file path)
     // check the original pattern path. if it doesn't exist make a guess
     $patternPathOrig = PatternData::getPatternOption($patternBaseOrig, "pathName");
     // 04-pages/00-homepage
     $patternPathOrigDash = PatternData::getPatternOption($patternBaseOrig, "pathDash");
     // 04-pages-00-homepage
     if (!$patternPathOrig) {
         $patternPathOrigBits = explode("~", $pathName);
         $patternPathOrig = $patternPathOrigBits[0];
         // 04-pages/00-homepage
         $patternPathOrigDash = str_replace($dirSep, "-", $patternPathOrig);
         // 04-pages-00-homepage
     }
     // create a key for the data store
     $patternStoreKey = $patternPartial;
     // collect the data
     $patternStoreData = array("category" => "pattern", "name" => $pattern, "partial" => $patternPartial, "nameDash" => $patternDash, "nameClean" => $patternClean, "type" => $patternType, "typeDash" => $patternTypeDash, "breadcrumb" => array("patternType" => $patternTypeClean), "state" => $patternState, "hidden" => $hidden, "noviewall" => $noviewall, "depth" => $depth, "ext" => $ext, "path" => $path, "pathName" => $patternPath, "pathDash" => $patternPathDash, "isDir" => $this->isDirProp, "isFile" => $this->isFileProp, "pseudo" => true, "original" => $patternBaseOrig, "pathOrig" => $patternPathOrig, "pathOrigDash" => $patternPathOrigDash);
     // add any subtype info if necessary
     if ($depth > 1) {
         $patternStoreData["subtype"] = $patternSubtype;
         $patternStoreData["subtypeDash"] = $patternSubtypeDash;
         $patternStoreData["breadcrumb"] = array("patternType" => $patternTypeClean, "patternSubtype" => $patternSubtypeClean);
     }
     $patternDataBase = array();
     if (file_exists(Config::getOption("patternSourceDir") . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . $patternBaseData)) {
         $data = file_get_contents(Config::getOption("patternSourceDir") . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . $patternBaseData);
         if ($ext == "json") {
             $patternDataBase = json_decode($data, true);
             if ($jsonErrorMessage = JSON::hasError()) {
                 JSON::lastErrorMsg($patternBaseJSON, $jsonErrorMessage, $data);
             }
         } else {
             try {
                 $patternDataBase = YAML::parse($data);
             } catch (ParseException $e) {
                 printf("unable to parse " . $pathNameClean . ": %s..\n", $e->getMessage());
             }
             // single line of text won't throw a YAML error. returns as string
             if (gettype($patternDataBase) == "string") {
                 $patternDataBase = array();
             }
         }
     }
     // get the data for the pseudo-pattern
     $data = file_get_contents(Config::getOption("patternSourceDir") . DIRECTORY_SEPARATOR . $pathName);
     if ($ext == "json") {
         $patternData = json_decode($data, true);
         if ($jsonErrorMessage = JSON::hasError()) {
             JSON::lastErrorMsg($name, $jsonErrorMessage, $data);
         }
     } else {
         try {
             $patternData = YAML::parse($data);
         } catch (ParseException $e) {
             printf("unable to parse " . $pathNameClean . ": %s..\n", $e->getMessage());
         }
         // single line of text won't throw a YAML error. returns as string
         if (gettype($patternData) == "string") {
             $patternData = array();
         }
     }
     // make sure the pattern data is an array before merging the data
     $patternStoreData["data"] = is_array($patternData) ? array_replace_recursive($patternDataBase, $patternData) : $patternDataBase;
     // if the pattern data store already exists make sure it is merged and overwrites this data
     $patternStoreData = PatternData::checkOption($patternStoreKey) ? array_replace_recursive(PatternData::getOption($patternStoreKey), $patternStoreData) : $patternStoreData;
     PatternData::setOption($patternStoreKey, $patternStoreData);
 }