2 namespace TYPO3\CMS\Documentation\Service;
35 $documents = json_decode($json,
true);
36 foreach ($documents as &$document) {
37 $document[
'icon'] = \TYPO3\CMS\Documentation\Utility\MiscUtility::getIcon($document[
'key']);
56 foreach (
$GLOBALS[
'TYPO3_LOADED_EXT'] as $extensionKey => $extensionData) {
58 if (is_file($absoluteExtensionPath .
'README.rst') || is_file($absoluteExtensionPath .
'Documentation' . DIRECTORY_SEPARATOR .
'Index.rst')) {
59 $metadata = \TYPO3\CMS\Documentation\Utility\MiscUtility::getExtensionMetaData($extensionKey);
60 if ($extensionData[
'type'] ===
'S') {
61 $version = TYPO3_branch;
63 $version = substr($metadata[
'release'], -4) ===
'-dev' ?
'latest' : $metadata[
'release'];
66 $documentKey =
'typo3cms.extensions.' . $extensionKey;
68 'title' => $metadata[
'title'],
69 'icon' => \TYPO3\CMS\Documentation\Utility\MiscUtility::getIcon($documentKey),
70 'type' =>
'Extension',
71 'key' => $documentKey,
72 'shortcut' => $extensionKey,
73 'url' =>
'https://docs.typo3.org/typo3cms/extensions/' . $extensionKey .
'/',
74 'version' => $version,
104 if (empty($packages)) {
108 $languages = array($language);
109 if ($language !==
'default') {
110 $languages[] =
'default';
112 foreach ($languages as $language) {
114 if (isset($packages[$version][$language])) {
115 $success |= $this->fetchDocument(
$url, $key, $version, $language);
119 if (isset($packages[$version])) {
120 foreach ($packages[$version] as $locale => $_) {
122 $success |= $this->fetchDocument(
$url, $key, $version, $locale);
130 if (preg_match(
'/^(\d+\.\d+)\.\d+$/', $version, $matches)) {
132 $shortVersion = $matches[1];
133 if (isset($packages[$shortVersion][$language])) {
134 $success |= $this->fetchDocument(
$url, $key, $shortVersion, $language);
140 if ($version !==
'latest' && isset($packages[
'latest'][$language])) {
141 $success |= $this->fetchDocument(
$url, $key,
'latest', $language);
159 public function fetchDocument(
$url, $key, $version =
'latest', $language =
'default')
164 $packagePrefix = substr($key, strrpos($key,
'.') + 1);
165 $languageSegment = str_replace(
'_',
'-', strtolower($language));
166 $packageName = sprintf(
'%s-%s-%s.zip', $packagePrefix, $version, $languageSegment);
167 $packageUrl =
$url .
'packages/' . $packageName;
171 if (empty($packages) || !isset($packages[$version][$language])) {
177 if (is_file($absolutePathToZipFile)) {
178 $localMd5 = md5_file($absolutePathToZipFile);
179 $remoteMd5 = $packages[$version][$language];
180 $hasArchive = $localMd5 === $remoteMd5;
192 if (is_file($absolutePathToZipFile)) {
199 $documents = json_decode(file_get_contents($absoluteCacheFilename),
true);
200 foreach ($documents as $document) {
201 if ($document[
'key'] === $key) {
202 $composerData = array(
203 'name' => $document[
'title'],
204 'type' =>
'documentation',
205 'description' =>
'TYPO3 ' . $document[
'type'],
207 $relativeComposerFilename = $key .
'/' . $language .
'/composer.json';
229 $indexUrl =
$url .
'packages/packages.xml';
248 $data = json_decode(json_encode((array)simplexml_load_string($string)),
true);
249 if (count($data) !== 2) {
250 throw new \TYPO3\CMS\Documentation\Exception\XmlParser(
'Error in XML parser while decoding packages XML file.', 1374222437);
254 if ($data[
'languagePackIndex'][
'languagepack'][0] === null) {
255 $data[
'languagePackIndex'][
'languagepack'] = array($data[
'languagePackIndex'][
'languagepack']);
259 foreach ($data[
'languagePackIndex'][
'languagepack'] as $languagePack) {
260 $language = $languagePack[
'@attributes'][
'language'];
261 $version = $languagePack[
'@attributes'][
'version'];
262 $packages[$version][$language] = $languagePack[
'md5'];
278 $zip = zip_open($file);
279 if (is_resource($zip)) {
282 if (!is_dir($path)) {
286 while (($zipEntry = zip_read($zip)) !==
false) {
287 $zipEntryName = zip_entry_name($zipEntry);
288 if (strpos($zipEntryName,
'/') !==
false) {
289 $zipEntryPathSegments = explode(
'/', $zipEntryName);
290 $fileName = array_pop($zipEntryPathSegments);
292 if (empty($fileName)) {
296 if (trim($absoluteTargetPath) !==
'') {
298 $absoluteTargetPath, zip_entry_read($zipEntry, zip_entry_filesize($zipEntry))
300 if ($return ===
false) {
301 throw new \TYPO3\CMS\Documentation\Exception\Document(
'Could not write file ' . $zipEntryName, 1374161546);
304 throw new \TYPO3\CMS\Documentation\Exception\Document(
'Could not write file ' . $zipEntryName, 1374161532);
308 throw new \TYPO3\CMS\Documentation\Exception\Document(
'Extension directory missing in zip file!', 1374161519);
312 throw new \TYPO3\CMS\Documentation\Exception\Document(
'Unable to open zip file ' . $file, 1374161508);