PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 2.1.1
Visualizer – Tables & Charts Manager with Built-in AI Generator v2.1.1
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
← All changes | classes/Visualizer/Source/Csv.php +14 -69 3.10.32.1.1 View file →
@@ -46,10 +46,10 @@
46 46 *
47 47 * @access public
48 48 * @param string $filename The path to the file.
49 49 */
50 - public function __construct( $filename = '' ) {
51 - $this->_filename = trim( (string) $filename );
50 + public function __construct( $filename = null ) {
51 + $this->_filename = trim( $filename );
52 52 }
53 53
54 54 /**
55 55 * Fetches series information.
@@ -61,42 +61,29 @@
61 61 */
62 62 private function _fetchSeries( &$handle ) {
63 63 // read column titles
64 64 $labels = fgetcsv( $handle, 0, VISUALIZER_CSV_DELIMITER, VISUALIZER_CSV_ENCLOSURE );
65 - $types = null;
65 + // read series types
66 + $types = fgetcsv( $handle, 0, VISUALIZER_CSV_DELIMITER, VISUALIZER_CSV_ENCLOSURE );
66 67
67 - if ( false !== strpos( $this->_filename, 'tqx=out:csv' ) ) {
68 - $attributes = $this->_fetchSeriesForGoogleQueryLanguage( $labels );
69 - if ( ! $attributes['abort'] ) {
70 - $labels = $attributes['labels'];
71 - $types = $attributes['types'];
72 - }
73 - }
74 -
75 - if ( is_null( $types ) ) {
76 - // read series types
77 - $types = fgetcsv( $handle, 0, VISUALIZER_CSV_DELIMITER, VISUALIZER_CSV_ENCLOSURE );
78 - }
79 -
80 - $labels = array_filter( $labels );
81 - $types = array_filter( $types );
82 -
83 68 if ( ! $labels || ! $types ) {
84 - $this->_error = esc_html__( 'File should have a heading row (1st row) and a data type row (2nd row). Please try again.', 'visualizer' );
85 69 return false;
86 70 }
87 71
72 + // if no types were setup, re read labels and empty types array
88 73 $types = array_map( 'trim', $types );
89 74 if ( ! self::_validateTypes( $types ) ) {
90 - $this->_error = esc_html__( 'Invalid data types detected in the data type row (2nd row). Please try again.', 'visualizer' );
91 - return false;
75 + // re open the file
76 + fclose( $handle );
77 + $handle = $this->_get_file_handle();
78 +
79 + // re read the labels and empty types array
80 + $labels = fgetcsv( $handle, 0, VISUALIZER_CSV_DELIMITER, VISUALIZER_CSV_ENCLOSURE );
81 + $types = array();
92 82 }
93 83
94 84 for ( $i = 0, $len = count( $labels ); $i < $len; $i++ ) {
95 - $default_type = $i === 0 ? 'string' : 'number';
96 -
97 - $labels[ $i ] = $this->toUTF8( $labels[ $i ] );
98 -
85 + $default_type = $i == 0 ? 'string' : 'number';
99 86 $this->_series[] = array(
100 87 'label' => $labels[ $i ],
101 88 'type' => isset( $types[ $i ] ) ? $types[ $i ] : $default_type,
102 89 );
@@ -131,9 +118,8 @@
131 118 */
132 119 public function fetch() {
133 120 // if filename is empty return false
134 121 if ( empty( $this->_filename ) ) {
135 - $this->_error = esc_html__( 'No file provided. Please try again.', 'visualizer' );
136 122 return false;
137 123 }
138 124
139 125 // read file and fill arrays
@@ -144,10 +130,10 @@
144 130 return false;
145 131 }
146 132
147 133 // fetch data
148 - // phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition
149 134 while ( ( $data = fgetcsv( $handle, 0, VISUALIZER_CSV_DELIMITER, VISUALIZER_CSV_ENCLOSURE ) ) !== false ) {
135 +
150 136 $this->_data[] = $this->_normalizeData( $data );
151 137 }
152 138
153 139 // close file handle
@@ -168,46 +154,5 @@
168 154 public function getSourceName() {
169 155 return __CLASS__;
170 156 }
171 157
172 - /**
173 - * Adds support for QueryLanguage https://developers.google.com/chart/interactive/docs/querylanguage
174 - * where the user can provide something like /gviz/tq?tq=select%20A%2C%20B%20&tqx=out:csv after the URL of the raw spreadsheet
175 - * to get the subset of data specified by the query
176 - * this will conflate the heading and the type into one value viz. for heading XXX and type string, the value will become "XXX string"
177 - * so we need to split them apart logically
178 - * also the $types variable now contains the first row because the header and the type got conflated
179 - */
180 - private function _fetchSeriesForGoogleQueryLanguage( $labels, $types = array() ) {
181 - $new_labels = array();
182 - $new_types = array();
183 - $abort = false;
184 - foreach ( $labels as $label ) {
185 - // get the index of the last space
186 - $index = strrpos( $label, ' ' );
187 - if ( $index === false ) {
188 - // no space here? something has gone wrong; abort the entire process.
189 - $abort = true;
190 - break;
191 - }
192 - $type = trim( substr( $label, $index + 1 ) );
193 - if ( ! self::_validateTypes( array( $type ) ) ) {
194 - // some other data type? abort the entire process.
195 - $abort = true;
196 - break;
197 - }
198 - $label = substr( $label, 0, $index );
199 - $new_labels[] = $label;
200 - $new_types[] = $type;
201 - }
202 - if ( ! $abort ) {
203 - $labels = $new_labels;
204 - $types = $new_types;
205 - }
206 -
207 - return array(
208 - 'abort' => $abort,
209 - 'labels' => $labels,
210 - 'types' => $types,
211 - );
212 - }
213 158 }