Back to directory
sparsetech avatar

pine

Functional HTML5 and XML library for the Scala platform. Read more below about its uses, features, and usage.

Clone repository

git clone https://github.com/sparsetech/pine.git

110

Stars

14

Forks

10

Watchers

Apache-2.0

License

pine

Build Status Build Status Maven Central

Pine is a functional HTML5 and XML library for the Scala platform. It supports parsing, manipulating and rendering of HTML. Pine provides type-safe bindings for HTML5 generated from MDN. Tree nodes are immutable and can be constructed from compile-time or runtime HTML/XML content. The tree may be manipulated and rendered back as HTML or as a browser node.

Features

  • Immutable and typed trees
  • Type-safe bindings, generated from MDN
  • Support for custom elements and attributes
  • HTML5 and XML parser based on recursive descent
  • Macros for compile-time HTML string/file parsing
  • Tree manipulation
  • Rendering as HTML strings
  • DSL for common operations
  • Unit and property-based tests
  • Few dependencies

JavaScript back end

  • Rendering as DOM nodes
  • Updating nodes in DOM
  • DSL for attaching/detaching events

Compatibility

Platform Platform version Scala versions
JVM 2.11 (T), 2.12 (T), 2.13 (L)
Scala.js 1.0 2.12 (T), 2.13 (L)
Scala Native 0.4.0-M2 2.11 (T)
  • (T): Typelevel Scala
  • (L): Lightbend Scala

Examples

import pine._

val url  = "http://github.com/"
val root = html"<a href=$url>GitHub</a>"

println(root.toHtml)  // <a href="http://github.com/">GitHub</a>

JavaScript

import pine.dom._
println(root.toDom)  // [object HTMLAnchorElement]

sbt

Pine makes use of a language extension called literal types, see SIP-23. For Scala 2.11 and 2.12, only Typelevel Scala implements this feature. However, it is available in Lightbend Scala from 2.13 onwards.

2.13 onwards

scalaVersion := "2.<version>"
libraryDependencies += scalaOrganization.value % "scala-reflect" % scalaVersion.value

< 2.13

scalaVersion      := "2.12.4-bin-typelevel-4"  // or "2.11.11-bin-typelevel-4"
scalaOrganization := "org.typelevel"
scalacOptions     += "-Yliteral-types"

libraryDependencies += scalaOrganization.value % "scala-reflect" % scalaVersion.value

Scala.js settings

libraryDependencies := libraryDependencies.value.filterNot(_.name == "scalajs-compiler") 
addCompilerPlugin("org.scala-js" % "scalajs-compiler" % scalaJSVersion cross CrossVersion.patch)

Scala Native settings

libraryDependencies := libraryDependencies.value.filterNot(_.name == "nscplugin")
addCompilerPlugin("org.scala-native" % "nscplugin" % nativeVersion cross CrossVersion.patch)

Dependencies

libraryDependencies += "tech.sparse" %%  "pine" % "<version>"  // JVM
libraryDependencies += "tech.sparse" %%% "pine" % "<version>"  // JavaScript, Native

Licence

Pine is licensed under the terms of the Apache v2.0 licence.

Contributors

  • Tim Nieradzik
  • Matt Hicks
  • Anatoliy Kmetyuk
  • Keven Wright

Releases

Version 0.1.7 fixes a number of bugs and improves the parsing performance. A benchmark suite was added and is now triggered as part of every CI build. This release also adds support for Scala.js 1.2.0...

Jul 18, 2019

Download .zip

This release fixes two publishing-related bugs introduced in v0.1.5. Bug fixes

Fix Scala Native build and run test cases (#58, #59) Fix Scala 2.13's JVM artefact (#60)

This release adds support for Scala 2.13. Changes

Support Scala 2.13 (#55) Drone CI: Enable Scala 2.13 build (#56) Build: Fix publishing (#57)

Contributors @kevinwright, @eed3si9n

Mar 28, 2019

Download .zip

Changes

Add support for rendering SVG nodes (#48) Add Seed build files (#51) Take list of attributes in Node.suffixIds (#54)

Jun 16, 2018

Download .zip

Migration The html macro now takes a path relative to the source file. This improves support for other build environments such as IntelliJ or Bloop (see #40). A regression in token list attributes tha...