update('StaticPublisher', 'static_publisher_theme', $theme); } /** * @deprecated * * @return string */ public static function static_publisher_theme() { Deprecation::notice('1.0', 'Use the new config system. SSViewer.static_publisher_theme'); return Config::inst()->get('StaticPublisher', 'static_publisher_theme'); } /** * @deprecated * * @return boolean */ public static function echo_progress() { Deprecation::notice('1.0', 'Use the new config system. SSViewer.static_publisher_theme'); return Config::inst()->get('StaticPublisher', 'echo_progress'); } /** * @deprecated * */ public static function set_echo_progress($progress) { Deprecation::notice('1.0', 'Use the new config system. SSViewer.static_publisher_theme'); Config::inst()->get('StaticPublisher', 'echo_progress', $progress); } /** * Called after a page is published. * * @param SiteTree */ public function onAfterPublish($original) { $this->republish($original); } /** * Called after link assets have been renamed, and the live site has been * updated, without an actual publish event. * * Only called if the published content exists and has been modified. */ public function onRenameLinkedAsset($original) { $this->republish($original); } public function republish($original) { if (Config::inst()->get('StaticPublisher', 'disable_realtime')) { return; } $urls = array(); if($this->owner->hasMethod('pagesAffectedByChanges')) { $urls = $this->owner->pagesAffectedByChanges($original); } else { $pages = Versioned::get_by_stage('SiteTree', 'Live', '', '', '', 10); if($pages) { foreach($pages as $page) { $urls[] = $page->AbsoluteLink(); } } } // Note: Similiar to RebuildStaticCacheTask->rebuildCache() foreach($urls as $i => $url) { if(!is_string($url)) { user_error("Bad URL: " . var_export($url, true), E_USER_WARNING); continue; } // Remove leading slashes from all URLs (apart from the homepage) if(substr($url,-1) == '/' && $url != '/') $url = substr($url,0,-1); $urls[$i] = $url; } $urls = array_unique($urls); $this->publishPages($urls); } /** * Get changes and hook into underlying functionality. */ public function onAfterUnpublish($page) { if (Config::inst()->get('StaticPublisher', 'disable_realtime')) { return; } // Get the affected URLs if($this->owner->hasMethod('pagesAffectedByUnpublishing')) { $urls = $this->owner->pagesAffectedByUnpublishing(); $urls = array_unique($urls); } else { $urls = array($this->owner->AbsoluteLink()); } $legalPages = singleton('Page')->allPagesToCache(); $urlsToRepublish = array_intersect($urls, $legalPages); $urlsToUnpublish = array_diff($urls, $legalPages); $this->unpublishPages($urlsToUnpublish); $this->publishPages($urlsToRepublish); } /** * Get all external references to CSS, JS, */ public function externalReferencesFor($content) { $CLI_content = escapeshellarg($content); $tidy = `echo $CLI_content | tidy -numeric -asxhtml`; $tidy = preg_replace('/xmlns="[^"]+"/','', $tidy); $xContent = new SimpleXMLElement($tidy); $xlinks = array( "//link[@rel='stylesheet']/@href" => false, "//script/@src" => false, "//img/@src" => false, "//a/@href" => true, ); $urls = array(); foreach($xlinks as $xlink => $assetsOnly) { $matches = $xContent->xpath($xlink); if($matches) foreach($matches as $item) { $url = $item . ''; if($assetsOnly && substr($url,0,7) != ASSETS_DIR . '/') continue; $urls[] = $url; } } return $urls; } /** * @param string $url * * @return array */ public function getMetadata($url) { return array( 'Cache generated on ' . date('Y-m-d H:i:s T (O)') ); } }