enclosure = $this->convert_literals( isset( $this->settings['enclosure'] ) ? $this->settings['enclosure'] : '' ); $this->linebreak = $this->convert_literals( isset( $this->settings['linebreak'] ) ? $this->settings['linebreak'] : '' ); $this->delimiter = $this->convert_literals( isset( $this->settings['delimiter'] ) ? $this->settings['delimiter'] : '' ); // register the filter WOE_Formatter_sv_crlf_filter::set_linebreak( $this->linebreak ); stream_filter_register( "WOE_Formatter_{$this->format}_crlf", 'WOE_Formatter_sv_crlf_filter' ); // attach to stream $this->stream_filter = stream_filter_append( $this->handle, "WOE_Formatter_{$this->format}_crlf" ); } public function start( $data = '' ) { $data = $this->make_header( $data ); $data = apply_filters( "woe_{$this->format}_header_filter", $data ); $this->prepare_array( $data ); parent::start( $data ); if ( ! empty( $this->settings['add_utf8_bom'] ) ) { fwrite( $this->handle, chr( 239 ) . chr( 187 ) . chr( 191 ) ); } $this->rows = array(); if ( ! empty( $this->settings['display_column_names'] ) AND $data ) { if ( $this->mode == 'preview' ) { $this->rows[] = $data; } else { do_action( "woe_before_{$this->format}_print_header", $this->handle, $data, $this ); if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $data, $this->delimiter, $this->linebreak, $this->enclosure, true ) ) { if ( $this->enclosure !== '' ) { fputcsv( $this->handle, $data, $this->delimiter, $this->enclosure, $this->escape ); } else { fwrite( $this->handle, implode( $this->delimiter, $data ) . $this->linebreak ); } } do_action( "woe_{$this->format}_print_header", $this->handle, $data, $this ); } } } public function output( $rec ) { $rows = parent::output( $rec ); foreach ( $rows as $row ) { $this->prepare_array( $row ); if ( $this->has_output_filter ) { $row = apply_filters( "woe_{$this->format}_output_filter", $row, $this ); if ( ! $row ) { continue; } } if ( $this->mode == 'preview' ) { $this->rows[] = $row; } else { // insert order id of inserted rows, only required for PDF if ( $this instanceof WOE_Formatter_PDF || $this instanceof WOE_Formatter_Xls ) { $row[] = ! $this->summary_processing ? intval( WC_Order_Export_Engine::$order_id ) : 0; } if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $row, $this->delimiter, $this->linebreak, $this->enclosure, false ) ) { if ( $this->enclosure !== '' ) { fputcsv( $this->handle, $row, $this->delimiter, $this->enclosure, $this->escape ); } else { fwrite( $this->handle, implode( $this->delimiter, $row ) . $this->linebreak ); } } } } return $rows; } public function finish() { $this->try_apply_summary_report_fields(); if ( $this->mode == 'preview' ) { $this->rows = apply_filters( "woe_{$this->format}_preview_rows", $this->rows ); fwrite( $this->handle, '' ); if ( $this->settings['display_column_names'] && count( $this->rows ) < 2 || count( $this->rows ) < 1 ) { $this->rows[] = array( '' ); } foreach ( $this->rows as $num => $rec ) { if ( $num == 0 AND ! empty( $this->settings['display_column_names'] ) ) { fwrite( $this->handle, '\n" ); } else { fwrite( $this->handle, '\n" ); } } fwrite( $this->handle, '
' . __( 'No results', 'woo-order-export-lite' ) . '
' . join( '', $rec ) . "
' . join( '', $rec ) . "
' ); } else { do_action( "woe_{$this->format}_print_footer", $this->handle, $this ); } stream_filter_remove( $this->stream_filter ); parent::finish(); } protected function prepare_array( &$arr ) { if ( apply_filters( "woe_stop_csv_injection", true ) ) { $arr = array_map( array( $this, 'stop_csv_injection' ), $arr ); } if ( $this->mode !== 'preview' AND ! in_array( $this->encoding, array( '', 'utf-8', 'UTF-8' ) ) ) { $arr = array_map( array( $this, 'encode_value' ), $arr ); } } protected function stop_csv_injection( $value ) { $formula_chars = array( "=", "+", "-", "@" ); if ( in_array( substr( $value, 0, 1 ), $formula_chars ) ) { $value = " " . $value; } return $value; } protected function encode_value( $value ) { return iconv( 'UTF-8', $this->encoding, $value ); } } // filter class that applies CRLF line endings class WOE_Formatter_sv_crlf_filter extends php_user_filter { protected static $linebreak; public static function set_linebreak( $linebreak ) { self::$linebreak = $linebreak; } #[\ReturnTypeWillChange] function filter( $in, $out, &$consumed, $closing ) { while ( $bucket = stream_bucket_make_writeable( $in ) ) { // make sure the line endings aren't already CRLF $bucket->data = preg_replace( "/(?data ); $consumed += $bucket->datalen; stream_bucket_append( $out, $bucket ); } return PSFS_PASS_ON; } }