diff --git a/.gitignore b/.gitignore index 4b4c065..120732a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ www -tests/*/actual -/bin/sitegen -node_modules +Tests/*/actual +/bin/gensite diff --git a/.tm_properties b/.tm_properties index c221498..1acefff 100644 --- a/.tm_properties +++ b/.tm_properties @@ -1,2 +1,2 @@ -exclude = "{$exclude,SiteGenerator,www,tweets,wayback,actual,node_modules}" +exclude = "{$exclude,SiteGenerator,www,tweets,wayback,actual}" include = "{$include,.gitignore}" diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 22b429c..0000000 --- a/Gemfile +++ /dev/null @@ -1,8 +0,0 @@ -source 'https://rubygems.org' - -gem 'builder', '~> 3.2' -gem 'css_parser', '~> 1.3' -gem 'htmlentities', '~> 4.3' -gem 'mustache', '~> 1.0' -gem 'nokogiri', '~> 1.10' -gem 'rdiscount', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index dbaf4c7..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,29 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) - builder (3.2.3) - css_parser (1.6.0) - addressable - htmlentities (4.3.4) - mini_portile2 (2.4.0) - mustache (1.0.5) - nokogiri (1.10.4) - mini_portile2 (~> 2.4.0) - public_suffix (3.0.1) - rdiscount (2.2.0.1) - -PLATFORMS - ruby - -DEPENDENCIES - builder (~> 3.2) - css_parser (~> 1.3) - htmlentities (~> 4.3) - mustache (~> 1.0) - nokogiri (~> 1.10) - rdiscount (~> 2.1) - -BUNDLED WITH - 1.17.1 diff --git a/Makefile b/Makefile index 15fb1d2..a1488d3 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ all: blog -blog: sitegen +blog: gensite @echo rm -rf www - ./bin/sitegen . www + ./bin/gensite . www publish: blog @echo @@ -11,17 +11,17 @@ publish: blog publish_beta: @echo - ./bin/build-sitegen + ./bin/build-gensite rm -rf www - ./bin/sitegen . www "https://beta.samhuri.net" + ./bin/gensite . www "https://beta.samhuri.net" ./bin/publish --beta --delete www/ -sitegen: +gensite: @echo - ./bin/build-sitegen + ./bin/build-gensite -test: sitegen +test: gensite @echo ./bin/test -.PHONY: blog publish publish_beta sitegen test +.PHONY: blog publish publish_beta gensite test diff --git a/Readme.md b/Readme.md index dd6b78a..32d5853 100644 --- a/Readme.md +++ b/Readme.md @@ -95,7 +95,7 @@ Execution, trying TDD for the first time: - [x] Stop using dictionaries for template contexts, use structs w/ computed properties -- [ ] Consider using Swift for samhuri.net as well, and then making SiteGenerator a package that it uses ... then we can use Plot or pointfree.co's swift-html +- [x] Consider using Swift for samhuri.net as well, and then making SiteGenerator a package that it uses ... then we can use Plot or pointfree.co's swift-html - [x] Replace remaining Ruby with Swift @@ -111,6 +111,24 @@ Execution, trying TDD for the first time: - [x] Minify JS? Now that we're keeping node, why not ... Nope! Ditched node too +- [ ] Convert to a system of packages: SiteGenerator, samhuri_net, and gensite (executable) + + - [x] Create new packages and distribute the code accordingly + + - [ ] Replace site.json with Swift code + + - [ ] Replace page template with Swift code + + - [ ] Replace projects.json with Swift code + + - [ ] Replace project templates with Swift code + + - [ ] Replace post templates with Swift code + + - [ ] Replace RSS feed template with Swift code + + - [ ] Remove stencil + - [ ] Munge relative URLs in the RSS and JSON feeds to be absolute instead - [ ] Add a server for local use and simple production setups (or use a file watcher + `python -m SimpleHTTPServer`?) diff --git a/SiteGenerator/.gitignore b/SiteGenerator/.gitignore index d3ad818..51ef6c2 100644 --- a/SiteGenerator/.gitignore +++ b/SiteGenerator/.gitignore @@ -2,4 +2,5 @@ /.build /Packages /*.xcodeproj -/.swiftpm \ No newline at end of file +/.swiftpm +xcuserdata/ diff --git a/SiteGenerator/Package.swift b/SiteGenerator/Package.swift index 2c7224b..61e8b8f 100644 --- a/SiteGenerator/Package.swift +++ b/SiteGenerator/Package.swift @@ -7,16 +7,29 @@ let package = Package( name: "SiteGenerator", platforms: [ .macOS(.v10_15), + .iOS(.v13), + ], + products: [ + // Products define the executables and libraries produced by a package, and make them visible to other packages. + .library( + name: "SiteGenerator", + targets: ["SiteGenerator"]), ], dependencies: [ .package(url: "https://github.com/johnsundell/ink.git", from: "0.1.0"), .package(url: "https://github.com/stencilproject/Stencil.git", from: "0.13.0"), ], targets: [ - .target( name: "SiteGenerator", dependencies: [ - "Ink", - "Stencil", + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages which this package depends on. + .target( + name: "SiteGenerator", + dependencies: [ + "Ink", + "Stencil", ]), - .testTarget(name: "SiteGeneratorTests", dependencies: ["SiteGenerator"]), + .testTarget( + name: "SiteGeneratorTests", + dependencies: ["SiteGenerator"]), ] ) diff --git a/SiteGenerator/Readme.md b/SiteGenerator/Readme.md index 55002ee..dc6d75e 100644 --- a/SiteGenerator/Readme.md +++ b/SiteGenerator/Readme.md @@ -1,5 +1,5 @@ # SiteGenerator -A static site generator for [samhuri.net](https://samhuri.net). +A static site generator. See https://github.com/samsonjs/samhuri.net for details. diff --git a/SiteGenerator/Sources/SiteGenerator/FunctionComposition.swift b/SiteGenerator/Sources/SiteGenerator/FunctionComposition.swift deleted file mode 100644 index 9e6b8d3..0000000 --- a/SiteGenerator/Sources/SiteGenerator/FunctionComposition.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// FunctionComposition.swift -// SiteGenerator -// -// Created by Sami Samhuri on 2019-11-18. -// - -import Foundation - -infix operator |> :AdditionPrecedence - -// MARK: Synchronous - -public func |> ( - f: @escaping (A) -> B, - g: @escaping (B) -> C -) -> (A) -> C { - return { a in - let b = f(a) - let c = g(b) - return c - } -} - -public func |> ( - f: @escaping (A) throws -> B, - g: @escaping (B) throws -> C -) -> (A) throws -> C { - return { a in - let b = try f(a) - let c = try g(b) - return c - } -} diff --git a/SiteGenerator/Sources/SiteGenerator/Renderers/MarkdownRenderer.swift b/SiteGenerator/Sources/SiteGenerator/Renderers/MarkdownRenderer.swift index a8b7976..8cfd376 100644 --- a/SiteGenerator/Sources/SiteGenerator/Renderers/MarkdownRenderer.swift +++ b/SiteGenerator/Sources/SiteGenerator/Renderers/MarkdownRenderer.swift @@ -12,6 +12,8 @@ public final class MarkdownRenderer: Renderer { let fileManager: FileManager = .default let markdownParser = MarkdownParser() + public init() {} + public func canRenderFile(named filename: String, withExtension ext: String) -> Bool { ext == "md" } diff --git a/SiteGenerator/Sources/SiteGenerator/Generator/Generator.swift b/SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift similarity index 98% rename from SiteGenerator/Sources/SiteGenerator/Generator/Generator.swift rename to SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift index 1cfaf55..9a506a3 100644 --- a/SiteGenerator/Sources/SiteGenerator/Generator/Generator.swift +++ b/SiteGenerator/Sources/SiteGenerator/SiteGenerator.swift @@ -1,5 +1,5 @@ // -// Generator.swift +// SiteGenerator.swift // SiteGenerator // // Created by Sami Samhuri on 2019-12-01. @@ -7,7 +7,7 @@ import Foundation -public final class Generator { +public final class SiteGenerator { // Dependencies let fileManager: FileManager = .default let templateRenderer: TemplateRenderer diff --git a/SiteGenerator/Sources/SiteGenerator/package-lock.json b/SiteGenerator/Sources/SiteGenerator/package-lock.json deleted file mode 100644 index 426a540..0000000 --- a/SiteGenerator/Sources/SiteGenerator/package-lock.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "name": "less-shell", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "optional": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", - "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", - "dev": true, - "optional": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "optional": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true, - "optional": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "less": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", - "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "dev": true, - "optional": true, - "requires": { - "mime-db": "1.42.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true, - "optional": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true, - "optional": true - }, - "psl": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.5.0.tgz", - "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==", - "dev": true, - "optional": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "optional": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "optional": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "optional": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - } -} diff --git a/SiteGenerator/Sources/SiteGenerator/package.json b/SiteGenerator/Sources/SiteGenerator/package.json deleted file mode 100644 index 5eae6d7..0000000 --- a/SiteGenerator/Sources/SiteGenerator/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "less-shell", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "less": "^3.10.3" - } -} diff --git a/SiteGenerator/Tests/SiteGeneratorTests/SiteGeneratorTests.swift b/SiteGenerator/Tests/SiteGeneratorTests/SiteGeneratorTests.swift index 3e76450..c2062e6 100644 --- a/SiteGenerator/Tests/SiteGeneratorTests/SiteGeneratorTests.swift +++ b/SiteGenerator/Tests/SiteGeneratorTests/SiteGeneratorTests.swift @@ -1,5 +1,5 @@ import XCTest -import class Foundation.Bundle +@testable import SiteGenerator final class SiteGeneratorTests: XCTestCase { func testExample() throws { diff --git a/bin/build-gensite b/bin/build-gensite new file mode 100755 index 0000000..94259b6 --- /dev/null +++ b/bin/build-gensite @@ -0,0 +1,6 @@ +#!/bin/bash + +pushd "gensite" >/dev/null +swift build +cp .build/x86_64-apple-macosx/debug/gensite ../bin/gensite +popd >/dev/null diff --git a/bin/build-sitegen b/bin/build-sitegen deleted file mode 100755 index 239bdfc..0000000 --- a/bin/build-sitegen +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -pushd "SiteGenerator" >/dev/null -swift build -cp .build/x86_64-apple-macosx/debug/SiteGenerator ../bin/sitegen -popd >/dev/null diff --git a/bin/sitegen b/bin/sitegen new file mode 100755 index 0000000..62d44e2 Binary files /dev/null and b/bin/sitegen differ diff --git a/bin/test b/bin/test index 96b8707..87779b8 100755 --- a/bin/test +++ b/bin/test @@ -3,7 +3,7 @@ set -e for site in Tests/test-*; do - bin/sitegen "$site/in" "$site/actual" + bin/gensite "$site/in" "$site/actual" diff -bru "$site/expected" "$site/actual" rm -r "$site/actual" done diff --git a/gensite/.gitignore b/gensite/.gitignore new file mode 100644 index 0000000..504eed0 --- /dev/null +++ b/gensite/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +/.swiftpm diff --git a/gensite/Package.resolved b/gensite/Package.resolved new file mode 100644 index 0000000..dd6c068 --- /dev/null +++ b/gensite/Package.resolved @@ -0,0 +1,43 @@ +{ + "object": { + "pins": [ + { + "package": "Ink", + "repositoryURL": "https://github.com/johnsundell/ink.git", + "state": { + "branch": null, + "revision": "c88bbce588a1ebfde2cf4d61eb9865a3edaa27d4", + "version": "0.2.0" + } + }, + { + "package": "PathKit", + "repositoryURL": "https://github.com/kylef/PathKit.git", + "state": { + "branch": null, + "revision": "e2f5be30e4c8f531c9c1e8765aa7b71c0a45d7a0", + "version": "0.9.2" + } + }, + { + "package": "Spectre", + "repositoryURL": "https://github.com/kylef/Spectre.git", + "state": { + "branch": null, + "revision": "f14ff47f45642aa5703900980b014c2e9394b6e5", + "version": "0.9.0" + } + }, + { + "package": "Stencil", + "repositoryURL": "https://github.com/stencilproject/Stencil.git", + "state": { + "branch": null, + "revision": "0e9a78d6584e3812cd9c09494d5c7b483e8f533c", + "version": "0.13.1" + } + } + ] + }, + "version": 1 +} diff --git a/gensite/Package.swift b/gensite/Package.swift new file mode 100644 index 0000000..5a546b3 --- /dev/null +++ b/gensite/Package.swift @@ -0,0 +1,21 @@ +// swift-tools-version:5.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "gensite", + platforms: [ + .macOS(.v10_15), + .iOS(.v13), + ], + dependencies: [ + .package(path: "../samhuri_net"), + ], + targets: [ + .target( name: "gensite", dependencies: [ + "samhuri_net", + ]), + .testTarget(name: "gensiteTests", dependencies: ["gensite"]), + ] +) diff --git a/gensite/Readme.md b/gensite/Readme.md new file mode 100644 index 0000000..3e98529 --- /dev/null +++ b/gensite/Readme.md @@ -0,0 +1,5 @@ +# gensite + +A binary to build [samhuri.net](https://samhuri.net) using SiteGenerator. + +See https://github.com/samsonjs/samhuri.net for details. diff --git a/SiteGenerator/Sources/SiteGenerator/main.swift b/gensite/Sources/gensite/main.swift similarity index 87% rename from SiteGenerator/Sources/SiteGenerator/main.swift rename to gensite/Sources/gensite/main.swift index 57e13dd..ebcd450 100644 --- a/SiteGenerator/Sources/SiteGenerator/main.swift +++ b/gensite/Sources/gensite/main.swift @@ -1,22 +1,19 @@ // // main.swift -// SiteGenerator +// gensite // // Created by Sami Samhuri on 2019-12-01. // import Darwin import Foundation +import samhuri_net func main(sourcePath: String, targetPath: String, siteURLOverride: URL?) throws { let sourceURL = URL(fileURLWithPath: sourcePath) let targetURL = URL(fileURLWithPath: targetPath) - let generator = try Generator( - sourceURL: sourceURL, - siteURLOverride: siteURLOverride, - renderers: [MarkdownRenderer()] - ) - try generator.generate(targetURL: targetURL) + let site = samhuri_net() + try site.generate(sourceURL: sourceURL, targetURL: targetURL, siteURLOverride: siteURLOverride) } guard CommandLine.arguments.count >= 3 else { diff --git a/gensite/Tests/LinuxMain.swift b/gensite/Tests/LinuxMain.swift new file mode 100644 index 0000000..48a7d0a --- /dev/null +++ b/gensite/Tests/LinuxMain.swift @@ -0,0 +1,7 @@ +import XCTest + +import gensiteTests + +var tests = [XCTestCaseEntry]() +tests += gensiteTests.allTests() +XCTMain(tests) diff --git a/gensite/Tests/gensiteTests/XCTestManifests.swift b/gensite/Tests/gensiteTests/XCTestManifests.swift new file mode 100644 index 0000000..56a0cb7 --- /dev/null +++ b/gensite/Tests/gensiteTests/XCTestManifests.swift @@ -0,0 +1,9 @@ +import XCTest + +#if !canImport(ObjectiveC) +public func allTests() -> [XCTestCaseEntry] { + return [ + testCase(gensiteTests.allTests), + ] +} +#endif diff --git a/gensite/Tests/gensiteTests/gensiteTests.swift b/gensite/Tests/gensiteTests/gensiteTests.swift new file mode 100644 index 0000000..08d2144 --- /dev/null +++ b/gensite/Tests/gensiteTests/gensiteTests.swift @@ -0,0 +1,6 @@ +import XCTest +import class Foundation.Bundle + +final class gensiteTests: XCTestCase { + static var allTests = [(String, XCTestCase)]() +} diff --git a/public/version.txt b/public/version.txt deleted file mode 100644 index 49915b3..0000000 --- a/public/version.txt +++ /dev/null @@ -1 +0,0 @@ -890b1508c132cd5ee5db1c28e9dced538b504d96 diff --git a/samhuri_net/.gitignore b/samhuri_net/.gitignore new file mode 100644 index 0000000..51ef6c2 --- /dev/null +++ b/samhuri_net/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +/.swiftpm +xcuserdata/ diff --git a/samhuri_net/Package.resolved b/samhuri_net/Package.resolved new file mode 100644 index 0000000..dd6c068 --- /dev/null +++ b/samhuri_net/Package.resolved @@ -0,0 +1,43 @@ +{ + "object": { + "pins": [ + { + "package": "Ink", + "repositoryURL": "https://github.com/johnsundell/ink.git", + "state": { + "branch": null, + "revision": "c88bbce588a1ebfde2cf4d61eb9865a3edaa27d4", + "version": "0.2.0" + } + }, + { + "package": "PathKit", + "repositoryURL": "https://github.com/kylef/PathKit.git", + "state": { + "branch": null, + "revision": "e2f5be30e4c8f531c9c1e8765aa7b71c0a45d7a0", + "version": "0.9.2" + } + }, + { + "package": "Spectre", + "repositoryURL": "https://github.com/kylef/Spectre.git", + "state": { + "branch": null, + "revision": "f14ff47f45642aa5703900980b014c2e9394b6e5", + "version": "0.9.0" + } + }, + { + "package": "Stencil", + "repositoryURL": "https://github.com/stencilproject/Stencil.git", + "state": { + "branch": null, + "revision": "0e9a78d6584e3812cd9c09494d5c7b483e8f533c", + "version": "0.13.1" + } + } + ] + }, + "version": 1 +} diff --git a/samhuri_net/Package.swift b/samhuri_net/Package.swift new file mode 100644 index 0000000..fc42f39 --- /dev/null +++ b/samhuri_net/Package.swift @@ -0,0 +1,33 @@ +// swift-tools-version:5.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "samhuri_net", + platforms: [ + .macOS(.v10_15), + .iOS(.v13), + ], + products: [ + // Products define the executables and libraries produced by a package, and make them visible to other packages. + .library( + name: "samhuri_net", + targets: ["samhuri_net"]), + ], + dependencies: [ + .package(path: "../SiteGenerator"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages which this package depends on. + .target( + name: "samhuri_net", + dependencies: [ + "SiteGenerator", + ]), + .testTarget( + name: "samhuri_netTests", + dependencies: ["samhuri_net"]), + ] +) diff --git a/samhuri_net/README.md b/samhuri_net/README.md new file mode 100644 index 0000000..847e00a --- /dev/null +++ b/samhuri_net/README.md @@ -0,0 +1,5 @@ +# samhuri.net + +A static site generator for [samhuri.net](https://samhuri.net) using SiteGenerator. + +See https://github.com/samsonjs/samhuri.net for details. diff --git a/samhuri_net/Sources/samhuri_net/samhuri_net.swift b/samhuri_net/Sources/samhuri_net/samhuri_net.swift new file mode 100644 index 0000000..e8d594b --- /dev/null +++ b/samhuri_net/Sources/samhuri_net/samhuri_net.swift @@ -0,0 +1,15 @@ +import Foundation +import SiteGenerator + +public struct samhuri_net { + public init() {} + + public func generate(sourceURL: URL, targetURL: URL, siteURLOverride: URL? = nil) throws { + let generator = try SiteGenerator( + sourceURL: sourceURL, + siteURLOverride: siteURLOverride, + renderers: [MarkdownRenderer()] + ) + try generator.generate(targetURL: targetURL) + } +} diff --git a/samhuri_net/Tests/LinuxMain.swift b/samhuri_net/Tests/LinuxMain.swift new file mode 100644 index 0000000..086b32d --- /dev/null +++ b/samhuri_net/Tests/LinuxMain.swift @@ -0,0 +1,7 @@ +import XCTest + +import samhuri_netTests + +var tests = [XCTestCaseEntry]() +tests += samhuri_netTests.allTests() +XCTMain(tests) diff --git a/samhuri_net/Tests/samhuri_netTests/XCTestManifests.swift b/samhuri_net/Tests/samhuri_netTests/XCTestManifests.swift new file mode 100644 index 0000000..a258601 --- /dev/null +++ b/samhuri_net/Tests/samhuri_netTests/XCTestManifests.swift @@ -0,0 +1,9 @@ +import XCTest + +#if !canImport(ObjectiveC) +public func allTests() -> [XCTestCaseEntry] { + return [ + testCase(samhuri_netTests.allTests), + ] +} +#endif diff --git a/samhuri_net/Tests/samhuri_netTests/samhuri_netTests.swift b/samhuri_net/Tests/samhuri_netTests/samhuri_netTests.swift new file mode 100644 index 0000000..f684de9 --- /dev/null +++ b/samhuri_net/Tests/samhuri_netTests/samhuri_netTests.swift @@ -0,0 +1,15 @@ +import XCTest +@testable import samhuri_net + +final class samhuri_netTests: XCTestCase { + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(samhuri_net().text, "Hello, World!") + } + + static var allTests = [ + ("testExample", testExample), + ] +}