Swiftpack.co - Package - SwiftDocOrg/Markup

Markup

CI Documentation

A Swift package for working with HTML, XML, and other markup languages, based on libxml2.

This project is under active development and is not ready for production use.

Features

  • ☑ XML Support
  • ☑ XHTML4 Support
  • ☑ XPath Expression Evaluation
  • ☐ HTML5 Support (using Gumbo)
  • ☐ CSS Selector to XPath Functionality*
  • ☐ XML Namespace Support*
  • ☐ DTD and Relax-NG Validation*
  • ☐ XInclude Support*
  • ☐ XSLT Support*
  • ☐ SAX Parser Interface*
  • ☐ HTML and XML Function Builder Interfaces*

* Coming soon!

Requirements

  • Swift 5.1+
  • libxml2 (except for macOS with Xcode 11.4 or later)

Usage

XML

Parsing & Introspection

import XML

let xml = #"""
<?xml version="1.0" encoding="UTF-8"?>
<!-- begin greeting -->
<greeting>Hello!</greeting>
<!-- end greeting -->
"""#

let document = try XML.Document(string: xml)!
document.root?.name // "greeting"
document.root?.content // "Hello!"

document.children.count // 3 (two comment nodes and one element node)
document.root?.children.count // 1 (one text node)

Searching and XPath Expression Evaluation

document.search("//greeting").count // 1
document.evaluate("//greeting/text()") // .string("Hello!")

Modification

for case let comment as Comment in document.children {
    comment.remove()
}

document.root?.name = "valediction"
document.root?["lang"] = "it"
document.root?.content = "Arrivederci!"

document.description // =>
/*
<?xml version="1.0" encoding="UTF-8"?>
<valediction lang="it">Arrivederci!</valediction>

*/

HTML

Parsing & Introspection

import HTML

let html = #"""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Welcome</title>
</head>
<body>
    <p>Hello, world!</p>
</body>
</html>
"""#

let document = try HTML.Document(string: html)!
document.body?.children.count // 1 (one element node)
document.body?.children.first?.name // "p"
document.body?.children.first?.text // "Hello, world!"

Searching and XPath Expression Evaluation

document.search("/body/p").count // 1
document.search("/body/p").first?.xpath // "/body/p[0]"
document.evaluate("/body/p/text()") // .string("Hello, world!")

Creation and Modification

let div = Element(name: "div")
div["class"] = "wrapper"
if let p = document.search("/body/p").first {
    p.wrap(inside: div)
}

document.body?.description // =>
/*
<div class="wrapper">
    <p>Hello, world!</p>
</div>
*/

Installation

Swift Package Manager

If you're on Linux or if you're on macOS and using Xcode < 11.4, install the libxml2 system library:

# macOS for Xcode 11.3 and earlier
$ brew install libxml2
$ brew link --force libxml2

# Linux (Ubuntu)
$ sudo apt-get install libxml2-dev

Add the Markup package to your target dependencies in Package.swift:

import PackageDescription

let package = Package(
  name: "YourProject",
  dependencies: [
    .package(
        url: "https://github.com/SwiftDocOrg/Markup",
        from: "0.0.1"
    ),
  ]
)

Add Markup as a dependency to your target(s):

targets: [
.target(
    name: "YourTarget",
    dependencies: ["Markup"]),

License

MIT

Contact

Mattt (@mattt)

Github

link
Stars: 92

Dependencies

Used By

Total: 0