diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f17d392 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + test: + name: Swift tests and smoke tests + runs-on: macos-15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Show Swift version + run: swift --version + + - name: Run unit tests + run: swift test + + - name: Run CLI smoke tests + run: Scripts/smoke-test.sh diff --git a/README.md b/README.md index 8d25c3d..ce98068 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,17 @@ print(document.markdown) swift run swift-markitdown path/to/file.html ``` +## Testing + +Run the unit test suite and CLI fixture smoke tests before opening a PR: + +```bash +swift test +Scripts/smoke-test.sh +``` + +GitHub Actions runs the same checks on pushes to `main`, pull requests, and manual workflow dispatches. + ## Roadmap 1. Expand the text/HTML/CSV/JSON converters with richer Markdown normalization and metadata extraction. diff --git a/Scripts/smoke-test.sh b/Scripts/smoke-test.sh new file mode 100755 index 0000000..3ca42e4 --- /dev/null +++ b/Scripts/smoke-test.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BINARY="${ROOT_DIR}/.build/debug/swift-markitdown" + +swift build --package-path "${ROOT_DIR}" --product swift-markitdown + +run_case() { + local name="$1" + local input="${ROOT_DIR}/Tests/Fixtures/${name}" + local expected="${ROOT_DIR}/Tests/Expected/${name%.*}.md" + local actual + actual="$(mktemp)" + + "${BINARY}" "${input}" > "${actual}" + + if ! diff -u "${expected}" "${actual}"; then + echo "Smoke test failed for ${name}" >&2 + rm -f "${actual}" + return 1 + fi + + rm -f "${actual}" + echo "✓ ${name}" +} + +run_case note.txt +run_case page.html +run_case table.csv +run_case data.json diff --git a/Sources/SwiftMarkItDown/Converters/HTMLConverter.swift b/Sources/SwiftMarkItDown/Converters/HTMLConverter.swift index 9b21554..75bfeab 100644 --- a/Sources/SwiftMarkItDown/Converters/HTMLConverter.swift +++ b/Sources/SwiftMarkItDown/Converters/HTMLConverter.swift @@ -10,6 +10,7 @@ public struct HTMLConverter: DocumentConverter { html = html.replacingOccurrences(of: "\r\n", with: "\n") let rules: [(String, String)] = [ + ("(?is)
]*>.*?", ""), ("(?is)", ""), ("(?is)", ""), ("(?is)Hello native Swift & Markdown.
+ + + diff --git a/Tests/Fixtures/table.csv b/Tests/Fixtures/table.csv new file mode 100644 index 0000000..e6f07dd --- /dev/null +++ b/Tests/Fixtures/table.csv @@ -0,0 +1,3 @@ +Name,Note +Swift,Native +"Mark, It Down","CSV | escaped" diff --git a/Tests/SwiftMarkItDownTests/SwiftMarkItDownTests.swift b/Tests/SwiftMarkItDownTests/SwiftMarkItDownTests.swift index ca33aa5..fec71d2 100644 --- a/Tests/SwiftMarkItDownTests/SwiftMarkItDownTests.swift +++ b/Tests/SwiftMarkItDownTests/SwiftMarkItDownTests.swift @@ -20,7 +20,7 @@ struct SwiftMarkItDownTests { @Test("converts simple HTML to Markdown") func convertsHTML() throws { - let html = "Hello Swift & iOS.
Link" + let html = "Hello Swift & iOS.
Link" let request = ConversionRequest(data: Data(html.utf8), fileName: "index.html") let document = try MarkItDown().convert(request) #expect(document.markdown == "# Title\nHello **Swift** & iOS.\n\n[Link](https://example.com)")