├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── app-bug.yml │ ├── app-feature-request.yaml │ ├── lib-bug.yml │ └── lib-new-feature.yml └── workflows │ ├── builder.yml │ ├── command.yml │ └── core.yml ├── .gitignore ├── .swift-format ├── .swiftpm └── xcode │ ├── Csv2ImgCore.xctestplan │ ├── package.xcworkspace │ └── contents.xcworkspacedata │ └── xcshareddata │ └── xcschemes │ ├── Csv2Img-Package.xcscheme │ ├── Csv2ImgCmd.xcscheme │ ├── Csv2ImgCore.xcscheme │ └── CsvBuilder.xcscheme ├── .vscode ├── launch.json └── settings.json ├── Csv2ImageApp ├── .editorconfig ├── Csv2ImageApp.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── swiftpm │ │ │ └── Package.resolved │ └── xcshareddata │ │ └── xcschemes │ │ └── Csv2ImageApp.xcscheme ├── Csv2ImageApp │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Csv2mg-1.png │ │ │ ├── Csv2mg-2.png │ │ │ ├── Csv2mg-3.png │ │ │ ├── Csv2mg-4.png │ │ │ ├── Csv2mg-5.png │ │ │ ├── Csv2mg-6.png │ │ │ ├── Csv2mg-7.png │ │ │ ├── Csv2mg.png │ │ │ ├── appstore.png │ │ │ ├── アートボード 1 のコピー 4-1.png │ │ │ └── アートボード 1 のコピー 4.png │ │ ├── BackgroundColor.colorset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── LightAccentColor.colorset │ │ │ └── Contents.json │ │ ├── SecondaryBackgroundColor.colorset │ │ │ └── Contents.json │ │ ├── SecondaryColor.colorset │ │ │ └── Contents.json │ │ └── TextColor.colorset │ │ │ └── Contents.json │ ├── Csv2ImageApp.entitlements │ ├── Csv2ImageAppApp.swift │ ├── Csv2Img.xcdatamodeld │ │ ├── .xccurrentversion │ │ ├── Csv2Img 2.xcdatamodel │ │ │ └── contents │ │ └── Csv2Img.xcdatamodel │ │ │ └── contents │ ├── Ex │ │ ├── Binding+Ex.swift │ │ └── UIApplication+Ex.swift │ ├── Generated │ │ ├── CsvConfig+CoreDataClass.swift │ │ ├── CsvConfig+CoreDataProperties.swift │ │ ├── CsvOutput+CoreDataClass.swift │ │ ├── CsvOutput+CoreDataProperties.swift │ │ └── XCAssets+Generated.swift │ ├── Models │ │ └── HistoryModel.swift │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ ├── States │ │ ├── GenerateOutputState.swift │ │ └── SelectedCsvState.swift │ ├── Type.swift │ ├── Views │ │ ├── BrandingFrameView.swift │ │ ├── CButton.swift │ │ ├── CText.swift │ │ ├── CsvViewer.swift │ │ ├── GenerateOutputView │ │ │ ├── GenerateOutputModel.swift │ │ │ ├── GenerateOutputView+iOS.swift │ │ │ ├── GenerateOutputView+macOS.swift │ │ │ ├── GenerateOutputView.swift │ │ │ └── GeneratePreviewView.swift │ │ ├── PdfDocumentView │ │ │ └── SwiftUI+PdfDocument.swift │ │ ├── RootView.swift │ │ └── SelectCsvView │ │ │ ├── SelectCsvModel.swift │ │ │ ├── SelectCsvView+iOS.swift │ │ │ ├── SelectCsvView+macOS.swift │ │ │ └── SelectCsvView.swift │ └── info.plist ├── Csv2ImageAppTests │ └── Csv2ImageAppTests.swift ├── Csv2ImageAppUITests │ ├── Csv2ImageAppUITests.swift │ └── Csv2ImageAppUITestsLaunchTests.swift ├── Mintfile └── swiftgen.yml ├── Examples └── CsvBuilderExample │ ├── CsvBuilderExample.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved │ └── CsvBuilderExample │ ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── ContentView.swift │ ├── CsvBuilderExample.entitlements │ ├── CsvBuilderExampleApp.swift │ ├── CsvCompositionExample.swift │ ├── CsvCompositionExample.txt │ ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json │ └── SecondContentView.swift ├── Fixtures ├── category.csv ├── outputs │ ├── category.pdf │ └── category.png ├── sample_1.csv ├── sample_2.csv └── yolov5x6.csv ├── LICENSE ├── Package.resolved ├── Package.swift ├── README.md ├── Sources ├── Csv2ImgCmd │ └── command.swift ├── Csv2ImgCore │ ├── Csv.swift │ ├── CsvColumn.swift │ ├── CsvColumnStyle+Ex.swift │ ├── CsvError.swift │ ├── CsvImageRepresentation.swift │ ├── CsvRow.swift │ ├── Image+Data.swift │ ├── ImageMaker.swift │ ├── ImageRenderer.swift │ ├── Maker.swift │ ├── PDFMetadata.swift │ ├── Pdf+Data.swift │ ├── PdfMaker.swift │ ├── PdfSize.swift │ ├── String+Ex.swift │ └── TypeConvertible.swift └── CsvBuilder │ ├── CsvBuilder.swift │ ├── CsvComposition.swift │ ├── CsvCompositionElement.swift │ ├── CsvCompositionParser.swift │ ├── Example.swift │ ├── NewCsvComposition.swift │ └── RowWrapper.swift ├── Tests ├── Csv2ImgCoreTests │ ├── CsvTests.swift │ ├── ImageMakerTests.swift │ ├── PdfMakerTests.swift │ ├── String+ExTests.swift │ └── Util.swift └── CsvBuilderTests │ └── CsvBuilderTests.swift ├── docs ├── app_privacy_policy.html ├── css │ ├── 866.60f074fd.css │ ├── 989.4f123103.css │ ├── documentation-topic.91c07ba9.css │ ├── index.3a335429.css │ ├── topic.4be8f56d.css │ └── tutorials-overview.7942d777.css ├── data │ └── documentation │ │ ├── csv2imgcmd.json │ │ ├── csv2imgcmd │ │ ├── csv2img.json │ │ ├── csv2img │ │ │ ├── _commandname.json │ │ │ ├── _dumphelp().json │ │ │ ├── _errorlabel.json │ │ │ ├── ascommand.json │ │ │ ├── asyncparsablecommand-implementations.json │ │ │ ├── completionscript(for:).json │ │ │ ├── configuration-6oyo2.json │ │ │ ├── configuration-8w40j.json │ │ │ ├── exit(witherror:).json │ │ │ ├── exitcode(for:).json │ │ │ ├── exporttype.json │ │ │ ├── fullmessage(for:).json │ │ │ ├── helpmessage(columns:).json │ │ │ ├── helpmessage(for:columns:).json │ │ │ ├── helpmessage(for:includehidden:columns:).json │ │ │ ├── helpmessage(includehidden:columns:).json │ │ │ ├── init().json │ │ │ ├── init(from:).json │ │ │ ├── input.json │ │ │ ├── inputtype.json │ │ │ ├── main()-5nphf.json │ │ │ ├── main()-60u2x.json │ │ │ ├── main(_:).json │ │ │ ├── message(for:).json │ │ │ ├── output.json │ │ │ ├── parsablearguments-implementations.json │ │ │ ├── parsablecommand-implementations.json │ │ │ ├── parse(_:).json │ │ │ ├── parseasroot(_:).json │ │ │ ├── parseorexit(_:).json │ │ │ ├── run().json │ │ │ └── validate().json │ │ ├── csv2imgcore.json │ │ ├── csv2imgcore │ │ │ ├── csv.json │ │ │ └── csv │ │ │ │ ├── exporttype.json │ │ │ │ └── exporttype │ │ │ │ ├── allvaluestrings-21sk8.json │ │ │ │ ├── allvaluestrings-871sm.json │ │ │ │ ├── defaultcompletionkind-3joax.json │ │ │ │ ├── defaultcompletionkind-3xs10.json │ │ │ │ ├── defaultvaluedescription.json │ │ │ │ └── expressiblebyargument-implementations.json │ │ ├── inputtype.json │ │ └── inputtype │ │ │ ├── !=(_:_:).json │ │ │ ├── enumerableflag-implementations.json │ │ │ ├── equatable-implementations.json │ │ │ ├── help(for:).json │ │ │ ├── local.json │ │ │ ├── name(for:)-453w3.json │ │ │ ├── name(for:)-9jrfy.json │ │ │ └── network.json │ │ ├── csv2imgcore.json │ │ ├── csv2imgcore │ │ ├── anycsvexportable.json │ │ ├── anycsvexportable │ │ │ ├── base.json │ │ │ └── init(_:).json │ │ ├── coregraphics.json │ │ ├── coregraphics │ │ │ ├── cgimage.json │ │ │ └── cgimage │ │ │ │ └── converttodata().json │ │ ├── csv.json │ │ ├── csv │ │ │ ├── actor-implementations.json │ │ │ ├── assertisolated(_:file:line:).json │ │ │ ├── assumeisolated(_:file:line:).json │ │ │ ├── column.json │ │ │ ├── column │ │ │ │ ├── !=(_:_:).json │ │ │ │ ├── equatable-implementations.json │ │ │ │ ├── init(name:style:).json │ │ │ │ ├── name-swift.property.json │ │ │ │ ├── name-swift.typealias.json │ │ │ │ ├── style-swift.property.json │ │ │ │ ├── style-swift.struct.json │ │ │ │ └── style-swift.struct │ │ │ │ │ ├── !=(_:_:).json │ │ │ │ │ ├── applyonlycolumn.json │ │ │ │ │ ├── color.json │ │ │ │ │ ├── equatable-implementations.json │ │ │ │ │ ├── init(color:applyonlycolumn:).json │ │ │ │ │ ├── random().json │ │ │ │ │ └── random(count:).json │ │ │ ├── columns.json │ │ │ ├── encoding.json │ │ │ ├── error.json │ │ │ ├── error │ │ │ │ ├── cannotaccessfile(url:).json │ │ │ │ ├── emptydata.json │ │ │ │ ├── error-implementations.json │ │ │ │ ├── invaliddownloadresource(url:data:).json │ │ │ │ ├── invalidexporttype(_:).json │ │ │ │ ├── invalidlocalresource(url:data:encoding:).json │ │ │ │ ├── localizeddescription.json │ │ │ │ ├── underlying(_:).json │ │ │ │ └── workinprogress.json │ │ │ ├── exporttype-swift.enum.json │ │ │ ├── exporttype-swift.enum │ │ │ │ ├── !=(_:_:).json │ │ │ │ ├── equatable-implementations.json │ │ │ │ ├── fileextension.json │ │ │ │ ├── hash(into:).json │ │ │ │ ├── hashvalue.json │ │ │ │ ├── init(rawvalue:).json │ │ │ │ ├── pdf.json │ │ │ │ ├── png.json │ │ │ │ ├── rawrepresentable-implementations.json │ │ │ │ └── uttype.json │ │ │ ├── exporttype-swift.property.json │ │ │ ├── generate(fontsize:exporttype:style:).json │ │ │ ├── generate(fontsize:exporttype:styles:).json │ │ │ ├── init(separator:rawstring:encoding:columns:rows:exporttype:pdfmetadata:).json │ │ │ ├── isloading.json │ │ │ ├── isloadingpublisher.json │ │ │ ├── loadfromdisk(_:separator:encoding:exporttype:).json │ │ │ ├── loadfromnetwork(_:separator:encoding:exporttype:).json │ │ │ ├── loadfromstring(_:encoding:separator:maxlength:exporttype:styles:).json │ │ │ ├── preconditionisolated(_:file:line:).json │ │ │ ├── progress.json │ │ │ ├── progresspublisher.json │ │ │ ├── rawstring.json │ │ │ ├── row.json │ │ │ ├── row │ │ │ │ ├── !=(_:_:).json │ │ │ │ ├── equatable-implementations.json │ │ │ │ ├── index.json │ │ │ │ ├── init(index:values:).json │ │ │ │ └── values.json │ │ │ ├── rows.json │ │ │ ├── separator.json │ │ │ ├── update(pdfmetadata:).json │ │ │ └── write(to:).json │ │ ├── csvexportable.json │ │ ├── imagemakingerror.json │ │ ├── imagemakingerror │ │ │ ├── error-implementations.json │ │ │ ├── failedcreateimage(_:).json │ │ │ ├── localizeddescription.json │ │ │ ├── nocontextavailable.json │ │ │ └── underlying(_:).json │ │ ├── maker.json │ │ ├── maker │ │ │ ├── exportable.json │ │ │ ├── make(columns:rows:progress:).json │ │ │ ├── maximumrowcount.json │ │ │ └── set(fontsize:).json │ │ ├── pdfmakingerror.json │ │ ├── pdfmakingerror │ │ │ ├── emptyrows.json │ │ │ ├── error-implementations.json │ │ │ ├── failedtogeneratepdf.json │ │ │ ├── failedtosavepdf(at:).json │ │ │ ├── localizeddescription.json │ │ │ ├── nocontextavailabe.json │ │ │ └── underlying(_:).json │ │ ├── pdfmetadata.json │ │ ├── pdfmetadata │ │ │ ├── author.json │ │ │ ├── init(author:title:size:orientation:).json │ │ │ ├── orientation.json │ │ │ ├── size.json │ │ │ └── title.json │ │ ├── pdfsize.json │ │ └── pdfsize │ │ │ ├── !=(_:_:).json │ │ │ ├── a0.json │ │ │ ├── a1.json │ │ │ ├── a2.json │ │ │ ├── a3.json │ │ │ ├── a4.json │ │ │ ├── a5.json │ │ │ ├── b0.json │ │ │ ├── b1.json │ │ │ ├── b2.json │ │ │ ├── b3.json │ │ │ ├── b4.json │ │ │ ├── b5.json │ │ │ ├── encode(to:).json │ │ │ ├── equatable-implementations.json │ │ │ ├── hash(into:).json │ │ │ ├── hashvalue.json │ │ │ ├── init(from:).json │ │ │ ├── init(rawvalue:).json │ │ │ ├── orientation.json │ │ │ ├── orientation │ │ │ ├── !=(_:_:).json │ │ │ ├── encode(to:).json │ │ │ ├── equatable-implementations.json │ │ │ ├── hash(into:).json │ │ │ ├── hashvalue.json │ │ │ ├── init(from:).json │ │ │ ├── init(rawvalue:).json │ │ │ ├── landscape.json │ │ │ ├── portrait.json │ │ │ └── rawrepresentable-implementations.json │ │ │ ├── rawrepresentable-implementations.json │ │ │ └── size(orientation:).json │ │ ├── csvbuilder.json │ │ └── csvbuilder │ │ ├── csvbuilder.json │ │ ├── csvbuilder │ │ └── build(composition:).json │ │ ├── csvbuildererror.json │ │ ├── csvbuildererror │ │ ├── error-implementations.json │ │ └── localizeddescription.json │ │ ├── csvcomposition.json │ │ ├── csvcomposition │ │ ├── build()-277oh.json │ │ └── build()-8hzeg.json │ │ ├── csvcompositionparser.json │ │ ├── csvcompositionparser │ │ ├── error.json │ │ ├── error │ │ │ ├── error-implementations.json │ │ │ ├── errordescription.json │ │ │ ├── failedtodecodewithutf8.json │ │ │ ├── failurereason.json │ │ │ ├── filenotfound(type:).json │ │ │ ├── helpanchor.json │ │ │ ├── localizeddescription.json │ │ │ ├── localizederror-implementations.json │ │ │ └── recoverysuggestion.json │ │ └── parse(type:rows:).json │ │ ├── csvrows.json │ │ ├── csvrows │ │ ├── column.json │ │ ├── init(column:).json │ │ └── wrappedvalue.json │ │ ├── newcsvcomposition.json │ │ └── newcsvcomposition │ │ ├── rows.json │ │ └── rows │ │ └── value.json ├── developer-og-twitter.jpg ├── developer-og.jpg ├── documentation │ ├── csv2imgcmd │ │ ├── csv2img │ │ │ ├── _commandname │ │ │ │ └── index.html │ │ │ ├── _dumphelp() │ │ │ │ └── index.html │ │ │ ├── _errorlabel │ │ │ │ └── index.html │ │ │ ├── ascommand │ │ │ │ └── index.html │ │ │ ├── asyncparsablecommand-implementations │ │ │ │ └── index.html │ │ │ ├── completionscript(for:) │ │ │ │ └── index.html │ │ │ ├── configuration-6oyo2 │ │ │ │ └── index.html │ │ │ ├── configuration-8w40j │ │ │ │ └── index.html │ │ │ ├── exit(witherror:) │ │ │ │ └── index.html │ │ │ ├── exitcode(for:) │ │ │ │ └── index.html │ │ │ ├── exporttype │ │ │ │ └── index.html │ │ │ ├── fullmessage(for:) │ │ │ │ └── index.html │ │ │ ├── helpmessage(columns:) │ │ │ │ └── index.html │ │ │ ├── helpmessage(for:columns:) │ │ │ │ └── index.html │ │ │ ├── helpmessage(for:includehidden:columns:) │ │ │ │ └── index.html │ │ │ ├── helpmessage(includehidden:columns:) │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── init() │ │ │ │ └── index.html │ │ │ ├── init(from:) │ │ │ │ └── index.html │ │ │ ├── input │ │ │ │ └── index.html │ │ │ ├── inputtype │ │ │ │ └── index.html │ │ │ ├── main()-5nphf │ │ │ │ └── index.html │ │ │ ├── main()-60u2x │ │ │ │ └── index.html │ │ │ ├── main(_:) │ │ │ │ └── index.html │ │ │ ├── message(for:) │ │ │ │ └── index.html │ │ │ ├── output │ │ │ │ └── index.html │ │ │ ├── parsablearguments-implementations │ │ │ │ └── index.html │ │ │ ├── parsablecommand-implementations │ │ │ │ └── index.html │ │ │ ├── parse(_:) │ │ │ │ └── index.html │ │ │ ├── parseasroot(_:) │ │ │ │ └── index.html │ │ │ ├── parseorexit(_:) │ │ │ │ └── index.html │ │ │ ├── run() │ │ │ │ └── index.html │ │ │ └── validate() │ │ │ │ └── index.html │ │ ├── csv2imgcore │ │ │ ├── csv │ │ │ │ ├── exporttype │ │ │ │ │ ├── allvaluestrings-21sk8 │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── allvaluestrings-871sm │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── defaultcompletionkind-3joax │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── defaultcompletionkind-3xs10 │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── defaultvaluedescription │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── expressiblebyargument-implementations │ │ │ │ │ │ └── index.html │ │ │ │ │ └── index.html │ │ │ │ └── index.html │ │ │ └── index.html │ │ ├── index.html │ │ └── inputtype │ │ │ ├── !=(_:_:) │ │ │ └── index.html │ │ │ ├── enumerableflag-implementations │ │ │ └── index.html │ │ │ ├── equatable-implementations │ │ │ └── index.html │ │ │ ├── help(for:) │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── local │ │ │ └── index.html │ │ │ ├── name(for:)-453w3 │ │ │ └── index.html │ │ │ ├── name(for:)-9jrfy │ │ │ └── index.html │ │ │ └── network │ │ │ └── index.html │ ├── csv2imgcore │ │ ├── anycsvexportable │ │ │ ├── base │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ └── init(_:) │ │ │ │ └── index.html │ │ ├── coregraphics │ │ │ ├── cgimage │ │ │ │ ├── converttodata() │ │ │ │ │ └── index.html │ │ │ │ └── index.html │ │ │ └── index.html │ │ ├── csv │ │ │ ├── actor-implementations │ │ │ │ └── index.html │ │ │ ├── assertisolated(_:file:line:) │ │ │ │ └── index.html │ │ │ ├── assumeisolated(_:file:line:) │ │ │ │ └── index.html │ │ │ ├── column │ │ │ │ ├── !=(_:_:) │ │ │ │ │ └── index.html │ │ │ │ ├── equatable-implementations │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ ├── init(name:style:) │ │ │ │ │ └── index.html │ │ │ │ ├── name-swift.property │ │ │ │ │ └── index.html │ │ │ │ ├── name-swift.typealias │ │ │ │ │ └── index.html │ │ │ │ ├── style-swift.property │ │ │ │ │ └── index.html │ │ │ │ └── style-swift.struct │ │ │ │ │ ├── !=(_:_:) │ │ │ │ │ └── index.html │ │ │ │ │ ├── applyonlycolumn │ │ │ │ │ └── index.html │ │ │ │ │ ├── color │ │ │ │ │ └── index.html │ │ │ │ │ ├── equatable-implementations │ │ │ │ │ └── index.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── init(color:applyonlycolumn:) │ │ │ │ │ └── index.html │ │ │ │ │ ├── random() │ │ │ │ │ └── index.html │ │ │ │ │ └── random(count:) │ │ │ │ │ └── index.html │ │ │ ├── columns │ │ │ │ └── index.html │ │ │ ├── encoding │ │ │ │ └── index.html │ │ │ ├── error │ │ │ │ ├── cannotaccessfile(url:) │ │ │ │ │ └── index.html │ │ │ │ ├── emptydata │ │ │ │ │ └── index.html │ │ │ │ ├── error-implementations │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ ├── invaliddownloadresource(url:data:) │ │ │ │ │ └── index.html │ │ │ │ ├── invalidexporttype(_:) │ │ │ │ │ └── index.html │ │ │ │ ├── invalidlocalresource(url:data:encoding:) │ │ │ │ │ └── index.html │ │ │ │ ├── localizeddescription │ │ │ │ │ └── index.html │ │ │ │ ├── underlying(_:) │ │ │ │ │ └── index.html │ │ │ │ └── workinprogress │ │ │ │ │ └── index.html │ │ │ ├── exporttype-swift.enum │ │ │ │ ├── !=(_:_:) │ │ │ │ │ └── index.html │ │ │ │ ├── equatable-implementations │ │ │ │ │ └── index.html │ │ │ │ ├── fileextension │ │ │ │ │ └── index.html │ │ │ │ ├── hash(into:) │ │ │ │ │ └── index.html │ │ │ │ ├── hashvalue │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ ├── init(rawvalue:) │ │ │ │ │ └── index.html │ │ │ │ ├── pdf │ │ │ │ │ └── index.html │ │ │ │ ├── png │ │ │ │ │ └── index.html │ │ │ │ ├── rawrepresentable-implementations │ │ │ │ │ └── index.html │ │ │ │ └── uttype │ │ │ │ │ └── index.html │ │ │ ├── exporttype-swift.property │ │ │ │ └── index.html │ │ │ ├── generate(fontsize:exporttype:style:) │ │ │ │ └── index.html │ │ │ ├── generate(fontsize:exporttype:styles:) │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── init(separator:rawstring:encoding:columns:rows:exporttype:pdfmetadata:) │ │ │ │ └── index.html │ │ │ ├── isloading │ │ │ │ └── index.html │ │ │ ├── isloadingpublisher │ │ │ │ └── index.html │ │ │ ├── loadfromdisk(_:separator:encoding:exporttype:) │ │ │ │ └── index.html │ │ │ ├── loadfromnetwork(_:separator:encoding:exporttype:) │ │ │ │ └── index.html │ │ │ ├── loadfromstring(_:encoding:separator:maxlength:exporttype:styles:) │ │ │ │ └── index.html │ │ │ ├── preconditionisolated(_:file:line:) │ │ │ │ └── index.html │ │ │ ├── progress │ │ │ │ └── index.html │ │ │ ├── progresspublisher │ │ │ │ └── index.html │ │ │ ├── rawstring │ │ │ │ └── index.html │ │ │ ├── row │ │ │ │ ├── !=(_:_:) │ │ │ │ │ └── index.html │ │ │ │ ├── equatable-implementations │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ ├── index │ │ │ │ │ └── index.html │ │ │ │ ├── init(index:values:) │ │ │ │ │ └── index.html │ │ │ │ └── values │ │ │ │ │ └── index.html │ │ │ ├── rows │ │ │ │ └── index.html │ │ │ ├── separator │ │ │ │ └── index.html │ │ │ ├── update(pdfmetadata:) │ │ │ │ └── index.html │ │ │ └── write(to:) │ │ │ │ └── index.html │ │ ├── csvexportable │ │ │ └── index.html │ │ ├── imagemakingerror │ │ │ ├── error-implementations │ │ │ │ └── index.html │ │ │ ├── failedcreateimage(_:) │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── localizeddescription │ │ │ │ └── index.html │ │ │ ├── nocontextavailable │ │ │ │ └── index.html │ │ │ └── underlying(_:) │ │ │ │ └── index.html │ │ ├── index.html │ │ ├── maker │ │ │ ├── exportable │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── make(columns:rows:progress:) │ │ │ │ └── index.html │ │ │ ├── maximumrowcount │ │ │ │ └── index.html │ │ │ └── set(fontsize:) │ │ │ │ └── index.html │ │ ├── pdfmakingerror │ │ │ ├── emptyrows │ │ │ │ └── index.html │ │ │ ├── error-implementations │ │ │ │ └── index.html │ │ │ ├── failedtogeneratepdf │ │ │ │ └── index.html │ │ │ ├── failedtosavepdf(at:) │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── localizeddescription │ │ │ │ └── index.html │ │ │ ├── nocontextavailabe │ │ │ │ └── index.html │ │ │ └── underlying(_:) │ │ │ │ └── index.html │ │ ├── pdfmetadata │ │ │ ├── author │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── init(author:title:size:orientation:) │ │ │ │ └── index.html │ │ │ ├── orientation │ │ │ │ └── index.html │ │ │ ├── size │ │ │ │ └── index.html │ │ │ └── title │ │ │ │ └── index.html │ │ └── pdfsize │ │ │ ├── !=(_:_:) │ │ │ └── index.html │ │ │ ├── a0 │ │ │ └── index.html │ │ │ ├── a1 │ │ │ └── index.html │ │ │ ├── a2 │ │ │ └── index.html │ │ │ ├── a3 │ │ │ └── index.html │ │ │ ├── a4 │ │ │ └── index.html │ │ │ ├── a5 │ │ │ └── index.html │ │ │ ├── b0 │ │ │ └── index.html │ │ │ ├── b1 │ │ │ └── index.html │ │ │ ├── b2 │ │ │ └── index.html │ │ │ ├── b3 │ │ │ └── index.html │ │ │ ├── b4 │ │ │ └── index.html │ │ │ ├── b5 │ │ │ └── index.html │ │ │ ├── encode(to:) │ │ │ └── index.html │ │ │ ├── equatable-implementations │ │ │ └── index.html │ │ │ ├── hash(into:) │ │ │ └── index.html │ │ │ ├── hashvalue │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── init(from:) │ │ │ └── index.html │ │ │ ├── init(rawvalue:) │ │ │ └── index.html │ │ │ ├── orientation │ │ │ ├── !=(_:_:) │ │ │ │ └── index.html │ │ │ ├── encode(to:) │ │ │ │ └── index.html │ │ │ ├── equatable-implementations │ │ │ │ └── index.html │ │ │ ├── hash(into:) │ │ │ │ └── index.html │ │ │ ├── hashvalue │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── init(from:) │ │ │ │ └── index.html │ │ │ ├── init(rawvalue:) │ │ │ │ └── index.html │ │ │ ├── landscape │ │ │ │ └── index.html │ │ │ ├── portrait │ │ │ │ └── index.html │ │ │ └── rawrepresentable-implementations │ │ │ │ └── index.html │ │ │ ├── rawrepresentable-implementations │ │ │ └── index.html │ │ │ └── size(orientation:) │ │ │ └── index.html │ └── csvbuilder │ │ ├── csvbuilder │ │ ├── build(composition:) │ │ │ └── index.html │ │ └── index.html │ │ ├── csvbuildererror │ │ ├── error-implementations │ │ │ └── index.html │ │ ├── index.html │ │ └── localizeddescription │ │ │ └── index.html │ │ ├── csvcomposition │ │ ├── build()-277oh │ │ │ └── index.html │ │ ├── build()-8hzeg │ │ │ └── index.html │ │ └── index.html │ │ ├── csvcompositionparser │ │ ├── error │ │ │ ├── error-implementations │ │ │ │ └── index.html │ │ │ ├── errordescription │ │ │ │ └── index.html │ │ │ ├── failedtodecodewithutf8 │ │ │ │ └── index.html │ │ │ ├── failurereason │ │ │ │ └── index.html │ │ │ ├── filenotfound(type:) │ │ │ │ └── index.html │ │ │ ├── helpanchor │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── localizeddescription │ │ │ │ └── index.html │ │ │ ├── localizederror-implementations │ │ │ │ └── index.html │ │ │ └── recoverysuggestion │ │ │ │ └── index.html │ │ ├── index.html │ │ └── parse(type:rows:) │ │ │ └── index.html │ │ ├── csvrows │ │ ├── column │ │ │ └── index.html │ │ ├── index.html │ │ ├── init(column:) │ │ │ └── index.html │ │ └── wrappedvalue │ │ │ └── index.html │ │ ├── index.html │ │ └── newcsvcomposition │ │ ├── index.html │ │ └── rows │ │ ├── index.html │ │ └── value │ │ └── index.html ├── favicon.ico ├── favicon.svg ├── img │ ├── added-icon.832a5d2c.svg │ ├── deprecated-icon.7bf1740a.svg │ └── modified-icon.efb2697d.svg ├── index.html ├── index │ └── index.json ├── js │ ├── 104.fe5974d0.js │ ├── 337.274a8ccc.js │ ├── 842.49774dc9.js │ ├── 866.eea4607d.js │ ├── chunk-vendors.bdb7cbba.js │ ├── documentation-topic.09a6ef86.js │ ├── highlight-js-bash-js.702f0c5c.js │ ├── highlight-js-c-js.063069d3.js │ ├── highlight-js-cpp-js.458a9ae4.js │ ├── highlight-js-css-js.bfc4251f.js │ ├── highlight-js-custom-markdown.78c9f6ed.js │ ├── highlight-js-custom-swift.738731d1.js │ ├── highlight-js-diff-js.4db9a783.js │ ├── highlight-js-http-js.f78e83c2.js │ ├── highlight-js-java-js.4fe21e94.js │ ├── highlight-js-javascript-js.dfc9d16d.js │ ├── highlight-js-json-js.2a1856ba.js │ ├── highlight-js-llvm-js.26121771.js │ ├── highlight-js-markdown-js.a2f456af.js │ ├── highlight-js-objectivec-js.74dea052.js │ ├── highlight-js-perl-js.da6eda82.js │ ├── highlight-js-php-js.c458ffa4.js │ ├── highlight-js-python-js.60354774.js │ ├── highlight-js-ruby-js.7272231f.js │ ├── highlight-js-scss-js.adcd11a2.js │ ├── highlight-js-shell-js.0ad5b20f.js │ ├── highlight-js-swift-js.bdd5bff5.js │ ├── highlight-js-xml-js.0d78f903.js │ ├── index.a08b31d0.js │ ├── topic.37e71576.js │ └── tutorials-overview.acb09e8a.js ├── link-hierarchy.json ├── linkable-entities.json └── metadata.json ├── res ├── Download_on_the_App_Store_Badge_JP_RGB_blk_100317.svg ├── Download_on_the_App_Store_Badge_US-UK_RGB_blk_092917.svg ├── app_privacy_policy.html ├── appdmg.json ├── icon.icns ├── keynote_5_5 │ └── Keynote.key ├── keynote_6_5 │ └── Keynote.key └── keynote_ipad │ └── Keynote.key └── scripts ├── actions-local.sh ├── format.sh └── generate_docs.sh /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.swift] 2 | indent_style = space 3 | indent_size = 4 4 | tab_width = 4 5 | end_of_line = crlf 6 | insert_final_newline = false 7 | max_line_length = 120 8 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/app-bug.yml: -------------------------------------------------------------------------------- 1 | name: Application Bug Report 2 | description: File a bug report 3 | title: "[app]: " 4 | labels: ["bug"] 5 | assignees: 6 | - fummicc1 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thanks for taking the time to fill out this bug report! 12 | - type: textarea 13 | id: what-happened 14 | attributes: 15 | label: What happened? 16 | description: Please write What happened and your expectation. 17 | placeholder: Tell us what you see! 18 | value: "-" 19 | validations: 20 | required: true 21 | - type: dropdown 22 | id: version 23 | attributes: 24 | label: Version 25 | description: 実行していたソフトウェアのバージョンは? 26 | options: 27 | - 1.2.1 28 | - 1.3.0 29 | - 1.3.1 30 | - 1.3.2 31 | - v1.3.3 32 | - v1.4.0 33 | - v1.4.1 34 | - v1.5.0 35 | - v1.6.0 36 | validations: 37 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/app-feature-request.yaml: -------------------------------------------------------------------------------- 1 | name: Application New feature Requet 2 | description: Describe a new feature request for app. 3 | title: "[app]: " 4 | labels: ["enhancement"] 5 | assignees: 6 | - fummicc1 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thanks for taking your time to fill out this issue! 12 | - type: textarea 13 | id: new-feature 14 | attributes: 15 | label: What is your new feature? 16 | description: Please write your expectation / new feature. 17 | placeholder: Tell us your expectation! 18 | value: "-" 19 | validations: 20 | required: true 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/lib-bug.yml: -------------------------------------------------------------------------------- 1 | name: Library Bug Report 2 | description: File a bug report 3 | title: "[csv2img]: " 4 | labels: ["bug"] 5 | assignees: 6 | - fummicc1 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thanks for taking the time to fill out this bug report! 12 | - type: textarea 13 | id: what-happened 14 | attributes: 15 | label: What happened? 16 | description: Please write What happened and your expectation. 17 | placeholder: Tell us what you see! 18 | value: "-" 19 | validations: 20 | required: true 21 | - type: dropdown 22 | id: version 23 | attributes: 24 | label: Version 25 | description: 実行していたソフトウェアのバージョンは? 26 | options: 27 | - 1.2.1 28 | - 1.3.0 29 | - 1.3.1 30 | - 1.3.2 31 | - v1.3.3 32 | - v1.4.0 33 | - v1.4.1 34 | - v1.5.0 35 | - v1.6.0 36 | validations: 37 | required: true 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/lib-new-feature.yml: -------------------------------------------------------------------------------- 1 | name: Library New feature Requet 2 | description: File a new feature request 3 | title: "[csv2img]: " 4 | labels: ["enhancement"] 5 | assignees: 6 | - fummicc1 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | Thanks for taking the time to fill out this issue! 12 | - type: textarea 13 | id: new-feature 14 | attributes: 15 | label: What is your new feature? 16 | description: Please write your expectation / new feature. 17 | placeholder: Tell us your expectation! 18 | value: "-" 19 | validations: 20 | required: true -------------------------------------------------------------------------------- /.github/workflows/builder.yml: -------------------------------------------------------------------------------- 1 | name: "[CsvBuilder] Build and Test Sources" 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | - develop 11 | 12 | jobs: 13 | test_builder: 14 | name: "Build CsvBuilder" 15 | runs-on: macos-14 16 | steps: 17 | - uses: actions/checkout@v3 18 | - uses: maxim-lobanov/setup-xcode@v1 19 | if: ${{ env.LOCAL != 'true' }} 20 | with: 21 | xcode-version: latest-stable 22 | - name: Install xcbeautify 23 | run: brew install xcbeautify 24 | - name: Build and Test (osX) 25 | run: | 26 | set -o pipefail && \ 27 | xcodebuild -scheme CsvBuilder \ 28 | clean build test \ 29 | -destination 'platform=OS X,arch=arm64' \ 30 | | xcbeautify 31 | - name: Build and Test (iOS) 32 | run: | 33 | set -o pipefail && \ 34 | xcodebuild -scheme CsvBuilder \ 35 | clean build test \ 36 | -destination 'platform=iOS Simulator,name=iPhone 15' \ 37 | | xcbeautify 38 | -------------------------------------------------------------------------------- /.github/workflows/command.yml: -------------------------------------------------------------------------------- 1 | name: "[Csv2ImgCmd] Build and Test Sources" 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | - develop 11 | 12 | jobs: 13 | test_cmd: 14 | name: "Build Csv2ImgCmd" 15 | runs-on: macos-14 16 | steps: 17 | - uses: actions/checkout@v3 18 | - uses: maxim-lobanov/setup-xcode@v1 19 | if: ${{ env.LOCAL != 'true' }} 20 | with: 21 | xcode-version: latest-stable 22 | - name: Install xcbeautify 23 | run: brew install xcbeautify 24 | - name: Build and Test 25 | run: | 26 | set -o pipefail && \ 27 | xcodebuild -scheme Csv2ImgCmd \ 28 | clean build \ 29 | -destination 'platform=OS X,arch=arm64' \ 30 | | xcbeautify 31 | -------------------------------------------------------------------------------- /.github/workflows/core.yml: -------------------------------------------------------------------------------- 1 | name: "[Csv2ImgCore] Build and Test Sources" 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | - develop 11 | 12 | jobs: 13 | test_core: 14 | name: "Build Csv2ImgCore" 15 | runs-on: macos-14 16 | steps: 17 | - uses: actions/checkout@v3 18 | - uses: maxim-lobanov/setup-xcode@v1 19 | if: ${{ env.LOCAL != 'true' }} 20 | with: 21 | xcode-version: latest-stable 22 | - name: Install xcbeautify 23 | run: brew install xcbeautify 24 | - name: Build and Test (osX) 25 | run: | 26 | set -o pipefail && \ 27 | xcodebuild -scheme Csv2ImgCore \ 28 | clean build test \ 29 | -destination 'platform=OS X,arch=arm64' \ 30 | | xcbeautify 31 | - name: Build and Test (iOS) 32 | run: | 33 | set -o pipefail && \ 34 | xcodebuild -scheme Csv2ImgCore \ 35 | clean build test \ 36 | -destination 'platform=iOS Simulator,name=iPhone 15' \ 37 | | xcbeautify 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .netrc 8 | 9 | .index-build/ -------------------------------------------------------------------------------- /.swiftpm/xcode/Csv2ImgCore.xctestplan: -------------------------------------------------------------------------------- 1 | { 2 | "configurations" : [ 3 | { 4 | "id" : "E908F407-34CE-4C61-9A65-A1309E0CEBFC", 5 | "name" : "Configuration 1", 6 | "options" : { 7 | 8 | } 9 | } 10 | ], 11 | "defaultOptions" : { 12 | 13 | }, 14 | "testTargets" : [ 15 | { 16 | "target" : { 17 | "containerPath" : "container:", 18 | "identifier" : "Csv2ImgCoreTests", 19 | "name" : "Csv2ImgCoreTests" 20 | } 21 | } 22 | ], 23 | "version" : 1 24 | } 25 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "type": "swift-lldb", 5 | "request": "launch", 6 | "name": "Debug Csv2ImgCmd", 7 | "program": "${workspaceFolder:Csv2Img}/.build/debug/Csv2ImgCmd", 8 | "args": [], 9 | "cwd": "${workspaceFolder:Csv2Img}", 10 | "preLaunchTask": "swift: Build Debug Csv2ImgCmd" 11 | }, 12 | { 13 | "type": "swift-lldb", 14 | "request": "launch", 15 | "name": "Release Csv2ImgCmd", 16 | "program": "${workspaceFolder:Csv2Img}/.build/release/Csv2ImgCmd", 17 | "args": [], 18 | "cwd": "${workspaceFolder:Csv2Img}", 19 | "preLaunchTask": "swift: Build Release Csv2ImgCmd" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "swift.diagnostics": true, 4 | "apple-swift-format.enable": true, 5 | "swift.autoGenerateLaunchConfigurations": true, 6 | "swift.buildArguments": [], 7 | "swift.testEnvironmentVariables": {}, 8 | "[swift]": { 9 | "editor.tabSize": 4, 10 | "editor.insertSpaces": true 11 | }, 12 | "editor.formatOnSaveMode": "file", 13 | "editor.defaultFormatter": "vknabel.vscode-apple-swift-format", 14 | "makefile.configureOnOpen": false, 15 | "swift.sourcekit-lsp.serverArguments": [ 16 | "-Xswiftc", 17 | "-sdk", 18 | "-Xswiftc", 19 | "/Applications/Xcode-16.0.0.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator18.0.sdk", 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /Csv2ImageApp/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.swift] 2 | indent_style = space 3 | indent_size = 4 4 | tab_width = 4 5 | end_of_line = crlf 6 | insert_final_newline = false 7 | max_line_length = 120 8 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "originHash" : "c09f66e72e7c4c85dc2f8d0b89481743b664e377ef344ce7e3c67dd83fda0ec6", 3 | "pins" : [ 4 | { 5 | "identity" : "swift-argument-parser", 6 | "kind" : "remoteSourceControl", 7 | "location" : "https://github.com/apple/swift-argument-parser", 8 | "state" : { 9 | "revision" : "9f39744e025c7d377987f30b03770805dcb0bcd1", 10 | "version" : "1.1.4" 11 | } 12 | }, 13 | { 14 | "identity" : "swift-docc-plugin", 15 | "kind" : "remoteSourceControl", 16 | "location" : "https://github.com/swiftlang/swift-docc-plugin", 17 | "state" : { 18 | "revision" : "85e4bb4e1cd62cec64a4b8e769dcefdf0c5b9d64", 19 | "version" : "1.4.3" 20 | } 21 | }, 22 | { 23 | "identity" : "swift-docc-symbolkit", 24 | "kind" : "remoteSourceControl", 25 | "location" : "https://github.com/swiftlang/swift-docc-symbolkit", 26 | "state" : { 27 | "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", 28 | "version" : "1.0.0" 29 | } 30 | }, 31 | { 32 | "identity" : "swift-syntax", 33 | "kind" : "remoteSourceControl", 34 | "location" : "https://github.com/swiftlang/swift-syntax", 35 | "state" : { 36 | "revision" : "2bc86522d115234d1f588efe2bcb4ce4be8f8b82", 37 | "version" : "510.0.3" 38 | } 39 | } 40 | ], 41 | "version" : 3 42 | } 43 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x1D", 9 | "green" : "0x93", 10 | "red" : "0xF7" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-1.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-2.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-3.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-4.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-5.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-6.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg-7.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/Csv2mg.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/appstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/appstore.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/アートボード 1 のコピー 4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/アートボード 1 のコピー 4-1.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/アートボード 1 のコピー 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Csv2ImageApp/Csv2ImageApp/Assets.xcassets/AppIcon.appiconset/アートボード 1 のコピー 4.png -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/BackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "secondarySystemBackgroundColor" 7 | }, 8 | "idiom" : "universal" 9 | }, 10 | { 11 | "appearances" : [ 12 | { 13 | "appearance" : "luminosity", 14 | "value" : "light" 15 | } 16 | ], 17 | "color" : { 18 | "color-space" : "srgb", 19 | "components" : { 20 | "alpha" : "1.000", 21 | "blue" : "0xF0", 22 | "green" : "0xF0", 23 | "red" : "0xF0" 24 | } 25 | }, 26 | "idiom" : "universal" 27 | }, 28 | { 29 | "appearances" : [ 30 | { 31 | "appearance" : "luminosity", 32 | "value" : "dark" 33 | } 34 | ], 35 | "color" : { 36 | "color-space" : "srgb", 37 | "components" : { 38 | "alpha" : "1.000", 39 | "blue" : "0x0E", 40 | "green" : "0x0E", 41 | "red" : "0x0E" 42 | } 43 | }, 44 | "idiom" : "universal" 45 | } 46 | ], 47 | "info" : { 48 | "author" : "xcode", 49 | "version" : 1 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/LightAccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x68", 9 | "green" : "0xB5", 10 | "red" : "0xF9" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/SecondaryBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "tertiarySystemBackgroundColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/SecondaryColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "226", 9 | "green" : "171", 10 | "red" : "41" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Assets.xcassets/TextColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "universal", 6 | "reference" : "labelColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | }, 15 | "properties" : { 16 | "localizable" : true 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Csv2ImageApp.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.downloads.read-only 8 | 9 | com.apple.security.files.user-selected.read-write 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Csv2Img.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | Csv2Img 2.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Csv2Img.xcdatamodeld/Csv2Img 2.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Csv2Img.xcdatamodeld/Csv2Img.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Ex/Binding+Ex.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Binding+Ex.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/07. 6 | // 7 | 8 | import Foundation 9 | import SwiftUI 10 | 11 | extension Binding { 12 | func isNotNil() -> Binding where Value == V? { 13 | Binding { 14 | self.wrappedValue != nil 15 | } set: { v, _ in 16 | if !v { 17 | self.wrappedValue = nil 18 | } 19 | } 20 | } 21 | 22 | func isNil() -> Binding where Value == V? { 23 | Binding { 24 | self.wrappedValue == nil 25 | } set: { v, _ in 26 | if v { 27 | self.wrappedValue = nil 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Ex/UIApplication+Ex.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIApplication+Ex.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/14. 6 | // 7 | 8 | import Foundation 9 | 10 | #if os(iOS) 11 | import UIKit 12 | extension Application { 13 | var activeRootViewController: UIViewController? { 14 | self.connectedScenes 15 | .filter { $0.activationState == .foregroundActive } 16 | .compactMap { $0 as? UIWindowScene } 17 | .compactMap { $0.keyWindow }.first? 18 | .rootViewController 19 | } 20 | } 21 | #endif 22 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Generated/CsvConfig+CoreDataClass.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvConfig+CoreDataClass.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/20. 6 | // 7 | // 8 | 9 | import CoreData 10 | import Foundation 11 | 12 | @objc(CsvConfig) 13 | public class CsvConfig: NSManagedObject { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Generated/CsvConfig+CoreDataProperties.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvConfig+CoreDataProperties.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/20. 6 | // 7 | // 8 | 9 | import CoreData 10 | import Foundation 11 | 12 | extension CsvConfig { 13 | 14 | @nonobjc public class func fetchRequest() -> NSFetchRequest { 15 | return NSFetchRequest(entityName: "CsvConfig") 16 | } 17 | 18 | @NSManaged public var fontSize: Int32 19 | @NSManaged public var separator: String? 20 | 21 | } 22 | 23 | extension CsvConfig: Identifiable { 24 | 25 | } 26 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Generated/CsvOutput+CoreDataClass.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvOutput+CoreDataClass.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/20. 6 | // 7 | // 8 | 9 | import CoreData 10 | import Foundation 11 | 12 | @objc(CsvOutput) 13 | public class CsvOutput: NSManagedObject { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Generated/CsvOutput+CoreDataProperties.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvOutput+CoreDataProperties.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/20. 6 | // 7 | // 8 | 9 | import CoreData 10 | import Foundation 11 | 12 | extension CsvOutput { 13 | 14 | @nonobjc public class func fetchRequest() -> NSFetchRequest { 15 | return NSFetchRequest(entityName: "CsvOutput") 16 | } 17 | 18 | @NSManaged public var generatedAt: Date 19 | @NSManaged public var png: Data? 20 | @NSManaged public var raw: String? 21 | @NSManaged public var config: CsvConfig? 22 | 23 | } 24 | 25 | extension CsvOutput: Identifiable { 26 | 27 | } 28 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/States/SelectedCsvState.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SelectedCsvState.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/07. 6 | // 7 | 8 | import Foundation 9 | 10 | enum FileURLType { 11 | case local 12 | case network 13 | } 14 | 15 | struct SelectedCsvState: Hashable { 16 | let fileType: FileURLType 17 | let url: URL 18 | } 19 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Type.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Type.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/22. 6 | // 7 | 8 | import Foundation 9 | import SwiftUI 10 | 11 | #if os(macOS) 12 | import AppKit 13 | typealias Application = NSApplication 14 | typealias ApplicationDelegate = NSApplicationDelegate 15 | typealias ApplicationDelegateAdaptor = NSApplicationDelegateAdaptor 16 | typealias Responder = NSResponder 17 | typealias ViewRepresentable = NSViewRepresentable 18 | #elseif os(iOS) 19 | import UIKit 20 | typealias Application = UIApplication 21 | typealias ApplicationDelegate = UIApplicationDelegate 22 | typealias ApplicationDelegateAdaptor = UIApplicationDelegateAdaptor 23 | typealias Responder = UIResponder 24 | typealias ViewRepresentable = UIViewRepresentable 25 | #endif 26 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Views/BrandingFrameView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BrandingFrameView.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/07. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct BrandingFrameView: View { 11 | 12 | let content: () -> Content 13 | 14 | var body: some View { 15 | GeometryReader { proxy in 16 | ZStack { 17 | RadialGradient( 18 | colors: [ 19 | Asset.lightAccentColor.swiftUIColor, 20 | Asset.accentColor.swiftUIColor, 21 | ], 22 | center: .init(x: 0.5, y: 0.5), startRadius: 8, endRadius: proxy.size.width / 2 23 | ) 24 | .ignoresSafeArea() 25 | content() 26 | } 27 | } 28 | } 29 | } 30 | 31 | struct BrandingFrameView_Previews: PreviewProvider { 32 | static var previews: some View { 33 | BrandingFrameView { 34 | Spacer().frame(width: 300, height: 300) 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Views/CText.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CText.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/07. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CText: View { 11 | 12 | let text: String 13 | let isBold: Bool 14 | let font: Font 15 | let foregroundColor: Color 16 | 17 | init( 18 | _ text: String, isBold: Bool = true, font: Font = .body, 19 | foregroundColor: Color = Asset.textColor.swiftUIColor 20 | ) { 21 | self.text = text 22 | self.isBold = isBold 23 | self.font = font 24 | self.foregroundColor = foregroundColor 25 | } 26 | 27 | var body: some View { 28 | if isBold { 29 | Text(text) 30 | .bold() 31 | .font(font) 32 | .foregroundColor(foregroundColor) 33 | } else { 34 | Text(text) 35 | .bold() 36 | .font(font) 37 | .foregroundColor(foregroundColor) 38 | } 39 | } 40 | } 41 | 42 | struct CText_Previews: PreviewProvider { 43 | static var previews: some View { 44 | CText("Hello") 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Views/CsvViewer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvViewer.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CsvViewer: View { 11 | 12 | let img: CGImage 13 | 14 | var body: some View { 15 | GeometryReader { proxy in 16 | ScrollView { 17 | Image(img, scale: 1, orientation: .up, label: Text("Output Image")) 18 | .resizable() 19 | .aspectRatio(contentMode: .fit) 20 | .frame(width: proxy.size.width * 0.6) 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Views/GenerateOutputView/GenerateOutputView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GenerateOutputView.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/07. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct GenerateOutputView: View { 11 | 12 | @StateObject var model: GenerateOutputModel 13 | @Binding var backToPreviousPage: Bool 14 | 15 | var body: some View { 16 | #if os(iOS) 17 | GenerateOutputView_iOS( 18 | model: model, 19 | backToPreviousPage: _backToPreviousPage 20 | ) 21 | #elseif os(macOS) 22 | GenerateOutputView_macOS( 23 | model: model, 24 | backToPreviousPage: _backToPreviousPage 25 | ) 26 | #endif 27 | 28 | } 29 | } 30 | 31 | struct GenerateOutputView_Previews: PreviewProvider { 32 | static var previews: some View { 33 | GenerateOutputView( 34 | model: GenerateOutputModel( 35 | url: URL(string: "https://via.placeholder.com/150")!, 36 | urlType: .network 37 | ), 38 | backToPreviousPage: .constant(false) 39 | ) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Views/RootView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RootView.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/07. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct RootView: View { 11 | 12 | @State private var selectedCsv: SelectedCsvState? 13 | 14 | var body: some View { 15 | if let selectedCsv = selectedCsv { 16 | GenerateOutputView( 17 | model: GenerateOutputModel( 18 | url: selectedCsv.url, 19 | urlType: selectedCsv.fileType 20 | ), 21 | backToPreviousPage: $selectedCsv.isNil() 22 | ).transition(.opacity.animation(.easeInOut)) 23 | } else { 24 | SelectCsvView( 25 | selectedCsv: $selectedCsv, model: SelectCsvModel() 26 | ) 27 | .transition(.move(edge: .leading).animation(.easeInOut)) 28 | } 29 | } 30 | } 31 | 32 | struct RootView_Previews: PreviewProvider { 33 | static var previews: some View { 34 | RootView() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/Views/SelectCsvView/SelectCsvView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SelectCsvView.swift 3 | // Csv2ImageApp 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/07. 6 | // 7 | 8 | import Csv2ImgCore 9 | import SwiftUI 10 | 11 | struct SelectCsvView: View { 12 | 13 | @Binding var selectedCsv: SelectedCsvState? 14 | @StateObject var model: SelectCsvModel 15 | 16 | var body: some View { 17 | Group { 18 | #if os(macOS) 19 | SelectCsvView_macOS(model: model) 20 | #elseif os(iOS) 21 | SelectCsvView_iOS(model: model) 22 | #endif 23 | } 24 | .onReceive(model.$selectedCsv) { selectedCsv in 25 | self.selectedCsv = selectedCsv 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageApp/info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | LSApplicationQueriesSchemes 6 | 7 | file 8 | 9 | UIFileSharingEnabled 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageAppTests/Csv2ImageAppTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Csv2ImageAppTests.swift 3 | // Csv2ImageAppTests 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/07. 6 | // 7 | 8 | import XCTest 9 | 10 | @testable import Csv2ImageApp 11 | 12 | class Csv2ImageAppTests: XCTestCase { 13 | 14 | override func setUpWithError() throws { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDownWithError() throws { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() throws { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | // Any test you write for XCTest can be annotated as throws and async. 26 | // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. 27 | // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. 28 | } 29 | 30 | func testPerformanceExample() throws { 31 | // This is an example of a performance test case. 32 | self.measure { 33 | // Put the code you want to measure the time of here. 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageAppUITests/Csv2ImageAppUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Csv2ImageAppUITests.swift 3 | // Csv2ImageAppUITests 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/07. 6 | // 7 | 8 | import XCTest 9 | 10 | class Csv2ImageAppUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | } 24 | 25 | func testExample() throws { 26 | // UI tests must launch the application that they test. 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | // Use XCTAssert and related functions to verify your tests produce the correct results. 31 | } 32 | 33 | func testLaunchPerformance() throws { 34 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { 35 | // This measures how long it takes to launch your application. 36 | measure(metrics: [XCTApplicationLaunchMetric()]) { 37 | XCUIApplication().launch() 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Csv2ImageApp/Csv2ImageAppUITests/Csv2ImageAppUITestsLaunchTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Csv2ImageAppUITestsLaunchTests.swift 3 | // Csv2ImageAppUITests 4 | // 5 | // Created by Fumiya Tanaka on 2022/06/07. 6 | // 7 | 8 | import XCTest 9 | 10 | class Csv2ImageAppUITestsLaunchTests: XCTestCase { 11 | 12 | override class var runsForEachTargetApplicationUIConfiguration: Bool { 13 | true 14 | } 15 | 16 | override func setUpWithError() throws { 17 | continueAfterFailure = false 18 | } 19 | 20 | func testLaunch() throws { 21 | let app = XCUIApplication() 22 | app.launch() 23 | 24 | // Insert steps here to perform after app launch but before taking a screenshot, 25 | // such as logging into a test account or navigating somewhere in the app 26 | 27 | let attachment = XCTAttachment(screenshot: app.screenshot()) 28 | attachment.name = "Launch Screen" 29 | attachment.lifetime = .keepAlways 30 | add(attachment) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Csv2ImageApp/Mintfile: -------------------------------------------------------------------------------- 1 | SwiftGen/SwiftGen 2 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "swift-argument-parser", 6 | "repositoryURL": "https://github.com/apple/swift-argument-parser", 7 | "state": { 8 | "branch": null, 9 | "revision": "9f39744e025c7d377987f30b03770805dcb0bcd1", 10 | "version": "1.1.4" 11 | } 12 | }, 13 | { 14 | "package": "SwiftDocCPlugin", 15 | "repositoryURL": "https://github.com/apple/swift-docc-plugin", 16 | "state": { 17 | "branch": null, 18 | "revision": "10bc670db657d11bdd561e07de30a9041311b2b1", 19 | "version": "1.1.0" 20 | } 21 | }, 22 | { 23 | "package": "SymbolKit", 24 | "repositoryURL": "https://github.com/apple/swift-docc-symbolkit", 25 | "state": { 26 | "branch": null, 27 | "revision": "b45d1f2ed151d057b54504d653e0da5552844e34", 28 | "version": "1.0.0" 29 | } 30 | }, 31 | { 32 | "package": "SwiftSyntax", 33 | "repositoryURL": "https://github.com/apple/swift-syntax", 34 | "state": { 35 | "branch": "main", 36 | "revision": "dfb8deb846e16d98e1d5b2261ed608121e096037", 37 | "version": null 38 | } 39 | } 40 | ] 41 | }, 42 | "version": 1 43 | } 44 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "1x", 11 | "size" : "16x16" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "scale" : "2x", 16 | "size" : "16x16" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "scale" : "1x", 21 | "size" : "32x32" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "scale" : "2x", 26 | "size" : "32x32" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "scale" : "1x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "scale" : "2x", 36 | "size" : "128x128" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "scale" : "1x", 41 | "size" : "256x256" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "scale" : "2x", 46 | "size" : "256x256" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "scale" : "1x", 51 | "size" : "512x512" 52 | }, 53 | { 54 | "idiom" : "mac", 55 | "scale" : "2x", 56 | "size" : "512x512" 57 | } 58 | ], 59 | "info" : { 60 | "author" : "xcode", 61 | "version" : 1 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/ContentView.swift: -------------------------------------------------------------------------------- 1 | import CsvBuilder 2 | import SwiftUI 3 | 4 | struct ContentView: View { 5 | 6 | @State private var composition: CsvCompositionExample = .init() 7 | @State private var image: CGImage? 8 | 9 | var body: some View { 10 | VStack { 11 | Image(systemName: "globe") 12 | .imageScale(.large) 13 | .foregroundColor(.accentColor) 14 | Text("Hello, world!") 15 | if let image = image { 16 | Image( 17 | nsImage: NSImage( 18 | cgImage: image, size: CGSize(width: image.width, height: image.height)) 19 | ) 20 | .resizable() 21 | .aspectRatio(contentMode: .fit) 22 | } 23 | } 24 | .padding() 25 | .task { 26 | composition = .init() 27 | composition.ages.append(contentsOf: ["98", "99", "100"]) 28 | composition.names.append(contentsOf: ["Yamada", "Tanaka", "Sato"]) 29 | let csv = try! composition.build() 30 | let data = try! await csv.generate(fontSize: 20, exportType: .png) 31 | self.image = data.base as! CGImage 32 | } 33 | } 34 | } 35 | 36 | struct ContentView_Previews: PreviewProvider { 37 | static var previews: some View { 38 | ContentView() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/CsvBuilderExample.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/CsvBuilderExampleApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvBuilderExampleApp.swift 3 | // CsvBuilderExample 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/25. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct CsvBuilderExampleApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | TabView { 15 | ContentView() 16 | .tabItem { 17 | Text("Example 1") 18 | } 19 | SecondContentView() 20 | .tabItem { 21 | Text("Example 2") 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/CsvCompositionExample.swift: -------------------------------------------------------------------------------- 1 | import CsvBuilder 2 | 3 | struct CsvCompositionExample: CsvComposition { 4 | @CsvRows(column: "age") 5 | var ages: [String] 6 | 7 | @CsvRows(column: "name") 8 | var names: [String] 9 | 10 | init() {} 11 | } 12 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/CsvCompositionExample.txt: -------------------------------------------------------------------------------- 1 | import CsvBuilder 2 | 3 | struct CsvCompositionExample: CsvComposition { 4 | @CsvRows(column: "age") 5 | var ages: [String] 6 | 7 | @CsvRows(column: "name") 8 | var names: [String] 9 | 10 | init() { } 11 | } 12 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Examples/CsvBuilderExample/CsvBuilderExample/SecondContentView.swift: -------------------------------------------------------------------------------- 1 | import Csv2ImgCore 2 | import CsvBuilder 3 | import SwiftUI 4 | 5 | struct SecondContentView: View { 6 | @State private var composition: CsvCompositionExample = .init() 7 | @State private var image: CGImage? 8 | 9 | var body: some View { 10 | VStack { 11 | Image(systemName: "globe") 12 | .imageScale(.large) 13 | .foregroundColor(.accentColor) 14 | Text("Hello, world!") 15 | if let image = image { 16 | Image( 17 | nsImage: NSImage( 18 | cgImage: image, size: CGSize(width: image.width, height: image.height)) 19 | ) 20 | .resizable() 21 | .aspectRatio(contentMode: .fit) 22 | } 23 | } 24 | .padding() 25 | .task { 26 | let yamada = Csv.Row(index: 0, values: ["98", "Yamada"]) 27 | let tanaka = Csv.Row(index: 0, values: ["99", "Tanaka"]) 28 | let sato = Csv.Row(index: 0, values: ["100", "Sato"]) 29 | let csv = try! CsvCompositionParser.parse( 30 | type: CsvCompositionExample.self, rows: [yamada, tanaka, sato]) 31 | let data = try! await csv.generate(fontSize: 20, exportType: .png) 32 | self.image = data.base as! CGImage 33 | } 34 | } 35 | } 36 | 37 | struct SecondContentView_Previews: PreviewProvider { 38 | static var previews: some View { 39 | SecondContentView() 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Fixtures/category.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Fixtures/category.csv -------------------------------------------------------------------------------- /Fixtures/outputs/category.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Fixtures/outputs/category.pdf -------------------------------------------------------------------------------- /Fixtures/outputs/category.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/Fixtures/outputs/category.png -------------------------------------------------------------------------------- /Fixtures/sample_1.csv: -------------------------------------------------------------------------------- 1 | a,b,c 2 | 1,2,3 3 | 4,5,6 4 | 7,8,9 5 | 10,11,12 6 | -------------------------------------------------------------------------------- /Fixtures/sample_2.csv: -------------------------------------------------------------------------------- 1 | 1,alice,alice@example.com 2 | 2,bob,bob@example.com 3 | 3,carol,carol@eample.com 4 | -------------------------------------------------------------------------------- /Fixtures/yolov5x6.csv: -------------------------------------------------------------------------------- 1 | ,name,xmin,ymin,xmax,ymax 2 | 0,person,3.0465424060821533e-05,0.5259348551432291,1.0,1.0 3 | 1,car,0.0,0.5300865809122721,1.0,1.0 4 | 2,traffic_light,0.22653963565826415,0.20737198193868,0.9982780456542969,0.597698465983073 5 | 3,bicycle,0.0017074823379516601,0.6379453023274739,0.9946540832519531,0.9978679021199545 6 | 4,truck,0.0,0.23778079350789388,1.0,1.0 7 | 5,parking meter,0.052110600471496585,0.7164962768554688,0.9998332977294921,0.9985182444254558 8 | 6,backpack,0.5714457035064697,0.7967685063680013,0.9580268859863281,0.9202975591023763 9 | 7,bus,0.0017816781997680663,0.5464848836263021,0.9708044052124023,0.9988042831420898 10 | 8,fire hydrant,0.2565213918685913,0.6313339233398437,0.8103376388549804,0.9993324279785156 11 | 9,motorcycle,0.001504969596862793,0.5938994089762369,0.9608647346496582,1.0 12 | 10,bench,0.5572725772857666,0.6351941426595052,0.5986509799957276,0.6801984151204427 13 | 11,dog,0.23603930473327636,0.8120218912760416,0.26651535034179685,0.8491163889567057 14 | 12,potted plant,0.5294355869293212,0.603613535563151,0.5626094341278076,0.6801102956136068 15 | 13,umbrella,0.8551274299621582,0.5495414733886719,0.9023731231689454,0.5898293177286784 16 | 14,boat,0.6071254253387451,0.8978073120117187,0.7929721355438233,0.9978271484375 17 | 15,train,0.6117803573608398,0.736886723836263,0.9020633697509766,0.9267396291097005 18 | 16,handbag,0.43555512428283694,0.8192273457845052,0.5187122821807861,0.8747571309407552 19 | 17,clock,0.7734241485595703,0.9318702061971028,0.8103131294250489,0.9949345270792643 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Fumiya Tanaka 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "originHash" : "b5a609958d4527ce07000982912bd4609927f45277d7cb706c744970b7051f59", 3 | "pins" : [ 4 | { 5 | "identity" : "swift-argument-parser", 6 | "kind" : "remoteSourceControl", 7 | "location" : "https://github.com/apple/swift-argument-parser", 8 | "state" : { 9 | "revision" : "f3c9084a71ef4376f2fabbdf1d3d90a49f1fabdb", 10 | "version" : "1.1.2" 11 | } 12 | }, 13 | { 14 | "identity" : "swift-docc-plugin", 15 | "kind" : "remoteSourceControl", 16 | "location" : "https://github.com/swiftlang/swift-docc-plugin", 17 | "state" : { 18 | "revision" : "85e4bb4e1cd62cec64a4b8e769dcefdf0c5b9d64", 19 | "version" : "1.4.3" 20 | } 21 | }, 22 | { 23 | "identity" : "swift-docc-symbolkit", 24 | "kind" : "remoteSourceControl", 25 | "location" : "https://github.com/swiftlang/swift-docc-symbolkit", 26 | "state" : { 27 | "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", 28 | "version" : "1.0.0" 29 | } 30 | }, 31 | { 32 | "identity" : "swift-syntax", 33 | "kind" : "remoteSourceControl", 34 | "location" : "https://github.com/swiftlang/swift-syntax", 35 | "state" : { 36 | "revision" : "2bc86522d115234d1f588efe2bcb4ce4be8f8b82", 37 | "version" : "510.0.3" 38 | } 39 | } 40 | ], 41 | "version" : 3 42 | } 43 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/CsvColumnStyle+Ex.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvColumnStyle+Ex.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/26. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Csv.Column.Style { 11 | 12 | func normalColor() -> Any { 13 | #if os(macOS) 14 | let color: Any = Color.labelColor 15 | #elseif os(iOS) 16 | let color: Any = Color.label.cgColor 17 | #endif 18 | return color 19 | } 20 | 21 | func displayableColor() -> Any { 22 | if applyOnlyColumn { 23 | return normalColor() 24 | } 25 | return Color( 26 | cgColor: color 27 | ) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/CsvError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvError.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/26. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Csv { 11 | 12 | /// `Error` related with Csv implmentation. 13 | public enum Error: Swift.Error { 14 | /// Specified network url is invalid or failed to download csv data. 15 | case invalidDownloadResource( 16 | url: String, 17 | data: Data 18 | ) 19 | /// Specified local url is invalid (file may not exist. using incorrect `String.Encoding` Type). 20 | case invalidLocalResource( 21 | url: String, 22 | data: Data, 23 | encoding: String.Encoding 24 | ) 25 | /// If file is not accessible due to security issue. 26 | case cannotAccessFile( 27 | url: String 28 | ) 29 | /// given `exportType` is invalid. 30 | case invalidExportType( 31 | ExportType 32 | ) 33 | /// Both columns and rows are empty 34 | case emptyData 35 | /// Csv denied execution because it is generating another contents. 36 | case workInProgress 37 | /// Failed to render image from `CsvImageRepresentation`. 38 | case failedToRenderImage 39 | case underlying( 40 | Swift.Error? 41 | ) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/CsvImageRepresentation.swift: -------------------------------------------------------------------------------- 1 | import CoreGraphics 2 | import Foundation 3 | 4 | public struct CsvImageRepresentation: Equatable { 5 | let width: Int 6 | let height: Int 7 | let backgroundColor: CGColor 8 | let fontSize: CGFloat 9 | let columns: [ColumnRepresentation] 10 | let rows: [RowRepresentation] 11 | 12 | struct ColumnRepresentation: Equatable { 13 | let name: String 14 | let style: Csv.Column.Style 15 | let frame: CGRect 16 | } 17 | 18 | struct RowRepresentation: Equatable { 19 | let values: [String] 20 | let frames: [CGRect] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/CsvRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvRow.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/26. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Csv { 11 | /// Row (a line) 12 | /// 13 | /// Row is hrizontally separated group except first line. 14 | /// 15 | /// First line is treated as ``ColumnName``. 16 | /// 17 | /// eg. 18 | /// 19 | /// 1 2 3 4 20 | /// 21 | /// 5 6 7 8 22 | /// 23 | /// →Row is [5, 6, 7, 8]. 24 | /// 25 | /// 26 | /// Because this class is usually initialized via ``Csv``, you do not have to take care about ``Row`` in detail. 27 | /// 28 | public struct Row: Sendable, Equatable { 29 | 30 | public init( 31 | index: Int, 32 | values: [String] 33 | ) { 34 | self.index = index 35 | self.values = values 36 | } 37 | 38 | public var index: Int 39 | public var values: [String] 40 | 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/Image+Data.swift: -------------------------------------------------------------------------------- 1 | import CoreGraphics 2 | import Foundation 3 | 4 | #if canImport(AppKit) 5 | import AppKit 6 | extension CGImage { 7 | public func convertToData() -> Data? { 8 | let rep = NSBitmapImageRep( 9 | cgImage: self 10 | ) 11 | rep.pixelsHigh = height 12 | rep.pixelsWide = width 13 | return rep.representation( 14 | using: .png, 15 | properties: [:] 16 | ) 17 | } 18 | } 19 | #elseif canImport(UIKit) 20 | import UIKit 21 | extension CGImage { 22 | public func convertToData() -> Data? { 23 | let img = UIImage( 24 | cgImage: self 25 | ) 26 | return img.pngData() 27 | } 28 | } 29 | #endif 30 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/Maker.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public protocol Maker: Sendable { 4 | associatedtype Exportable: CsvExportable 5 | 6 | var maximumRowCount: Int? { 7 | get 8 | } 9 | 10 | func make( 11 | columns: [Csv.Column], 12 | rows: [Csv.Row], 13 | progress: @escaping @Sendable ( 14 | Double 15 | ) -> Void 16 | ) throws -> Exportable 17 | func set( 18 | fontSize size: Double 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/PDFMetadata.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | /// ``PDFMetadata`` is a struct which stores Metadata about output-pdf. 4 | public struct PDFMetadata { 5 | 6 | /// `author`. author of document. 7 | public var author: String? 8 | /// `title`. title of document. 9 | public var title: String? 10 | 11 | /** 12 | - specify output pdf size with ``PdfSize``. 13 | */ 14 | public var size: PdfSize? 15 | public var orientation: PdfSize.Orientation 16 | 17 | public init( 18 | author: String? = nil, 19 | title: String? = nil, 20 | size: PdfSize? = nil, 21 | orientation: PdfSize.Orientation = .portrait 22 | ) { 23 | self.author = author 24 | self.title = title 25 | self.size = size 26 | self.orientation = orientation 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/Pdf+Data.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/String+Ex.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import CoreText 3 | 4 | extension String { 5 | func getSize( 6 | fontSize: Double 7 | ) -> CGSize { 8 | // Calculate the size of the string using CoreText 9 | let font = getFont(ofSize: fontSize) 10 | let attrString = NSAttributedString( 11 | string: self, 12 | attributes: [ 13 | .font: font 14 | ]) 15 | let size = attrString.size() 16 | return CGSize( 17 | width: Int(size.width), 18 | height: Int(size.height) 19 | ) 20 | } 21 | 22 | func getFont(ofSize fontSize: CGFloat) -> CTFont { 23 | CTFontCreateWithName( 24 | "San Francisco" as CFString, 25 | fontSize, 26 | nil 27 | ) 28 | } 29 | } 30 | 31 | extension NSAttributedString { 32 | func _draw( 33 | at rect: Rect 34 | ) { 35 | #if os(macOS) 36 | draw( 37 | with: rect 38 | ) 39 | #elseif os(iOS) 40 | draw( 41 | in: rect 42 | ) 43 | #endif 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Sources/Csv2ImgCore/TypeConvertible.swift: -------------------------------------------------------------------------------- 1 | import CoreFoundation 2 | import CoreGraphics 3 | import PDFKit 4 | 5 | public protocol CsvExportable: Sendable { 6 | } 7 | 8 | public final class AnyCsvExportable: CsvExportable { 9 | 10 | public let base: CsvExportable 11 | 12 | public init( 13 | _ csvExportable: CsvExportable 14 | ) { 15 | self.base = csvExportable 16 | } 17 | } 18 | 19 | extension CGImage: CsvExportable { 20 | 21 | } 22 | extension Data: CsvExportable { 23 | 24 | } 25 | extension PDFDocument: @unchecked Sendable { 26 | } 27 | extension PDFDocument: CsvExportable { 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Sources/CsvBuilder/CsvComposition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvComposition.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/25. 6 | // 7 | 8 | import Csv2ImgCore 9 | import Foundation 10 | 11 | public protocol CsvComposition { 12 | func build() throws -> Csv 13 | } 14 | 15 | extension CsvComposition { 16 | public func build() throws -> Csv { 17 | try CsvBuilder.build( 18 | composition: self 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Sources/CsvBuilder/CsvCompositionElement.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvCompositionElement.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/25. 6 | // 7 | 8 | import Foundation 9 | 10 | struct CsvCompositionElement { 11 | var columnName: String 12 | var rows: [Row] 13 | 14 | struct Row { 15 | let index: Int 16 | let value: String 17 | } 18 | 19 | init( 20 | column: String, 21 | rows: [Row] 22 | ) { 23 | self.columnName = column 24 | self.rows = rows 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/CsvBuilder/Example.swift: -------------------------------------------------------------------------------- 1 | /// Just an example 2 | struct ExampleComposition: CsvComposition { 3 | @CsvRows( 4 | column: "age" 5 | ) 6 | var ages: [String] 7 | 8 | @CsvRows( 9 | column: "name" 10 | ) 11 | var names: [String] 12 | 13 | init() { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/CsvBuilder/NewCsvComposition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2023/02/01. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Under development 11 | public struct NewCsvComposition< 12 | Row, 13 | Column: StringProtocol 14 | > { 15 | var columns: [Column] 16 | var rows: Rows 17 | 18 | @dynamicMemberLookup 19 | public struct Rows { 20 | public typealias Value = [Column: [Row]] 21 | var value: Value = [:] 22 | 23 | subscript( 24 | dynamicMember keyPath: KeyPath< 25 | Rows, 26 | [Rows] 27 | > 28 | ) -> Value { 29 | fatalError() 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Sources/CsvBuilder/RowWrapper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvRows.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/24. 6 | // 7 | 8 | import Foundation 9 | 10 | @propertyWrapper 11 | public struct CsvRows { 12 | public var wrappedValue: [String] 13 | public var column: String 14 | 15 | public init( 16 | column: String 17 | ) { 18 | self.column = column 19 | self.wrappedValue = [] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Tests/Csv2ImgCoreTests/String+ExTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+ExTests.swift 3 | // Csv2Img 4 | // 5 | // Created by Fumiya Tanaka on 2024/10/19. 6 | // 7 | 8 | import XCTest 9 | 10 | @testable import Csv2ImgCore 11 | 12 | class StringExtensionTests: XCTestCase { 13 | func testGetSize() throws { 14 | let sut = "Hello World" 15 | let fontSize: CGFloat = 12 16 | 17 | // Because font system is different between iOS and macOS, 18 | // calculation logic might be different and result font size differs. 19 | #if os(iOS) 20 | let expected = CGSize(width: 61, height: 13) 21 | #elseif os(macOS) 22 | let expected = CGSize(width: 61, height: 12) 23 | #endif 24 | 25 | let actual = sut.getSize(fontSize: fontSize) 26 | XCTAssertEqual(actual, expected) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Tests/Csv2ImgCoreTests/Util.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Util.swift 3 | // Csv2Img 4 | // 5 | // Created by Fumiya Tanaka on 2024/09/23. 6 | // 7 | 8 | import XCTest 9 | 10 | func getRelativeFilePathFromPackageSource(path: String) -> URL { 11 | let packageRootPath = URL(fileURLWithPath: #file).pathComponents 12 | .prefix(while: { $0 != "Tests" }).joined( 13 | separator: "/" 14 | ).dropFirst() 15 | let fileURLPath = [String(packageRootPath), path].joined(separator: "/") 16 | let fileURL = URL(fileURLWithPath: fileURLPath) 17 | XCTAssertTrue( 18 | FileManager.default.fileExists(atPath: fileURL.path), 19 | "\(fileURLPath) does not exists." 20 | ) 21 | print("fileURL.absoluteString", fileURL.absoluteString) 22 | return fileURL 23 | } 24 | -------------------------------------------------------------------------------- /Tests/CsvBuilderTests/CsvBuilderTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CsvBuilderTests.swift 3 | // 4 | // 5 | // Created by Fumiya Tanaka on 2022/08/24. 6 | // 7 | 8 | import XCTest 9 | 10 | final class CsvBuilderTests: XCTestCase { 11 | func testExample() throws { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /docs/app_privacy_policy.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Csv2ImageApp privacy policy 9 | 10 | 11 | 12 | All of your data are never shared with others includeing developer. 13 | 14 | 15 | -------------------------------------------------------------------------------- /docs/data/documentation/csv2imgcmd/csv2imgcore.json: -------------------------------------------------------------------------------- 1 | {"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/Csv2ImgCmd\/documentation\/Csv2ImgCmd\/Csv2ImgCore"},"hierarchy":{"paths":[["doc:\/\/Csv2ImgCmd\/documentation\/Csv2ImgCmd"]]},"metadata":{"title":"Csv2ImgCore","roleHeading":"Extended Module","role":"collection","modules":[{"name":"Csv2ImgCmd"}],"externalID":"s:m:s:e:s:e:s:11Csv2ImgCore3CsvC10ExportTypeOs:14ArgumentParser013ExpressibleByA0P","symbolKind":"extension"},"schemaVersion":{"minor":3,"patch":0,"major":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/csv2imgcmd\/csv2imgcore"]}],"kind":"symbol","topicSections":[{"title":"Extended Types","generated":true,"identifiers":["doc:\/\/Csv2ImgCmd\/documentation\/Csv2ImgCmd\/Csv2ImgCore\/Csv"],"anchor":"Extended-Types"}],"references":{"doc://Csv2ImgCmd/documentation/Csv2ImgCmd":{"kind":"symbol","title":"Csv2ImgCmd","url":"\/documentation\/csv2imgcmd","identifier":"doc:\/\/Csv2ImgCmd\/documentation\/Csv2ImgCmd","type":"topic","role":"collection","abstract":[]},"doc://Csv2ImgCmd/documentation/Csv2ImgCmd/Csv2ImgCore":{"kind":"symbol","title":"Csv2ImgCore","url":"\/documentation\/csv2imgcmd\/csv2imgcore","type":"topic","identifier":"doc:\/\/Csv2ImgCmd\/documentation\/Csv2ImgCmd\/Csv2ImgCore","role":"collection","abstract":[]},"doc://Csv2ImgCmd/documentation/Csv2ImgCmd/Csv2ImgCore/Csv":{"abstract":[],"role":"symbol","navigatorTitle":[{"kind":"identifier","text":"Csv"}],"identifier":"doc:\/\/Csv2ImgCmd\/documentation\/Csv2ImgCmd\/Csv2ImgCore\/Csv","url":"\/documentation\/csv2imgcmd\/csv2imgcore\/csv","kind":"symbol","title":"Csv","type":"topic"}}} -------------------------------------------------------------------------------- /docs/developer-og-twitter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/docs/developer-og-twitter.jpg -------------------------------------------------------------------------------- /docs/developer-og.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/docs/developer-og.jpg -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/_commandname/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/_dumphelp()/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/_errorlabel/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/ascommand/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/exporttype/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/init()/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/init(from:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/input/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/inputtype/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/main()-5nphf/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/main()-60u2x/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/main(_:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/message(for:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/output/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/parse(_:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/run()/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2img/validate()/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2imgcore/csv/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/csv2imgcore/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/inputtype/!=(_:_:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/inputtype/help(for:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/inputtype/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/inputtype/local/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcmd/inputtype/network/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/anycsvexportable/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/coregraphics/cgimage/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/coregraphics/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/column/!=(_:_:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/column/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/columns/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/encoding/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/error/emptydata/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/error/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/isloading/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/progress/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/rawstring/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/row/!=(_:_:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/row/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/row/index/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/row/values/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/rows/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/separator/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csv/write(to:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/csvexportable/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/imagemakingerror/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/maker/exportable/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/maker/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/maker/set(fontsize:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfmakingerror/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfmetadata/author/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfmetadata/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfmetadata/size/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfmetadata/title/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/!=(_:_:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/a0/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/a1/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/a2/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/a3/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/a4/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/a5/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/b0/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/b1/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/b2/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/b3/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/b4/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/b5/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/encode(to:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/hash(into:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/hashvalue/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csv2imgcore/pdfsize/init(from:)/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csvbuilder/csvbuilder/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csvbuilder/csvbuildererror/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csvbuilder/csvcomposition/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csvbuilder/csvrows/column/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csvbuilder/csvrows/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/documentation/csvbuilder/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/docs/favicon.ico -------------------------------------------------------------------------------- /docs/favicon.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/img/added-icon.832a5d2c.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/img/deprecated-icon.7bf1740a.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/img/modified-icon.efb2697d.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | DocumentationThis page requires JavaScript.Please turn on JavaScript in your browser and refresh the page to view its content. -------------------------------------------------------------------------------- /docs/js/highlight-js-diff-js.4db9a783.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (self["webpackChunkswift_docc_render"]=self["webpackChunkswift_docc_render"]||[]).push([[213],{7731:function(e){function n(e){const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}e.exports=n}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-http-js.f78e83c2.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (self["webpackChunkswift_docc_render"]=self["webpackChunkswift_docc_render"]||[]).push([[878],{8937:function(e){function n(e){const n=e.regex,a="HTTP/(2|1\\.[01])",s=/[A-Za-z][A-Za-z0-9-]*/,t={className:"attribute",begin:n.concat("^",s,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},i=[t,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})",end:/$/,contains:[{className:"meta",begin:a},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:i}},{begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:i}},e.inherit(t,{relevance:0})]}}e.exports=n}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-json-js.2a1856ba.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (self["webpackChunkswift_docc_render"]=self["webpackChunkswift_docc_render"]||[]).push([[82],{14:function(e){function n(e){const n={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},c={match:/[{}[\],:]/,className:"punctuation",relevance:0},a={beginKeywords:["true","false","null"].join(" ")};return{name:"JSON",contains:[n,c,e.QUOTE_STRING_MODE,a,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}e.exports=n}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-shell-js.0ad5b20f.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (self["webpackChunkswift_docc_render"]=self["webpackChunkswift_docc_render"]||[]).push([[176],{7874:function(s){function e(s){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}s.exports=e}}]); -------------------------------------------------------------------------------- /docs/metadata.json: -------------------------------------------------------------------------------- 1 | {"bundleDisplayName":"Csv2ImgCore","bundleIdentifier":"Csv2ImgCore","schemaVersion":{"minor":1,"patch":0,"major":0}} -------------------------------------------------------------------------------- /res/app_privacy_policy.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Csv2ImageApp privacy policy 9 | 10 | 11 | 12 | All of your data are never shared with others includeing developer. 13 | 14 | 15 | -------------------------------------------------------------------------------- /res/appdmg.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Csv2Img", 3 | "icon": "icon.icns", 4 | "contents": [ 5 | { 6 | "x": 448, 7 | "y": 344, 8 | "type": "link", 9 | "path": "/Applications" 10 | }, 11 | { 12 | "x": 192, 13 | "y": 344, 14 | "type": "file", 15 | "path": "/Users/fumiyatanaka/Library/Developer/Xcode/Archives/2022-08-24/Csv2ImageApp 2022-08-24 22.46.xcarchive/Products/Applications/Csv2ImageApp.app" 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /res/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/res/icon.icns -------------------------------------------------------------------------------- /res/keynote_5_5/Keynote.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/res/keynote_5_5/Keynote.key -------------------------------------------------------------------------------- /res/keynote_6_5/Keynote.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/res/keynote_6_5/Keynote.key -------------------------------------------------------------------------------- /res/keynote_ipad/Keynote.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fummicc1/csv2img/5a4e7f1a634c7d25df5b030fa2e2ff365e8ab537/res/keynote_ipad/Keynote.key -------------------------------------------------------------------------------- /scripts/actions-local.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | current_dir=`realpath $0` 6 | cd `dirname $current_dir`/../ 7 | 8 | act -P macos-14=-self-hosted 9 | 10 | # Because xcode-setup does not work on local machine, make local flag true to skip xcode-setup 11 | export LOCAL=true 12 | 13 | act -P macos-14=-self-hosted -W ./.github/workflows/core.yml 14 | act -P macos-14=-self-hosted -W ./.github/workflows/command.yml 15 | act -P macos-14=-self-hosted -W ./.github/workflows/builder.yml 16 | -------------------------------------------------------------------------------- /scripts/format.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Format the code using swift-format 4 | swift format . --in-place --recursive -------------------------------------------------------------------------------- /scripts/generate_docs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | swift package --allow-writing-to-directory docs \ 4 | generate-documentation \ 5 | --target Csv2ImgCore --target Csv2ImgCmd --target CsvBuilder \ 6 | --disable-indexing \ 7 | --transform-for-static-hosting \ 8 | --enable-experimental-combined-documentation \ 9 | --hosting-base-path csv2img \ 10 | --output-path docs 11 | 12 | cp res/app_privacy_policy.html docs/app_privacy_policy.html --------------------------------------------------------------------------------
Please turn on JavaScript in your browser and refresh the page to view its content.