summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/Importer/ContentModeller.php
blob: 4f667a7fdbf16f7eca5ec2a3f27587d02fa9e57b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php

namespace SMW\Importer;

/**
 * @license GNU GPL v2+
 * @since 3.0
 *
 * @author mwjames
 */
class ContentModeller {

	/**
	 * @since 3.0
	 *
	 * @param string $fileDir
	 * @param array $fileContents
	 *
	 * @return ImportContents[]|[]
	 */
	public function makeContentList( $fileDir, array $fileContents ) {

		$contents = [];

		if ( !isset( $fileContents['import'] ) ) {
			return $contents;
		}

		foreach ( $fileContents['import'] as $value ) {

			$importContents = new ImportContents();

			if ( isset( $value['namespace'] ) ) {
				$importContents->setNamespace(
					defined( $value['namespace'] ) ? constant( $value['namespace'] ) : 0
				);
			}

			if ( isset( $value['page'] ) ) {
				$importContents->setName( $value['page'] );
			}

			if ( isset( $value['description'] ) ) {
				$importContents->setDescription( $value['description'] );
			} elseif ( isset( $fileContents['description'] ) ) {
				$importContents->setDescription( $fileContents['description'] );
			} else {
				$importContents->setDescription( 'No description' );
			}

			if ( isset( $fileContents['meta']['version'] ) ) {
				$importContents->setVersion( $fileContents['meta']['version'] );
			} else {
				$importContents->setVersion( 0 );
			}

			if ( isset( $value['contents']['type'] ) && $value['contents']['type'] === 'xml' ) {
				$contents[] = $this->newImportContents( $importContents, $fileDir, $value );
			} else {
				$contents[] = $this->newImportContents( $importContents, $fileDir, $value );
			}
		}

		return $contents;
	}

	private function newImportContents( $importContents, $fileDir, $value ) {

		$importContents->setContentType( ImportContents::CONTENT_TEXT );

		if ( !isset( $value['contents'] ) || $value['contents'] === '' ) {
			$importContents->addError( 'Missing, or has empty contents section' );
		} else {
			$this->setContents( $importContents, $fileDir, $value['contents'] );
		}

		if ( isset( $value['options'] ) ) {
			$importContents->setOptions( $value['options'] );
		}

		return $importContents;
	}

	private function setContents( $importContents, $fileDir, $contents ) {

		if ( !is_array( $contents ) || !isset( $contents['importFrom'] ) ) {
			return $importContents->setContents( $contents );
		}

		$file = $this->normalizeFile( $fileDir, $contents['importFrom'] );

		if ( !is_readable( $file ) ) {
			return $importContents->addError( "File: " . $file . " wasn't accessible" );
		}

		$extension = pathinfo( $file, PATHINFO_EXTENSION );

		if ( isset( $contents['type'] ) && $contents['type'] === 'xml' && $extension !== 'xml' ) {
			return $importContents->addError( "XML: " . $file . " is not recognized as xml file extension" );
		}

		if ( $extension === 'xml' ) {
			$importContents->setContentType( ImportContents::CONTENT_XML );
		}

		$importContents->setContentsFile( $file );
	}

	private function normalizeFile( $fileDir, $file ) {
		return str_replace( [ '\\', '/' ], DIRECTORY_SEPARATOR, $fileDir . ( $file{0} === '/' ? '' : '/' ) . $file );
	}

}