trait BuilderContext[E <: Element] extends AnyRef
Provides the basic building blocks for Laika's Directive API.
This trait is not used directly, but instead its three sub-traits Blocks
, Spans
and Templates
,
which represent the concrete implementations for the three directive types.
- Alphabetic
- By Inheritance
- BuilderContext
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
sealed
trait
BodyContent extends AnyRef
The content of a directive part, either an attribute or the body.
-
trait
Combinators extends AnyRef
Provides combinators to describe the expected structure of a specific directive.
-
class
Directive extends AnyRef
Represents a directive, its name and its (combined) parts.
-
case class
DirectiveContent(attributes: Config, body: Option[BodyContent]) extends Product with Serializable
The content of a parsed directive with the HOCON attributes captured in a
Config
instance. -
case class
DirectiveContext(content: DirectiveContent, parser: Parser, cursor: DocumentCursor, source: SourceFragment) extends Product with Serializable
The context of a directive during execution.
-
abstract
class
DirectivePart[+A] extends (DirectiveContext) ⇒ Result[A]
Represents a single part (attribute or body) of a directive or a combination of multiple parts.
-
case class
Multipart[T](mainBody: Seq[E], children: Seq[T]) extends Product with Serializable
The content of a body element divided by separator directives.
-
abstract
type
Parser
The parser API in case a directive function needs to manually parse one of the directive parts.
- type Result[+A] = Either[Seq[String], A]
-
class
SeparatorDirective[+T] extends AnyRef
Represents a separator directive, its name and its (combined) parts.
Represents a separator directive, its name and its (combined) parts. It also allows to specify requirements for the minimum and maximum number of occurrences allowed for this directive. The default is unbounded, with 0 or more instances allowed.
Abstract Value Members
-
abstract
def
parse(parser: Parser, src: SourceFragment): Result[Seq[E]]
- Attributes
- protected
Concrete Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native() @HotSpotIntrinsicCandidate()
-
def
create(name: String)(part: DirectivePart[E]): Directive
Creates a new directive with the specified name and part specification.
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
eval(name: String)(part: DirectivePart[Either[String, E]]): Directive
Creates a new directive with the specified name and part specification.
Creates a new directive with the specified name and part specification.
When the result of the directive is a
Left
, the directive will produce an invalid AST element with the string as the error message. -
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @HotSpotIntrinsicCandidate()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @HotSpotIntrinsicCandidate()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @HotSpotIntrinsicCandidate()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @HotSpotIntrinsicCandidate()
-
def
separator[T](name: String, min: Int = 0, max: Int = Int.MaxValue)(part: DirectivePart[T]): SeparatorDirective[T]
Creates a new separator directive with the specified name and part specification.
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toMap(directives: Iterable[Directive]): Map[String, Directive]
Turns a collection of directives into a map, using the name of the directive as the key.
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- object BodyContent
- object DirectivePart
-
object
dsl extends Combinators
Provides the basic building blocks for defining directives, Laika's extension mechanism for creating custom tags for both, templates or text markup.
Provides the basic building blocks for defining directives, Laika's extension mechanism for creating custom tags for both, templates or text markup.
This object is used as part of the concrete objects
Blocks.dsl
,Spans.dsl
andTemplates.dsl
respectively.It contains several simple combinators that allow to specify the expected attributes and body elements of the directive, optional converters for these elements and the function responsible for producing the final node element.
In contrast to custom tag hooks in other template engines the result of a directive is not a string. In the same way as markup documents get transformed into a tree of elements before rendering, a directive produces a node of the tree to render. As a result, the directive can be used independent from the output format.
Entry points of the API are the
Templates
,Blocks
andSpans
objects for the three different directive types.A directive may consist of any combination of attributes and body elements:
@:myDirective { arg1 = value1, arg2 = value2 } This is the body of the directive. It may consist of any standard or custom block-level and inline markup. @:@
In the example above
arg1
andarg2
are attributes, followed by a body element enclosed in curly braces.For each of these directive elements, the API offers a combinator to specify whether the element is required or optional, and an optional function to convert.
Consider the following simple example of a directive with just one argument and a body, for specifying a specially formatted inline note:
@:note { This is the title } This is the body of the note. @:@
The implementation of this directive could look like this:
case class Note (title: String, content: Seq[Block], options: Options = NoOpt) extends Block with BlockContainer[Note] object MyDirectives extends DirectiveRegistry { val blockDirectives = Seq( Blocks.create("note") { (defaultAttribute.as[String], parsedBody).mapN(Note(_,_)) } ) val spanDirectives = Seq() } val transformer = Transformer.from(Markdown).to(HTML).using(MyDirectives)
The
defaultAttribute
combinator specifies a required attribute of typeString
and without a name. TheparsedBody
combinator specifies standard block content (any block elements that are supported in normal markup, too) which results in a parsed value of typeSeq[Block]
.Finally you need to provide a function that accepts the results of the specified directive elements as parameters (of the corresponding type). Here we created a case class with a matching signature so can pass it directly as the target function. For a block directive the final result has to be of type
Block
which theNote
class satisfies. Finally the directive gets registered with theMarkdown
parser. It can be registered for areStructuredText
parser, too, without any changes.If any conversion of attributes is required it can be performed with the
as[T]
method:case class Message (severity: Int, content: Seq[Block], options: Options = NoOpt) extends Block with BlockContainer[Message] val blockDirectives = Seq( Blocks.create("message") { (defaultAttribute.as[Int], blockContent).mapN(Message(_,_)) } )
In the example above the built-in
Int
decoder gets passed to thedefaultAttribute
combinator, but you can easily create and use your own instances ofConfigDecoder[T]
.If required attributes or bodies are missing or any type conversion fails, an instance of
InvalidBlock
containing the error message and the raw source of the directive will be inserted into the document tree. In this case the final function (Message
) will never be invoked.Finally attributes can also be optional. In case they are missing, the directive is still considered valid and
None
will be passed to your function:case class Message (severity: Int, content: Seq[Block], options: Options = NoOpt) extends Block with BlockContainer[Message] val blockDirectives = Seq( Blocks.create("message") { (defaultAttribute.as[Int].optional, blockContent).mapN { (severity, content) => Message(severity.getOrElse(0), content) } } )
The attribute may be missing, but if it is present it has to pass the specified validator.
Deprecated Value Members
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] ) @Deprecated
- Deprecated