Import any XML or CSV File to WordPress - Version 3.3.7

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 Icon 128x128 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

Files changed (38) hide show
  1. actions/admin_notices.php +2 -2
  2. classes/PHPExcel/CachedObjectStorage/Wincache.php +294 -294
  3. classes/PHPExcel/locale/sv/functions +408 -408
  4. classes/XmlStreamReader/autoload.php +7 -0
  5. classes/XmlStreamReader/composer/ClassLoader.php +413 -0
  6. classes/XmlStreamReader/composer/autoload_classmap.php +9 -0
  7. classes/XmlStreamReader/composer/autoload_namespaces.php +9 -0
  8. classes/XmlStreamReader/composer/autoload_psr4.php +10 -0
  9. classes/XmlStreamReader/composer/autoload_real.php +45 -0
  10. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer.php +77 -0
  11. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Parser/StringWalker.php +275 -0
  12. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Parser/UniqueNode.php +274 -0
  13. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/ParserInterface.php +34 -0
  14. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Stream/File.php +54 -0
  15. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/Stream/Stdin.php +11 -0
  16. classes/XmlStreamReader/prewk/xml-string-streamer/src/XmlStringStreamer/StreamInterface.php +21 -0
  17. classes/chunk.php +140 -54
  18. classes/handler.php +13 -1
  19. controllers/admin/import.php +35 -16
  20. controllers/admin/manage.php +2 -0
  21. controllers/admin/settings.php +42 -1
  22. helpers/wp_all_import_get_reader_engine.php +120 -0
  23. models/import/record.php +9 -8
  24. plugin.php +167 -165
  25. readme.txt +26 -22
  26. static/css/admin.css +12 -0
  27. static/js/admin.js +107 -14
  28. static/js/plupload/wplupload.js +5 -0
  29. views/admin/help/index.php +1 -1
  30. views/admin/import/index.php +35 -24
  31. views/admin/import/options/_import_file.php +4 -4
  32. views/admin/import/options/_reimport_options.php +4 -1
  33. views/admin/import/options/_settings_template.php +35 -7
  34. views/admin/import/template.php +11 -2
  35. views/admin/import/template/_custom_fields_template.php +2 -2
  36. views/admin/import/template/_featured_template.php +2 -2
  37. views/admin/manage/index.php +1 -1
  38. 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 professional 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 professional 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;
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(), $debug = false) {
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
- $reader = new XMLReader();
108
- $reader->open($path);
109
- $reader->setParserProperty(XMLReader::VALIDATE, false);
110
- while ( @$reader->read() ) {
111
- switch ($reader->nodeType) {
112
- case (XMLREADER::ELEMENT):
113
- $localName = str_replace("_colon_", ":", $reader->localName);
114
- if (array_key_exists(str_replace(":", "_", $localName), $this->cloud))
115
- $this->cloud[str_replace(":", "_", $localName)]++;
116
- else
117
- $this->cloud[str_replace(":", "_", $localName)] = 1;
118
- break;
119
- default:
120
-
121
- break;
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
- $this->reader = new XMLReader();
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
- try {
203
- while ( @$this->reader->read() ) {
204
- switch ($this->reader->nodeType) {
205
- case (XMLREADER::ELEMENT):
206
-
207
- $localName = str_replace("_colon_", ":", $this->reader->localName);
208
-
209
- if ( strtolower(str_replace(":", "_", $localName)) == strtolower($element) ) {
210
-
211
- if ($this->loop < $this->options['pointer']){
212
- $this->loop++;
213
- continue;
214
- }
215
-
216
- $xml = @$this->reader->readOuterXML();
217
-
218
- break(2);
219
- }
220
- break;
221
- default:
222
- // code ...
223
- break;
224
- }
 
 
 
 
 
225
  }
226
- } catch (XmlImportException $e) {
227
- $xml = false;
228
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
 
230
  return ( ! empty($xml) ) ? self::removeColonsFromRSS(preg_replace('%xmlns.*=\s*([\'"&quot;]).*\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*([\'"&quot;]).*\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
- $DefaultOptions = (isset(PMXI_Plugin::$session->options) ? PMXI_Plugin::$session->options : array()) + $default;
1387
  foreach (PMXI_Admin_Addons::get_active_addons() as $class) {
1388
- if (class_exists($class)) $DefaultOptions += call_user_func(array($class, "get_default_import_options"));
1389
  }
1390
- $DefaultOptions['wizard_type'] = PMXI_Plugin::$session->wizard_type;
1391
- $DefaultOptions['custom_type'] = PMXI_Plugin::$session->custom_type;
1392
- $DefaultOptions['delimiter'] = PMXI_Plugin::$session->is_csv;
1393
- $post = $this->input->post( apply_filters('pmxi_options_options', $DefaultOptions, $this->isWizard) );
 
 
 
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)) $DefaultOptions += call_user_func(array($class, "get_default_import_options"));
1670
- }
1671
- if (PMXI_Plugin::$session->options['custom_type'] != 'import_users'){
 
 
 
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
- $post = $this->input->post( $DefaultOptions );
 
 
 
 
 
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&amp;utm_medium=in-plugin&amp;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&amp;utm_medium=in-plugin&amp;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&amp;utm_medium=in-plugin&amp;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\'n found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
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.6
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.6');
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 $this->options;
705
- } else if (isset($this->options[$option])) {
706
- return $this->options[$option];
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
- 'is_override_post_type' => 0,
981
- 'post_type_xpath' => '',
982
- 'deligate' => '',
983
- 'wizard_type' => 'new',
984
- 'custom_type' => '',
985
- 'featured_delim' => ',',
986
- 'atch_delim' => ',',
987
- 'is_search_existing_attach' => 0,
988
- 'post_taxonomies' => array(),
989
- 'parent' => 0,
990
- 'is_multiple_page_parent' => 'yes',
991
- 'single_page_parent' => '',
992
- 'order' => 0,
993
- 'status' => 'publish',
994
- 'page_template' => 'default',
995
- 'is_multiple_page_template' => 'yes',
996
- 'single_page_template' => '',
997
- 'page_taxonomies' => array(),
998
- 'date_type' => 'specific',
999
- 'date' => 'now',
1000
- 'date_start' => 'now',
1001
- 'date_end' => 'now',
1002
- 'custom_name' => array(),
1003
- 'custom_value' => array(),
1004
- 'custom_format' => array(),
1005
- 'custom_mapping' => array(),
1006
- 'serialized_values' => array(),
1007
- 'custom_mapping_rules' => array(),
1008
- 'comment_status' => 'open',
1009
- 'comment_status_xpath' => '',
1010
- 'ping_status' => 'open',
1011
- 'ping_status_xpath' => '',
1012
- 'create_draft' => 'no',
1013
- 'author' => '',
1014
- 'post_excerpt' => '',
1015
- 'post_slug' => '',
1016
- 'attachments' => '',
1017
- 'is_import_specified' => 0,
1018
- 'import_specified' => '',
1019
- 'is_delete_source' => 0,
1020
- 'is_cloak' => 0,
1021
- 'unique_key' => '',
1022
- 'tmp_unique_key' => '',
1023
- 'feed_type' => 'auto',
1024
- 'search_existing_images' => 1,
1025
-
1026
- 'create_new_records' => 1,
1027
- 'is_delete_missing' => 0,
1028
- 'set_missing_to_draft' => 0,
1029
- 'is_update_missing_cf' => 0,
1030
- 'update_missing_cf_name' => '',
1031
- 'update_missing_cf_value' => '',
1032
-
1033
- 'is_keep_former_posts' => 'no',
1034
- 'is_update_status' => 1,
1035
- 'is_update_content' => 1,
1036
- 'is_update_title' => 1,
1037
- 'is_update_slug' => 1,
1038
- 'is_update_excerpt' => 1,
1039
- 'is_update_categories' => 1,
1040
- 'is_update_author' => 1,
1041
- 'is_update_comment_status' => 1,
1042
- 'update_categories_logic' => 'full_update',
1043
- 'taxonomies_list' => array(),
1044
- 'taxonomies_only_list' => array(),
1045
- 'taxonomies_except_list' => array(),
1046
- 'is_update_attachments' => 1,
1047
- 'is_update_images' => 1,
1048
- 'update_images_logic' => 'full_update',
1049
- 'is_update_dates' => 1,
1050
- 'is_update_menu_order' => 1,
1051
- 'is_update_parent' => 1,
1052
- 'is_keep_attachments' => 0,
1053
- 'is_keep_imgs' => 0,
1054
- 'do_not_remove_images' => 1,
1055
-
1056
- 'is_update_custom_fields' => 1,
1057
- 'update_custom_fields_logic' => 'full_update',
1058
- 'custom_fields_list' => array(),
1059
- 'custom_fields_only_list' => array(),
1060
- 'custom_fields_except_list' => array(),
1061
-
1062
- 'duplicate_matching' => 'auto',
1063
- 'duplicate_indicator' => 'title',
1064
- 'custom_duplicate_name' => '',
1065
- 'custom_duplicate_value' => '',
1066
- 'is_update_previous' => 0,
1067
- 'is_scheduled' => '',
1068
- 'scheduled_period' => '',
1069
- 'friendly_name' => '',
1070
- 'records_per_request' => 20,
1071
- 'auto_rename_images' => 0,
1072
- 'auto_rename_images_suffix' => '',
1073
- 'images_name' => 'filename',
1074
- 'post_format' => 'standard',
1075
- 'post_format_xpath' => '',
1076
- 'encoding' => 'UTF-8',
1077
- 'delimiter' => '',
1078
- 'image_meta_title' => '',
1079
- 'image_meta_title_delim' => ',',
1080
- 'image_meta_caption' => '',
1081
- 'image_meta_caption_delim' => ',',
1082
- 'image_meta_alt' => '',
1083
- 'image_meta_alt_delim' => ',',
1084
- 'image_meta_description' => '',
1085
- 'image_meta_description_delim' => ',',
1086
- 'image_meta_description_delim_logic' => 'separate',
1087
- 'status_xpath' => '',
1088
- 'download_images' => 'yes',
1089
- 'converted_options' => 0,
1090
- 'update_all_data' => 'yes',
1091
- 'is_fast_mode' => 0,
1092
- 'chuncking' => 1,
1093
- 'import_processing' => 'ajax',
1094
- 'save_template_as' => 0,
1095
-
1096
- 'title' => '',
1097
- 'content' => '',
1098
- 'name' => '',
1099
- 'is_keep_linebreaks' => 0,
1100
- 'is_leave_html' => 0,
1101
- 'fix_characters' => 0,
1102
- 'pid_xpath' => '',
1103
-
1104
- 'featured_image' => '',
1105
- 'download_featured_image' => '',
1106
- 'download_featured_delim' => ',',
1107
- 'gallery_featured_image' => '',
1108
- 'gallery_featured_delim' => ',',
1109
- 'is_featured' => 1,
1110
- 'set_image_meta_title' => 0,
1111
- 'set_image_meta_caption' => 0,
1112
- 'set_image_meta_alt' => 0,
1113
- 'set_image_meta_description' => 0,
1114
- 'auto_set_extension' => 0,
1115
- 'new_extension' => '',
1116
- 'tax_logic' => array(),
1117
- 'tax_assing' => array(),
1118
- 'term_assing' => array(),
1119
- 'multiple_term_assing' => array(),
1120
- 'tax_hierarchical_assing' => array(),
1121
- 'tax_hierarchical_last_level_assign' => array(),
1122
- 'tax_single_xpath' => array(),
1123
- 'tax_multiple_xpath' => array(),
1124
- 'tax_hierarchical_xpath' => array(),
1125
- 'tax_multiple_delim' => array(),
1126
- 'tax_hierarchical_delim' => array(),
1127
- 'tax_manualhierarchy_delim' => array(),
1128
- 'tax_hierarchical_logic_entire' => array(),
1129
- 'tax_hierarchical_logic_manual' => array(),
1130
- 'tax_enable_mapping' => array(),
1131
- 'tax_is_full_search_single' => array(),
1132
- 'tax_is_full_search_multiple' => array(),
1133
- 'tax_assign_to_one_term_single' => array(),
1134
- 'tax_assign_to_one_term_multiple' => array(),
1135
- 'tax_mapping' => array(),
1136
- 'tax_logic_mapping' => array(),
1137
- 'is_tax_hierarchical_group_delim' => array(),
1138
- 'tax_hierarchical_group_delim' => array(),
1139
- 'nested_files' => array()
 
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.1
5
- Stable tag: 3.3.6
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 professional 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,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 professional edition of WP All Import for premium support.
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
- - added de_CH translation
110
- - added support for .svg images
111
- - added possibility for import excerpts for pages
112
- - added new filter 'wp_all_import_specified_records'
113
- - added new filter 'wp_all_import_is_post_to_delete'
114
- - disable XMLReader stream filter for HHVM
115
- - improve search for existing images in media gallery
116
 
117
  = 3.3.5 =
118
- - fixed 'Use images currently in Media Library' option
119
 
120
  = 3.3.4 =
121
- - fixed error messages on step 1 in case when server throws fatal error e.q. time limit exception
122
- - 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
123
- - fixed custom php functions in images preview
124
- - fixed detecting root nodes with colons in names
125
- - added es_ES translation
126
- - added de_DE translation
127
- - added iterative ajax delete process ( deleting associated posts )
128
- - added feature to download template/bundle from import settings
129
- - added new option for importing images "Use images currently in Media Library"
130
- - added new action 'pmxi_missing_post'
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
- $('input[name=custom_type]').val(selectedData.selectedData.value);
300
-
301
- if ($('.wpallimport-upload-resource-step-two:visible').length)
302
- {
303
- $('#custom_type_selector').find('.dd-selected').css({'color':'#555'});
304
- $('.wpallimport-choose-file').find('.wpallimport-submit-buttons').show();
305
- }
306
- else
307
- {
308
- $('#custom_type_selector').find('.dd-selected').css({'color':'#555'});
309
- $('.wpallimport-choose-file').find('.wpallimport-submit-buttons').hide();
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 professional edition of WP All Import.', 'wp_all_import_plugin'); ?></a></p>
16
 
17
  </td>
18
  <td class="right">&nbsp;</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">&nbsp;</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 professional 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 professional edition.', 'wp_all_import_plugin'); ?></p>
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 professional 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 professional edition.', 'wp_all_import_plugin'); ?></p>
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', 'shop_coupon'))) unset($custom_types[$key]);
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', 'import_users', 'shop_order') ) )
 
219
  $image_src = 'dashicon-' . $cpt;
 
 
 
 
 
 
220
  ?>
221
- <option value="<?php echo $cpt; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>"><?php echo $cpt_label; ?></option>
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 professional 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 professional edition.', 'wp_all_import_plugin'); ?></p>
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 professional 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 professional edition.', 'wp_all_import_plugin'); ?></p>
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:17px;">
 
 
 
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', 'shop_coupon'))) unset($custom_types[$key]);
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 => $cpt) :?>
67
  <?php
68
  $image_src = 'dashicon-cpt';
69
- if ( in_array($key, array('post', 'page', 'product') ) )
70
- $image_src = 'dashicon-' . $key;
 
 
 
 
 
 
 
 
 
 
 
71
  ?>
72
- <option value="<?php echo $key; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>" <?php if ( $key == $post['custom_type'] ) echo 'selected="selected"';?>><?php echo $cpt->labels->name; ?></option>
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 professional 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 professional 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,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 professional 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 professional edition.', 'wp_all_import_plugin'); ?></p>
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 professional 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 professional edition.', 'wp_all_import_plugin'); ?></p>
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 professional 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
 
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 professional 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 professional 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
 
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