Version Description
- added new option 'Use StreamReader instead of XMLReader to parse import file' to fix issue with libxml 2.9.3
- execute 'pmxi_article_data' filter for all posts ( new & existing )
Download this release
Release Info
Developer | soflyy |
Plugin | Import any XML or CSV File to WordPress |
Version | 3.3.7 |
Comparing to | |
See all releases |
Code changes from version 3.3.6 to 3.3.7
- actions/admin_notices.php +2 -2
- classes/PHPExcel/CachedObjectStorage/Wincache.php +294 -294
- classes/PHPExcel/locale/sv/functions +408 -408
- classes/XmlStreamReader/autoload.php +7 -0
- classes/XmlStreamReader/composer/ClassLoader.php +413 -0
- classes/XmlStreamReader/composer/autoload_classmap.php +9 -0
- classes/XmlStreamReader/composer/autoload_namespaces.php +9 -0
- classes/XmlStreamReader/composer/autoload_psr4.php +10 -0
- classes/XmlStreamReader/composer/autoload_real.php +45 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer.php +77 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Parser/StringWalker.php +275 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Parser/UniqueNode.php +274 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/ParserInterface.php +34 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Stream/File.php +54 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Stream/Stdin.php +11 -0
- classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/StreamInterface.php +21 -0
- classes/chunk.php +140 -54
- classes/handler.php +13 -1
- controllers/admin/import.php +35 -16
- controllers/admin/manage.php +2 -0
- controllers/admin/settings.php +42 -1
- helpers/wp_all_import_get_reader_engine.php +120 -0
- models/import/record.php +9 -8
- plugin.php +167 -165
- readme.txt +26 -22
- static/css/admin.css +12 -0
- static/js/admin.js +107 -14
- static/js/plupload/wplupload.js +5 -0
- views/admin/help/index.php +1 -1
- views/admin/import/index.php +35 -24
- views/admin/import/options/_import_file.php +4 -4
- views/admin/import/options/_reimport_options.php +4 -1
- views/admin/import/options/_settings_template.php +35 -7
- views/admin/import/template.php +11 -2
- views/admin/import/template/_custom_fields_template.php +2 -2
- views/admin/import/template/_featured_template.php +2 -2
- views/admin/manage/index.php +1 -1
- views/admin/settings/index.php +2 -2
actions/admin_notices.php
CHANGED
@@ -122,10 +122,10 @@ function pmxi_admin_notices() {
|
|
122 |
$m = __('<strong>Warning:</strong> your content is blank.', 'pmxi_plugin');
|
123 |
break;
|
124 |
case 3:
|
125 |
-
$m = __('<strong>Warning:</strong> You must <a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=images" target="_blank">upgrade to the
|
126 |
break;
|
127 |
case 4:
|
128 |
-
$m = __('<strong>Warning:</strong> You must <a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank">upgrade to the
|
129 |
break;
|
130 |
default:
|
131 |
$m = false;
|
122 |
$m = __('<strong>Warning:</strong> your content is blank.', 'pmxi_plugin');
|
123 |
break;
|
124 |
case 3:
|
125 |
+
$m = __('<strong>Warning:</strong> You must <a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=images" target="_blank">upgrade to the Pro edition of WP All Import</a> to import images. The settings you configured in the images section will be ignored.', 'pmxi_plugin');
|
126 |
break;
|
127 |
case 4:
|
128 |
+
$m = __('<strong>Warning:</strong> You must <a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank">upgrade to the Pro edition of WP All Import</a> to import data to Custom Fields. The settings you configured in the Custom Fields section will be ignored.', 'pmxi_plugin');
|
129 |
break;
|
130 |
default:
|
131 |
$m = false;
|
classes/PHPExcel/CachedObjectStorage/Wincache.php
CHANGED
@@ -1,294 +1,294 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* PHPExcel
|
4 |
-
*
|
5 |
-
* Copyright (c) 2006 - 2014 PHPExcel
|
6 |
-
*
|
7 |
-
* This library is free software; you can redistribute it and/or
|
8 |
-
* modify it under the terms of the GNU Lesser General Public
|
9 |
-
* License as published by the Free Software Foundation; either
|
10 |
-
* version 2.1 of the License, or (at your option) any later version.
|
11 |
-
*
|
12 |
-
* This library is distributed in the hope that it will be useful,
|
13 |
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 |
-
* Lesser General Public License for more details.
|
16 |
-
*
|
17 |
-
* You should have received a copy of the GNU Lesser General Public
|
18 |
-
* License along with this library; if not, write to the Free Software
|
19 |
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 |
-
*
|
21 |
-
* @category PHPExcel
|
22 |
-
* @package PHPExcel_CachedObjectStorage
|
23 |
-
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
|
24 |
-
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
25 |
-
* @version ##VERSION##, ##DATE##
|
26 |
-
*/
|
27 |
-
|
28 |
-
|
29 |
-
/**
|
30 |
-
* PHPExcel_CachedObjectStorage_Wincache
|
31 |
-
*
|
32 |
-
* @category PHPExcel
|
33 |
-
* @package PHPExcel_CachedObjectStorage
|
34 |
-
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
|
35 |
-
*/
|
36 |
-
class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache {
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Prefix used to uniquely identify cache data for this worksheet
|
40 |
-
*
|
41 |
-
* @var string
|
42 |
-
*/
|
43 |
-
private $_cachePrefix = null;
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Cache timeout
|
47 |
-
*
|
48 |
-
* @var integer
|
49 |
-
*/
|
50 |
-
private $_cacheTime = 600;
|
51 |
-
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Store cell data in cache for the current cell object if it's "dirty",
|
55 |
-
* and the 'nullify' the current cell object
|
56 |
-
*
|
57 |
-
* @return void
|
58 |
-
* @throws PHPExcel_Exception
|
59 |
-
*/
|
60 |
-
protected function _storeData() {
|
61 |
-
if ($this->_currentCellIsDirty && !empty($this->_currentObjectID)) {
|
62 |
-
$this->_currentObject->detach();
|
63 |
-
|
64 |
-
$obj = serialize($this->_currentObject);
|
65 |
-
if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
|
66 |
-
if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
|
67 |
-
$this->__destruct();
|
68 |
-
throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
|
69 |
-
}
|
70 |
-
} else {
|
71 |
-
if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
|
72 |
-
$this->__destruct();
|
73 |
-
throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
|
74 |
-
}
|
75 |
-
}
|
76 |
-
$this->_currentCellIsDirty = false;
|
77 |
-
}
|
78 |
-
|
79 |
-
$this->_currentObjectID = $this->_currentObject = null;
|
80 |
-
} // function _storeData()
|
81 |
-
|
82 |
-
|
83 |
-
/**
|
84 |
-
* Add or Update a cell in cache identified by coordinate address
|
85 |
-
*
|
86 |
-
* @param string $pCoord Coordinate address of the cell to update
|
87 |
-
* @param PHPExcel_Cell $cell Cell to update
|
88 |
-
* @return PHPExcel_Cell
|
89 |
-
* @throws PHPExcel_Exception
|
90 |
-
*/
|
91 |
-
public function addCacheData($pCoord, PHPExcel_Cell $cell) {
|
92 |
-
if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) {
|
93 |
-
$this->_storeData();
|
94 |
-
}
|
95 |
-
$this->_cellCache[$pCoord] = true;
|
96 |
-
|
97 |
-
$this->_currentObjectID = $pCoord;
|
98 |
-
$this->_currentObject = $cell;
|
99 |
-
$this->_currentCellIsDirty = true;
|
100 |
-
|
101 |
-
return $cell;
|
102 |
-
} // function addCacheData()
|
103 |
-
|
104 |
-
|
105 |
-
/**
|
106 |
-
* Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
107 |
-
*
|
108 |
-
* @param string $pCoord Coordinate address of the cell to check
|
109 |
-
* @return boolean
|
110 |
-
*/
|
111 |
-
public function isDataSet($pCoord) {
|
112 |
-
// Check if the requested entry is the current object, or exists in the cache
|
113 |
-
if (parent::isDataSet($pCoord)) {
|
114 |
-
if ($this->_currentObjectID == $pCoord) {
|
115 |
-
return true;
|
116 |
-
}
|
117 |
-
// Check if the requested entry still exists in cache
|
118 |
-
$success = wincache_ucache_exists($this->_cachePrefix.$pCoord.'.cache');
|
119 |
-
if ($success === false) {
|
120 |
-
// Entry no longer exists in Wincache, so clear it from the cache array
|
121 |
-
parent::deleteCacheData($pCoord);
|
122 |
-
throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
|
123 |
-
}
|
124 |
-
return true;
|
125 |
-
}
|
126 |
-
return false;
|
127 |
-
} // function isDataSet()
|
128 |
-
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Get cell at a specific coordinate
|
132 |
-
*
|
133 |
-
* @param string $pCoord Coordinate of the cell
|
134 |
-
* @throws PHPExcel_Exception
|
135 |
-
* @return PHPExcel_Cell Cell that was found, or null if not found
|
136 |
-
*/
|
137 |
-
public function getCacheData($pCoord) {
|
138 |
-
if ($pCoord === $this->_currentObjectID) {
|
139 |
-
return $this->_currentObject;
|
140 |
-
}
|
141 |
-
$this->_storeData();
|
142 |
-
|
143 |
-
// Check if the entry that has been requested actually exists
|
144 |
-
$obj = null;
|
145 |
-
if (parent::isDataSet($pCoord)) {
|
146 |
-
$success = false;
|
147 |
-
$obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
|
148 |
-
if ($success === false) {
|
149 |
-
// Entry no longer exists in WinCache, so clear it from the cache array
|
150 |
-
parent::deleteCacheData($pCoord);
|
151 |
-
throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
|
152 |
-
}
|
153 |
-
} else {
|
154 |
-
// Return null if requested entry doesn't exist in cache
|
155 |
-
return null;
|
156 |
-
}
|
157 |
-
|
158 |
-
// Set current entry to the requested entry
|
159 |
-
$this->_currentObjectID = $pCoord;
|
160 |
-
$this->_currentObject = unserialize($obj);
|
161 |
-
// Re-attach this as the cell's parent
|
162 |
-
$this->_currentObject->attach($this);
|
163 |
-
|
164 |
-
// Return requested entry
|
165 |
-
return $this->_currentObject;
|
166 |
-
} // function getCacheData()
|
167 |
-
|
168 |
-
|
169 |
-
/**
|
170 |
-
* Get a list of all cell addresses currently held in cache
|
171 |
-
*
|
172 |
-
* @return string[]
|
173 |
-
*/
|
174 |
-
public function getCellList() {
|
175 |
-
if ($this->_currentObjectID !== null) {
|
176 |
-
$this->_storeData();
|
177 |
-
}
|
178 |
-
|
179 |
-
return parent::getCellList();
|
180 |
-
}
|
181 |
-
|
182 |
-
|
183 |
-
/**
|
184 |
-
* Delete a cell in cache identified by coordinate address
|
185 |
-
*
|
186 |
-
* @param string $pCoord Coordinate address of the cell to delete
|
187 |
-
* @throws PHPExcel_Exception
|
188 |
-
*/
|
189 |
-
public function deleteCacheData($pCoord) {
|
190 |
-
// Delete the entry from Wincache
|
191 |
-
wincache_ucache_delete($this->_cachePrefix.$pCoord.'.cache');
|
192 |
-
|
193 |
-
// Delete the entry from our cell address array
|
194 |
-
parent::deleteCacheData($pCoord);
|
195 |
-
} // function deleteCacheData()
|
196 |
-
|
197 |
-
|
198 |
-
/**
|
199 |
-
* Clone the cell collection
|
200 |
-
*
|
201 |
-
* @param PHPExcel_Worksheet $parent The new worksheet
|
202 |
-
* @return void
|
203 |
-
*/
|
204 |
-
public function copyCellCollection(PHPExcel_Worksheet $parent) {
|
205 |
-
parent::copyCellCollection($parent);
|
206 |
-
// Get a new id for the new file name
|
207 |
-
$baseUnique = $this->_getUniqueID();
|
208 |
-
$newCachePrefix = substr(md5($baseUnique),0,8).'.';
|
209 |
-
$cacheList = $this->getCellList();
|
210 |
-
foreach($cacheList as $cellID) {
|
211 |
-
if ($cellID != $this->_currentObjectID) {
|
212 |
-
$success = false;
|
213 |
-
$obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
|
214 |
-
if ($success === false) {
|
215 |
-
// Entry no longer exists in WinCache, so clear it from the cache array
|
216 |
-
parent::deleteCacheData($cellID);
|
217 |
-
throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');
|
218 |
-
}
|
219 |
-
if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
|
220 |
-
$this->__destruct();
|
221 |
-
throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');
|
222 |
-
}
|
223 |
-
}
|
224 |
-
}
|
225 |
-
$this->_cachePrefix = $newCachePrefix;
|
226 |
-
} // function copyCellCollection()
|
227 |
-
|
228 |
-
|
229 |
-
/**
|
230 |
-
* Clear the cell collection and disconnect from our parent
|
231 |
-
*
|
232 |
-
* @return void
|
233 |
-
*/
|
234 |
-
public function unsetWorksheetCells() {
|
235 |
-
if(!is_null($this->_currentObject)) {
|
236 |
-
$this->_currentObject->detach();
|
237 |
-
$this->_currentObject = $this->_currentObjectID = null;
|
238 |
-
}
|
239 |
-
|
240 |
-
// Flush the WinCache cache
|
241 |
-
$this->__destruct();
|
242 |
-
|
243 |
-
$this->_cellCache = array();
|
244 |
-
|
245 |
-
// detach ourself from the worksheet, so that it can then delete this object successfully
|
246 |
-
$this->_parent = null;
|
247 |
-
} // function unsetWorksheetCells()
|
248 |
-
|
249 |
-
|
250 |
-
/**
|
251 |
-
* Initialise this new cell collection
|
252 |
-
*
|
253 |
-
* @param PHPExcel_Worksheet $parent The worksheet for this cell collection
|
254 |
-
* @param array of mixed $arguments Additional initialisation arguments
|
255 |
-
*/
|
256 |
-
public function __construct(PHPExcel_Worksheet $parent, $arguments) {
|
257 |
-
$cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
|
258 |
-
|
259 |
-
if (is_null($this->_cachePrefix)) {
|
260 |
-
$baseUnique = $this->_getUniqueID();
|
261 |
-
$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
|
262 |
-
$this->_cacheTime = $cacheTime;
|
263 |
-
|
264 |
-
parent::__construct($parent);
|
265 |
-
}
|
266 |
-
} // function __construct()
|
267 |
-
|
268 |
-
|
269 |
-
/**
|
270 |
-
* Destroy this cell collection
|
271 |
-
*/
|
272 |
-
public function __destruct() {
|
273 |
-
$cacheList = $this->getCellList();
|
274 |
-
foreach($cacheList as $cellID) {
|
275 |
-
wincache_ucache_delete($this->_cachePrefix.$cellID.'.cache');
|
276 |
-
}
|
277 |
-
} // function __destruct()
|
278 |
-
|
279 |
-
|
280 |
-
/**
|
281 |
-
* Identify whether the caching method is currently available
|
282 |
-
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build
|
283 |
-
*
|
284 |
-
* @return boolean
|
285 |
-
*/
|
286 |
-
public static function cacheMethodIsAvailable() {
|
287 |
-
if (!function_exists('wincache_ucache_add')) {
|
288 |
-
return false;
|
289 |
-
}
|
290 |
-
|
291 |
-
return true;
|
292 |
-
}
|
293 |
-
|
294 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* PHPExcel
|
4 |
+
*
|
5 |
+
* Copyright (c) 2006 - 2014 PHPExcel
|
6 |
+
*
|
7 |
+
* This library is free software; you can redistribute it and/or
|
8 |
+
* modify it under the terms of the GNU Lesser General Public
|
9 |
+
* License as published by the Free Software Foundation; either
|
10 |
+
* version 2.1 of the License, or (at your option) any later version.
|
11 |
+
*
|
12 |
+
* This library is distributed in the hope that it will be useful,
|
13 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 |
+
* Lesser General Public License for more details.
|
16 |
+
*
|
17 |
+
* You should have received a copy of the GNU Lesser General Public
|
18 |
+
* License along with this library; if not, write to the Free Software
|
19 |
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 |
+
*
|
21 |
+
* @category PHPExcel
|
22 |
+
* @package PHPExcel_CachedObjectStorage
|
23 |
+
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
|
24 |
+
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
25 |
+
* @version ##VERSION##, ##DATE##
|
26 |
+
*/
|
27 |
+
|
28 |
+
|
29 |
+
/**
|
30 |
+
* PHPExcel_CachedObjectStorage_Wincache
|
31 |
+
*
|
32 |
+
* @category PHPExcel
|
33 |
+
* @package PHPExcel_CachedObjectStorage
|
34 |
+
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
|
35 |
+
*/
|
36 |
+
class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache {
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Prefix used to uniquely identify cache data for this worksheet
|
40 |
+
*
|
41 |
+
* @var string
|
42 |
+
*/
|
43 |
+
private $_cachePrefix = null;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Cache timeout
|
47 |
+
*
|
48 |
+
* @var integer
|
49 |
+
*/
|
50 |
+
private $_cacheTime = 600;
|
51 |
+
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Store cell data in cache for the current cell object if it's "dirty",
|
55 |
+
* and the 'nullify' the current cell object
|
56 |
+
*
|
57 |
+
* @return void
|
58 |
+
* @throws PHPExcel_Exception
|
59 |
+
*/
|
60 |
+
protected function _storeData() {
|
61 |
+
if ($this->_currentCellIsDirty && !empty($this->_currentObjectID)) {
|
62 |
+
$this->_currentObject->detach();
|
63 |
+
|
64 |
+
$obj = serialize($this->_currentObject);
|
65 |
+
if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
|
66 |
+
if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
|
67 |
+
$this->__destruct();
|
68 |
+
throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
|
69 |
+
}
|
70 |
+
} else {
|
71 |
+
if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
|
72 |
+
$this->__destruct();
|
73 |
+
throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
|
74 |
+
}
|
75 |
+
}
|
76 |
+
$this->_currentCellIsDirty = false;
|
77 |
+
}
|
78 |
+
|
79 |
+
$this->_currentObjectID = $this->_currentObject = null;
|
80 |
+
} // function _storeData()
|
81 |
+
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Add or Update a cell in cache identified by coordinate address
|
85 |
+
*
|
86 |
+
* @param string $pCoord Coordinate address of the cell to update
|
87 |
+
* @param PHPExcel_Cell $cell Cell to update
|
88 |
+
* @return PHPExcel_Cell
|
89 |
+
* @throws PHPExcel_Exception
|
90 |
+
*/
|
91 |
+
public function addCacheData($pCoord, PHPExcel_Cell $cell) {
|
92 |
+
if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) {
|
93 |
+
$this->_storeData();
|
94 |
+
}
|
95 |
+
$this->_cellCache[$pCoord] = true;
|
96 |
+
|
97 |
+
$this->_currentObjectID = $pCoord;
|
98 |
+
$this->_currentObject = $cell;
|
99 |
+
$this->_currentCellIsDirty = true;
|
100 |
+
|
101 |
+
return $cell;
|
102 |
+
} // function addCacheData()
|
103 |
+
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
|
107 |
+
*
|
108 |
+
* @param string $pCoord Coordinate address of the cell to check
|
109 |
+
* @return boolean
|
110 |
+
*/
|
111 |
+
public function isDataSet($pCoord) {
|
112 |
+
// Check if the requested entry is the current object, or exists in the cache
|
113 |
+
if (parent::isDataSet($pCoord)) {
|
114 |
+
if ($this->_currentObjectID == $pCoord) {
|
115 |
+
return true;
|
116 |
+
}
|
117 |
+
// Check if the requested entry still exists in cache
|
118 |
+
$success = wincache_ucache_exists($this->_cachePrefix.$pCoord.'.cache');
|
119 |
+
if ($success === false) {
|
120 |
+
// Entry no longer exists in Wincache, so clear it from the cache array
|
121 |
+
parent::deleteCacheData($pCoord);
|
122 |
+
throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
|
123 |
+
}
|
124 |
+
return true;
|
125 |
+
}
|
126 |
+
return false;
|
127 |
+
} // function isDataSet()
|
128 |
+
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Get cell at a specific coordinate
|
132 |
+
*
|
133 |
+
* @param string $pCoord Coordinate of the cell
|
134 |
+
* @throws PHPExcel_Exception
|
135 |
+
* @return PHPExcel_Cell Cell that was found, or null if not found
|
136 |
+
*/
|
137 |
+
public function getCacheData($pCoord) {
|
138 |
+
if ($pCoord === $this->_currentObjectID) {
|
139 |
+
return $this->_currentObject;
|
140 |
+
}
|
141 |
+
$this->_storeData();
|
142 |
+
|
143 |
+
// Check if the entry that has been requested actually exists
|
144 |
+
$obj = null;
|
145 |
+
if (parent::isDataSet($pCoord)) {
|
146 |
+
$success = false;
|
147 |
+
$obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
|
148 |
+
if ($success === false) {
|
149 |
+
// Entry no longer exists in WinCache, so clear it from the cache array
|
150 |
+
parent::deleteCacheData($pCoord);
|
151 |
+
throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
|
152 |
+
}
|
153 |
+
} else {
|
154 |
+
// Return null if requested entry doesn't exist in cache
|
155 |
+
return null;
|
156 |
+
}
|
157 |
+
|
158 |
+
// Set current entry to the requested entry
|
159 |
+
$this->_currentObjectID = $pCoord;
|
160 |
+
$this->_currentObject = unserialize($obj);
|
161 |
+
// Re-attach this as the cell's parent
|
162 |
+
$this->_currentObject->attach($this);
|
163 |
+
|
164 |
+
// Return requested entry
|
165 |
+
return $this->_currentObject;
|
166 |
+
} // function getCacheData()
|
167 |
+
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Get a list of all cell addresses currently held in cache
|
171 |
+
*
|
172 |
+
* @return string[]
|
173 |
+
*/
|
174 |
+
public function getCellList() {
|
175 |
+
if ($this->_currentObjectID !== null) {
|
176 |
+
$this->_storeData();
|
177 |
+
}
|
178 |
+
|
179 |
+
return parent::getCellList();
|
180 |
+
}
|
181 |
+
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Delete a cell in cache identified by coordinate address
|
185 |
+
*
|
186 |
+
* @param string $pCoord Coordinate address of the cell to delete
|
187 |
+
* @throws PHPExcel_Exception
|
188 |
+
*/
|
189 |
+
public function deleteCacheData($pCoord) {
|
190 |
+
// Delete the entry from Wincache
|
191 |
+
wincache_ucache_delete($this->_cachePrefix.$pCoord.'.cache');
|
192 |
+
|
193 |
+
// Delete the entry from our cell address array
|
194 |
+
parent::deleteCacheData($pCoord);
|
195 |
+
} // function deleteCacheData()
|
196 |
+
|
197 |
+
|
198 |
+
/**
|
199 |
+
* Clone the cell collection
|
200 |
+
*
|
201 |
+
* @param PHPExcel_Worksheet $parent The new worksheet
|
202 |
+
* @return void
|
203 |
+
*/
|
204 |
+
public function copyCellCollection(PHPExcel_Worksheet $parent) {
|
205 |
+
parent::copyCellCollection($parent);
|
206 |
+
// Get a new id for the new file name
|
207 |
+
$baseUnique = $this->_getUniqueID();
|
208 |
+
$newCachePrefix = substr(md5($baseUnique),0,8).'.';
|
209 |
+
$cacheList = $this->getCellList();
|
210 |
+
foreach($cacheList as $cellID) {
|
211 |
+
if ($cellID != $this->_currentObjectID) {
|
212 |
+
$success = false;
|
213 |
+
$obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
|
214 |
+
if ($success === false) {
|
215 |
+
// Entry no longer exists in WinCache, so clear it from the cache array
|
216 |
+
parent::deleteCacheData($cellID);
|
217 |
+
throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');
|
218 |
+
}
|
219 |
+
if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
|
220 |
+
$this->__destruct();
|
221 |
+
throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');
|
222 |
+
}
|
223 |
+
}
|
224 |
+
}
|
225 |
+
$this->_cachePrefix = $newCachePrefix;
|
226 |
+
} // function copyCellCollection()
|
227 |
+
|
228 |
+
|
229 |
+
/**
|
230 |
+
* Clear the cell collection and disconnect from our parent
|
231 |
+
*
|
232 |
+
* @return void
|
233 |
+
*/
|
234 |
+
public function unsetWorksheetCells() {
|
235 |
+
if(!is_null($this->_currentObject)) {
|
236 |
+
$this->_currentObject->detach();
|
237 |
+
$this->_currentObject = $this->_currentObjectID = null;
|
238 |
+
}
|
239 |
+
|
240 |
+
// Flush the WinCache cache
|
241 |
+
$this->__destruct();
|
242 |
+
|
243 |
+
$this->_cellCache = array();
|
244 |
+
|
245 |
+
// detach ourself from the worksheet, so that it can then delete this object successfully
|
246 |
+
$this->_parent = null;
|
247 |
+
} // function unsetWorksheetCells()
|
248 |
+
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Initialise this new cell collection
|
252 |
+
*
|
253 |
+
* @param PHPExcel_Worksheet $parent The worksheet for this cell collection
|
254 |
+
* @param array of mixed $arguments Additional initialisation arguments
|
255 |
+
*/
|
256 |
+
public function __construct(PHPExcel_Worksheet $parent, $arguments) {
|
257 |
+
$cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
|
258 |
+
|
259 |
+
if (is_null($this->_cachePrefix)) {
|
260 |
+
$baseUnique = $this->_getUniqueID();
|
261 |
+
$this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
|
262 |
+
$this->_cacheTime = $cacheTime;
|
263 |
+
|
264 |
+
parent::__construct($parent);
|
265 |
+
}
|
266 |
+
} // function __construct()
|
267 |
+
|
268 |
+
|
269 |
+
/**
|
270 |
+
* Destroy this cell collection
|
271 |
+
*/
|
272 |
+
public function __destruct() {
|
273 |
+
$cacheList = $this->getCellList();
|
274 |
+
foreach($cacheList as $cellID) {
|
275 |
+
wincache_ucache_delete($this->_cachePrefix.$cellID.'.cache');
|
276 |
+
}
|
277 |
+
} // function __destruct()
|
278 |
+
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Identify whether the caching method is currently available
|
282 |
+
* Some methods are dependent on the availability of certain extensions being enabled in the PHP build
|
283 |
+
*
|
284 |
+
* @return boolean
|
285 |
+
*/
|
286 |
+
public static function cacheMethodIsAvailable() {
|
287 |
+
if (!function_exists('wincache_ucache_add')) {
|
288 |
+
return false;
|
289 |
+
}
|
290 |
+
|
291 |
+
return true;
|
292 |
+
}
|
293 |
+
|
294 |
+
}
|
classes/PHPExcel/locale/sv/functions
CHANGED
@@ -1,408 +1,408 @@
|
|
1 |
-
##
|
2 |
-
## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner
|
3 |
-
##
|
4 |
-
GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport
|
5 |
-
|
6 |
-
|
7 |
-
##
|
8 |
-
## Cube functions Kubfunktioner
|
9 |
-
##
|
10 |
-
CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat.
|
11 |
-
CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben.
|
12 |
-
CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen.
|
13 |
-
CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna.
|
14 |
-
CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel.
|
15 |
-
CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning.
|
16 |
-
CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub.
|
17 |
-
|
18 |
-
|
19 |
-
##
|
20 |
-
## Database functions Databasfunktioner
|
21 |
-
##
|
22 |
-
DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna
|
23 |
-
DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas
|
24 |
-
DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas
|
25 |
-
DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren
|
26 |
-
DMAX = DMAX ## Returnerar det största värdet från databasposterna
|
27 |
-
DMIN = DMIN ## Returnerar det minsta värdet från databasposterna
|
28 |
-
DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret
|
29 |
-
DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna
|
30 |
-
DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter
|
31 |
-
DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret
|
32 |
-
DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna
|
33 |
-
DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter
|
34 |
-
|
35 |
-
|
36 |
-
##
|
37 |
-
## Date and time functions Tid- och datumfunktioner
|
38 |
-
##
|
39 |
-
DATE = DATUM ## Returnerar ett serienummer för ett visst datum
|
40 |
-
DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer
|
41 |
-
DAY = DAG ## Konverterar ett serienummer till dag i månaden
|
42 |
-
DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår
|
43 |
-
EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet
|
44 |
-
EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare
|
45 |
-
HOUR = TIMME ## Konverterar ett serienummer till en timme
|
46 |
-
MINUTE = MINUT ## Konverterar ett serienummer till en minut
|
47 |
-
MONTH = MÅNAD ## Konverterar ett serienummer till en månad
|
48 |
-
NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum
|
49 |
-
NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid
|
50 |
-
SECOND = SEKUND ## Konverterar ett serienummer till en sekund
|
51 |
-
TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid
|
52 |
-
TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer
|
53 |
-
TODAY = IDAG ## Returnerar serienumret för dagens datum
|
54 |
-
WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan
|
55 |
-
WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer
|
56 |
-
WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare
|
57 |
-
YEAR = ÅR ## Konverterar ett serienummer till ett år
|
58 |
-
YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum
|
59 |
-
|
60 |
-
|
61 |
-
##
|
62 |
-
## Engineering functions Tekniska funktioner
|
63 |
-
##
|
64 |
-
BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x)
|
65 |
-
BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x)
|
66 |
-
BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x)
|
67 |
-
BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x)
|
68 |
-
BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt
|
69 |
-
BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt
|
70 |
-
BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt
|
71 |
-
COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal
|
72 |
-
CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat
|
73 |
-
DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt
|
74 |
-
DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt
|
75 |
-
DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt
|
76 |
-
DELTA = DELTA ## Testar om två värden är lika
|
77 |
-
ERF = FELF ## Returnerar felfunktionen
|
78 |
-
ERFC = FELFK ## Returnerar den komplementära felfunktionen
|
79 |
-
GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde
|
80 |
-
HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt
|
81 |
-
HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt
|
82 |
-
HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt
|
83 |
-
IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal
|
84 |
-
IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal
|
85 |
-
IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer
|
86 |
-
IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat
|
87 |
-
IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal
|
88 |
-
IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal
|
89 |
-
IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal
|
90 |
-
IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal
|
91 |
-
IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal
|
92 |
-
IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal
|
93 |
-
IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent
|
94 |
-
IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal
|
95 |
-
IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal
|
96 |
-
IMSIN = IMSIN ## Returnerar sinus för ett komplext tal
|
97 |
-
IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal
|
98 |
-
IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal
|
99 |
-
IMSUM = IMSUM ## Returnerar summan av komplexa tal
|
100 |
-
OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt
|
101 |
-
OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt
|
102 |
-
OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt
|
103 |
-
|
104 |
-
|
105 |
-
##
|
106 |
-
## Financial functions Finansiella funktioner
|
107 |
-
##
|
108 |
-
ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta
|
109 |
-
ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen
|
110 |
-
AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient
|
111 |
-
AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod
|
112 |
-
COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen
|
113 |
-
COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet
|
114 |
-
COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum
|
115 |
-
COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen
|
116 |
-
COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen
|
117 |
-
COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen
|
118 |
-
CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder
|
119 |
-
CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder
|
120 |
-
DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning
|
121 |
-
DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger
|
122 |
-
DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper
|
123 |
-
DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal
|
124 |
-
DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk
|
125 |
-
DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar
|
126 |
-
EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen
|
127 |
-
FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering
|
128 |
-
FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer
|
129 |
-
INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper
|
130 |
-
IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period
|
131 |
-
IRR = IR ## Returnerar internräntan för en serie betalningar
|
132 |
-
ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod
|
133 |
-
MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr
|
134 |
-
MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor
|
135 |
-
NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen
|
136 |
-
NPER = PERIODER ## Returnerar antalet perioder för en investering
|
137 |
-
NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta
|
138 |
-
ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period
|
139 |
-
ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period
|
140 |
-
ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period
|
141 |
-
ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period
|
142 |
-
PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet
|
143 |
-
PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period
|
144 |
-
PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta
|
145 |
-
PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper
|
146 |
-
PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen
|
147 |
-
PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar
|
148 |
-
RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet
|
149 |
-
RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper
|
150 |
-
SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period
|
151 |
-
SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period
|
152 |
-
TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel
|
153 |
-
TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel
|
154 |
-
TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel
|
155 |
-
VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning)
|
156 |
-
XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska
|
157 |
-
XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska
|
158 |
-
YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta
|
159 |
-
YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel
|
160 |
-
YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen
|
161 |
-
|
162 |
-
|
163 |
-
##
|
164 |
-
## Information functions Informationsfunktioner
|
165 |
-
##
|
166 |
-
CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell
|
167 |
-
ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde
|
168 |
-
INFO = INFO ## Returnerar information om operativsystemet
|
169 |
-
ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt
|
170 |
-
ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS!
|
171 |
-
ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde
|
172 |
-
ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt
|
173 |
-
ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde
|
174 |
-
ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS!
|
175 |
-
ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text
|
176 |
-
ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal
|
177 |
-
ISODD = ÄRUDDA ## Returnerar SANT om talet är udda
|
178 |
-
ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens
|
179 |
-
ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text
|
180 |
-
N = N ## Returnerar ett värde omvandlat till ett tal
|
181 |
-
NA = SAKNAS ## Returnerar felvärdet #SAKNAS!
|
182 |
-
TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp
|
183 |
-
|
184 |
-
|
185 |
-
##
|
186 |
-
## Logical functions Logiska funktioner
|
187 |
-
##
|
188 |
-
AND = OCH ## Returnerar SANT om alla argument är sanna
|
189 |
-
FALSE = FALSKT ## Returnerar det logiska värdet FALSKT
|
190 |
-
IF = OM ## Anger vilket logiskt test som ska utföras
|
191 |
-
IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln
|
192 |
-
NOT = ICKE ## Inverterar logiken för argumenten
|
193 |
-
OR = ELLER ## Returnerar SANT om något argument är SANT
|
194 |
-
TRUE = SANT ## Returnerar det logiska värdet SANT
|
195 |
-
|
196 |
-
|
197 |
-
##
|
198 |
-
## Lookup and reference functions Sök- och referensfunktioner
|
199 |
-
##
|
200 |
-
ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad
|
201 |
-
AREAS = OMRÅDEN ## Returnerar antalet områden i en referens
|
202 |
-
CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden
|
203 |
-
COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens
|
204 |
-
COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens
|
205 |
-
HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell
|
206 |
-
HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet
|
207 |
-
INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris
|
208 |
-
INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde
|
209 |
-
LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris
|
210 |
-
MATCH = PASSA ## Letar upp värden i en referens eller matris
|
211 |
-
OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens
|
212 |
-
ROW = RAD ## Returnerar radnumret för en referens
|
213 |
-
ROWS = RADER ## Returnerar antalet rader i en referens
|
214 |
-
RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).)
|
215 |
-
TRANSPOSE = TRANSPONERA ## Transponerar en matris
|
216 |
-
VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell
|
217 |
-
|
218 |
-
|
219 |
-
##
|
220 |
-
## Math and trigonometry functions Matematiska och trigonometriska funktioner
|
221 |
-
##
|
222 |
-
ABS = ABS ## Returnerar absolutvärdet av ett tal
|
223 |
-
ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal
|
224 |
-
ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal
|
225 |
-
ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal
|
226 |
-
ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal
|
227 |
-
ATAN = ARCTAN ## Returnerar arcus tangens för ett tal
|
228 |
-
ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat
|
229 |
-
ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal
|
230 |
-
CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel
|
231 |
-
COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt
|
232 |
-
COS = COS ## Returnerar cosinus för ett tal
|
233 |
-
COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal
|
234 |
-
DEGREES = GRADER ## Omvandlar radianer till grader
|
235 |
-
EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal
|
236 |
-
EXP = EXP ## Returnerar e upphöjt till ett givet tal
|
237 |
-
FACT = FAKULTET ## Returnerar fakulteten för ett tal
|
238 |
-
FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal
|
239 |
-
FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll
|
240 |
-
GCD = SGD ## Returnerar den största gemensamma nämnaren
|
241 |
-
INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal
|
242 |
-
LCM = MGM ## Returnerar den minsta gemensamma multipeln
|
243 |
-
LN = LN ## Returnerar den naturliga logaritmen för ett tal
|
244 |
-
LOG = LOG ## Returnerar logaritmen för ett tal för en given bas
|
245 |
-
LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal
|
246 |
-
MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris
|
247 |
-
MINVERSE = MINVERT ## Returnerar matrisinversen av en matris
|
248 |
-
MMULT = MMULT ## Returnerar matrisprodukten av två matriser
|
249 |
-
MOD = REST ## Returnerar resten vid en division
|
250 |
-
MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel
|
251 |
-
MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal
|
252 |
-
ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal
|
253 |
-
PI = PI ## Returnerar värdet pi
|
254 |
-
POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent
|
255 |
-
PRODUCT = PRODUKT ## Multiplicerar argumenten
|
256 |
-
QUOTIENT = KVOT ## Returnerar heltalsdelen av en division
|
257 |
-
RADIANS = RADIANER ## Omvandlar grader till radianer
|
258 |
-
RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1
|
259 |
-
RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger
|
260 |
-
ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text
|
261 |
-
ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror
|
262 |
-
ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll
|
263 |
-
ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll
|
264 |
-
SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln
|
265 |
-
SIGN = TECKEN ## Returnerar tecknet för ett tal
|
266 |
-
SIN = SIN ## Returnerar sinus för en given vinkel
|
267 |
-
SINH = SINH ## Returnerar hyperbolisk sinus för ett tal
|
268 |
-
SQRT = ROT ## Returnerar den positiva kvadratroten
|
269 |
-
SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi)
|
270 |
-
SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas
|
271 |
-
SUM = SUMMA ## Summerar argumenten
|
272 |
-
SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor
|
273 |
-
SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier
|
274 |
-
SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter
|
275 |
-
SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater
|
276 |
-
SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser
|
277 |
-
SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser
|
278 |
-
SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser
|
279 |
-
TAN = TAN ## Returnerar tangens för ett tal
|
280 |
-
TANH = TANH ## Returnerar hyperbolisk tangens för ett tal
|
281 |
-
TRUNC = AVKORTA ## Avkortar ett tal till ett heltal
|
282 |
-
|
283 |
-
|
284 |
-
##
|
285 |
-
## Statistical functions Statistiska funktioner
|
286 |
-
##
|
287 |
-
AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde
|
288 |
-
AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten
|
289 |
-
AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden
|
290 |
-
AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium
|
291 |
-
AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor.
|
292 |
-
BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen
|
293 |
-
BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning
|
294 |
-
BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen
|
295 |
-
CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen
|
296 |
-
CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen
|
297 |
-
CHITEST = CHI2TEST ## Returnerar oberoendetesten
|
298 |
-
CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde
|
299 |
-
CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder
|
300 |
-
COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten
|
301 |
-
COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten
|
302 |
-
COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område
|
303 |
-
COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor.
|
304 |
-
COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor.
|
305 |
-
COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser
|
306 |
-
CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde
|
307 |
-
DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser
|
308 |
-
EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen
|
309 |
-
FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen
|
310 |
-
FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen
|
311 |
-
FISHER = FISHER ## Returnerar Fisher-transformationen
|
312 |
-
FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen
|
313 |
-
FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje
|
314 |
-
FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris
|
315 |
-
FTEST = FTEST ## Returnerar resultatet av en F-test
|
316 |
-
GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen
|
317 |
-
GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen
|
318 |
-
GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x)
|
319 |
-
GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet
|
320 |
-
GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend
|
321 |
-
HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet
|
322 |
-
HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen
|
323 |
-
INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje
|
324 |
-
KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data
|
325 |
-
LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data
|
326 |
-
LINEST = REGR ## Returnerar parametrar till en linjär trendlinje
|
327 |
-
LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend
|
328 |
-
LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen
|
329 |
-
LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen
|
330 |
-
MAX = MAX ## Returnerar det största värdet i en lista av argument
|
331 |
-
MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden
|
332 |
-
MEDIAN = MEDIAN ## Returnerar medianen för angivna tal
|
333 |
-
MIN = MIN ## Returnerar det minsta värdet i en lista med argument
|
334 |
-
MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden
|
335 |
-
MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd
|
336 |
-
NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen
|
337 |
-
NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen
|
338 |
-
NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen
|
339 |
-
NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen
|
340 |
-
NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen
|
341 |
-
PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt
|
342 |
-
PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område
|
343 |
-
PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd
|
344 |
-
PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt
|
345 |
-
POISSON = POISSON ## Returnerar Poisson-fördelningen
|
346 |
-
PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser
|
347 |
-
QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data
|
348 |
-
RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal
|
349 |
-
RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient
|
350 |
-
SKEW = SNEDHET ## Returnerar snedheten för en fördelning
|
351 |
-
SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje
|
352 |
-
SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data
|
353 |
-
STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde
|
354 |
-
STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval
|
355 |
-
STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden
|
356 |
-
STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen
|
357 |
-
STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden
|
358 |
-
STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen
|
359 |
-
TDIST = TFÖRD ## Returnerar Students t-fördelning
|
360 |
-
TINV = TINV ## Returnerar inversen till Students t-fördelning
|
361 |
-
TREND = TREND ## Returnerar värden längs en linjär trend
|
362 |
-
TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd
|
363 |
-
TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test
|
364 |
-
VAR = VARIANS ## Uppskattar variansen baserat på ett urval
|
365 |
-
VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden
|
366 |
-
VARP = VARIANSP ## Beräknar variansen baserat på hela populationen
|
367 |
-
VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden
|
368 |
-
WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen
|
369 |
-
ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test
|
370 |
-
|
371 |
-
|
372 |
-
##
|
373 |
-
## Text functions Textfunktioner
|
374 |
-
##
|
375 |
-
ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte)
|
376 |
-
BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht)
|
377 |
-
CHAR = TECKENKOD ## Returnerar tecknet som anges av kod
|
378 |
-
CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text
|
379 |
-
CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng
|
380 |
-
CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng
|
381 |
-
DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat
|
382 |
-
EXACT = EXAKT ## Kontrollerar om två textvärden är identiska
|
383 |
-
FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler)
|
384 |
-
FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler)
|
385 |
-
FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler
|
386 |
-
JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte)
|
387 |
-
LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng
|
388 |
-
LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng
|
389 |
-
LEN = LÄNGD ## Returnerar antalet tecken i en textsträng
|
390 |
-
LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng
|
391 |
-
LOWER = GEMENER ## Omvandlar text till gemener
|
392 |
-
MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger
|
393 |
-
MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger
|
394 |
-
PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng
|
395 |
-
PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal
|
396 |
-
REPLACE = ERSÄTT ## Ersätter tecken i text
|
397 |
-
REPLACEB = ERSÄTTB ## Ersätter tecken i text
|
398 |
-
REPT = REP ## Upprepar en text ett bestämt antal gånger
|
399 |
-
RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng
|
400 |
-
RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng
|
401 |
-
SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
|
402 |
-
SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
|
403 |
-
SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng
|
404 |
-
T = T ## Omvandlar argumenten till text
|
405 |
-
TEXT = TEXT ## Formaterar ett tal och omvandlar det till text
|
406 |
-
TRIM = RENSA ## Tar bort blanksteg från text
|
407 |
-
UPPER = VERSALER ## Omvandlar text till versaler
|
408 |
-
VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal
|
1 |
+
##
|
2 |
+
## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner
|
3 |
+
##
|
4 |
+
GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport
|
5 |
+
|
6 |
+
|
7 |
+
##
|
8 |
+
## Cube functions Kubfunktioner
|
9 |
+
##
|
10 |
+
CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat.
|
11 |
+
CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben.
|
12 |
+
CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen.
|
13 |
+
CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna.
|
14 |
+
CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel.
|
15 |
+
CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning.
|
16 |
+
CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub.
|
17 |
+
|
18 |
+
|
19 |
+
##
|
20 |
+
## Database functions Databasfunktioner
|
21 |
+
##
|
22 |
+
DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna
|
23 |
+
DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas
|
24 |
+
DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas
|
25 |
+
DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren
|
26 |
+
DMAX = DMAX ## Returnerar det största värdet från databasposterna
|
27 |
+
DMIN = DMIN ## Returnerar det minsta värdet från databasposterna
|
28 |
+
DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret
|
29 |
+
DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna
|
30 |
+
DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter
|
31 |
+
DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret
|
32 |
+
DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna
|
33 |
+
DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter
|
34 |
+
|
35 |
+
|
36 |
+
##
|
37 |
+
## Date and time functions Tid- och datumfunktioner
|
38 |
+
##
|
39 |
+
DATE = DATUM ## Returnerar ett serienummer för ett visst datum
|
40 |
+
DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer
|
41 |
+
DAY = DAG ## Konverterar ett serienummer till dag i månaden
|
42 |
+
DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår
|
43 |
+
EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet
|
44 |
+
EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare
|
45 |
+
HOUR = TIMME ## Konverterar ett serienummer till en timme
|
46 |
+
MINUTE = MINUT ## Konverterar ett serienummer till en minut
|
47 |
+
MONTH = MÅNAD ## Konverterar ett serienummer till en månad
|
48 |
+
NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum
|
49 |
+
NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid
|
50 |
+
SECOND = SEKUND ## Konverterar ett serienummer till en sekund
|
51 |
+
TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid
|
52 |
+
TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer
|
53 |
+
TODAY = IDAG ## Returnerar serienumret för dagens datum
|
54 |
+
WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan
|
55 |
+
WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer
|
56 |
+
WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare
|
57 |
+
YEAR = ÅR ## Konverterar ett serienummer till ett år
|
58 |
+
YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum
|
59 |
+
|
60 |
+
|
61 |
+
##
|
62 |
+
## Engineering functions Tekniska funktioner
|
63 |
+
##
|
64 |
+
BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x)
|
65 |
+
BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x)
|
66 |
+
BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x)
|
67 |
+
BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x)
|
68 |
+
BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt
|
69 |
+
BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt
|
70 |
+
BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt
|
71 |
+
COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal
|
72 |
+
CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat
|
73 |
+
DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt
|
74 |
+
DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt
|
75 |
+
DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt
|
76 |
+
DELTA = DELTA ## Testar om två värden är lika
|
77 |
+
ERF = FELF ## Returnerar felfunktionen
|
78 |
+
ERFC = FELFK ## Returnerar den komplementära felfunktionen
|
79 |
+
GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde
|
80 |
+
HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt
|
81 |
+
HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt
|
82 |
+
HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt
|
83 |
+
IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal
|
84 |
+
IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal
|
85 |
+
IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer
|
86 |
+
IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat
|
87 |
+
IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal
|
88 |
+
IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal
|
89 |
+
IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal
|
90 |
+
IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal
|
91 |
+
IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal
|
92 |
+
IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal
|
93 |
+
IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent
|
94 |
+
IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal
|
95 |
+
IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal
|
96 |
+
IMSIN = IMSIN ## Returnerar sinus för ett komplext tal
|
97 |
+
IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal
|
98 |
+
IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal
|
99 |
+
IMSUM = IMSUM ## Returnerar summan av komplexa tal
|
100 |
+
OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt
|
101 |
+
OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt
|
102 |
+
OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt
|
103 |
+
|
104 |
+
|
105 |
+
##
|
106 |
+
## Financial functions Finansiella funktioner
|
107 |
+
##
|
108 |
+
ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta
|
109 |
+
ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen
|
110 |
+
AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient
|
111 |
+
AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod
|
112 |
+
COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen
|
113 |
+
COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet
|
114 |
+
COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum
|
115 |
+
COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen
|
116 |
+
COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen
|
117 |
+
COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen
|
118 |
+
CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder
|
119 |
+
CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder
|
120 |
+
DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning
|
121 |
+
DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger
|
122 |
+
DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper
|
123 |
+
DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal
|
124 |
+
DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk
|
125 |
+
DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar
|
126 |
+
EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen
|
127 |
+
FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering
|
128 |
+
FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer
|
129 |
+
INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper
|
130 |
+
IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period
|
131 |
+
IRR = IR ## Returnerar internräntan för en serie betalningar
|
132 |
+
ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod
|
133 |
+
MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr
|
134 |
+
MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor
|
135 |
+
NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen
|
136 |
+
NPER = PERIODER ## Returnerar antalet perioder för en investering
|
137 |
+
NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta
|
138 |
+
ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period
|
139 |
+
ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period
|
140 |
+
ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period
|
141 |
+
ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period
|
142 |
+
PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet
|
143 |
+
PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period
|
144 |
+
PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta
|
145 |
+
PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper
|
146 |
+
PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen
|
147 |
+
PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar
|
148 |
+
RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet
|
149 |
+
RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper
|
150 |
+
SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period
|
151 |
+
SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period
|
152 |
+
TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel
|
153 |
+
TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel
|
154 |
+
TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel
|
155 |
+
VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning)
|
156 |
+
XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska
|
157 |
+
XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska
|
158 |
+
YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta
|
159 |
+
YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel
|
160 |
+
YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen
|
161 |
+
|
162 |
+
|
163 |
+
##
|
164 |
+
## Information functions Informationsfunktioner
|
165 |
+
##
|
166 |
+
CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell
|
167 |
+
ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde
|
168 |
+
INFO = INFO ## Returnerar information om operativsystemet
|
169 |
+
ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt
|
170 |
+
ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS!
|
171 |
+
ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde
|
172 |
+
ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt
|
173 |
+
ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde
|
174 |
+
ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS!
|
175 |
+
ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text
|
176 |
+
ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal
|
177 |
+
ISODD = ÄRUDDA ## Returnerar SANT om talet är udda
|
178 |
+
ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens
|
179 |
+
ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text
|
180 |
+
N = N ## Returnerar ett värde omvandlat till ett tal
|
181 |
+
NA = SAKNAS ## Returnerar felvärdet #SAKNAS!
|
182 |
+
TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp
|
183 |
+
|
184 |
+
|
185 |
+
##
|
186 |
+
## Logical functions Logiska funktioner
|
187 |
+
##
|
188 |
+
AND = OCH ## Returnerar SANT om alla argument är sanna
|
189 |
+
FALSE = FALSKT ## Returnerar det logiska värdet FALSKT
|
190 |
+
IF = OM ## Anger vilket logiskt test som ska utföras
|
191 |
+
IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln
|
192 |
+
NOT = ICKE ## Inverterar logiken för argumenten
|
193 |
+
OR = ELLER ## Returnerar SANT om något argument är SANT
|
194 |
+
TRUE = SANT ## Returnerar det logiska värdet SANT
|
195 |
+
|
196 |
+
|
197 |
+
##
|
198 |
+
## Lookup and reference functions Sök- och referensfunktioner
|
199 |
+
##
|
200 |
+
ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad
|
201 |
+
AREAS = OMRÅDEN ## Returnerar antalet områden i en referens
|
202 |
+
CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden
|
203 |
+
COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens
|
204 |
+
COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens
|
205 |
+
HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell
|
206 |
+
HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet
|
207 |
+
INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris
|
208 |
+
INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde
|
209 |
+
LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris
|
210 |
+
MATCH = PASSA ## Letar upp värden i en referens eller matris
|
211 |
+
OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens
|
212 |
+
ROW = RAD ## Returnerar radnumret för en referens
|
213 |
+
ROWS = RADER ## Returnerar antalet rader i en referens
|
214 |
+
RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).)
|
215 |
+
TRANSPOSE = TRANSPONERA ## Transponerar en matris
|
216 |
+
VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell
|
217 |
+
|
218 |
+
|
219 |
+
##
|
220 |
+
## Math and trigonometry functions Matematiska och trigonometriska funktioner
|
221 |
+
##
|
222 |
+
ABS = ABS ## Returnerar absolutvärdet av ett tal
|
223 |
+
ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal
|
224 |
+
ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal
|
225 |
+
ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal
|
226 |
+
ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal
|
227 |
+
ATAN = ARCTAN ## Returnerar arcus tangens för ett tal
|
228 |
+
ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat
|
229 |
+
ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal
|
230 |
+
CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel
|
231 |
+
COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt
|
232 |
+
COS = COS ## Returnerar cosinus för ett tal
|
233 |
+
COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal
|
234 |
+
DEGREES = GRADER ## Omvandlar radianer till grader
|
235 |
+
EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal
|
236 |
+
EXP = EXP ## Returnerar e upphöjt till ett givet tal
|
237 |
+
FACT = FAKULTET ## Returnerar fakulteten för ett tal
|
238 |
+
FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal
|
239 |
+
FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll
|
240 |
+
GCD = SGD ## Returnerar den största gemensamma nämnaren
|
241 |
+
INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal
|
242 |
+
LCM = MGM ## Returnerar den minsta gemensamma multipeln
|
243 |
+
LN = LN ## Returnerar den naturliga logaritmen för ett tal
|
244 |
+
LOG = LOG ## Returnerar logaritmen för ett tal för en given bas
|
245 |
+
LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal
|
246 |
+
MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris
|
247 |
+
MINVERSE = MINVERT ## Returnerar matrisinversen av en matris
|
248 |
+
MMULT = MMULT ## Returnerar matrisprodukten av två matriser
|
249 |
+
MOD = REST ## Returnerar resten vid en division
|
250 |
+
MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel
|
251 |
+
MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal
|
252 |
+
ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal
|
253 |
+
PI = PI ## Returnerar värdet pi
|
254 |
+
POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent
|
255 |
+
PRODUCT = PRODUKT ## Multiplicerar argumenten
|
256 |
+
QUOTIENT = KVOT ## Returnerar heltalsdelen av en division
|
257 |
+
RADIANS = RADIANER ## Omvandlar grader till radianer
|
258 |
+
RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1
|
259 |
+
RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger
|
260 |
+
ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text
|
261 |
+
ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror
|
262 |
+
ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll
|
263 |
+
ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll
|
264 |
+
SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln
|
265 |
+
SIGN = TECKEN ## Returnerar tecknet för ett tal
|
266 |
+
SIN = SIN ## Returnerar sinus för en given vinkel
|
267 |
+
SINH = SINH ## Returnerar hyperbolisk sinus för ett tal
|
268 |
+
SQRT = ROT ## Returnerar den positiva kvadratroten
|
269 |
+
SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi)
|
270 |
+
SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas
|
271 |
+
SUM = SUMMA ## Summerar argumenten
|
272 |
+
SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor
|
273 |
+
SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier
|
274 |
+
SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter
|
275 |
+
SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater
|
276 |
+
SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser
|
277 |
+
SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser
|
278 |
+
SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser
|
279 |
+
TAN = TAN ## Returnerar tangens för ett tal
|
280 |
+
TANH = TANH ## Returnerar hyperbolisk tangens för ett tal
|
281 |
+
TRUNC = AVKORTA ## Avkortar ett tal till ett heltal
|
282 |
+
|
283 |
+
|
284 |
+
##
|
285 |
+
## Statistical functions Statistiska funktioner
|
286 |
+
##
|
287 |
+
AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde
|
288 |
+
AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten
|
289 |
+
AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden
|
290 |
+
AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium
|
291 |
+
AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor.
|
292 |
+
BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen
|
293 |
+
BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning
|
294 |
+
BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen
|
295 |
+
CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen
|
296 |
+
CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen
|
297 |
+
CHITEST = CHI2TEST ## Returnerar oberoendetesten
|
298 |
+
CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde
|
299 |
+
CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder
|
300 |
+
COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten
|
301 |
+
COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten
|
302 |
+
COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område
|
303 |
+
COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor.
|
304 |
+
COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor.
|
305 |
+
COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser
|
306 |
+
CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde
|
307 |
+
DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser
|
308 |
+
EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen
|
309 |
+
FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen
|
310 |
+
FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen
|
311 |
+
FISHER = FISHER ## Returnerar Fisher-transformationen
|
312 |
+
FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen
|
313 |
+
FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje
|
314 |
+
FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris
|
315 |
+
FTEST = FTEST ## Returnerar resultatet av en F-test
|
316 |
+
GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen
|
317 |
+
GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen
|
318 |
+
GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x)
|
319 |
+
GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet
|
320 |
+
GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend
|
321 |
+
HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet
|
322 |
+
HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen
|
323 |
+
INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje
|
324 |
+
KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data
|
325 |
+
LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data
|
326 |
+
LINEST = REGR ## Returnerar parametrar till en linjär trendlinje
|
327 |
+
LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend
|
328 |
+
LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen
|
329 |
+
LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen
|
330 |
+
MAX = MAX ## Returnerar det största värdet i en lista av argument
|
331 |
+
MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden
|
332 |
+
MEDIAN = MEDIAN ## Returnerar medianen för angivna tal
|
333 |
+
MIN = MIN ## Returnerar det minsta värdet i en lista med argument
|
334 |
+
MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden
|
335 |
+
MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd
|
336 |
+
NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen
|
337 |
+
NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen
|
338 |
+
NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen
|
339 |
+
NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen
|
340 |
+
NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen
|
341 |
+
PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt
|
342 |
+
PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område
|
343 |
+
PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd
|
344 |
+
PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt
|
345 |
+
POISSON = POISSON ## Returnerar Poisson-fördelningen
|
346 |
+
PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser
|
347 |
+
QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data
|
348 |
+
RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal
|
349 |
+
RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient
|
350 |
+
SKEW = SNEDHET ## Returnerar snedheten för en fördelning
|
351 |
+
SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje
|
352 |
+
SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data
|
353 |
+
STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde
|
354 |
+
STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval
|
355 |
+
STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden
|
356 |
+
STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen
|
357 |
+
STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden
|
358 |
+
STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen
|
359 |
+
TDIST = TFÖRD ## Returnerar Students t-fördelning
|
360 |
+
TINV = TINV ## Returnerar inversen till Students t-fördelning
|
361 |
+
TREND = TREND ## Returnerar värden längs en linjär trend
|
362 |
+
TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd
|
363 |
+
TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test
|
364 |
+
VAR = VARIANS ## Uppskattar variansen baserat på ett urval
|
365 |
+
VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden
|
366 |
+
VARP = VARIANSP ## Beräknar variansen baserat på hela populationen
|
367 |
+
VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden
|
368 |
+
WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen
|
369 |
+
ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test
|
370 |
+
|
371 |
+
|
372 |
+
##
|
373 |
+
## Text functions Textfunktioner
|
374 |
+
##
|
375 |
+
ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte)
|
376 |
+
BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht)
|
377 |
+
CHAR = TECKENKOD ## Returnerar tecknet som anges av kod
|
378 |
+
CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text
|
379 |
+
CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng
|
380 |
+
CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng
|
381 |
+
DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat
|
382 |
+
EXACT = EXAKT ## Kontrollerar om två textvärden är identiska
|
383 |
+
FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler)
|
384 |
+
FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler)
|
385 |
+
FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler
|
386 |
+
JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte)
|
387 |
+
LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng
|
388 |
+
LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng
|
389 |
+
LEN = LÄNGD ## Returnerar antalet tecken i en textsträng
|
390 |
+
LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng
|
391 |
+
LOWER = GEMENER ## Omvandlar text till gemener
|
392 |
+
MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger
|
393 |
+
MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger
|
394 |
+
PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng
|
395 |
+
PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal
|
396 |
+
REPLACE = ERSÄTT ## Ersätter tecken i text
|
397 |
+
REPLACEB = ERSÄTTB ## Ersätter tecken i text
|
398 |
+
REPT = REP ## Upprepar en text ett bestämt antal gånger
|
399 |
+
RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng
|
400 |
+
RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng
|
401 |
+
SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
|
402 |
+
SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
|
403 |
+
SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng
|
404 |
+
T = T ## Omvandlar argumenten till text
|
405 |
+
TEXT = TEXT ## Formaterar ett tal och omvandlar det till text
|
406 |
+
TRIM = RENSA ## Tar bort blanksteg från text
|
407 |
+
UPPER = VERSALER ## Omvandlar text till versaler
|
408 |
+
VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal
|
classes/XmlStreamReader/autoload.php
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload.php @generated by Composer
|
4 |
+
|
5 |
+
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
6 |
+
|
7 |
+
return ComposerAutoloaderInit18a81a838bde72a6ce7edd20e3ab047d::getLoader();
|
classes/XmlStreamReader/composer/ClassLoader.php
ADDED
@@ -0,0 +1,413 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* This file is part of Composer.
|
5 |
+
*
|
6 |
+
* (c) Nils Adermann <naderman@naderman.de>
|
7 |
+
* Jordi Boggiano <j.boggiano@seld.be>
|
8 |
+
*
|
9 |
+
* For the full copyright and license information, please view the LICENSE
|
10 |
+
* file that was distributed with this source code.
|
11 |
+
*/
|
12 |
+
|
13 |
+
namespace Composer\Autoload;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
17 |
+
*
|
18 |
+
* $loader = new \Composer\Autoload\ClassLoader();
|
19 |
+
*
|
20 |
+
* // register classes with namespaces
|
21 |
+
* $loader->add('Symfony\Component', __DIR__.'/component');
|
22 |
+
* $loader->add('Symfony', __DIR__.'/framework');
|
23 |
+
*
|
24 |
+
* // activate the autoloader
|
25 |
+
* $loader->register();
|
26 |
+
*
|
27 |
+
* // to enable searching the include path (eg. for PEAR packages)
|
28 |
+
* $loader->setUseIncludePath(true);
|
29 |
+
*
|
30 |
+
* In this example, if you try to use a class in the Symfony\Component
|
31 |
+
* namespace or one of its children (Symfony\Component\Console for instance),
|
32 |
+
* the autoloader will first look for the class under the component/
|
33 |
+
* directory, and it will then fallback to the framework/ directory if not
|
34 |
+
* found before giving up.
|
35 |
+
*
|
36 |
+
* This class is loosely based on the Symfony UniversalClassLoader.
|
37 |
+
*
|
38 |
+
* @author Fabien Potencier <fabien@symfony.com>
|
39 |
+
* @author Jordi Boggiano <j.boggiano@seld.be>
|
40 |
+
* @see http://www.php-fig.org/psr/psr-0/
|
41 |
+
* @see http://www.php-fig.org/psr/psr-4/
|
42 |
+
*/
|
43 |
+
class ClassLoader
|
44 |
+
{
|
45 |
+
// PSR-4
|
46 |
+
private $prefixLengthsPsr4 = array();
|
47 |
+
private $prefixDirsPsr4 = array();
|
48 |
+
private $fallbackDirsPsr4 = array();
|
49 |
+
|
50 |
+
// PSR-0
|
51 |
+
private $prefixesPsr0 = array();
|
52 |
+
private $fallbackDirsPsr0 = array();
|
53 |
+
|
54 |
+
private $useIncludePath = false;
|
55 |
+
private $classMap = array();
|
56 |
+
|
57 |
+
private $classMapAuthoritative = false;
|
58 |
+
|
59 |
+
public function getPrefixes()
|
60 |
+
{
|
61 |
+
if (!empty($this->prefixesPsr0)) {
|
62 |
+
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
63 |
+
}
|
64 |
+
|
65 |
+
return array();
|
66 |
+
}
|
67 |
+
|
68 |
+
public function getPrefixesPsr4()
|
69 |
+
{
|
70 |
+
return $this->prefixDirsPsr4;
|
71 |
+
}
|
72 |
+
|
73 |
+
public function getFallbackDirs()
|
74 |
+
{
|
75 |
+
return $this->fallbackDirsPsr0;
|
76 |
+
}
|
77 |
+
|
78 |
+
public function getFallbackDirsPsr4()
|
79 |
+
{
|
80 |
+
return $this->fallbackDirsPsr4;
|
81 |
+
}
|
82 |
+
|
83 |
+
public function getClassMap()
|
84 |
+
{
|
85 |
+
return $this->classMap;
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* @param array $classMap Class to filename map
|
90 |
+
*/
|
91 |
+
public function addClassMap(array $classMap)
|
92 |
+
{
|
93 |
+
if ($this->classMap) {
|
94 |
+
$this->classMap = array_merge($this->classMap, $classMap);
|
95 |
+
} else {
|
96 |
+
$this->classMap = $classMap;
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Registers a set of PSR-0 directories for a given prefix, either
|
102 |
+
* appending or prepending to the ones previously set for this prefix.
|
103 |
+
*
|
104 |
+
* @param string $prefix The prefix
|
105 |
+
* @param array|string $paths The PSR-0 root directories
|
106 |
+
* @param bool $prepend Whether to prepend the directories
|
107 |
+
*/
|
108 |
+
public function add($prefix, $paths, $prepend = false)
|
109 |
+
{
|
110 |
+
if (!$prefix) {
|
111 |
+
if ($prepend) {
|
112 |
+
$this->fallbackDirsPsr0 = array_merge(
|
113 |
+
(array) $paths,
|
114 |
+
$this->fallbackDirsPsr0
|
115 |
+
);
|
116 |
+
} else {
|
117 |
+
$this->fallbackDirsPsr0 = array_merge(
|
118 |
+
$this->fallbackDirsPsr0,
|
119 |
+
(array) $paths
|
120 |
+
);
|
121 |
+
}
|
122 |
+
|
123 |
+
return;
|
124 |
+
}
|
125 |
+
|
126 |
+
$first = $prefix[0];
|
127 |
+
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
128 |
+
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
129 |
+
|
130 |
+
return;
|
131 |
+
}
|
132 |
+
if ($prepend) {
|
133 |
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
134 |
+
(array) $paths,
|
135 |
+
$this->prefixesPsr0[$first][$prefix]
|
136 |
+
);
|
137 |
+
} else {
|
138 |
+
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
139 |
+
$this->prefixesPsr0[$first][$prefix],
|
140 |
+
(array) $paths
|
141 |
+
);
|
142 |
+
}
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Registers a set of PSR-4 directories for a given namespace, either
|
147 |
+
* appending or prepending to the ones previously set for this namespace.
|
148 |
+
*
|
149 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
150 |
+
* @param array|string $paths The PSR-4 base directories
|
151 |
+
* @param bool $prepend Whether to prepend the directories
|
152 |
+
*
|
153 |
+
* @throws \InvalidArgumentException
|
154 |
+
*/
|
155 |
+
public function addPsr4($prefix, $paths, $prepend = false)
|
156 |
+
{
|
157 |
+
if (!$prefix) {
|
158 |
+
// Register directories for the root namespace.
|
159 |
+
if ($prepend) {
|
160 |
+
$this->fallbackDirsPsr4 = array_merge(
|
161 |
+
(array) $paths,
|
162 |
+
$this->fallbackDirsPsr4
|
163 |
+
);
|
164 |
+
} else {
|
165 |
+
$this->fallbackDirsPsr4 = array_merge(
|
166 |
+
$this->fallbackDirsPsr4,
|
167 |
+
(array) $paths
|
168 |
+
);
|
169 |
+
}
|
170 |
+
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
171 |
+
// Register directories for a new namespace.
|
172 |
+
$length = strlen($prefix);
|
173 |
+
if ('\\' !== $prefix[$length - 1]) {
|
174 |
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
175 |
+
}
|
176 |
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
177 |
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
178 |
+
} elseif ($prepend) {
|
179 |
+
// Prepend directories for an already registered namespace.
|
180 |
+
$this->prefixDirsPsr4[$prefix] = array_merge(
|
181 |
+
(array) $paths,
|
182 |
+
$this->prefixDirsPsr4[$prefix]
|
183 |
+
);
|
184 |
+
} else {
|
185 |
+
// Append directories for an already registered namespace.
|
186 |
+
$this->prefixDirsPsr4[$prefix] = array_merge(
|
187 |
+
$this->prefixDirsPsr4[$prefix],
|
188 |
+
(array) $paths
|
189 |
+
);
|
190 |
+
}
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* Registers a set of PSR-0 directories for a given prefix,
|
195 |
+
* replacing any others previously set for this prefix.
|
196 |
+
*
|
197 |
+
* @param string $prefix The prefix
|
198 |
+
* @param array|string $paths The PSR-0 base directories
|
199 |
+
*/
|
200 |
+
public function set($prefix, $paths)
|
201 |
+
{
|
202 |
+
if (!$prefix) {
|
203 |
+
$this->fallbackDirsPsr0 = (array) $paths;
|
204 |
+
} else {
|
205 |
+
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
206 |
+
}
|
207 |
+
}
|
208 |
+
|
209 |
+
/**
|
210 |
+
* Registers a set of PSR-4 directories for a given namespace,
|
211 |
+
* replacing any others previously set for this namespace.
|
212 |
+
*
|
213 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
214 |
+
* @param array|string $paths The PSR-4 base directories
|
215 |
+
*
|
216 |
+
* @throws \InvalidArgumentException
|
217 |
+
*/
|
218 |
+
public function setPsr4($prefix, $paths)
|
219 |
+
{
|
220 |
+
if (!$prefix) {
|
221 |
+
$this->fallbackDirsPsr4 = (array) $paths;
|
222 |
+
} else {
|
223 |
+
$length = strlen($prefix);
|
224 |
+
if ('\\' !== $prefix[$length - 1]) {
|
225 |
+
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
226 |
+
}
|
227 |
+
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
228 |
+
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
229 |
+
}
|
230 |
+
}
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Turns on searching the include path for class files.
|
234 |
+
*
|
235 |
+
* @param bool $useIncludePath
|
236 |
+
*/
|
237 |
+
public function setUseIncludePath($useIncludePath)
|
238 |
+
{
|
239 |
+
$this->useIncludePath = $useIncludePath;
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Can be used to check if the autoloader uses the include path to check
|
244 |
+
* for classes.
|
245 |
+
*
|
246 |
+
* @return bool
|
247 |
+
*/
|
248 |
+
public function getUseIncludePath()
|
249 |
+
{
|
250 |
+
return $this->useIncludePath;
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Turns off searching the prefix and fallback directories for classes
|
255 |
+
* that have not been registered with the class map.
|
256 |
+
*
|
257 |
+
* @param bool $classMapAuthoritative
|
258 |
+
*/
|
259 |
+
public function setClassMapAuthoritative($classMapAuthoritative)
|
260 |
+
{
|
261 |
+
$this->classMapAuthoritative = $classMapAuthoritative;
|
262 |
+
}
|
263 |
+
|
264 |
+
/**
|
265 |
+
* Should class lookup fail if not found in the current class map?
|
266 |
+
*
|
267 |
+
* @return bool
|
268 |
+
*/
|
269 |
+
public function isClassMapAuthoritative()
|
270 |
+
{
|
271 |
+
return $this->classMapAuthoritative;
|
272 |
+
}
|
273 |
+
|
274 |
+
/**
|
275 |
+
* Registers this instance as an autoloader.
|
276 |
+
*
|
277 |
+
* @param bool $prepend Whether to prepend the autoloader or not
|
278 |
+
*/
|
279 |
+
public function register($prepend = false)
|
280 |
+
{
|
281 |
+
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
282 |
+
}
|
283 |
+
|
284 |
+
/**
|
285 |
+
* Unregisters this instance as an autoloader.
|
286 |
+
*/
|
287 |
+
public function unregister()
|
288 |
+
{
|
289 |
+
spl_autoload_unregister(array($this, 'loadClass'));
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Loads the given class or interface.
|
294 |
+
*
|
295 |
+
* @param string $class The name of the class
|
296 |
+
* @return bool|null True if loaded, null otherwise
|
297 |
+
*/
|
298 |
+
public function loadClass($class)
|
299 |
+
{
|
300 |
+
if ($file = $this->findFile($class)) {
|
301 |
+
includeFile($file);
|
302 |
+
|
303 |
+
return true;
|
304 |
+
}
|
305 |
+
}
|
306 |
+
|
307 |
+
/**
|
308 |
+
* Finds the path to the file where the class is defined.
|
309 |
+
*
|
310 |
+
* @param string $class The name of the class
|
311 |
+
*
|
312 |
+
* @return string|false The path if found, false otherwise
|
313 |
+
*/
|
314 |
+
public function findFile($class)
|
315 |
+
{
|
316 |
+
// work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
|
317 |
+
if ('\\' == $class[0]) {
|
318 |
+
$class = substr($class, 1);
|
319 |
+
}
|
320 |
+
|
321 |
+
// class map lookup
|
322 |
+
if (isset($this->classMap[$class])) {
|
323 |
+
return $this->classMap[$class];
|
324 |
+
}
|
325 |
+
if ($this->classMapAuthoritative) {
|
326 |
+
return false;
|
327 |
+
}
|
328 |
+
|
329 |
+
$file = $this->findFileWithExtension($class, '.php');
|
330 |
+
|
331 |
+
// Search for Hack files if we are running on HHVM
|
332 |
+
if ($file === null && defined('HHVM_VERSION')) {
|
333 |
+
$file = $this->findFileWithExtension($class, '.hh');
|
334 |
+
}
|
335 |
+
|
336 |
+
if ($file === null) {
|
337 |
+
// Remember that this class does not exist.
|
338 |
+
return $this->classMap[$class] = false;
|
339 |
+
}
|
340 |
+
|
341 |
+
return $file;
|
342 |
+
}
|
343 |
+
|
344 |
+
private function findFileWithExtension($class, $ext)
|
345 |
+
{
|
346 |
+
// PSR-4 lookup
|
347 |
+
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
348 |
+
|
349 |
+
$first = $class[0];
|
350 |
+
if (isset($this->prefixLengthsPsr4[$first])) {
|
351 |
+
foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
|
352 |
+
if (0 === strpos($class, $prefix)) {
|
353 |
+
foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
|
354 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
|
355 |
+
return $file;
|
356 |
+
}
|
357 |
+
}
|
358 |
+
}
|
359 |
+
}
|
360 |
+
}
|
361 |
+
|
362 |
+
// PSR-4 fallback dirs
|
363 |
+
foreach ($this->fallbackDirsPsr4 as $dir) {
|
364 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
365 |
+
return $file;
|
366 |
+
}
|
367 |
+
}
|
368 |
+
|
369 |
+
// PSR-0 lookup
|
370 |
+
if (false !== $pos = strrpos($class, '\\')) {
|
371 |
+
// namespaced class name
|
372 |
+
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
373 |
+
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
374 |
+
} else {
|
375 |
+
// PEAR-like class name
|
376 |
+
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
377 |
+
}
|
378 |
+
|
379 |
+
if (isset($this->prefixesPsr0[$first])) {
|
380 |
+
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
381 |
+
if (0 === strpos($class, $prefix)) {
|
382 |
+
foreach ($dirs as $dir) {
|
383 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
384 |
+
return $file;
|
385 |
+
}
|
386 |
+
}
|
387 |
+
}
|
388 |
+
}
|
389 |
+
}
|
390 |
+
|
391 |
+
// PSR-0 fallback dirs
|
392 |
+
foreach ($this->fallbackDirsPsr0 as $dir) {
|
393 |
+
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
394 |
+
return $file;
|
395 |
+
}
|
396 |
+
}
|
397 |
+
|
398 |
+
// PSR-0 include paths.
|
399 |
+
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
400 |
+
return $file;
|
401 |
+
}
|
402 |
+
}
|
403 |
+
}
|
404 |
+
|
405 |
+
/**
|
406 |
+
* Scope isolated include.
|
407 |
+
*
|
408 |
+
* Prevents access to $this/self from included files.
|
409 |
+
*/
|
410 |
+
function includeFile($file)
|
411 |
+
{
|
412 |
+
include $file;
|
413 |
+
}
|
classes/XmlStreamReader/composer/autoload_classmap.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_classmap.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
);
|
classes/XmlStreamReader/composer/autoload_namespaces.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_namespaces.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
);
|
classes/XmlStreamReader/composer/autoload_psr4.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_psr4.php @generated by Composer
|
4 |
+
|
5 |
+
$vendorDir = dirname(dirname(__FILE__));
|
6 |
+
$baseDir = dirname($vendorDir);
|
7 |
+
|
8 |
+
return array(
|
9 |
+
'Prewk\\' => array($vendorDir . '/prewk/xml-string-streamer/src'),
|
10 |
+
);
|
classes/XmlStreamReader/composer/autoload_real.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// autoload_real.php @generated by Composer
|
4 |
+
|
5 |
+
class ComposerAutoloaderInit18a81a838bde72a6ce7edd20e3ab047d
|
6 |
+
{
|
7 |
+
private static $loader;
|
8 |
+
|
9 |
+
public static function loadClassLoader($class)
|
10 |
+
{
|
11 |
+
if ('Composer\Autoload\ClassLoader' === $class) {
|
12 |
+
require __DIR__ . '/ClassLoader.php';
|
13 |
+
}
|
14 |
+
}
|
15 |
+
|
16 |
+
public static function getLoader()
|
17 |
+
{
|
18 |
+
if (null !== self::$loader) {
|
19 |
+
return self::$loader;
|
20 |
+
}
|
21 |
+
|
22 |
+
spl_autoload_register(array('ComposerAutoloaderInit18a81a838bde72a6ce7edd20e3ab047d', 'loadClassLoader'), true, true);
|
23 |
+
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
+
spl_autoload_unregister(array('ComposerAutoloaderInit18a81a838bde72a6ce7edd20e3ab047d', 'loadClassLoader'));
|
25 |
+
|
26 |
+
$map = require __DIR__ . '/autoload_namespaces.php';
|
27 |
+
foreach ($map as $namespace => $path) {
|
28 |
+
$loader->set($namespace, $path);
|
29 |
+
}
|
30 |
+
|
31 |
+
$map = require __DIR__ . '/autoload_psr4.php';
|
32 |
+
foreach ($map as $namespace => $path) {
|
33 |
+
$loader->setPsr4($namespace, $path);
|
34 |
+
}
|
35 |
+
|
36 |
+
$classMap = require __DIR__ . '/autoload_classmap.php';
|
37 |
+
if ($classMap) {
|
38 |
+
$loader->addClassMap($classMap);
|
39 |
+
}
|
40 |
+
|
41 |
+
$loader->register(true);
|
42 |
+
|
43 |
+
return $loader;
|
44 |
+
}
|
45 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer.php
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* xml-string-streamer base class
|
4 |
+
*
|
5 |
+
* @package xml-string-streamer
|
6 |
+
* @author Oskar Thornblad <oskar.thornblad@gmail.com>
|
7 |
+
*/
|
8 |
+
|
9 |
+
namespace Prewk;
|
10 |
+
|
11 |
+
use Prewk\XmlStringStreamer\ParserInterface;
|
12 |
+
use Prewk\XmlStringStreamer\StreamInterface;
|
13 |
+
use Prewk\XmlStringStreamer\Parser;
|
14 |
+
use Prewk\XmlStringStreamer\Stream;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* The base class for the xml-string-streamer
|
18 |
+
*/
|
19 |
+
class XmlStringStreamer
|
20 |
+
{
|
21 |
+
/**
|
22 |
+
* The current parser
|
23 |
+
* @var ParserInterface
|
24 |
+
*/
|
25 |
+
protected $parser;
|
26 |
+
/**
|
27 |
+
* The current stream
|
28 |
+
* @var StreamInterface
|
29 |
+
*/
|
30 |
+
protected $stream;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Constructs the XML streamer
|
34 |
+
* @param ParserInterface $parser A parser with options set
|
35 |
+
* @param StreamInterface $stream A stream for the parser to use
|
36 |
+
*/
|
37 |
+
public function __construct(ParserInterface $parser, StreamInterface $stream)
|
38 |
+
{
|
39 |
+
$this->parser = $parser;
|
40 |
+
$this->stream = $stream;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Convenience method for creating a StringWalker parser with a File stream
|
45 |
+
* @param string|resource $file File path or handle
|
46 |
+
* @param array $options Parser configuration
|
47 |
+
* @return XmlStringStreamer A streamer ready for use
|
48 |
+
*/
|
49 |
+
public static function createStringWalkerParser($file, $options = array())
|
50 |
+
{
|
51 |
+
$stream = new Stream\File($file, 16384);
|
52 |
+
$parser = new Parser\StringWalker($options);
|
53 |
+
return new XmlStringStreamer($parser, $stream);
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Convenience method for creating a UniqueNode parser with a File stream
|
58 |
+
* @param string|resource $file File path or handle
|
59 |
+
* @param array $options Parser configuration
|
60 |
+
* @return XmlStringStreamer A streamer ready for use
|
61 |
+
*/
|
62 |
+
public static function createUniqueNodeParser($file, $options = array())
|
63 |
+
{
|
64 |
+
$stream = new Stream\File($file, 16384);
|
65 |
+
$parser = new Parser\UniqueNode($options);
|
66 |
+
return new XmlStringStreamer($parser, $stream);
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Gets the next node from the parser
|
71 |
+
* @return bool|string The xml string or false
|
72 |
+
*/
|
73 |
+
public function getNode()
|
74 |
+
{
|
75 |
+
return $this->parser->getNodeFrom($this->stream);
|
76 |
+
}
|
77 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Parser/StringWalker.php
ADDED
@@ -0,0 +1,275 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* xml-string-streamer StringWalker parser
|
4 |
+
*
|
5 |
+
* @package xml-string-streamer
|
6 |
+
* @author Oskar Thornblad <oskar.thornblad@gmail.com>
|
7 |
+
*/
|
8 |
+
|
9 |
+
namespace Prewk\XmlStringStreamer\Parser;
|
10 |
+
|
11 |
+
use Exception;
|
12 |
+
use Prewk\XmlStringStreamer\ParserInterface;
|
13 |
+
use Prewk\XmlStringStreamer\StreamInterface;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* The string walker parser builds the XML nodes by fetching one element at a time until a certain depth is re-reached
|
17 |
+
*/
|
18 |
+
class StringWalker implements ParserInterface
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* Holds the parser configuration
|
22 |
+
* @var array
|
23 |
+
*/
|
24 |
+
protected $options;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Is this the first run?
|
28 |
+
* @var boolean
|
29 |
+
*/
|
30 |
+
protected $firstRun = true;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* What depth are we currently at?
|
34 |
+
* @var integer
|
35 |
+
*/
|
36 |
+
protected $depth = 0;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* The latest chunk from the stream
|
40 |
+
* @var string
|
41 |
+
*/
|
42 |
+
protected $chunk;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Last XML node in the making, used for anti-freeze detection
|
46 |
+
* @var null|string
|
47 |
+
*/
|
48 |
+
protected $lastChunk;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* XML node in the making
|
52 |
+
* @var null|string
|
53 |
+
*/
|
54 |
+
protected $shaved = null;
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Whether to capture or not
|
58 |
+
* @var boolean
|
59 |
+
*/
|
60 |
+
protected $capture = false;
|
61 |
+
|
62 |
+
/**
|
63 |
+
* If extractContainer is true, this will grow with the XML captured before and after the specified capture depth
|
64 |
+
* @var string
|
65 |
+
*/
|
66 |
+
protected $containerXml = "";
|
67 |
+
|
68 |
+
public $cloud = array();
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Parser contructor
|
72 |
+
* @param array $options An options array
|
73 |
+
*/
|
74 |
+
public function __construct(array $options = array())
|
75 |
+
{
|
76 |
+
$this->options = array_merge(array(
|
77 |
+
"captureDepth" => 2,
|
78 |
+
"expectGT" => false,
|
79 |
+
"tags" => array(
|
80 |
+
array("<?", "?>", 0),
|
81 |
+
array("<!--", "-->", 0),
|
82 |
+
array("<![CDATA[", "]]>", 0),
|
83 |
+
array("<!", ">", 0),
|
84 |
+
array("</", ">", -1),
|
85 |
+
array("<", "/>", 0),
|
86 |
+
array("<", ">", 1),
|
87 |
+
),
|
88 |
+
"tagsWithAllowedGT" => array(
|
89 |
+
array("<!--", "-->"),
|
90 |
+
array("<![CDATA[", "]]>"),
|
91 |
+
),
|
92 |
+
"extractContainer" => false,
|
93 |
+
), $options);
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Shaves off the next element from the chunk
|
98 |
+
* @return string[]|bool Either a shaved off element array(0 => Captured element, 1 => Data from last shaving point up to and including captured element) or false if one could not be obtained
|
99 |
+
*/
|
100 |
+
protected function shave()
|
101 |
+
{
|
102 |
+
preg_match("/<[^>]+>/", $this->chunk, $matches, PREG_OFFSET_CAPTURE);
|
103 |
+
|
104 |
+
if (isset($matches[0], $matches[0][0], $matches[0][1])) {
|
105 |
+
list($captured, $offset) = $matches[0];
|
106 |
+
|
107 |
+
if ($this->options["expectGT"]) {
|
108 |
+
// Some elements support > inside
|
109 |
+
foreach ($this->options["tagsWithAllowedGT"] as $tag) {
|
110 |
+
list($opening, $closing) = $tag;
|
111 |
+
|
112 |
+
if (substr($captured, 0, strlen($opening)) === $opening) {
|
113 |
+
// We have a match, our preg_match may have ended too early
|
114 |
+
// Most often, this isn't the case
|
115 |
+
if (substr($captured, -1 * strlen($closing)) !== $closing) {
|
116 |
+
// In this case, the preg_match ended too early, let's find the real end
|
117 |
+
$position = strpos($this->chunk, $closing);
|
118 |
+
if ($position === false) {
|
119 |
+
// We need more XML!
|
120 |
+
|
121 |
+
return false;
|
122 |
+
}
|
123 |
+
|
124 |
+
// We found the end, modify $captured
|
125 |
+
$captured = substr($this->chunk, $offset, $position + strlen($closing) - $offset);
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
// Data in between
|
132 |
+
$data = substr($this->chunk, 0, $offset);
|
133 |
+
|
134 |
+
// Shave from chunk
|
135 |
+
$this->chunk = substr($this->chunk, $offset + strlen($captured));
|
136 |
+
|
137 |
+
return array($captured, $data . $captured);
|
138 |
+
}
|
139 |
+
|
140 |
+
return false;
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Extract XML compatible tag head and tail
|
145 |
+
* @param string $element XML element
|
146 |
+
* @return string[] 0 => Opening tag, 1 => Closing tag
|
147 |
+
*/
|
148 |
+
protected function getEdges($element)
|
149 |
+
{
|
150 |
+
// TODO: Performance tuning possible here by not looping
|
151 |
+
|
152 |
+
foreach ($this->options["tags"] as $tag) {
|
153 |
+
list($opening, $closing, $depth) = $tag;
|
154 |
+
|
155 |
+
if (substr($element, 0, strlen($opening)) === $opening
|
156 |
+
&& substr($element, -1 * strlen($closing)) === $closing) {
|
157 |
+
|
158 |
+
return $tag;
|
159 |
+
}
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* The shave method must be able to request more data even though there isn't any more to fetch from the stream, this method wraps the getChunk call so that it returns true as long as there is XML data left
|
165 |
+
* @param StreamInterface $stream The stream to read from
|
166 |
+
* @return bool Returns whether there is more XML data or not
|
167 |
+
*/
|
168 |
+
protected function prepareChunk(StreamInterface $stream)
|
169 |
+
{
|
170 |
+
if (!$this->firstRun && is_null($this->shaved)) {
|
171 |
+
// We're starting again after a flush
|
172 |
+
$this->shaved = "";
|
173 |
+
|
174 |
+
return true;
|
175 |
+
} else if (is_null($this->shaved)) {
|
176 |
+
$this->shaved = "";
|
177 |
+
}
|
178 |
+
|
179 |
+
$newChunk = $stream->getChunk();
|
180 |
+
|
181 |
+
if ($newChunk !== false) {
|
182 |
+
$this->chunk .= $newChunk;
|
183 |
+
|
184 |
+
return true;
|
185 |
+
} else {
|
186 |
+
if (trim($this->chunk) !== "" && $this->chunk !== $this->lastChunk) {
|
187 |
+
// Update anti-freeze protection chunk
|
188 |
+
$this->lastChunk = $this->chunk;
|
189 |
+
// Continue
|
190 |
+
return true;
|
191 |
+
}
|
192 |
+
}
|
193 |
+
|
194 |
+
return false;
|
195 |
+
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* Get the extracted container XML, if called before the whole stream is parsed, the XML returned will most likely be invalid due to missing closing tags
|
199 |
+
* @return string XML string
|
200 |
+
* @throws Exception if the extractContainer option isn't true
|
201 |
+
*/
|
202 |
+
public function getExtractedContainer()
|
203 |
+
{
|
204 |
+
if (!$this->options["extractContainer"]) {
|
205 |
+
throw new Exception("This method requires the 'extractContainer' option to be true");
|
206 |
+
}
|
207 |
+
|
208 |
+
return $this->containerXml;
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Tries to retrieve the next node or returns false
|
213 |
+
* @param StreamInterface $stream The stream to use
|
214 |
+
* @return string|bool The next xml node or false if one could not be retrieved
|
215 |
+
*/
|
216 |
+
public function getNodeFrom(StreamInterface $stream)
|
217 |
+
{
|
218 |
+
// Iterate and append to $this->chunk
|
219 |
+
while ($this->prepareChunk($stream)) {
|
220 |
+
$this->firstRun = false;
|
221 |
+
// Shave off elements
|
222 |
+
while ($shaved = $this->shave()) {
|
223 |
+
list($element, $data) = $shaved;
|
224 |
+
|
225 |
+
// Analyze element
|
226 |
+
list($opening, $closing, $depth) = $this->getEdges($element);
|
227 |
+
|
228 |
+
if ( strpos($element, "<![CDATA[") === false && strpos($element, "<?xml") === false && strpos($element, "</") === false && strpos($element, "/>") === false )
|
229 |
+
{
|
230 |
+
$cloud_element = str_replace(array("<", ">"), "", preg_replace("%\s.*%", "", $element));
|
231 |
+
if ( strpos($cloud_element, ":") === false )
|
232 |
+
{
|
233 |
+
if ( isset($this->cloud[$cloud_element])) $this->cloud[$cloud_element]++; else $this->cloud[$cloud_element] = 1;
|
234 |
+
}
|
235 |
+
}
|
236 |
+
|
237 |
+
// Update depth
|
238 |
+
$this->depth += $depth;
|
239 |
+
|
240 |
+
$flush = false;
|
241 |
+
|
242 |
+
// Capture or don't?
|
243 |
+
if ($this->depth === $this->options["captureDepth"] && $depth > 0) {
|
244 |
+
// Yes, we've just entered capture depth, start capturing
|
245 |
+
$this->capture = true;
|
246 |
+
} else if ($this->depth === $this->options["captureDepth"] - 1 && $depth < 0) {
|
247 |
+
// No, we've just exited capture depth, stop capturing and prepare for flush
|
248 |
+
$flush = true;
|
249 |
+
$this->capture = false;
|
250 |
+
|
251 |
+
// ..but include this last node
|
252 |
+
$this->shaved .= $data;
|
253 |
+
} else if ($this->options["extractContainer"] && $this->depth < $this->options["captureDepth"]) {
|
254 |
+
// We're outside of our capture scope, save to the special buffer if extractContainer is true
|
255 |
+
$this->containerXml .= $element;
|
256 |
+
}
|
257 |
+
|
258 |
+
// Capture the last retrieved node
|
259 |
+
if ($this->capture) {
|
260 |
+
$this->shaved .= $data;
|
261 |
+
}
|
262 |
+
|
263 |
+
if ($flush) {
|
264 |
+
// Flush the whole node and start over on the next
|
265 |
+
$flush = $this->shaved;
|
266 |
+
$this->shaved = null;
|
267 |
+
|
268 |
+
return $flush;
|
269 |
+
}
|
270 |
+
}
|
271 |
+
}
|
272 |
+
|
273 |
+
return false;
|
274 |
+
}
|
275 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Parser/UniqueNode.php
ADDED
@@ -0,0 +1,274 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* xml-string-streamer UniqueNode parser
|
4 |
+
*
|
5 |
+
* @package xml-string-streamer
|
6 |
+
* @author Oskar Thornblad <oskar.thornblad@gmail.com>
|
7 |
+
* @author Roman Voloboev <animir@ya.ru>
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace Prewk\XmlStringStreamer\Parser;
|
11 |
+
|
12 |
+
use Exception;
|
13 |
+
use Prewk\XmlStringStreamer\ParserInterface;
|
14 |
+
use Prewk\XmlStringStreamer\StreamInterface;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* The unique node parser starts at a given element name and flushes when its corresponding closing tag is found
|
18 |
+
*/
|
19 |
+
class UniqueNode implements ParserInterface
|
20 |
+
{
|
21 |
+
/**
|
22 |
+
* Current working XML blob
|
23 |
+
* @var string
|
24 |
+
*/
|
25 |
+
private $workingBlob = "";
|
26 |
+
/**
|
27 |
+
* The flushed node
|
28 |
+
* @var string
|
29 |
+
*/
|
30 |
+
private $flushed = "";
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Start position of the given element in the workingBlob
|
34 |
+
* @var integer
|
35 |
+
*/
|
36 |
+
private $startPos = 0;
|
37 |
+
/**
|
38 |
+
* Records how far we've searched in the XML blob so far
|
39 |
+
* @var integer
|
40 |
+
*/
|
41 |
+
private $hasSearchedUntilPos = -1;
|
42 |
+
|
43 |
+
const FIND_OPENING_TAG_ACTION = 0;
|
44 |
+
const FIND_CLOSING_TAG_ACTION = 1;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Next action to perform
|
48 |
+
* @var integer
|
49 |
+
*/
|
50 |
+
private $nextAction = 0;
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Indicates short closing tag
|
54 |
+
* @var bool
|
55 |
+
*/
|
56 |
+
|
57 |
+
private $shortClosedTagNow = false;
|
58 |
+
|
59 |
+
/**
|
60 |
+
* If extractContainer is true, this will grow with the XML captured before and after the specified capture depth
|
61 |
+
* @var string
|
62 |
+
*/
|
63 |
+
protected $containerXml = "";
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Whether we're found our first capture target or not
|
67 |
+
* @var bool
|
68 |
+
*/
|
69 |
+
protected $preCapture = true;
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Parser constructor
|
73 |
+
* @param array $options An options array
|
74 |
+
* @throws Exception if the required option uniqueNode isn't set
|
75 |
+
*/
|
76 |
+
public function __construct(array $options = array())
|
77 |
+
{
|
78 |
+
$this->options = array_merge(array(
|
79 |
+
"extractContainer" => false,
|
80 |
+
), $options);
|
81 |
+
|
82 |
+
if (!isset($this->options["uniqueNode"])) {
|
83 |
+
throw new Exception("Required option 'uniqueNode' not set");
|
84 |
+
}
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Search the blob for our unique node's opening tag
|
89 |
+
* @return bool|int Either returns the char position of the opening tag or false
|
90 |
+
*/
|
91 |
+
protected function getOpeningTagPos()
|
92 |
+
{
|
93 |
+
$startPositionInBlob = false;
|
94 |
+
if (preg_match("/<" . preg_quote($this->options["uniqueNode"]) . "(>| )/", $this->workingBlob, $matches, PREG_OFFSET_CAPTURE) === 1) {
|
95 |
+
$startPositionInBlob = $matches[0][1];
|
96 |
+
}
|
97 |
+
|
98 |
+
|
99 |
+
if ($startPositionInBlob === false) {
|
100 |
+
$this->hasSearchedUntilPos = strlen($this->workingBlob) - 1;
|
101 |
+
}
|
102 |
+
|
103 |
+
return $startPositionInBlob;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Search short closing tag in $workingBlob before
|
108 |
+
*
|
109 |
+
* @param string $workingBlob
|
110 |
+
* @param int $len
|
111 |
+
* @return bool|int Either returns the char position of the short closing tag or false
|
112 |
+
*/
|
113 |
+
private function checkShortClosingTag($workingBlob, $len) {
|
114 |
+
$resultEndPositionInBlob = false;
|
115 |
+
while ($len = strpos($workingBlob, "/>", $len + 1)) {
|
116 |
+
$subBlob = substr($workingBlob, $this->startPos, $len + strlen("/>") - $this->startPos);
|
117 |
+
$cntOpen = substr_count($subBlob, "<");
|
118 |
+
$cntClose = substr_count($subBlob, "/>");
|
119 |
+
if ($cntOpen === $cntClose && $cntOpen === 1) {
|
120 |
+
$resultEndPositionInBlob = $len + strlen("/>");
|
121 |
+
break; // end while. so $endPositionInBlob correct now
|
122 |
+
}
|
123 |
+
}
|
124 |
+
return $resultEndPositionInBlob;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Search the blob for our unique node's closing tag
|
129 |
+
* @return bool|int Either returns the char position of the closing tag or false
|
130 |
+
*/
|
131 |
+
protected function getClosingTagPos()
|
132 |
+
{
|
133 |
+
$endPositionInBlob = strpos($this->workingBlob, "</" . $this->options["uniqueNode"] . ">");
|
134 |
+
if ($endPositionInBlob === false) {
|
135 |
+
|
136 |
+
if (isset($this->options["checkShortClosing"]) && $this->options["checkShortClosing"] === true) {
|
137 |
+
$endPositionInBlob = $this->checkShortClosingTag($this->workingBlob, $this->startPos);
|
138 |
+
}
|
139 |
+
|
140 |
+
if ($endPositionInBlob === false) {
|
141 |
+
$this->hasSearchedUntilPos = strlen($this->workingBlob) - 1;
|
142 |
+
} else {
|
143 |
+
$this->shortClosedTagNow = true;
|
144 |
+
}
|
145 |
+
} else {
|
146 |
+
if (isset($this->options["checkShortClosing"]) && $this->options["checkShortClosing"] === true) {
|
147 |
+
$tmpEndPositionInBlob = $this->checkShortClosingTag(substr($this->workingBlob, 0, $endPositionInBlob), $this->startPos);
|
148 |
+
if ($tmpEndPositionInBlob !== false) {
|
149 |
+
$this->shortClosedTagNow = true;
|
150 |
+
$endPositionInBlob = $tmpEndPositionInBlob;
|
151 |
+
}
|
152 |
+
}
|
153 |
+
}
|
154 |
+
|
155 |
+
return $endPositionInBlob;
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Set the start position in the workingBlob from where we should start reading when the closing tag is found
|
160 |
+
* @param int $startPositionInBlob Position of starting tag
|
161 |
+
*/
|
162 |
+
protected function startSalvaging($startPositionInBlob)
|
163 |
+
{
|
164 |
+
$this->startPos = $startPositionInBlob;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Cut everything from the start position to the end position in the workingBlob (+ tag length) and flush it out for later return in getNodeFrom
|
169 |
+
* @param int $endPositionInBlob Position of the closing tag
|
170 |
+
*/
|
171 |
+
protected function flush($endPositionInBlob) {
|
172 |
+
$endTagLen = $this->shortClosedTagNow ? 0 : strlen("</" . $this->options["uniqueNode"] . ">");
|
173 |
+
$realEndPosition = $endPositionInBlob + $endTagLen;
|
174 |
+
$this->flushed = substr($this->workingBlob, $this->startPos, $realEndPosition - $this->startPos);
|
175 |
+
$this->workingBlob = substr($this->workingBlob, $realEndPosition);
|
176 |
+
$this->hasSearchedUntilPos = 0;
|
177 |
+
$this->shortClosedTagNow = false;
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Decides whether we're to fetch more chunks from the stream or keep working with what we have.
|
182 |
+
* @param StreamInterface $stream The stream provider
|
183 |
+
* @return bool Keep working?
|
184 |
+
*/
|
185 |
+
protected function prepareChunk(StreamInterface $stream)
|
186 |
+
{
|
187 |
+
if ($this->hasSearchedUntilPos > -1 && $this->hasSearchedUntilPos < (strlen($this->workingBlob) - 1)) {
|
188 |
+
// More work to do
|
189 |
+
return true;
|
190 |
+
}
|
191 |
+
|
192 |
+
$chunk = $stream->getChunk();
|
193 |
+
|
194 |
+
if ($chunk === false) {
|
195 |
+
// EOF
|
196 |
+
if ($this->hasSearchedUntilPos === -1) {
|
197 |
+
// EOF, but we haven't even started searching, special case that probably means we're dealing with a file of less size than the stream buffer
|
198 |
+
// Therefore, keep looping
|
199 |
+
return true;
|
200 |
+
}
|
201 |
+
return false;
|
202 |
+
} else {
|
203 |
+
// New chunk fetched
|
204 |
+
$this->workingBlob .= $chunk;
|
205 |
+
return true;
|
206 |
+
}
|
207 |
+
}
|
208 |
+
|
209 |
+
/**
|
210 |
+
* Tries to retrieve the next node or returns false
|
211 |
+
* @param StreamInterface $stream The stream to use
|
212 |
+
* @return string|bool The next xml node or false if one could not be retrieved
|
213 |
+
*/
|
214 |
+
public function getNodeFrom(StreamInterface $stream)
|
215 |
+
{
|
216 |
+
while ($this->prepareChunk($stream)) {
|
217 |
+
// What's our next course of action?
|
218 |
+
if ($this->nextAction === self::FIND_OPENING_TAG_ACTION) {
|
219 |
+
// Try to find an opening tag
|
220 |
+
$positionInBlob = $this->getOpeningTagPos();
|
221 |
+
|
222 |
+
if ($positionInBlob !== false) {
|
223 |
+
// We found it, start salvaging
|
224 |
+
if ($this->options["extractContainer"] && $this->preCapture) {
|
225 |
+
$this->containerXml .= substr($this->workingBlob, 0, $positionInBlob);
|
226 |
+
$this->preCapture = false;
|
227 |
+
}
|
228 |
+
|
229 |
+
|
230 |
+
$this->startSalvaging($positionInBlob);
|
231 |
+
|
232 |
+
// The next course of action will be to find a closing tag
|
233 |
+
$this->nextAction = self::FIND_CLOSING_TAG_ACTION;
|
234 |
+
}
|
235 |
+
} else if ($this->nextAction === self::FIND_CLOSING_TAG_ACTION) {
|
236 |
+
// Try to find a closing tag
|
237 |
+
$positionInBlob = $this->getClosingTagPos();
|
238 |
+
if ($positionInBlob !== false) {
|
239 |
+
// We found it, we now have a full node to flush out
|
240 |
+
$this->flush($positionInBlob);
|
241 |
+
|
242 |
+
// The next course of action will be to find an opening tag
|
243 |
+
$this->nextAction = self::FIND_OPENING_TAG_ACTION;
|
244 |
+
|
245 |
+
// Get the flushed node and make way for the next node
|
246 |
+
$flushed = $this->flushed;
|
247 |
+
$this->flushed = "";
|
248 |
+
|
249 |
+
return $flushed;
|
250 |
+
}
|
251 |
+
}
|
252 |
+
}
|
253 |
+
|
254 |
+
if ($this->options["extractContainer"]) {
|
255 |
+
$this->containerXml .= $this->workingBlob;
|
256 |
+
}
|
257 |
+
|
258 |
+
return false;
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Get the extracted container XML, if called before the whole stream is parsed, the XML returned can be invalid due to missing closing tags
|
263 |
+
* @return string XML string
|
264 |
+
* @throws Exception if the extractContainer option isn't true
|
265 |
+
*/
|
266 |
+
public function getExtractedContainer()
|
267 |
+
{
|
268 |
+
if (!$this->options["extractContainer"]) {
|
269 |
+
throw new Exception("This method requires the 'extractContainer' option to be true");
|
270 |
+
}
|
271 |
+
|
272 |
+
return $this->containerXml;
|
273 |
+
}
|
274 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/ParserInterface.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* xml-string-streamer Parser interface
|
4 |
+
*
|
5 |
+
* @package xml-string-streamer
|
6 |
+
* @author Oskar Thornblad <oskar.thornblad@gmail.com>
|
7 |
+
*/
|
8 |
+
|
9 |
+
namespace Prewk\XmlStringStreamer;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Interface describing a parser
|
13 |
+
*/
|
14 |
+
interface ParserInterface
|
15 |
+
{
|
16 |
+
/**
|
17 |
+
* Parser contructor
|
18 |
+
* @param array $options An options array decided by the parser implementation
|
19 |
+
*/
|
20 |
+
public function __construct(array $options = array());
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Tries to retrieve the next node or returns false
|
24 |
+
* @param StreamInterface $stream The stream to use
|
25 |
+
* @return string|bool The next xml node or false if one could not be retrieved
|
26 |
+
*/
|
27 |
+
public function getNodeFrom(StreamInterface $stream);
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Get the extracted container XML, if called before the whole stream is parsed, the XML returned can be invalid due to missing closing tags
|
31 |
+
* @return string XML string
|
32 |
+
*/
|
33 |
+
public function getExtractedContainer();
|
34 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Stream/File.php
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php namespace Prewk\XmlStringStreamer\Stream;
|
2 |
+
|
3 |
+
use Prewk\XmlStringStreamer\StreamInterface;
|
4 |
+
|
5 |
+
class File implements StreamInterface
|
6 |
+
{
|
7 |
+
private $handle;
|
8 |
+
private $readBytes = 0;
|
9 |
+
private $chunkSize;
|
10 |
+
private $chunkCallback;
|
11 |
+
|
12 |
+
public function __construct($mixed, $chunkSize = 16384, $chunkCallback = null)
|
13 |
+
{
|
14 |
+
if (is_string($mixed)) {
|
15 |
+
// Treat as filename
|
16 |
+
if (!file_exists($mixed)) {
|
17 |
+
throw new \Exception("File '$mixed' doesn't exist");
|
18 |
+
}
|
19 |
+
$this->handle = fopen($mixed, "rb");
|
20 |
+
$this->handle;
|
21 |
+
} else if (get_resource_type($mixed) == "stream") {
|
22 |
+
// Treat as file handle
|
23 |
+
$this->handle = $mixed;
|
24 |
+
} else {
|
25 |
+
throw new \Exception("First argument must be either a filename or a file handle");
|
26 |
+
}
|
27 |
+
|
28 |
+
if ($this->handle === false) {
|
29 |
+
throw new \Exception("Couldn't create file handle");
|
30 |
+
}
|
31 |
+
|
32 |
+
$this->chunkSize = $chunkSize;
|
33 |
+
$this->chunkCallback = $chunkCallback;
|
34 |
+
}
|
35 |
+
|
36 |
+
public function getChunk()
|
37 |
+
{
|
38 |
+
if (is_resource($this->handle) && !feof($this->handle)) {
|
39 |
+
$buffer = fread($this->handle, $this->chunkSize);
|
40 |
+
$this->readBytes += strlen($buffer);
|
41 |
+
|
42 |
+
if (is_callable($this->chunkCallback)) {
|
43 |
+
call_user_func_array($this->chunkCallback, array($buffer, $this->readBytes));
|
44 |
+
}
|
45 |
+
|
46 |
+
return $buffer;
|
47 |
+
} else if (is_resource($this->handle)) {
|
48 |
+
fclose($this->handle);
|
49 |
+
return false;
|
50 |
+
} else {
|
51 |
+
return false;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Stream/Stdin.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php namespace Prewk\XmlStringStreamer\Stream;
|
2 |
+
|
3 |
+
use Prewk\XmlStringStreamer\StreamInterface;
|
4 |
+
|
5 |
+
class Stdin extends File
|
6 |
+
{
|
7 |
+
public function __construct($chunkSize = 1024, $chunkCallback = null)
|
8 |
+
{
|
9 |
+
parent::__construct(fopen("php://stdin", "r"), $chunkSize, $chunkCallback);
|
10 |
+
}
|
11 |
+
}
|
classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/StreamInterface.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* xml-string-streamer Stream interface
|
4 |
+
*
|
5 |
+
* @package xml-string-streamer
|
6 |
+
* @author Oskar Thornblad <oskar.thornblad@gmail.com>
|
7 |
+
*/
|
8 |
+
|
9 |
+
namespace Prewk\XmlStringStreamer;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Interface describing a stream provider
|
13 |
+
*/
|
14 |
+
interface StreamInterface
|
15 |
+
{
|
16 |
+
/**
|
17 |
+
* Gets the next chunk form the stream if one is available
|
18 |
+
* @return bool|string The next chunk if available, or false if not available
|
19 |
+
*/
|
20 |
+
public function getChunk();
|
21 |
+
}
|
classes/chunk.php
CHANGED
@@ -1,4 +1,11 @@
|
|
1 |
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
/**
|
3 |
* Chunk
|
4 |
*
|
@@ -23,7 +30,7 @@ class PMXI_Chunk {
|
|
23 |
'pointer' => 1,
|
24 |
'chunkSize' => 1024,
|
25 |
'filter' => true,
|
26 |
-
'get_cloud' => false
|
27 |
);
|
28 |
|
29 |
/**
|
@@ -43,6 +50,7 @@ class PMXI_Chunk {
|
|
43 |
public $cloud = array();
|
44 |
public $loop = 1;
|
45 |
public $is_404 = false;
|
|
|
46 |
|
47 |
/**
|
48 |
* handle
|
@@ -68,7 +76,7 @@ class PMXI_Chunk {
|
|
68 |
* @author Dom Hastings
|
69 |
* @access public
|
70 |
*/
|
71 |
-
public function __construct($file, $options = array(), $
|
72 |
|
73 |
// merge the options together
|
74 |
$this->options = array_merge($this->options, (is_array($options) ? $options : array()));
|
@@ -99,29 +107,69 @@ class PMXI_Chunk {
|
|
99 |
return;
|
100 |
}
|
101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
if (empty($this->options['element']) or $this->options['get_cloud'])
|
103 |
{
|
104 |
-
|
105 |
$path = $this->get_file_path();
|
106 |
|
107 |
-
$
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
$
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
}
|
124 |
-
unset($reader);
|
125 |
|
126 |
if ( ! empty($this->cloud) and empty($this->options['element']) ){
|
127 |
|
@@ -143,20 +191,32 @@ class PMXI_Chunk {
|
|
143 |
}
|
144 |
}
|
145 |
}
|
146 |
-
}
|
147 |
-
|
148 |
-
$path = $this->get_file_path();
|
149 |
|
150 |
-
$
|
151 |
-
@$this->reader->open($path);
|
152 |
-
@$this->reader->setParserProperty(XMLReader::VALIDATE, false);
|
153 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
}
|
155 |
|
156 |
function get_file_path()
|
157 |
{
|
158 |
$is_enabled_stream_filter = apply_filters('wp_all_import_is_enabled_stream_filter', true);
|
159 |
-
if ( function_exists('stream_filter_register') and $this->options['filter'] and $is_enabled_stream_filter )
|
160 |
{
|
161 |
stream_filter_register('preprocessxml', 'preprocessXml_filter');
|
162 |
if (defined('HHVM_VERSION'))
|
@@ -199,33 +259,59 @@ class PMXI_Chunk {
|
|
199 |
|
200 |
$xml = '';
|
201 |
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
|
|
|
|
|
|
|
|
|
|
225 |
}
|
226 |
-
}
|
227 |
-
|
228 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
|
230 |
return ( ! empty($xml) ) ? self::removeColonsFromRSS(preg_replace('%xmlns.*=\s*([\'""]).*\1%sU', '', $xml)) : false;
|
231 |
|
@@ -280,7 +366,7 @@ class preprocessXml_filter extends php_user_filter {
|
|
280 |
{
|
281 |
// the & symbol is not valid in XML, so replace it with temporary word _ampersand_
|
282 |
$bucket->data = str_replace("&", "_ampersand_", $bucket->data);
|
283 |
-
$bucket->data = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $this->replace_colons($bucket->data));
|
284 |
}
|
285 |
$consumed += $bucket->datalen;
|
286 |
stream_bucket_append($out, $bucket);
|
1 |
<?php
|
2 |
+
|
3 |
+
include __DIR__ . "/XmlStreamReader/autoload.php";
|
4 |
+
|
5 |
+
use Prewk\XmlStringStreamer;
|
6 |
+
use Prewk\XmlStringStreamer\Parser;
|
7 |
+
use Prewk\XmlStringStreamer\Stream;
|
8 |
+
|
9 |
/**
|
10 |
* Chunk
|
11 |
*
|
30 |
'pointer' => 1,
|
31 |
'chunkSize' => 1024,
|
32 |
'filter' => true,
|
33 |
+
'get_cloud' => false
|
34 |
);
|
35 |
|
36 |
/**
|
50 |
public $cloud = array();
|
51 |
public $loop = 1;
|
52 |
public $is_404 = false;
|
53 |
+
public $parser_type = false;
|
54 |
|
55 |
/**
|
56 |
* handle
|
76 |
* @author Dom Hastings
|
77 |
* @access public
|
78 |
*/
|
79 |
+
public function __construct($file, $options = array(), $parser_type = false) {
|
80 |
|
81 |
// merge the options together
|
82 |
$this->options = array_merge($this->options, (is_array($options) ? $options : array()));
|
107 |
return;
|
108 |
}
|
109 |
|
110 |
+
$input = new PMXI_Input();
|
111 |
+
|
112 |
+
$import_id = $input->get('id', 0);
|
113 |
+
|
114 |
+
if ( empty($import_id)) $import_id = $input->get('import_id', 0);
|
115 |
+
|
116 |
+
if ( ! empty($import_id) )
|
117 |
+
{
|
118 |
+
$this->parser_type = empty($parser_type) ? 'xmlreader' : $parser_type;
|
119 |
+
$import = new PMXI_Import_Record();
|
120 |
+
$import->getById($import_id);
|
121 |
+
if ( ! $import->isEmpty() ){
|
122 |
+
$this->parser_type = empty($import->options['xml_reader_engine']) ? 'xmlreader' : 'xmlstreamer';
|
123 |
+
}
|
124 |
+
}
|
125 |
+
else
|
126 |
+
{
|
127 |
+
$this->parser_type = empty($parser_type) ? get_option('wpai_parser_type', 'xmlreader') : $parser_type;
|
128 |
+
}
|
129 |
+
|
130 |
if (empty($this->options['element']) or $this->options['get_cloud'])
|
131 |
{
|
|
|
132 |
$path = $this->get_file_path();
|
133 |
|
134 |
+
if ( $this->parser_type == 'xmlreader' )
|
135 |
+
{
|
136 |
+
$reader = new XMLReader();
|
137 |
+
$reader->open($path);
|
138 |
+
$reader->setParserProperty(XMLReader::VALIDATE, false);
|
139 |
+
while ( @$reader->read() ) {
|
140 |
+
switch ($reader->nodeType) {
|
141 |
+
case (XMLREADER::ELEMENT):
|
142 |
+
$localName = str_replace("_colon_", ":", $reader->localName);
|
143 |
+
if (array_key_exists(str_replace(":", "_", $localName), $this->cloud))
|
144 |
+
$this->cloud[str_replace(":", "_", $localName)]++;
|
145 |
+
else
|
146 |
+
$this->cloud[str_replace(":", "_", $localName)] = 1;
|
147 |
+
break;
|
148 |
+
default:
|
149 |
+
|
150 |
+
break;
|
151 |
+
}
|
152 |
+
}
|
153 |
+
unset($reader);
|
154 |
+
}
|
155 |
+
else
|
156 |
+
{
|
157 |
+
$CHUNK_SIZE = 1024;
|
158 |
+
$streamProvider = new Prewk\XmlStringStreamer\Stream\File($path, $CHUNK_SIZE);
|
159 |
+
$parseroptions = array(
|
160 |
+
"extractContainer" => false, // Required option
|
161 |
+
);
|
162 |
+
// Works like an XmlReader, and walks the XML tree node by node. Captures by node depth setting.
|
163 |
+
$parser = new Parser\StringWalker($parseroptions);
|
164 |
+
// Create the streamer
|
165 |
+
$streamer = new XmlStringStreamer($parser, $streamProvider);
|
166 |
+
while ($node = $streamer->getNode()) {
|
167 |
+
// $simpleXmlNode = simplexml_load_string($node);
|
168 |
+
// echo (string)$simpleXmlNode->firstName;
|
169 |
+
}
|
170 |
+
|
171 |
+
$this->cloud = $parser->cloud;
|
172 |
}
|
|
|
173 |
|
174 |
if ( ! empty($this->cloud) and empty($this->options['element']) ){
|
175 |
|
191 |
}
|
192 |
}
|
193 |
}
|
194 |
+
}
|
|
|
|
|
195 |
|
196 |
+
$path = $this->get_file_path();
|
|
|
|
|
197 |
|
198 |
+
if ( $this->parser_type == 'xmlreader' )
|
199 |
+
{
|
200 |
+
$this->reader = new XMLReader();
|
201 |
+
@$this->reader->open($path);
|
202 |
+
@$this->reader->setParserProperty(XMLReader::VALIDATE, false);
|
203 |
+
}
|
204 |
+
else
|
205 |
+
{
|
206 |
+
$parseroptions = array(
|
207 |
+
"uniqueNode" => $this->options['element']
|
208 |
+
);
|
209 |
+
$CHUNK_SIZE = 1024;
|
210 |
+
$streamProvider = new Prewk\XmlStringStreamer\Stream\File($path, $CHUNK_SIZE);
|
211 |
+
$parser = new Parser\UniqueNode($parseroptions);
|
212 |
+
$this->reader = new XmlStringStreamer($parser, $streamProvider);
|
213 |
+
}
|
214 |
}
|
215 |
|
216 |
function get_file_path()
|
217 |
{
|
218 |
$is_enabled_stream_filter = apply_filters('wp_all_import_is_enabled_stream_filter', true);
|
219 |
+
if ( function_exists('stream_filter_register') and $this->options['filter'] and $is_enabled_stream_filter and $this->parser_type == 'xmlreader' )
|
220 |
{
|
221 |
stream_filter_register('preprocessxml', 'preprocessXml_filter');
|
222 |
if (defined('HHVM_VERSION'))
|
259 |
|
260 |
$xml = '';
|
261 |
|
262 |
+
if ( $this->parser_type == 'xmlreader' )
|
263 |
+
{
|
264 |
+
try {
|
265 |
+
while ( @$this->reader->read() ) {
|
266 |
+
switch ($this->reader->nodeType) {
|
267 |
+
case (XMLREADER::ELEMENT):
|
268 |
+
|
269 |
+
$localName = str_replace("_colon_", ":", $this->reader->localName);
|
270 |
+
|
271 |
+
if ( strtolower(str_replace(":", "_", $localName)) == strtolower($element) ) {
|
272 |
+
|
273 |
+
if ($this->loop < $this->options['pointer']){
|
274 |
+
$this->loop++;
|
275 |
+
continue;
|
276 |
+
}
|
277 |
+
|
278 |
+
$xml = @$this->reader->readOuterXML();
|
279 |
+
|
280 |
+
break(2);
|
281 |
+
}
|
282 |
+
break;
|
283 |
+
default:
|
284 |
+
// code ...
|
285 |
+
break;
|
286 |
+
}
|
287 |
+
}
|
288 |
+
} catch (XmlImportException $e) {
|
289 |
+
$xml = false;
|
290 |
}
|
291 |
+
}
|
292 |
+
else
|
293 |
+
{
|
294 |
+
$is_preprocess_enabled = apply_filters('is_xml_preprocess_enabled', true);
|
295 |
+
|
296 |
+
while ($xml = $this->reader->getNode()) {
|
297 |
+
// $simpleXmlNode = simplexml_load_string($node);
|
298 |
+
// echo (string)$simpleXmlNode->firstName;
|
299 |
+
|
300 |
+
if ($this->loop < $this->options['pointer']){
|
301 |
+
$this->loop++;
|
302 |
+
continue;
|
303 |
+
}
|
304 |
+
|
305 |
+
if ($is_preprocess_enabled)
|
306 |
+
{
|
307 |
+
// the & symbol is not valid in XML, so replace it with temporary word _ampersand_
|
308 |
+
$xml = str_replace("&", "_ampersand_", $xml);
|
309 |
+
$xml = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', str_replace(":", "_colon_", $xml));
|
310 |
+
}
|
311 |
+
|
312 |
+
break;
|
313 |
+
}
|
314 |
+
}
|
315 |
|
316 |
return ( ! empty($xml) ) ? self::removeColonsFromRSS(preg_replace('%xmlns.*=\s*([\'""]).*\1%sU', '', $xml)) : false;
|
317 |
|
366 |
{
|
367 |
// the & symbol is not valid in XML, so replace it with temporary word _ampersand_
|
368 |
$bucket->data = str_replace("&", "_ampersand_", $bucket->data);
|
369 |
+
$bucket->data = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $this->replace_colons($bucket->data));
|
370 |
}
|
371 |
$consumed += $bucket->datalen;
|
372 |
stream_bucket_append($out, $bucket);
|
classes/handler.php
CHANGED
@@ -67,7 +67,12 @@ class PMXI_Handler extends PMXI_Session {
|
|
67 |
* @return array
|
68 |
*/
|
69 |
public function get_session_data() {
|
70 |
-
return (array) get_option( '_wpallimport_session_' . $this->_import_id . '_', array() );
|
|
|
|
|
|
|
|
|
|
|
71 |
}
|
72 |
|
73 |
/**
|
@@ -111,6 +116,13 @@ class PMXI_Handler extends PMXI_Session {
|
|
111 |
$this->_dirty = true;
|
112 |
|
113 |
$this->save_data();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
}
|
115 |
|
116 |
public function clean_session( $import_id = 'new' ){
|
67 |
* @return array
|
68 |
*/
|
69 |
public function get_session_data() {
|
70 |
+
// return (array) get_option( '_wpallimport_session_' . $this->_import_id . '_', array() );
|
71 |
+
global $wpdb;
|
72 |
+
|
73 |
+
$session = $wpdb->get_row( $wpdb->prepare("SELECT option_name, option_value FROM $wpdb->options WHERE option_name = %s", '_wpallimport_session_' . $this->_import_id . '_'), ARRAY_A );
|
74 |
+
|
75 |
+
return empty($session) ? array() : unserialize($session['option_value']);
|
76 |
}
|
77 |
|
78 |
/**
|
116 |
$this->_dirty = true;
|
117 |
|
118 |
$this->save_data();
|
119 |
+
|
120 |
+
$parser_type = get_option('wpai_parser_type_0');
|
121 |
+
|
122 |
+
if ( ! empty($parser_type) ){
|
123 |
+
update_option('wpai_parser_type_' . $import_id, $parser_type);
|
124 |
+
delete_option('wpai_parser_type_0');
|
125 |
+
}
|
126 |
}
|
127 |
|
128 |
public function clean_session( $import_id = 'new' ){
|
controllers/admin/import.php
CHANGED
@@ -256,6 +256,8 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
256 |
}
|
257 |
|
258 |
$local_paths = !empty($local_paths) ? $local_paths : array($filePath);
|
|
|
|
|
259 |
|
260 |
foreach ($local_paths as $key => $path) {
|
261 |
|
@@ -1383,14 +1385,17 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
1383 |
|
1384 |
if ($this->isWizard) {
|
1385 |
$this->data['source_type'] = PMXI_Plugin::$session->source['type'];
|
1386 |
-
|
1387 |
foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
|
1388 |
-
if (class_exists($class)) $
|
1389 |
}
|
1390 |
-
$
|
1391 |
-
$
|
1392 |
-
$
|
1393 |
-
|
|
|
|
|
|
|
1394 |
|
1395 |
} else {
|
1396 |
$this->data['source_type'] = $this->data['import']->type;
|
@@ -1408,9 +1413,16 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
1408 |
|
1409 |
PMXI_Plugin::$session->set('source', $source);
|
1410 |
|
1411 |
-
$post = $this->input->post( apply_filters( 'pmxi_options_options', $DefaultOptions, $this->isWizard) );
|
1412 |
|
1413 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1414 |
|
1415 |
$this->data['post'] =& $post;
|
1416 |
|
@@ -1663,12 +1675,14 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
1663 |
|
1664 |
if ($this->isWizard) {
|
1665 |
$this->data['source_type'] = PMXI_Plugin::$session->source['type'];
|
1666 |
-
|
1667 |
-
$DefaultOptions = (isset(PMXI_Plugin::$session->options) ? PMXI_Plugin::$session->options : array()) + $default;
|
1668 |
foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
|
1669 |
-
if (class_exists($class)) $
|
1670 |
-
}
|
1671 |
-
|
|
|
|
|
|
|
1672 |
if (empty(PMXI_Plugin::$session->options['title']))
|
1673 |
$this->warnings->add('form-validation', __('<strong>Warning:</strong> your title is blank.'));
|
1674 |
if (empty(PMXI_Plugin::$session->options['content']))
|
@@ -1716,7 +1730,12 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
1716 |
$DefaultOptions['custom_duplicate_name'] = '_sku';
|
1717 |
}
|
1718 |
|
1719 |
-
$
|
|
|
|
|
|
|
|
|
|
|
1720 |
} else {
|
1721 |
$this->data['source_type'] = $this->data['import']->type;
|
1722 |
$DefaultOptions = (is_array($this->data['import']->options)) ? $this->data['import']->options + $default : $default;
|
@@ -1733,7 +1752,7 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
1733 |
|
1734 |
PMXI_Plugin::$session->set('source', $source);
|
1735 |
|
1736 |
-
$post = $this->input->post( $DefaultOptions );
|
1737 |
|
1738 |
}
|
1739 |
|
@@ -2148,7 +2167,7 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
|
|
2148 |
|
2149 |
$log_storage = (int) PMXI_Plugin::getInstance()->getOption('log_storage');
|
2150 |
|
2151 |
-
if ( ! PMXI_Plugin::is_ajax() ) {
|
2152 |
|
2153 |
$import->set(
|
2154 |
(empty(PMXI_Plugin::$session->source) ? array() : PMXI_Plugin::$session->source)
|
256 |
}
|
257 |
|
258 |
$local_paths = !empty($local_paths) ? $local_paths : array($filePath);
|
259 |
+
|
260 |
+
// wp_all_import_get_reader_engine( $local_paths, $post );
|
261 |
|
262 |
foreach ($local_paths as $key => $path) {
|
263 |
|
1385 |
|
1386 |
if ($this->isWizard) {
|
1387 |
$this->data['source_type'] = PMXI_Plugin::$session->source['type'];
|
1388 |
+
|
1389 |
foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
|
1390 |
+
if (class_exists($class)) $default += call_user_func(array($class, "get_default_import_options"));
|
1391 |
}
|
1392 |
+
$default['wizard_type'] = PMXI_Plugin::$session->wizard_type;
|
1393 |
+
if (empty($default['custom_type'])) $default['custom_type'] = PMXI_Plugin::$session->custom_type;
|
1394 |
+
if (empty($default['delimiter'])) $default['delimiter'] = PMXI_Plugin::$session->is_csv;
|
1395 |
+
|
1396 |
+
$DefaultOptions = (isset(PMXI_Plugin::$session->options) ? PMXI_Plugin::$session->options : array()) + $default;
|
1397 |
+
|
1398 |
+
$post = array_replace_recursive($DefaultOptions, $this->input->post( apply_filters('pmxi_options_options', $DefaultOptions, $this->isWizard)));
|
1399 |
|
1400 |
} else {
|
1401 |
$this->data['source_type'] = $this->data['import']->type;
|
1413 |
|
1414 |
PMXI_Plugin::$session->set('source', $source);
|
1415 |
|
1416 |
+
$post = array_replace_recursive($DefaultOptions, $this->input->post( apply_filters( 'pmxi_options_options', $DefaultOptions, $this->isWizard) ));
|
1417 |
|
1418 |
+
}
|
1419 |
+
|
1420 |
+
$max_input_vars = @ini_get('max_input_vars');
|
1421 |
+
|
1422 |
+
if(ctype_digit($max_input_vars) && count($_POST, COUNT_RECURSIVE) >= $max_input_vars)
|
1423 |
+
{
|
1424 |
+
$this->errors->add('form-validation', sprintf(__('You\'ve reached your max_input_vars limit of %d. Please increase this.', 'wp_all_export_plugin'), $max_input_vars));
|
1425 |
+
}
|
1426 |
|
1427 |
$this->data['post'] =& $post;
|
1428 |
|
1675 |
|
1676 |
if ($this->isWizard) {
|
1677 |
$this->data['source_type'] = PMXI_Plugin::$session->source['type'];
|
1678 |
+
|
|
|
1679 |
foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
|
1680 |
+
if (class_exists($class)) $default += call_user_func(array($class, "get_default_import_options"));
|
1681 |
+
}
|
1682 |
+
|
1683 |
+
$DefaultOptions = (isset(PMXI_Plugin::$session->options) ? PMXI_Plugin::$session->options : array()) + $default;
|
1684 |
+
|
1685 |
+
if ( ! in_array(PMXI_Plugin::$session->options['custom_type'], array('import_users', 'shop_order')) ){
|
1686 |
if (empty(PMXI_Plugin::$session->options['title']))
|
1687 |
$this->warnings->add('form-validation', __('<strong>Warning:</strong> your title is blank.'));
|
1688 |
if (empty(PMXI_Plugin::$session->options['content']))
|
1730 |
$DefaultOptions['custom_duplicate_name'] = '_sku';
|
1731 |
}
|
1732 |
|
1733 |
+
$DefaultOptions['wizard_type'] = PMXI_Plugin::$session->wizard_type;
|
1734 |
+
if (empty($DefaultOptions['custom_type'])) $DefaultOptions['custom_type'] = PMXI_Plugin::$session->custom_type;
|
1735 |
+
if (empty($DefaultOptions['delimiter'])) $DefaultOptions['delimiter'] = PMXI_Plugin::$session->is_csv;
|
1736 |
+
|
1737 |
+
$post = array_replace_recursive($DefaultOptions, $this->input->post( $DefaultOptions ));
|
1738 |
+
|
1739 |
} else {
|
1740 |
$this->data['source_type'] = $this->data['import']->type;
|
1741 |
$DefaultOptions = (is_array($this->data['import']->options)) ? $this->data['import']->options + $default : $default;
|
1752 |
|
1753 |
PMXI_Plugin::$session->set('source', $source);
|
1754 |
|
1755 |
+
$post = array_replace_recursive($DefaultOptions, $this->input->post( $DefaultOptions ));
|
1756 |
|
1757 |
}
|
1758 |
|
2167 |
|
2168 |
$log_storage = (int) PMXI_Plugin::getInstance()->getOption('log_storage');
|
2169 |
|
2170 |
+
if ( ! PMXI_Plugin::is_ajax() ) {
|
2171 |
|
2172 |
$import->set(
|
2173 |
(empty(PMXI_Plugin::$session->source) ? array() : PMXI_Plugin::$session->source)
|
controllers/admin/manage.php
CHANGED
@@ -385,6 +385,8 @@ class PMXI_Admin_Manage extends PMXI_Controller_Admin {
|
|
385 |
|
386 |
$local_paths = ( ! empty($local_paths) ) ? $local_paths : array($filePath);
|
387 |
|
|
|
|
|
388 |
foreach ($local_paths as $key => $path) {
|
389 |
|
390 |
if (!empty($action_type) and $action_type == 'continue'){
|
385 |
|
386 |
$local_paths = ( ! empty($local_paths) ) ? $local_paths : array($filePath);
|
387 |
|
388 |
+
// wp_all_import_get_reader_engine( $local_paths, array('root_element' => $item->root_element), $item->id );
|
389 |
+
|
390 |
foreach ($local_paths as $key => $path) {
|
391 |
|
392 |
if (!empty($action_type) and $action_type == 'continue'){
|
controllers/admin/settings.php
CHANGED
@@ -560,6 +560,8 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
|
|
560 |
|
561 |
$notice = false;
|
562 |
|
|
|
|
|
563 |
// Check if file has been uploaded
|
564 |
if (!$chunks || $chunk == $chunks - 1) {
|
565 |
// Strip the temp .part suffix off
|
@@ -592,9 +594,41 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
|
|
592 |
{
|
593 |
$post_type = $upload_result['post_type'];
|
594 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
595 |
switch ( $post_type ) {
|
596 |
|
597 |
case 'product':
|
|
|
598 |
|
599 |
if ( ! class_exists('WooCommerce') ) {
|
600 |
$notice = __('<p class="wpallimport-bundle-notice">The import bundle you are using requires WooCommerce.</p><a class="upgrade_link" href="https://wordpress.org/plugins/woocommerce/" target="_blank">Get WooCommerce</a>.', 'wp_all_import_plugin');
|
@@ -636,6 +670,13 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
|
|
636 |
}
|
637 |
else
|
638 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
639 |
// validate XML
|
640 |
$file = new PMXI_Chunk($upload_result['filePath'], array('element' => $upload_result['root_element']));
|
641 |
|
@@ -711,7 +752,7 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
|
|
711 |
}
|
712 |
|
713 |
// Return JSON-RPC response
|
714 |
-
exit(json_encode(array("jsonrpc" => "2.0", "error" => null, "result" => null, "id" => "id", "name" => $filePath, "post_type" => $post_type, "notice" => $notice)));
|
715 |
|
716 |
}
|
717 |
|
560 |
|
561 |
$notice = false;
|
562 |
|
563 |
+
$warning = false;
|
564 |
+
|
565 |
// Check if file has been uploaded
|
566 |
if (!$chunks || $chunk == $chunks - 1) {
|
567 |
// Strip the temp .part suffix off
|
594 |
{
|
595 |
$post_type = $upload_result['post_type'];
|
596 |
|
597 |
+
if ( ! empty($upload_result['template']) )
|
598 |
+
{
|
599 |
+
|
600 |
+
$template = json_decode($upload_result['template'], true);
|
601 |
+
|
602 |
+
if ( ! empty($template[0]['options']))
|
603 |
+
{
|
604 |
+
$is_show_cf_notice = ( ! empty($template[0]['options']['custom_name'])) ? true : false;
|
605 |
+
|
606 |
+
$is_show_images_notice = false;
|
607 |
+
|
608 |
+
if ( $post_type != 'product' && (
|
609 |
+
$template[0]['options']['download_featured_image'] != '' ||
|
610 |
+
$template[0]['options']['gallery_featured_image'] != '' ||
|
611 |
+
$template[0]['options']['featured_image'] != ''))
|
612 |
+
{
|
613 |
+
$is_show_images_notice = true;
|
614 |
+
}
|
615 |
+
|
616 |
+
if ( $is_show_cf_notice && $is_show_images_notice ){
|
617 |
+
$warning = __('<a class="upgrade_link" target="_blank" href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields">Upgrade to the Pro edition of WP All Import to import images and custom fields.</a> <p>If you already own it, remove the free edition and install the Pro edition.</p>', 'wp_all_import_plugin');
|
618 |
+
}
|
619 |
+
else if ( $is_show_cf_notice ){
|
620 |
+
$warning = __('<a class="upgrade_link" target="_blank" href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields">Upgrade to the Pro edition of WP All Import to import custom fields.</a> <p>If you already own it, remove the free edition and install the Pro edition.</p>', 'wp_all_import_plugin');
|
621 |
+
}
|
622 |
+
else if ( $is_show_images_notice ) {
|
623 |
+
$warning = __('<a class="upgrade_link" target="_blank" href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields">Upgrade to the Pro edition of WP All Import to import images.</a> <p>If you already own it, remove the free edition and install the Pro edition.</p>', 'wp_all_import_plugin');
|
624 |
+
}
|
625 |
+
}
|
626 |
+
}
|
627 |
+
|
628 |
switch ( $post_type ) {
|
629 |
|
630 |
case 'product':
|
631 |
+
case 'shop_order':
|
632 |
|
633 |
if ( ! class_exists('WooCommerce') ) {
|
634 |
$notice = __('<p class="wpallimport-bundle-notice">The import bundle you are using requires WooCommerce.</p><a class="upgrade_link" href="https://wordpress.org/plugins/woocommerce/" target="_blank">Get WooCommerce</a>.', 'wp_all_import_plugin');
|
670 |
}
|
671 |
else
|
672 |
{
|
673 |
+
// $root_element = wp_all_import_get_reader_engine( array($upload_result['filePath']), array('root_element' => $upload_result['root_element']) );
|
674 |
+
|
675 |
+
// if ( ! empty($root_element) and empty($upload_result['root_element']))
|
676 |
+
// {
|
677 |
+
// $upload_result['root_element'] = $root_element;
|
678 |
+
// }
|
679 |
+
|
680 |
// validate XML
|
681 |
$file = new PMXI_Chunk($upload_result['filePath'], array('element' => $upload_result['root_element']));
|
682 |
|
752 |
}
|
753 |
|
754 |
// Return JSON-RPC response
|
755 |
+
exit(json_encode(array("jsonrpc" => "2.0", "error" => null, "result" => null, "id" => "id", "name" => $filePath, "post_type" => $post_type, "notice" => $notice, "warning" => $warning)));
|
756 |
|
757 |
}
|
758 |
|
helpers/wp_all_import_get_reader_engine.php
ADDED
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( ! function_exists('wp_all_import_get_reader_engine')){
|
4 |
+
|
5 |
+
function wp_all_import_get_reader_engine( $local_paths, $post, $import_id = 0 ) {
|
6 |
+
|
7 |
+
$xml_reader_engine = 'xmlreader';
|
8 |
+
|
9 |
+
$is_auto_detect_xml_reader = apply_filters( 'wp_all_import_auto_detect_reader_engine', true );
|
10 |
+
|
11 |
+
// auto detect xml reader engine disabled
|
12 |
+
if ( $is_auto_detect_xml_reader === false )
|
13 |
+
{
|
14 |
+
update_option('wpai_parser_type', 'xmlreader');
|
15 |
+
|
16 |
+
return false;
|
17 |
+
}
|
18 |
+
|
19 |
+
$root_element = '';
|
20 |
+
|
21 |
+
// auto-detect XML reader engine
|
22 |
+
foreach ($local_paths as $key => $path) {
|
23 |
+
|
24 |
+
if ( @file_exists($path) ){
|
25 |
+
|
26 |
+
$file = new PMXI_Chunk( $path, array('element' => $post['root_element']), 'xmlreader' );
|
27 |
+
|
28 |
+
$xmlreader_count = 0;
|
29 |
+
|
30 |
+
if ( ! empty($file->options['element']) ) {
|
31 |
+
|
32 |
+
$root_element = $file->options['element'];
|
33 |
+
|
34 |
+
$xpath = "/" . $file->options['element'];
|
35 |
+
|
36 |
+
$start_time = time();
|
37 |
+
|
38 |
+
// loop through the file until all lines are read
|
39 |
+
while ($xml = $file->read()) {
|
40 |
+
|
41 |
+
if ( ! empty($xml) )
|
42 |
+
{
|
43 |
+
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" . "\n" . $xml;
|
44 |
+
|
45 |
+
$dom = new DOMDocument('1.0', 'UTF-8');
|
46 |
+
$old = libxml_use_internal_errors(true);
|
47 |
+
$dom->loadXML($xml);
|
48 |
+
libxml_use_internal_errors($old);
|
49 |
+
$dxpath = new DOMXPath($dom);
|
50 |
+
|
51 |
+
if (($elements = @$dxpath->query($xpath)) and $elements->length){
|
52 |
+
$xmlreader_count += $elements->length;
|
53 |
+
unset($dom, $dxpath, $elements);
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
$execution_time = time() - $start_time;
|
58 |
+
|
59 |
+
// if stream reader takes longer than 30 seconds just stop using it
|
60 |
+
// if ( $execution_time > 30 ) {
|
61 |
+
// break;
|
62 |
+
// }
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
unset($file);
|
67 |
+
|
68 |
+
// count element using xml streamer
|
69 |
+
|
70 |
+
if ( ! empty($post['root_element'])) $root_element = $post['root_element'];
|
71 |
+
|
72 |
+
$file = new PMXI_Chunk( $path, array('element' => $root_element), 'xmlstreamer' );
|
73 |
+
|
74 |
+
$xmlstreamer_count = 0;
|
75 |
+
|
76 |
+
if ( ! empty($file->options['element']) ) {
|
77 |
+
|
78 |
+
$xpath = "/" . $file->options['element'];
|
79 |
+
|
80 |
+
$start_time = time();
|
81 |
+
|
82 |
+
// loop through the file until all lines are read
|
83 |
+
while ($xml = $file->read()) {
|
84 |
+
|
85 |
+
if ( ! empty($xml) )
|
86 |
+
{
|
87 |
+
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" . "\n" . $xml;
|
88 |
+
|
89 |
+
$dom = new DOMDocument('1.0', 'UTF-8');
|
90 |
+
$old = libxml_use_internal_errors(true);
|
91 |
+
$dom->loadXML($xml);
|
92 |
+
libxml_use_internal_errors($old);
|
93 |
+
$dxpath = new DOMXPath($dom);
|
94 |
+
|
95 |
+
if (($elements = @$dxpath->query($xpath)) and $elements->length){
|
96 |
+
$xmlstreamer_count += $elements->length;
|
97 |
+
unset($dom, $dxpath, $elements);
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
$execution_time = time() - $start_time;
|
102 |
+
|
103 |
+
// if stream reader takes longer than 30 seconds just stop using it
|
104 |
+
// if ( $execution_time > 30 ) {
|
105 |
+
// break;
|
106 |
+
// }
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
unset($file);
|
111 |
+
|
112 |
+
$xml_reader_engine = ($xmlreader_count >= $xmlstreamer_count) ? 'xmlreader' : 'xmlstreamer';
|
113 |
+
|
114 |
+
update_option('wpai_parser_type', $xml_reader_engine);
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
return $root_element;
|
119 |
+
}
|
120 |
+
}
|
models/import/record.php
CHANGED
@@ -973,7 +973,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
|
|
973 |
}
|
974 |
}
|
975 |
else{
|
976 |
-
$logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'
|
977 |
}
|
978 |
}
|
979 |
}
|
@@ -1128,10 +1128,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
|
|
1128 |
if ( ! $this->options['is_update_registered'] ) $articleData['user_registered'] = $post_to_update->user_registered;
|
1129 |
if ( ! $this->options['is_update_display_name'] ) $articleData['display_name'] = $post_to_update->display_name;
|
1130 |
if ( ! $this->options['is_update_url'] ) $articleData['user_url'] = $post_to_update->user_url;
|
1131 |
-
}
|
1132 |
-
|
1133 |
-
$logger and call_user_func($logger, sprintf(__('Applying filter `pmxi_article_data` for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
|
1134 |
-
$articleData = apply_filters('pmxi_article_data', $articleData, $this, $post_to_update);
|
1135 |
|
1136 |
}
|
1137 |
|
@@ -1160,6 +1157,9 @@ class PMXI_Import_Record extends PMXI_Model_Record {
|
|
1160 |
$postRecord->clear();
|
1161 |
|
1162 |
}
|
|
|
|
|
|
|
1163 |
|
1164 |
// no new records are created. it will only update posts it finds matching duplicates for
|
1165 |
if ( ! $this->options['create_new_records'] and empty($articleData['ID']) ){
|
@@ -2118,10 +2118,11 @@ class PMXI_Import_Record extends PMXI_Model_Record {
|
|
2118 |
$logger and call_user_func($logger, sprintf(__('<b>UPDATED</b> `%s` `%s` (ID: %s)', 'wp_all_import_plugin'), $articleData['post_title'], $custom_type_details->labels->singular_name, $pid));
|
2119 |
}
|
2120 |
|
|
|
|
|
2121 |
// fire important hooks after custom fields are added
|
2122 |
if ( ! $this->options['is_fast_mode'] and $this->options['custom_type'] != 'import_users'){
|
2123 |
-
$post_object = get_post( $pid );
|
2124 |
-
$is_update = ! empty($articleData['ID']);
|
2125 |
do_action( "save_post_" . $articleData['post_type'], $pid, $post_object, $is_update );
|
2126 |
do_action( 'save_post', $pid, $post_object, $is_update );
|
2127 |
do_action( 'wp_insert_post', $pid, $post_object, $is_update );
|
@@ -2157,7 +2158,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
|
|
2157 |
|
2158 |
// [/addons import]
|
2159 |
$logger and call_user_func($logger, __('<b>ACTION</b>: pmxi_saved_post', 'wp_all_import_plugin'));
|
2160 |
-
do_action( 'pmxi_saved_post', $pid, $rootNodes[$i]); // hook that was triggered immediately after post saved
|
2161 |
|
2162 |
if (empty($articleData['ID'])) $created++; else $updated++;
|
2163 |
|
973 |
}
|
974 |
}
|
975 |
else{
|
976 |
+
$logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'t found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
|
977 |
}
|
978 |
}
|
979 |
}
|
1128 |
if ( ! $this->options['is_update_registered'] ) $articleData['user_registered'] = $post_to_update->user_registered;
|
1129 |
if ( ! $this->options['is_update_display_name'] ) $articleData['display_name'] = $post_to_update->display_name;
|
1130 |
if ( ! $this->options['is_update_url'] ) $articleData['user_url'] = $post_to_update->user_url;
|
1131 |
+
}
|
|
|
|
|
|
|
1132 |
|
1133 |
}
|
1134 |
|
1157 |
$postRecord->clear();
|
1158 |
|
1159 |
}
|
1160 |
+
|
1161 |
+
$logger and call_user_func($logger, sprintf(__('Applying filter `pmxi_article_data` for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
|
1162 |
+
$articleData = apply_filters('pmxi_article_data', $articleData, $this, $post_to_update);
|
1163 |
|
1164 |
// no new records are created. it will only update posts it finds matching duplicates for
|
1165 |
if ( ! $this->options['create_new_records'] and empty($articleData['ID']) ){
|
2118 |
$logger and call_user_func($logger, sprintf(__('<b>UPDATED</b> `%s` `%s` (ID: %s)', 'wp_all_import_plugin'), $articleData['post_title'], $custom_type_details->labels->singular_name, $pid));
|
2119 |
}
|
2120 |
|
2121 |
+
$is_update = ! empty($articleData['ID']);
|
2122 |
+
|
2123 |
// fire important hooks after custom fields are added
|
2124 |
if ( ! $this->options['is_fast_mode'] and $this->options['custom_type'] != 'import_users'){
|
2125 |
+
$post_object = get_post( $pid );
|
|
|
2126 |
do_action( "save_post_" . $articleData['post_type'], $pid, $post_object, $is_update );
|
2127 |
do_action( 'save_post', $pid, $post_object, $is_update );
|
2128 |
do_action( 'wp_insert_post', $pid, $post_object, $is_update );
|
2158 |
|
2159 |
// [/addons import]
|
2160 |
$logger and call_user_func($logger, __('<b>ACTION</b>: pmxi_saved_post', 'wp_all_import_plugin'));
|
2161 |
+
do_action( 'pmxi_saved_post', $pid, $rootNodes[$i], $is_update); // hook that was triggered immediately after post saved
|
2162 |
|
2163 |
if (empty($articleData['ID'])) $created++; else $updated++;
|
2164 |
|
plugin.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: WP All Import
|
4 |
Plugin URI: http://www.wpallimport.com/upgrade-to-pro?utm_source=wordpress.org&utm_medium=plugins-page&utm_campaign=free+plugin
|
5 |
Description: The most powerful solution for importing XML and CSV files to WordPress. Create Posts and Pages with content from any XML or CSV file. A paid upgrade to WP All Import Pro is available for support and additional features.
|
6 |
-
Version: 3.3.
|
7 |
Author: Soflyy
|
8 |
*/
|
9 |
|
@@ -25,7 +25,7 @@ define('WP_ALL_IMPORT_ROOT_URL', rtrim(plugin_dir_url(__FILE__), '/'));
|
|
25 |
*/
|
26 |
define('WP_ALL_IMPORT_PREFIX', 'pmxi_');
|
27 |
|
28 |
-
define('PMXI_VERSION', '3.3.
|
29 |
|
30 |
define('PMXI_EDITION', 'free');
|
31 |
|
@@ -700,10 +700,11 @@ final class PMXI_Plugin {
|
|
700 |
* @return mixed
|
701 |
*/
|
702 |
public function getOption($option = NULL) {
|
|
|
703 |
if (is_null($option)) {
|
704 |
-
return $
|
705 |
-
} else if (isset($
|
706 |
-
return $
|
707 |
} else {
|
708 |
throw new Exception("Specified option is not defined for the plugin");
|
709 |
}
|
@@ -977,166 +978,167 @@ final class PMXI_Plugin {
|
|
977 |
public static function get_default_import_options() {
|
978 |
return array(
|
979 |
'type' => 'post',
|
980 |
-
|
981 |
-
|
982 |
-
|
983 |
-
|
984 |
-
|
985 |
-
|
986 |
-
|
987 |
-
|
988 |
-
|
989 |
-
|
990 |
-
|
991 |
-
|
992 |
-
|
993 |
-
|
994 |
-
|
995 |
-
|
996 |
-
|
997 |
-
|
998 |
-
|
999 |
-
|
1000 |
-
|
1001 |
-
|
1002 |
-
|
1003 |
-
|
1004 |
-
|
1005 |
-
|
1006 |
-
|
1007 |
-
|
1008 |
-
|
1009 |
-
|
1010 |
-
|
1011 |
-
|
1012 |
-
|
1013 |
-
|
1014 |
-
|
1015 |
-
|
1016 |
-
|
1017 |
-
|
1018 |
-
|
1019 |
-
|
1020 |
-
|
1021 |
-
|
1022 |
-
|
1023 |
-
|
1024 |
-
|
1025 |
-
|
1026 |
-
|
1027 |
-
|
1028 |
-
|
1029 |
-
|
1030 |
-
|
1031 |
-
|
1032 |
-
|
1033 |
-
|
1034 |
-
|
1035 |
-
|
1036 |
-
|
1037 |
-
|
1038 |
-
|
1039 |
-
|
1040 |
-
|
1041 |
-
|
1042 |
-
|
1043 |
-
|
1044 |
-
|
1045 |
-
|
1046 |
-
|
1047 |
-
|
1048 |
-
|
1049 |
-
|
1050 |
-
|
1051 |
-
|
1052 |
-
|
1053 |
-
|
1054 |
-
|
1055 |
-
|
1056 |
-
|
1057 |
-
|
1058 |
-
|
1059 |
-
|
1060 |
-
|
1061 |
-
|
1062 |
-
|
1063 |
-
|
1064 |
-
|
1065 |
-
|
1066 |
-
|
1067 |
-
|
1068 |
-
|
1069 |
-
|
1070 |
-
|
1071 |
-
|
1072 |
-
|
1073 |
-
|
1074 |
-
|
1075 |
-
|
1076 |
-
|
1077 |
-
|
1078 |
-
|
1079 |
-
|
1080 |
-
|
1081 |
-
|
1082 |
-
|
1083 |
-
|
1084 |
-
|
1085 |
-
|
1086 |
-
|
1087 |
-
|
1088 |
-
|
1089 |
-
|
1090 |
-
|
1091 |
-
|
1092 |
-
|
1093 |
-
|
1094 |
-
|
1095 |
-
|
1096 |
-
|
1097 |
-
|
1098 |
-
|
1099 |
-
|
1100 |
-
|
1101 |
-
|
1102 |
-
|
1103 |
-
|
1104 |
-
|
1105 |
-
|
1106 |
-
|
1107 |
-
|
1108 |
-
|
1109 |
-
|
1110 |
-
|
1111 |
-
|
1112 |
-
|
1113 |
-
|
1114 |
-
|
1115 |
-
|
1116 |
-
|
1117 |
-
|
1118 |
-
|
1119 |
-
|
1120 |
-
|
1121 |
-
|
1122 |
-
|
1123 |
-
|
1124 |
-
|
1125 |
-
|
1126 |
-
|
1127 |
-
|
1128 |
-
|
1129 |
-
|
1130 |
-
|
1131 |
-
|
1132 |
-
|
1133 |
-
|
1134 |
-
|
1135 |
-
|
1136 |
-
|
1137 |
-
|
1138 |
-
|
1139 |
-
|
|
|
1140 |
);
|
1141 |
}
|
1142 |
|
3 |
Plugin Name: WP All Import
|
4 |
Plugin URI: http://www.wpallimport.com/upgrade-to-pro?utm_source=wordpress.org&utm_medium=plugins-page&utm_campaign=free+plugin
|
5 |
Description: The most powerful solution for importing XML and CSV files to WordPress. Create Posts and Pages with content from any XML or CSV file. A paid upgrade to WP All Import Pro is available for support and additional features.
|
6 |
+
Version: 3.3.7
|
7 |
Author: Soflyy
|
8 |
*/
|
9 |
|
25 |
*/
|
26 |
define('WP_ALL_IMPORT_PREFIX', 'pmxi_');
|
27 |
|
28 |
+
define('PMXI_VERSION', '3.3.7');
|
29 |
|
30 |
define('PMXI_EDITION', 'free');
|
31 |
|
700 |
* @return mixed
|
701 |
*/
|
702 |
public function getOption($option = NULL) {
|
703 |
+
$options = apply_filters('wp_all_import_config_options', $this->options);
|
704 |
if (is_null($option)) {
|
705 |
+
return $options;
|
706 |
+
} else if (isset($options[$option])) {
|
707 |
+
return $options[$option];
|
708 |
} else {
|
709 |
throw new Exception("Specified option is not defined for the plugin");
|
710 |
}
|
978 |
public static function get_default_import_options() {
|
979 |
return array(
|
980 |
'type' => 'post',
|
981 |
+
'is_override_post_type' => 0,
|
982 |
+
'post_type_xpath' => '',
|
983 |
+
'deligate' => '',
|
984 |
+
'wizard_type' => 'new',
|
985 |
+
'custom_type' => '',
|
986 |
+
'featured_delim' => ',',
|
987 |
+
'atch_delim' => ',',
|
988 |
+
'is_search_existing_attach' => 0,
|
989 |
+
'post_taxonomies' => array(),
|
990 |
+
'parent' => 0,
|
991 |
+
'is_multiple_page_parent' => 'yes',
|
992 |
+
'single_page_parent' => '',
|
993 |
+
'order' => 0,
|
994 |
+
'status' => 'publish',
|
995 |
+
'page_template' => 'default',
|
996 |
+
'is_multiple_page_template' => 'yes',
|
997 |
+
'single_page_template' => '',
|
998 |
+
'page_taxonomies' => array(),
|
999 |
+
'date_type' => 'specific',
|
1000 |
+
'date' => 'now',
|
1001 |
+
'date_start' => 'now',
|
1002 |
+
'date_end' => 'now',
|
1003 |
+
'custom_name' => array(),
|
1004 |
+
'custom_value' => array(),
|
1005 |
+
'custom_format' => array(),
|
1006 |
+
'custom_mapping' => array(),
|
1007 |
+
'serialized_values' => array(),
|
1008 |
+
'custom_mapping_rules' => array(),
|
1009 |
+
'comment_status' => 'open',
|
1010 |
+
'comment_status_xpath' => '',
|
1011 |
+
'ping_status' => 'open',
|
1012 |
+
'ping_status_xpath' => '',
|
1013 |
+
'create_draft' => 'no',
|
1014 |
+
'author' => '',
|
1015 |
+
'post_excerpt' => '',
|
1016 |
+
'post_slug' => '',
|
1017 |
+
'attachments' => '',
|
1018 |
+
'is_import_specified' => 0,
|
1019 |
+
'import_specified' => '',
|
1020 |
+
'is_delete_source' => 0,
|
1021 |
+
'is_cloak' => 0,
|
1022 |
+
'unique_key' => '',
|
1023 |
+
'tmp_unique_key' => '',
|
1024 |
+
'feed_type' => 'auto',
|
1025 |
+
'search_existing_images' => 1,
|
1026 |
+
|
1027 |
+
'create_new_records' => 1,
|
1028 |
+
'is_delete_missing' => 0,
|
1029 |
+
'set_missing_to_draft' => 0,
|
1030 |
+
'is_update_missing_cf' => 0,
|
1031 |
+
'update_missing_cf_name' => '',
|
1032 |
+
'update_missing_cf_value' => '',
|
1033 |
+
|
1034 |
+
'is_keep_former_posts' => 'no',
|
1035 |
+
'is_update_status' => 1,
|
1036 |
+
'is_update_content' => 1,
|
1037 |
+
'is_update_title' => 1,
|
1038 |
+
'is_update_slug' => 1,
|
1039 |
+
'is_update_excerpt' => 1,
|
1040 |
+
'is_update_categories' => 1,
|
1041 |
+
'is_update_author' => 1,
|
1042 |
+
'is_update_comment_status' => 1,
|
1043 |
+
'update_categories_logic' => 'full_update',
|
1044 |
+
'taxonomies_list' => array(),
|
1045 |
+
'taxonomies_only_list' => array(),
|
1046 |
+
'taxonomies_except_list' => array(),
|
1047 |
+
'is_update_attachments' => 1,
|
1048 |
+
'is_update_images' => 1,
|
1049 |
+
'update_images_logic' => 'full_update',
|
1050 |
+
'is_update_dates' => 1,
|
1051 |
+
'is_update_menu_order' => 1,
|
1052 |
+
'is_update_parent' => 1,
|
1053 |
+
'is_keep_attachments' => 0,
|
1054 |
+
'is_keep_imgs' => 0,
|
1055 |
+
'do_not_remove_images' => 1,
|
1056 |
+
|
1057 |
+
'is_update_custom_fields' => 1,
|
1058 |
+
'update_custom_fields_logic' => 'full_update',
|
1059 |
+
'custom_fields_list' => array(),
|
1060 |
+
'custom_fields_only_list' => array(),
|
1061 |
+
'custom_fields_except_list' => array(),
|
1062 |
+
|
1063 |
+
'duplicate_matching' => 'auto',
|
1064 |
+
'duplicate_indicator' => 'title',
|
1065 |
+
'custom_duplicate_name' => '',
|
1066 |
+
'custom_duplicate_value' => '',
|
1067 |
+
'is_update_previous' => 0,
|
1068 |
+
'is_scheduled' => '',
|
1069 |
+
'scheduled_period' => '',
|
1070 |
+
'friendly_name' => '',
|
1071 |
+
'records_per_request' => 20,
|
1072 |
+
'auto_rename_images' => 0,
|
1073 |
+
'auto_rename_images_suffix' => '',
|
1074 |
+
'images_name' => 'filename',
|
1075 |
+
'post_format' => 'standard',
|
1076 |
+
'post_format_xpath' => '',
|
1077 |
+
'encoding' => 'UTF-8',
|
1078 |
+
'delimiter' => '',
|
1079 |
+
'image_meta_title' => '',
|
1080 |
+
'image_meta_title_delim' => ',',
|
1081 |
+
'image_meta_caption' => '',
|
1082 |
+
'image_meta_caption_delim' => ',',
|
1083 |
+
'image_meta_alt' => '',
|
1084 |
+
'image_meta_alt_delim' => ',',
|
1085 |
+
'image_meta_description' => '',
|
1086 |
+
'image_meta_description_delim' => ',',
|
1087 |
+
'image_meta_description_delim_logic' => 'separate',
|
1088 |
+
'status_xpath' => '',
|
1089 |
+
'download_images' => 'yes',
|
1090 |
+
'converted_options' => 0,
|
1091 |
+
'update_all_data' => 'yes',
|
1092 |
+
'is_fast_mode' => 0,
|
1093 |
+
'chuncking' => 1,
|
1094 |
+
'import_processing' => 'ajax',
|
1095 |
+
'save_template_as' => 0,
|
1096 |
+
|
1097 |
+
'title' => '',
|
1098 |
+
'content' => '',
|
1099 |
+
'name' => '',
|
1100 |
+
'is_keep_linebreaks' => 0,
|
1101 |
+
'is_leave_html' => 0,
|
1102 |
+
'fix_characters' => 0,
|
1103 |
+
'pid_xpath' => '',
|
1104 |
+
|
1105 |
+
'featured_image' => '',
|
1106 |
+
'download_featured_image' => '',
|
1107 |
+
'download_featured_delim' => ',',
|
1108 |
+
'gallery_featured_image' => '',
|
1109 |
+
'gallery_featured_delim' => ',',
|
1110 |
+
'is_featured' => 1,
|
1111 |
+
'set_image_meta_title' => 0,
|
1112 |
+
'set_image_meta_caption' => 0,
|
1113 |
+
'set_image_meta_alt' => 0,
|
1114 |
+
'set_image_meta_description' => 0,
|
1115 |
+
'auto_set_extension' => 0,
|
1116 |
+
'new_extension' => '',
|
1117 |
+
'tax_logic' => array(),
|
1118 |
+
'tax_assing' => array(),
|
1119 |
+
'term_assing' => array(),
|
1120 |
+
'multiple_term_assing' => array(),
|
1121 |
+
'tax_hierarchical_assing' => array(),
|
1122 |
+
'tax_hierarchical_last_level_assign' => array(),
|
1123 |
+
'tax_single_xpath' => array(),
|
1124 |
+
'tax_multiple_xpath' => array(),
|
1125 |
+
'tax_hierarchical_xpath' => array(),
|
1126 |
+
'tax_multiple_delim' => array(),
|
1127 |
+
'tax_hierarchical_delim' => array(),
|
1128 |
+
'tax_manualhierarchy_delim' => array(),
|
1129 |
+
'tax_hierarchical_logic_entire' => array(),
|
1130 |
+
'tax_hierarchical_logic_manual' => array(),
|
1131 |
+
'tax_enable_mapping' => array(),
|
1132 |
+
'tax_is_full_search_single' => array(),
|
1133 |
+
'tax_is_full_search_multiple' => array(),
|
1134 |
+
'tax_assign_to_one_term_single' => array(),
|
1135 |
+
'tax_assign_to_one_term_multiple' => array(),
|
1136 |
+
'tax_mapping' => array(),
|
1137 |
+
'tax_logic_mapping' => array(),
|
1138 |
+
'is_tax_hierarchical_group_delim' => array(),
|
1139 |
+
'tax_hierarchical_group_delim' => array(),
|
1140 |
+
'nested_files' => array(),
|
1141 |
+
'xml_reader_engine' => 0
|
1142 |
);
|
1143 |
}
|
1144 |
|
readme.txt
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
=== Import any XML or CSV File to WordPress ===
|
2 |
Contributors: soflyy, wpallimport
|
3 |
Requires at least: 4.1
|
4 |
-
Tested up to: 4.
|
5 |
-
Stable tag: 3.3.
|
6 |
Tags: wordpress csv import, wordpress xml import, xml, csv, datafeed, import, migrate, import csv to wordpress, import xml to wordpress, advanced xml import, advanced csv import, bulk csv import, bulk xml import, bulk data import, xml to custom post type, csv to custom post type, woocommerce csv import, woocommerce xml import, csv import, import csv, xml import, import xml, csv importer
|
7 |
|
8 |
WP All Import is an extremely powerful importer that makes it easy to import any XML or CSV file to WordPress.
|
@@ -43,7 +43,7 @@ For technical support from the developers, please consider purchasing WP All Imp
|
|
43 |
|
44 |
* Guaranteed technical support via e-mail.
|
45 |
|
46 |
-
[Upgrade to the
|
47 |
|
48 |
Need to [import XML and CSV to WooCommerce?](http://wordpress.org/plugins/woocommerce-xml-csv-product-import/) Check out our WooCommerce add-on.
|
49 |
|
@@ -73,7 +73,7 @@ Learn more about our add-ons at [http://www.wpallimport.com/add-ons](http://www.
|
|
73 |
A [developer API](http://www.wpallimport.com/documentation/developers/action-reference/?utm_source=free-plugin&utm_medium=dot-org&utm_campaign=documentation) (action hooks) is also available.
|
74 |
|
75 |
== Premium Support ==
|
76 |
-
Upgrade to the
|
77 |
|
78 |
E-mail: support@wpallimport.com
|
79 |
|
@@ -105,29 +105,33 @@ Does it work with special character encoding like Hebrew, Arabic, Chinese, etc?
|
|
105 |
|
106 |
== Changelog ==
|
107 |
|
|
|
|
|
|
|
|
|
108 |
= 3.3.6 =
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
|
117 |
= 3.3.5 =
|
118 |
-
|
119 |
|
120 |
= 3.3.4 =
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
|
132 |
= 3.3.3 =
|
133 |
* fixed duplicate matching by custom field
|
1 |
=== Import any XML or CSV File to WordPress ===
|
2 |
Contributors: soflyy, wpallimport
|
3 |
Requires at least: 4.1
|
4 |
+
Tested up to: 4.6
|
5 |
+
Stable tag: 3.3.7
|
6 |
Tags: wordpress csv import, wordpress xml import, xml, csv, datafeed, import, migrate, import csv to wordpress, import xml to wordpress, advanced xml import, advanced csv import, bulk csv import, bulk xml import, bulk data import, xml to custom post type, csv to custom post type, woocommerce csv import, woocommerce xml import, csv import, import csv, xml import, import xml, csv importer
|
7 |
|
8 |
WP All Import is an extremely powerful importer that makes it easy to import any XML or CSV file to WordPress.
|
43 |
|
44 |
* Guaranteed technical support via e-mail.
|
45 |
|
46 |
+
[Upgrade to the Pro edition of WP All Import.](http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=dot-org&utm_campaign=upgrade)
|
47 |
|
48 |
Need to [import XML and CSV to WooCommerce?](http://wordpress.org/plugins/woocommerce-xml-csv-product-import/) Check out our WooCommerce add-on.
|
49 |
|
73 |
A [developer API](http://www.wpallimport.com/documentation/developers/action-reference/?utm_source=free-plugin&utm_medium=dot-org&utm_campaign=documentation) (action hooks) is also available.
|
74 |
|
75 |
== Premium Support ==
|
76 |
+
Upgrade to the Pro edition of WP All Import for premium support.
|
77 |
|
78 |
E-mail: support@wpallimport.com
|
79 |
|
105 |
|
106 |
== Changelog ==
|
107 |
|
108 |
+
= 3.3.7 =
|
109 |
+
* added new option 'Use StreamReader instead of XMLReader to parse import file' to fix issue with libxml 2.9.3
|
110 |
+
* execute 'pmxi_article_data' filter for all posts ( new & existing )
|
111 |
+
|
112 |
= 3.3.6 =
|
113 |
+
* added de_CH translation
|
114 |
+
* added support for .svg images
|
115 |
+
* added possibility for import excerpts for pages
|
116 |
+
* added new filter 'wp_all_import_specified_records'
|
117 |
+
* added new filter 'wp_all_import_is_post_to_delete'
|
118 |
+
* disable XMLReader stream filter for HHVM
|
119 |
+
* improve search for existing images in media gallery
|
120 |
|
121 |
= 3.3.5 =
|
122 |
+
* fixed 'Use images currently in Media Library' option
|
123 |
|
124 |
= 3.3.4 =
|
125 |
+
* fixed error messages on step 1 in case when server throws fatal error e.q. time limit exception
|
126 |
+
* fixed option "Delete posts that are no longer present in your file", now it works with empty CSV files which has only one header row
|
127 |
+
* fixed custom php functions in images preview
|
128 |
+
* fixed detecting root nodes with colons in names
|
129 |
+
* added es_ES translation
|
130 |
+
* added de_DE translation
|
131 |
+
* added iterative ajax delete process ( deleting associated posts )
|
132 |
+
* added feature to download template/bundle from import settings
|
133 |
+
* added new option for importing images "Use images currently in Media Library"
|
134 |
+
* added new action 'pmxi_missing_post'
|
135 |
|
136 |
= 3.3.3 =
|
137 |
* fixed duplicate matching by custom field
|
static/css/admin.css
CHANGED
@@ -600,6 +600,16 @@
|
|
600 |
margin-top: 0;
|
601 |
margin-bottom: 15px;
|
602 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
603 |
/*--------------------------------------------------------------------------
|
604 |
*
|
605 |
* Helpers
|
@@ -1394,6 +1404,8 @@
|
|
1394 |
color: #555;
|
1395 |
margin-top: 0;
|
1396 |
}
|
|
|
|
|
1397 |
.wpallimport-plugin #custom_type_selector .dd-option .dashicon-shop_order:before,
|
1398 |
.wpallimport-plugin #custom_type_selector .dd-selected .dashicon-shop_order:before{
|
1399 |
font-family: "WooCommerce";
|
600 |
margin-top: 0;
|
601 |
margin-bottom: 15px;
|
602 |
}
|
603 |
+
.wpallimport-plugin .wpallimport-trigger-options{
|
604 |
+
cursor: pointer;
|
605 |
+
margin: 5px 0;
|
606 |
+
}
|
607 |
+
.wpallimport-plugin .wpallimport-dynamic-notice{
|
608 |
+
display: none;
|
609 |
+
}
|
610 |
+
.wpallimport-plugin .wpallimport-import-orders-notice{
|
611 |
+
display: none;
|
612 |
+
}
|
613 |
/*--------------------------------------------------------------------------
|
614 |
*
|
615 |
* Helpers
|
1404 |
color: #555;
|
1405 |
margin-top: 0;
|
1406 |
}
|
1407 |
+
.wpallimport-plugin #custom_type_selector .dd-option .dashicon-shop_coupon:before,
|
1408 |
+
.wpallimport-plugin #custom_type_selector .dd-selected .dashicon-shop_coupon:before,
|
1409 |
.wpallimport-plugin #custom_type_selector .dd-option .dashicon-shop_order:before,
|
1410 |
.wpallimport-plugin #custom_type_selector .dd-selected .dashicon-shop_order:before{
|
1411 |
font-family: "WooCommerce";
|
static/js/admin.js
CHANGED
@@ -151,6 +151,46 @@
|
|
151 |
});
|
152 |
});
|
153 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
$('.change_file').each(function(){
|
155 |
|
156 |
var $wrap = $('.wrap');
|
@@ -294,20 +334,30 @@
|
|
294 |
if (fixWrapHeight)
|
295 |
$wrap.css({'height': formHeight + 'px'});
|
296 |
else
|
297 |
-
fixWrapHeight = true;
|
|
|
|
|
298 |
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
311 |
}
|
312 |
});
|
313 |
|
@@ -1886,6 +1936,37 @@
|
|
1886 |
});
|
1887 |
// [\ Delete Import]
|
1888 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1889 |
var fix_tag_position = function(){
|
1890 |
if ($('.wpallimport-layout').length && $('.tag').length){
|
1891 |
var offset = $('.wpallimport-layout').offset();
|
@@ -1903,7 +1984,19 @@
|
|
1903 |
fix_tag_position();
|
1904 |
|
1905 |
$(document).scroll(function() {
|
1906 |
-
fix_tag_position();
|
|
|
1907 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1908 |
|
1909 |
});})(jQuery);
|
151 |
});
|
152 |
});
|
153 |
|
154 |
+
var toggle_dynamic_notice = function(){
|
155 |
+
|
156 |
+
$('.wpallimport-dynamic-notice').hide();
|
157 |
+
|
158 |
+
var $import_to_custom_type = $('input[name=custom_type]').val();
|
159 |
+
|
160 |
+
var $is_show_cf_notice = false;
|
161 |
+
var $is_show_images_notice = false;
|
162 |
+
|
163 |
+
$('input[name^=custom_name]').each(function(){
|
164 |
+
if ( $(this).val() != "")
|
165 |
+
{
|
166 |
+
$is_show_cf_notice = true;
|
167 |
+
return false;
|
168 |
+
}
|
169 |
+
});
|
170 |
+
|
171 |
+
if ( $import_to_custom_type != 'product' &&
|
172 |
+
( $('textarea[name=download_featured_image]').val() != "" ||
|
173 |
+
$('textarea[name=gallery_featured_image]').val() != "" ||
|
174 |
+
$('textarea[name=featured_image]').val() != "" ))
|
175 |
+
{
|
176 |
+
$is_show_images_notice = true;
|
177 |
+
}
|
178 |
+
|
179 |
+
if ( $is_show_cf_notice && $is_show_images_notice ){
|
180 |
+
$('.wpallimport-dynamic-notice').find('a').html($('.wpallimport-dynamic-notice-cf-image-text').val());
|
181 |
+
$('.wpallimport-dynamic-notice').show();
|
182 |
+
}
|
183 |
+
else if ( $is_show_cf_notice ){
|
184 |
+
$('.wpallimport-dynamic-notice').find('a').html($('.wpallimport-dynamic-notice-cf-text').val());
|
185 |
+
$('.wpallimport-dynamic-notice').show();
|
186 |
+
}
|
187 |
+
else if ( $is_show_images_notice ) {
|
188 |
+
$('.wpallimport-dynamic-notice').find('a').html($('.wpallimport-dynamic-notice-images-text').val());
|
189 |
+
$('.wpallimport-dynamic-notice').show();
|
190 |
+
}
|
191 |
+
|
192 |
+
}
|
193 |
+
|
194 |
$('.change_file').each(function(){
|
195 |
|
196 |
var $wrap = $('.wrap');
|
334 |
if (fixWrapHeight)
|
335 |
$wrap.css({'height': formHeight + 'px'});
|
336 |
else
|
337 |
+
fixWrapHeight = true;
|
338 |
+
|
339 |
+
$('#custom_type_selector').find('.dd-selected').css({'color':'#555'});
|
340 |
|
341 |
+
$('input[name=custom_type]').val(selectedData.selectedData.value);
|
342 |
+
|
343 |
+
if (selectedData.selectedData.value == 'shop_order')
|
344 |
+
{
|
345 |
+
$('.wpallimport-choose-file').find('.wpallimport-submit-buttons').hide();
|
346 |
+
$('.wpallimport-import-orders-notice').show();
|
347 |
+
}
|
348 |
+
else
|
349 |
+
{
|
350 |
+
$('.wpallimport-import-orders-notice').hide();
|
351 |
+
|
352 |
+
if ($('.wpallimport-upload-resource-step-two:visible').length)
|
353 |
+
{
|
354 |
+
$('.wpallimport-choose-file').find('.wpallimport-submit-buttons').show();
|
355 |
+
}
|
356 |
+
else
|
357 |
+
{
|
358 |
+
$('.wpallimport-choose-file').find('.wpallimport-submit-buttons').hide();
|
359 |
+
}
|
360 |
+
}
|
361 |
}
|
362 |
});
|
363 |
|
1936 |
});
|
1937 |
// [\ Delete Import]
|
1938 |
|
1939 |
+
if ($('.switcher-target-update_choosen_data').length)
|
1940 |
+
{
|
1941 |
+
var $re_import_options = $('.switcher-target-update_choosen_data');
|
1942 |
+
var $toggle_re_import_options = $('.wpallimport-trigger-options');
|
1943 |
+
|
1944 |
+
if ($re_import_options.find('input[type=checkbox]').length == $re_import_options.find('input[type=checkbox]:checked').length)
|
1945 |
+
{
|
1946 |
+
var $newtitle = $toggle_re_import_options.attr('rel');
|
1947 |
+
$toggle_re_import_options.attr('rel', $toggle_re_import_options.html());
|
1948 |
+
$toggle_re_import_options.html($newtitle);
|
1949 |
+
$toggle_re_import_options.removeClass('wpallimport-select-all');
|
1950 |
+
}
|
1951 |
+
}
|
1952 |
+
|
1953 |
+
$('.wpallimport-trigger-options').click(function(){
|
1954 |
+
var $parent = $(this).parents('.switcher-target-update_choosen_data:first');
|
1955 |
+
var $newtitle = $(this).attr('rel');
|
1956 |
+
if ( $(this).hasClass('wpallimport-select-all') )
|
1957 |
+
{
|
1958 |
+
$parent.find('input[type=checkbox]').removeAttr('checked').click();
|
1959 |
+
$(this).removeClass('wpallimport-select-all');
|
1960 |
+
}
|
1961 |
+
else
|
1962 |
+
{
|
1963 |
+
$parent.find('input[type=checkbox]:checked').click();
|
1964 |
+
$(this).addClass('wpallimport-select-all');
|
1965 |
+
}
|
1966 |
+
$(this).attr('rel', $(this).html());
|
1967 |
+
$(this).html($newtitle);
|
1968 |
+
});
|
1969 |
+
|
1970 |
var fix_tag_position = function(){
|
1971 |
if ($('.wpallimport-layout').length && $('.tag').length){
|
1972 |
var offset = $('.wpallimport-layout').offset();
|
1984 |
fix_tag_position();
|
1985 |
|
1986 |
$(document).scroll(function() {
|
1987 |
+
fix_tag_position();
|
1988 |
+
toggle_dynamic_notice();
|
1989 |
});
|
1990 |
+
|
1991 |
+
toggle_dynamic_notice();
|
1992 |
+
|
1993 |
+
$('input[name^=custom_name], input[name^=custom_value], textarea[name=download_featured_image], textarea[name=gallery_featured_image], textarea[name=featured_image]').change(function() {
|
1994 |
+
toggle_dynamic_notice();
|
1995 |
+
});
|
1996 |
+
|
1997 |
+
$('input[name^=custom_name], input[name^=custom_value], textarea[name=download_featured_image], textarea[name=gallery_featured_image], textarea[name=featured_image]').blur(function() {
|
1998 |
+
toggle_dynamic_notice();
|
1999 |
+
});
|
2000 |
+
|
2001 |
|
2002 |
});})(jQuery);
|
static/js/plupload/wplupload.js
CHANGED
@@ -151,6 +151,11 @@ $.fn.wplupload = function($options) {
|
|
151 |
}
|
152 |
else
|
153 |
{
|
|
|
|
|
|
|
|
|
|
|
154 |
$('.wpallimport-choose-file').find('.wpallimport-upload-resource-step-two').slideDown();
|
155 |
$('.wpallimport-choose-file').find('.wpallimport-submit-buttons').show();
|
156 |
}
|
151 |
}
|
152 |
else
|
153 |
{
|
154 |
+
if (r.post_type && r.warning !== false)
|
155 |
+
{
|
156 |
+
var $note = $('.wpallimport-upload-type-container[rel=upload_type]').find('.wpallimport-note');
|
157 |
+
$note.html("<div class='wpallimport-free-edition-notice'>" + r.warning + "</div>").show();
|
158 |
+
}
|
159 |
$('.wpallimport-choose-file').find('.wpallimport-upload-resource-step-two').slideDown();
|
160 |
$('.wpallimport-choose-file').find('.wpallimport-submit-buttons').show();
|
161 |
}
|
views/admin/help/index.php
CHANGED
@@ -12,7 +12,7 @@
|
|
12 |
|
13 |
<p style="font-size: 1.3em;"><?php _e('We do not provide technical support in the WordPress.org community forums. But we are usually more than happy to help out free version users via e-mail - just e-mail us at the address above or submit a ticket through the support form.', 'wp_all_import_plugin'); ?></p>
|
14 |
|
15 |
-
<p style="font-size: 1.3em;"><a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=support" target="_blank"><?php _e('For premium support, please upgrade to the
|
16 |
|
17 |
</td>
|
18 |
<td class="right"> </td>
|
12 |
|
13 |
<p style="font-size: 1.3em;"><?php _e('We do not provide technical support in the WordPress.org community forums. But we are usually more than happy to help out free version users via e-mail - just e-mail us at the address above or submit a ticket through the support form.', 'wp_all_import_plugin'); ?></p>
|
14 |
|
15 |
+
<p style="font-size: 1.3em;"><a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=support" target="_blank"><?php _e('For premium support, please upgrade to the Pro edition of WP All Import.', 'wp_all_import_plugin'); ?></a></p>
|
16 |
|
17 |
</td>
|
18 |
<td class="right"> </td>
|
views/admin/import/index.php
CHANGED
@@ -112,8 +112,8 @@ $l10n = array(
|
|
112 |
<div class="wpallimport-note" style="margin: 20px auto 0; font-size: 13px;">
|
113 |
<?php _e('<strong>Hint:</strong> After you create this import, you can schedule it to run automatically, on a pre-defined schedule, with cron jobs. If anything in your file has changed, WP All Import can update your site with the changed data automatically.', 'wp_all_import_plugin'); ?>
|
114 |
<div class="wpallimport-free-edition-notice" style="display:none;">
|
115 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=download-from-url" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
116 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
117 |
</div>
|
118 |
</div>
|
119 |
<input type="hidden" name="downloaded" value="<?php echo $post['downloaded']; ?>"/>
|
@@ -137,8 +137,8 @@ $l10n = array(
|
|
137 |
<div class="wpallimport-note" style="margin: 0 auto; font-size: 13px;">
|
138 |
<?php printf(__('Upload files to <strong>%s</strong> and they will appear in this list', 'wp_all_import_plugin'), $upload_dir['basedir'] . '/wpallimport/files') ?>
|
139 |
<div class="wpallimport-free-edition-notice">
|
140 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=use-existing-file" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
141 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
142 |
</div>
|
143 |
</div>
|
144 |
</div>
|
@@ -170,7 +170,7 @@ $l10n = array(
|
|
170 |
|
171 |
$custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
|
172 |
foreach ($custom_types as $key => $ct) {
|
173 |
-
if (in_array($key, array('attachment', 'revision', 'nav_menu_item', '
|
174 |
}
|
175 |
$custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
|
176 |
|
@@ -193,33 +193,39 @@ $l10n = array(
|
|
193 |
</div>
|
194 |
</div>
|
195 |
<select name="custom_type_selector" id="custom_type_selector" class="wpallimport-post-types">
|
196 |
-
<?php if ( ! empty($custom_types)): ?>
|
197 |
<?php foreach ($custom_types as $key => $ct) :?>
|
198 |
<?php
|
199 |
$image_src = 'dashicon-cpt';
|
200 |
|
201 |
$cpt = $key;
|
202 |
-
$cpt_label = $ct->labels->name;
|
203 |
-
|
204 |
-
if (class_exists('WooCommerce'))
|
205 |
-
{
|
206 |
-
if ($key == 'product')
|
207 |
-
{
|
208 |
-
$cpt = 'shop_order';
|
209 |
-
$cpt_label = $custom_types['shop_order']->labels->name;
|
210 |
-
}
|
211 |
-
elseif($key == 'shop_order')
|
212 |
-
{
|
213 |
-
$cpt = 'product';
|
214 |
-
$cpt_label = $custom_types['product']->labels->name;
|
215 |
-
}
|
216 |
-
}
|
217 |
|
218 |
-
if ( in_array($cpt, array('post', 'page', 'product', '
|
|
|
219 |
$image_src = 'dashicon-' . $cpt;
|
|
|
|
|
|
|
|
|
|
|
|
|
220 |
?>
|
221 |
-
<option value="<?php echo $cpt; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>"
|
222 |
<?php endforeach; ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
<?php endif; ?>
|
224 |
<?php if ( ! empty($hidden_post_types)): ?>
|
225 |
<?php foreach ($hidden_post_types as $key => $cpt) :?>
|
@@ -269,7 +275,12 @@ $l10n = array(
|
|
269 |
</div>
|
270 |
</div>
|
271 |
<a class="button button-primary button-hero wpallimport-large-button wpallimport-notify-read-more" href="http://www.wpallimport.com/documentation/troubleshooting/problems-with-import-files/#invalid" target="_blank"><?php _e('Read More', 'wp_all_import_plugin');?></a>
|
272 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
273 |
|
274 |
<p class="wpallimport-submit-buttons">
|
275 |
<input type="hidden" name="custom_type" value="<?php echo $post['custom_type'];?>">
|
112 |
<div class="wpallimport-note" style="margin: 20px auto 0; font-size: 13px;">
|
113 |
<?php _e('<strong>Hint:</strong> After you create this import, you can schedule it to run automatically, on a pre-defined schedule, with cron jobs. If anything in your file has changed, WP All Import can update your site with the changed data automatically.', 'wp_all_import_plugin'); ?>
|
114 |
<div class="wpallimport-free-edition-notice" style="display:none;">
|
115 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=download-from-url" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to use this feature.', 'wp_all_import_plugin');?></a>
|
116 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
117 |
</div>
|
118 |
</div>
|
119 |
<input type="hidden" name="downloaded" value="<?php echo $post['downloaded']; ?>"/>
|
137 |
<div class="wpallimport-note" style="margin: 0 auto; font-size: 13px;">
|
138 |
<?php printf(__('Upload files to <strong>%s</strong> and they will appear in this list', 'wp_all_import_plugin'), $upload_dir['basedir'] . '/wpallimport/files') ?>
|
139 |
<div class="wpallimport-free-edition-notice">
|
140 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=use-existing-file" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to use this feature.', 'wp_all_import_plugin');?></a>
|
141 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
142 |
</div>
|
143 |
</div>
|
144 |
</div>
|
170 |
|
171 |
$custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
|
172 |
foreach ($custom_types as $key => $ct) {
|
173 |
+
if (in_array($key, array('attachment', 'revision', 'nav_menu_item', 'shop_webhook', 'import_users'))) unset($custom_types[$key]);
|
174 |
}
|
175 |
$custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
|
176 |
|
193 |
</div>
|
194 |
</div>
|
195 |
<select name="custom_type_selector" id="custom_type_selector" class="wpallimport-post-types">
|
196 |
+
<?php if ( ! empty($custom_types)): $unknown_cpt = array(); ?>
|
197 |
<?php foreach ($custom_types as $key => $ct) :?>
|
198 |
<?php
|
199 |
$image_src = 'dashicon-cpt';
|
200 |
|
201 |
$cpt = $key;
|
202 |
+
$cpt_label = $ct->labels->name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
203 |
|
204 |
+
if ( in_array($cpt, array('post', 'page', 'product', 'shop_order', 'shop_coupon') ) )
|
205 |
+
{
|
206 |
$image_src = 'dashicon-' . $cpt;
|
207 |
+
}
|
208 |
+
else
|
209 |
+
{
|
210 |
+
$unknown_cpt[$key] = $ct;
|
211 |
+
continue;
|
212 |
+
}
|
213 |
?>
|
214 |
+
<option value="<?php echo $cpt; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>" <?php if ( $cpt == $post['custom_type'] ):?>selected="selected"<?php endif; ?>><?php echo $cpt_label; ?></option>
|
215 |
<?php endforeach; ?>
|
216 |
+
<?php if (class_exists('PMUI_Plugin')): ?>
|
217 |
+
<option value="import_users" data-imagesrc="dashicon dashicon-import_users" <?php if ( 'import_users' == $post['custom_type'] ):?>selected="selected"<?php endif; ?>><?php _e('Users', 'wp_all_import_plugin'); ?></option>
|
218 |
+
<?php endif; ?>
|
219 |
+
<?php if ( ! empty($unknown_cpt)): ?>
|
220 |
+
<?php foreach ($unknown_cpt as $key => $ct):?>
|
221 |
+
<?php
|
222 |
+
$image_src = 'dashicon-cpt';
|
223 |
+
$cpt_label = $ct->labels->name;
|
224 |
+
?>
|
225 |
+
<option value="<?php echo $key;?>" data-imagesrc="dashicon <?php echo $image_src; ?>" <?php if ($key == $post['custom_type']) echo 'selected="selected"'; ?>><?php echo $cpt_label; ?></option>
|
226 |
+
<?php endforeach ?>
|
227 |
+
<?php endif;?>
|
228 |
+
|
229 |
<?php endif; ?>
|
230 |
<?php if ( ! empty($hidden_post_types)): ?>
|
231 |
<?php foreach ($hidden_post_types as $key => $cpt) :?>
|
275 |
</div>
|
276 |
</div>
|
277 |
<a class="button button-primary button-hero wpallimport-large-button wpallimport-notify-read-more" href="http://www.wpallimport.com/documentation/troubleshooting/problems-with-import-files/#invalid" target="_blank"><?php _e('Read More', 'wp_all_import_plugin');?></a>
|
278 |
+
</div>
|
279 |
+
|
280 |
+
<div class="wpallimport-free-edition-notice wpallimport-import-orders-notice" style="text-align:center; margin-top:20px; margin-bottom: 40px; display: none;">
|
281 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WooCommerce add-on to import WooCommerce Orders.', 'wp_all_import_plugin');?></a>
|
282 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
283 |
+
</div>
|
284 |
|
285 |
<p class="wpallimport-submit-buttons">
|
286 |
<input type="hidden" name="custom_type" value="<?php echo $post['custom_type'];?>">
|
views/admin/import/options/_import_file.php
CHANGED
@@ -104,8 +104,8 @@ $l10n = array(
|
|
104 |
<span class="wpallimport-url-icon"></span>
|
105 |
<input type="text" class="regular-text" name="url" value="<?php echo ('url' == $import->type) ? esc_attr($import->path) : 'Enter a web address to download the file from...'; ?>"/>
|
106 |
<div class="wpallimport-free-edition-notice">
|
107 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=download-from-url" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
108 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
109 |
</div>
|
110 |
</div>
|
111 |
<input type="hidden" name="downloaded"/>
|
@@ -130,8 +130,8 @@ $l10n = array(
|
|
130 |
<?php printf(__('Upload files to <strong>%s</strong> and they will appear in this list', 'wp_all_import_plugin'), $upload_dir['basedir'] . '/wpallimport/files'); ?>
|
131 |
</div>
|
132 |
<div class="wpallimport-free-edition-notice">
|
133 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=use-existing-file" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
134 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
135 |
</div>
|
136 |
</div>
|
137 |
</div>
|
104 |
<span class="wpallimport-url-icon"></span>
|
105 |
<input type="text" class="regular-text" name="url" value="<?php echo ('url' == $import->type) ? esc_attr($import->path) : 'Enter a web address to download the file from...'; ?>"/>
|
106 |
<div class="wpallimport-free-edition-notice">
|
107 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=download-from-url" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to use this feature.', 'wp_all_import_plugin');?></a>
|
108 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
109 |
</div>
|
110 |
</div>
|
111 |
<input type="hidden" name="downloaded"/>
|
130 |
<?php printf(__('Upload files to <strong>%s</strong> and they will appear in this list', 'wp_all_import_plugin'), $upload_dir['basedir'] . '/wpallimport/files'); ?>
|
131 |
</div>
|
132 |
<div class="wpallimport-free-edition-notice">
|
133 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=use-existing-file" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to use this feature.', 'wp_all_import_plugin');?></a>
|
134 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
135 |
</div>
|
136 |
</div>
|
137 |
</div>
|
views/admin/import/options/_reimport_options.php
CHANGED
@@ -64,7 +64,10 @@
|
|
64 |
|
65 |
<input type="radio" id="update_choosen_data" class="switcher" name="update_all_data" value="no" <?php echo 'no' == $post['update_all_data'] ? 'checked="checked"': '' ?>/>
|
66 |
<label for="update_choosen_data"><?php _e('Choose which data to update', 'wp_all_import_plugin' )?></label><br>
|
67 |
-
<div class="switcher-target-update_choosen_data" style="padding-left:
|
|
|
|
|
|
|
68 |
<div class="input">
|
69 |
<input type="hidden" name="is_update_status" value="0" />
|
70 |
<input type="checkbox" id="is_update_status" name="is_update_status" value="1" <?php echo $post['is_update_status'] ? 'checked="checked"': '' ?> />
|
64 |
|
65 |
<input type="radio" id="update_choosen_data" class="switcher" name="update_all_data" value="no" <?php echo 'no' == $post['update_all_data'] ? 'checked="checked"': '' ?>/>
|
66 |
<label for="update_choosen_data"><?php _e('Choose which data to update', 'wp_all_import_plugin' )?></label><br>
|
67 |
+
<div class="switcher-target-update_choosen_data" style="padding-left:27px;">
|
68 |
+
<div class="input">
|
69 |
+
<h4 class="wpallimport-trigger-options wpallimport-select-all" rel="<?php _e("Unselect All", "wp_all_import_plugin"); ?>"><?php _e("Select All", "wp_all_import_plugin"); ?></h4>
|
70 |
+
</div>
|
71 |
<div class="input">
|
72 |
<input type="hidden" name="is_update_status" value="0" />
|
73 |
<input type="checkbox" id="is_update_status" name="is_update_status" value="1" <?php echo $post['is_update_status'] ? 'checked="checked"': '' ?> />
|
views/admin/import/options/_settings_template.php
CHANGED
@@ -49,7 +49,7 @@
|
|
49 |
|
50 |
$custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
|
51 |
foreach ($custom_types as $key => $ct) {
|
52 |
-
if (in_array($key, array('attachment', 'revision', 'nav_menu_item', '
|
53 |
}
|
54 |
$custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
|
55 |
|
@@ -62,15 +62,38 @@
|
|
62 |
?>
|
63 |
<div class="wpallimport-change-custom-type">
|
64 |
<select name="custom_type_selector" id="custom_type_selector" class="wpallimport-post-types">
|
65 |
-
<?php if ( ! empty($custom_types)): ?>
|
66 |
-
<?php foreach ($custom_types as $key => $
|
67 |
<?php
|
68 |
$image_src = 'dashicon-cpt';
|
69 |
-
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
?>
|
72 |
-
<option value="<?php echo $
|
73 |
<?php endforeach; ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
<?php endif; ?>
|
75 |
<?php if ( ! empty($hidden_post_types)): ?>
|
76 |
<?php foreach ($hidden_post_types as $key => $cpt) :?>
|
@@ -122,7 +145,12 @@
|
|
122 |
<input type="checkbox" id="is_cloak" class="fix_checkbox" name="is_cloak" value="1" <?php echo $post['is_cloak'] ? 'checked="checked"': '' ?>/>
|
123 |
<label for="is_cloak"><?php _e('Auto-Cloak Links', 'wp_all_import_plugin') ?> <a href="#help" class="wpallimport-help" style="position:relative; top:0;" title="<?php printf(__('Automatically process all links present in body of created post or page with <b>%s</b> plugin', 'wp_all_import_plugin'), PMLC_Plugin::getInstance()->getName()) ?>">?</a></label>
|
124 |
</div>
|
125 |
-
<?php endif; ?>
|
|
|
|
|
|
|
|
|
|
|
126 |
|
127 |
<div class="input" style="margin-top: 15px;">
|
128 |
<p><?php _e('Friendly Name','wp_all_import_plugin');?></p> <br>
|
49 |
|
50 |
$custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
|
51 |
foreach ($custom_types as $key => $ct) {
|
52 |
+
if (in_array($key, array('attachment', 'revision', 'nav_menu_item', 'shop_webhook', 'import_users', 'shop_order'))) unset($custom_types[$key]);
|
53 |
}
|
54 |
$custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
|
55 |
|
62 |
?>
|
63 |
<div class="wpallimport-change-custom-type">
|
64 |
<select name="custom_type_selector" id="custom_type_selector" class="wpallimport-post-types">
|
65 |
+
<?php if ( ! empty($custom_types)): $unknown_cpt = array(); ?>
|
66 |
+
<?php foreach ($custom_types as $key => $ct) :?>
|
67 |
<?php
|
68 |
$image_src = 'dashicon-cpt';
|
69 |
+
|
70 |
+
$cpt = $key;
|
71 |
+
$cpt_label = $ct->labels->name;
|
72 |
+
|
73 |
+
if ( in_array($cpt, array('post', 'page', 'product', 'shop_order', 'shop_coupon') ) )
|
74 |
+
{
|
75 |
+
$image_src = 'dashicon-' . $cpt;
|
76 |
+
}
|
77 |
+
else
|
78 |
+
{
|
79 |
+
$unknown_cpt[$key] = $ct;
|
80 |
+
continue;
|
81 |
+
}
|
82 |
?>
|
83 |
+
<option value="<?php echo $cpt; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>" <?php if ( $cpt == $post['custom_type'] ) echo 'selected="selected"';?>><?php echo $cpt_label; ?></option>
|
84 |
<?php endforeach; ?>
|
85 |
+
<?php if (class_exists('PMUI_Plugin')): ?>
|
86 |
+
<option value="import_users" data-imagesrc="dashicon dashicon-import_users" <?php if ( 'import_users' == $post['custom_type'] ):?>selected="selected"<?php endif; ?>><?php _e('Users', 'wp_all_import_plugin'); ?></option>
|
87 |
+
<?php endif; ?>
|
88 |
+
<?php if ( ! empty($unknown_cpt)): ?>
|
89 |
+
<?php foreach ($unknown_cpt as $key => $ct):?>
|
90 |
+
<?php
|
91 |
+
$image_src = 'dashicon-cpt';
|
92 |
+
$cpt_label = $ct->labels->name;
|
93 |
+
?>
|
94 |
+
<option value="<?php echo $key;?>" data-imagesrc="dashicon <?php echo $image_src; ?>" <?php if ($key == $post['custom_type']) echo 'selected="selected"'; ?>><?php echo $cpt_label; ?></option>
|
95 |
+
<?php endforeach ?>
|
96 |
+
<?php endif;?>
|
97 |
<?php endif; ?>
|
98 |
<?php if ( ! empty($hidden_post_types)): ?>
|
99 |
<?php foreach ($hidden_post_types as $key => $cpt) :?>
|
145 |
<input type="checkbox" id="is_cloak" class="fix_checkbox" name="is_cloak" value="1" <?php echo $post['is_cloak'] ? 'checked="checked"': '' ?>/>
|
146 |
<label for="is_cloak"><?php _e('Auto-Cloak Links', 'wp_all_import_plugin') ?> <a href="#help" class="wpallimport-help" style="position:relative; top:0;" title="<?php printf(__('Automatically process all links present in body of created post or page with <b>%s</b> plugin', 'wp_all_import_plugin'), PMLC_Plugin::getInstance()->getName()) ?>">?</a></label>
|
147 |
</div>
|
148 |
+
<?php endif; ?>
|
149 |
+
<div class="input">
|
150 |
+
<input type="hidden" name="xml_reader_engine" value="0" />
|
151 |
+
<input type="checkbox" id="xml_reader_engine" class="fix_checkbox" name="xml_reader_engine" value="1" <?php echo $post['xml_reader_engine'] ? 'checked="checked"': '' ?>/>
|
152 |
+
<label for="xml_reader_engine"><?php _e('Use StreamReader instead of XMLReader to parse import file', 'wp_all_import_plugin') ?> <a href="#help" class="wpallimport-help" style="position:relative; top:0;" title="<?php _e('XMLReader is much faster, but has a bug that sometimes prevents certain records from being imported with import files that contain special cases.', 'wp_all_import_plugin'); ?>">?</a></label>
|
153 |
+
</div>
|
154 |
|
155 |
<div class="input" style="margin-top: 15px;">
|
156 |
<p><?php _e('Friendly Name','wp_all_import_plugin');?></p> <br>
|
views/admin/import/template.php
CHANGED
@@ -148,8 +148,8 @@
|
|
148 |
<div class="wpallimport-collapsed-content" style="padding: 0;">
|
149 |
<div class="wpallimport-collapsed-content-inner">
|
150 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
151 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
152 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
153 |
</div>
|
154 |
|
155 |
<textarea id="wp_all_import_code" name="wp_all_import_code"><?php echo "<?php\n\n?>";?></textarea>
|
@@ -205,6 +205,15 @@
|
|
205 |
<div class="wpallimport-submit-buttons">
|
206 |
|
207 |
<div style="text-align:center; width:100%;">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
<?php wp_nonce_field('template', '_wpnonce_template'); ?>
|
209 |
|
210 |
<input type="hidden" name="is_submitted" value="1" />
|
148 |
<div class="wpallimport-collapsed-content" style="padding: 0;">
|
149 |
<div class="wpallimport-collapsed-content-inner">
|
150 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
151 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to enable the Function Editor.', 'wp_all_import_plugin');?></a>
|
152 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
153 |
</div>
|
154 |
|
155 |
<textarea id="wp_all_import_code" name="wp_all_import_code"><?php echo "<?php\n\n?>";?></textarea>
|
205 |
<div class="wpallimport-submit-buttons">
|
206 |
|
207 |
<div style="text-align:center; width:100%;">
|
208 |
+
|
209 |
+
<div class="wpallimport-free-edition-notice wpallimport-dynamic-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
210 |
+
<input type="hidden" value="<?php _e('Upgrade to the Pro edition of WP All Import to import custom fields.', 'wp_all_import_plugin');?>" class="wpallimport-dynamic-notice-cf-text"/>
|
211 |
+
<input type="hidden" value="<?php _e('Upgrade to the Pro edition of WP All Import to import images.', 'wp_all_import_plugin');?>" class="wpallimport-dynamic-notice-images-text"/>
|
212 |
+
<input type="hidden" value="<?php _e('Upgrade to the Pro edition of WP All Import to import images and custom fields.', 'wp_all_import_plugin');?>" class="wpallimport-dynamic-notice-cf-image-text"/>
|
213 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"></a>
|
214 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
215 |
+
</div>
|
216 |
+
|
217 |
<?php wp_nonce_field('template', '_wpnonce_template'); ?>
|
218 |
|
219 |
<input type="hidden" name="is_submitted" value="1" />
|
views/admin/import/template/_custom_fields_template.php
CHANGED
@@ -7,8 +7,8 @@
|
|
7 |
<div class="wpallimport-collapsed-content" style="padding: 0;">
|
8 |
<div class="wpallimport-collapsed-content-inner">
|
9 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
10 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
11 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
12 |
</div>
|
13 |
<script type="text/javascript">
|
14 |
__META_KEYS = <?php echo json_encode($meta_keys) ?>;
|
7 |
<div class="wpallimport-collapsed-content" style="padding: 0;">
|
8 |
<div class="wpallimport-collapsed-content-inner">
|
9 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
10 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to import data to Custom Fields.', 'pmxi_plugin');?></a>
|
11 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
12 |
</div>
|
13 |
<script type="text/javascript">
|
14 |
__META_KEYS = <?php echo json_encode($meta_keys) ?>;
|
views/admin/import/template/_featured_template.php
CHANGED
@@ -8,8 +8,8 @@
|
|
8 |
<?php if ($section_is_show_warning and ( $post_type != "product" or ! class_exists('PMWI_Plugin'))):?>
|
9 |
|
10 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:-15px; margin-bottom: 40px;">
|
11 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=images" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
12 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
13 |
</div>
|
14 |
|
15 |
<?php endif; ?>
|
8 |
<?php if ($section_is_show_warning and ( $post_type != "product" or ! class_exists('PMWI_Plugin'))):?>
|
9 |
|
10 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:-15px; margin-bottom: 40px;">
|
11 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=images" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to import images.', 'pmxi_plugin');?></a>
|
12 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
13 |
</div>
|
14 |
|
15 |
<?php endif; ?>
|
views/admin/manage/index.php
CHANGED
@@ -373,7 +373,7 @@ $columns = apply_filters('pmxi_manage_imports_columns', $columns);
|
|
373 |
}
|
374 |
?>
|
375 |
|
376 |
-
<p style='font-size: 1.3em; font-weight: bold;'><a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=manage" target="_blank" class="upgrade_link"><?php _e('Find out more about the
|
377 |
|
378 |
<a href="http://soflyy.com/" target="_blank" class="wpallimport-created-by"><?php _e('Created by', 'wp_all_import_plugin'); ?> <span></span></a>
|
379 |
|
373 |
}
|
374 |
?>
|
375 |
|
376 |
+
<p style='font-size: 1.3em; font-weight: bold;'><a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=manage" target="_blank" class="upgrade_link"><?php _e('Find out more about the Pro edition of WP All Import.', 'wp_all_import_plugin'); ?></a></p>
|
377 |
|
378 |
<a href="http://soflyy.com/" target="_blank" class="wpallimport-created-by"><?php _e('Created by', 'wp_all_import_plugin'); ?> <span></span></a>
|
379 |
|
views/admin/settings/index.php
CHANGED
@@ -135,8 +135,8 @@
|
|
135 |
<br>
|
136 |
<h3><?php _e('Function Editor', 'wp_all_import_plugin') ?></h3>
|
137 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
138 |
-
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the
|
139 |
-
<p><?php _e('If you already own it, remove the free edition and install the
|
140 |
</div>
|
141 |
<textarea id="wp_all_import_code" name="wp_all_import_code"><?php echo "<?php\n\n?>";?></textarea>
|
142 |
|
135 |
<br>
|
136 |
<h3><?php _e('Function Editor', 'wp_all_import_plugin') ?></h3>
|
137 |
<div class="wpallimport-free-edition-notice" style="text-align:center; margin-top:0; margin-bottom: 40px;">
|
138 |
+
<a href="http://www.wpallimport.com/upgrade-to-pro/?utm_source=free-plugin&utm_medium=in-plugin&utm_campaign=custom-fields" target="_blank" class="upgrade_link"><?php _e('Upgrade to the Pro edition of WP All Import to enable the Function Editor.', 'wp_all_import_plugin');?></a>
|
139 |
+
<p><?php _e('If you already own it, remove the free edition and install the Pro edition.', 'wp_all_import_plugin'); ?></p>
|
140 |
</div>
|
141 |
<textarea id="wp_all_import_code" name="wp_all_import_code"><?php echo "<?php\n\n?>";?></textarea>
|
142 |
|