From 8f76ce356931913fb728ba49793fd5e09ec4aa23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 29 Jul 2018 22:07:21 +0200 Subject: [PATCH] new export options --- app/Http/Controllers/TableController.php | 13 ++++ app/Tables/BaseExporter.php | 24 +++++++ app/Tables/CStructArrayExporter.php | 10 ++- app/Tables/CsvExporter.php | 12 +++- app/Tables/JsonExporter.php | 18 +++++- app/Tables/PhpExporter.php | 64 +++++++++++++++++++ resources/views/table/_panel-export.blade.php | 3 + 7 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 app/Tables/PhpExporter.php diff --git a/app/Http/Controllers/TableController.php b/app/Http/Controllers/TableController.php index 535554f..34f36f6 100644 --- a/app/Http/Controllers/TableController.php +++ b/app/Http/Controllers/TableController.php @@ -10,6 +10,7 @@ use App\Tables\Column; use App\Tables\CStructArrayExporter; use App\Tables\CsvExporter; use App\Tables\JsonExporter; +use App\Tables\PhpExporter; use Illuminate\Http\Request; use Illuminate\Validation\Rule; use MightyPork\Exceptions\NotApplicableException; @@ -280,10 +281,22 @@ class TableController extends Controller $exporter = new CsvExporter($tableModel); break; + case 'csv-tab': + $exporter = (new CsvExporter($tableModel))->withDelimiter("\t"); + break; + case 'c': $exporter = new CStructArrayExporter($tableModel); break; + case 'php': + $exporter = new PhpExporter($tableModel); + break; + + case 'js': + $exporter = (new JsonExporter($tableModel))->withJsWrapper(); + break; + default: abort(400, "Unspecified or unknown format."); } diff --git a/app/Tables/BaseExporter.php b/app/Tables/BaseExporter.php index c5c949c..4800727 100644 --- a/app/Tables/BaseExporter.php +++ b/app/Tables/BaseExporter.php @@ -37,6 +37,30 @@ abstract class BaseExporter $this->columns = Column::columnsFromJson($table->revision->columns); } + protected function getHeaderComment($prefix = " ") + { + $table = $this->table; + $owner = $this->table->owner; + + $s = + $prefix."Table \"$table->title\" by $owner->title\n". + $prefix."exported ".date('M n, Y \\a\\t G:i')."\n". + $prefix."\n". + $prefix."License: ". str_replace("\n", "\n$prefix", $table->license ?: 'CC0') ."\n". + $prefix."\n". + $prefix."Upstream: https://datatable.directory/$owner->handle/$table->name\n"; + + $s .= + $prefix."\n". + $prefix."Columns:\n"; + + foreach ($this->columns as $c) { + $s .= $prefix." - $c->name ... $c->title\n"; + } + + return $s; + } + /** * @return string - mime type for the downloaded file */ diff --git a/app/Tables/CStructArrayExporter.php b/app/Tables/CStructArrayExporter.php index 32b39a9..ce130d4 100644 --- a/app/Tables/CStructArrayExporter.php +++ b/app/Tables/CStructArrayExporter.php @@ -36,6 +36,8 @@ class CStructArrayExporter extends BaseExporter */ protected function writeDocument() { + $table = $this->table; + $any_bool = false; $fields = array_map(function (Column $c) use (&$any_bool) { $type = $c->type; @@ -50,13 +52,15 @@ class CStructArrayExporter extends BaseExporter return (object)['name' => $c->name, 'type' => $c->type, 'ctype' => $type, 'cname' => $name]; }, $this->columns); - $ctablename = $this->cify($this->table->name); + $ctablename = $this->cify($table->name); // preamble if ($any_bool) { echo "#include \n\n"; } + echo "/*\n" . $this->getHeaderComment(' ') . "*/\n\n"; + echo "struct " . $ctablename . " {\n"; foreach ($fields as $field) { echo " " . $field->ctype . " " . $field->cname . ";\n"; @@ -74,7 +78,7 @@ class CStructArrayExporter extends BaseExporter echo ",\n"; } - echo " {"; + echo " { "; $firstf = true; foreach ($fields as $field) { @@ -115,7 +119,7 @@ class CStructArrayExporter extends BaseExporter break; } } - echo "}"; + echo " }"; } echo "\n};\n"; diff --git a/app/Tables/CsvExporter.php b/app/Tables/CsvExporter.php index fc5ad7a..62394f4 100644 --- a/app/Tables/CsvExporter.php +++ b/app/Tables/CsvExporter.php @@ -6,6 +6,14 @@ namespace App\Tables; class CsvExporter extends BaseExporter { + private $delimiter = ','; + + public function withDelimiter($delimiter) + { + $this->delimiter = $delimiter; + return $this; + } + /** * @return string - mime type for the downloaded file */ @@ -33,7 +41,7 @@ class CsvExporter extends BaseExporter return $c->title; }, $this->columns); - fputcsv($handle, $columnNames); + fputcsv($handle, $columnNames, $this->delimiter); foreach ($this->iterateRows() as $row) { $items = []; @@ -44,7 +52,7 @@ class CsvExporter extends BaseExporter $items[] = null; } } - fputcsv($handle, $items); + fputcsv($handle, $items, $this->delimiter); } fclose($handle); diff --git a/app/Tables/JsonExporter.php b/app/Tables/JsonExporter.php index f95bbfe..7575896 100644 --- a/app/Tables/JsonExporter.php +++ b/app/Tables/JsonExporter.php @@ -6,12 +6,20 @@ namespace App\Tables; class JsonExporter extends BaseExporter { + private $fullJsDoc = false; + + public function withJsWrapper() + { + $this->fullJsDoc = true; + return $this; + } + /** * @return string - mime type for the downloaded file */ protected function getMimeType() { - return 'application/json'; + return $this->fullJsDoc ? 'application/javascript' : 'application/json'; } /** @@ -27,6 +35,12 @@ class JsonExporter extends BaseExporter */ protected function writeDocument() { + if ($this->fullJsDoc) { + echo "/*\n" . $this->getHeaderComment(' ') . "*/\n\n"; + + echo 'module.exports = '; + } + echo "[\n"; $first = true; @@ -36,7 +50,7 @@ class JsonExporter extends BaseExporter } else { echo ",\n"; } - echo json_encode($row, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); + echo ' '.json_encode($row, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); } echo "\n]\n"; diff --git a/app/Tables/PhpExporter.php b/app/Tables/PhpExporter.php new file mode 100644 index 0000000..f7a090b --- /dev/null +++ b/app/Tables/PhpExporter.php @@ -0,0 +1,64 @@ +wantDownload ? 'application/x-php' : 'text/plain'; + } + + /** + * @return string - file extension for the downloaded file + */ + protected function getFileExtension() + { + return 'php'; + } + + /** + * Write the document to stdout ('php://output') + */ + protected function writeDocument() + { + echo "getHeaderComment(' ') . "*/\n\n"; + + echo "return [\n"; + + $first = true; + foreach ($this->iterateRows() as $row) { + if ($first) { + $first = false; + } else { + echo ",\n"; + } + + echo ' ['; + + $firstf = true; + foreach ($this->columns as $column) { + if ($firstf) { + $firstf = false; + } else { + echo ", "; + } + + var_export($column->name); + echo ' => '; + var_export($row->{$column->name}); + } + + echo ']'; + } + + echo "\n];\n"; + } +} diff --git a/resources/views/table/_panel-export.blade.php b/resources/views/table/_panel-export.blade.php index 48d939b..99cdac1 100644 --- a/resources/views/table/_panel-export.blade.php +++ b/resources/views/table/_panel-export.blade.php @@ -3,7 +3,10 @@