Asciidoctor 1.5.0 “Bleeding Heart” released!
by
and -The long-awaited release of Asciidoctor 1.5.0 “Bleeding Heart” has arrived at last! This release includes a stockpile of 150 fixes, improvements and enhancements as well as several refinements to the AsciiDoc syntax. We’re confident you’re going to love writing with Asciidoctor more than ever before.
Asciidoctor 1.5.0 is the sequel to 0.1.4. We shifted the numbers to adopt a semantic versioning scheme and communicate that this release is well beyond stable.
Please take note!
Before you upgrade to Asciidoctor 1.5.0, it’s important to know we’ve introduced some changes to the AsciiDoc syntax that aren’t backward compatible. Don’t panic, though! We also introduced a compatibility mode.
Refer to the migration guide for information about the affected syntax and how to migrate (or prepare to migrate) your content. By making these syntax changes, we’re working to make AsciiDoc more consistent and easier to learn.
Milestones & momentum
We closed 150 issues during the Asciidoctor 1.5.0 development cycle. At the time of the last release, we announced that Asciidoctor had reached 50,000 downloads from RubyGems.org. This time around, we didn’t just double the download count, we quadrupled it! Asciidoctor has now been downloaded more than 225,000 times at the time of this release!
It’s not the download count of which we’re most proud. It’s the community of awesome people . There are now over 50 contributors in the Asciidoctor ecosystem, and this release alone has received participation from nearly every person in this group! If you haven’t had a chance to participate in Asciidoctor, there’s never been a better time to join in.
Here’s a summary of the milestones we’ve crossed:
-
150 issues closed in 1.5.0
-
50 total contributors
-
225,000 total downloads
-
1,800 total commits
-
1,500 tests
-
1000 total issues (including pull requests)
-
800 issues closed in total (including pull requests)
-
400 mailing list topics
-
2 years of development (initial commit Jun 1, 2012)
This wouldn’t be an Asciidoctor release announcement without discussing the speed of the processor. The 1.5.0 release brings another 10% improvement in speed over the previous version. To give you a picture of how fast it is now, the Spring Framework Reference Guide, weighing in at 50,000+ lines, renders to HTML in 1.15 seconds on an Asus ZenBook UX301LA using Ruby 2.1.
Asciidoctor is now in use by even more open source projects, including Groovy, Griffon, GroovyFX, Infinispan, Weld, Hibernate OGM, Spring Data and git-scm.com. It’s also used to produce NFJS, the Magazine. Best of all, Sarah has been hard at work filling in Asciidoctor’s own user manual and helping teams understand how to write better documentation.
In case you didn’t notice, the Asciidoctor project is on . On that note, let’s get to what’s in this new release!
Release highlights
Get technical with MathJax
If you need to get technical in your writing, Asciidoctor integrates with MathJax to allow you to write TeX / LaTeX or AsciiMath expressions directly in your document.
Diagrams, diagrams, diagrams
You can add even more visual elements to your document with diagrams conjured from plain text. Asciidoctor Diagram emerged from a request to port the PlantUML extension for AsciiDoc Python to Asciidoctor. Pepijn Van Eeckhoudt (@pepijnve) took the reins and created a comprehensive diagram extension that not only adds integration with PlantUML, but three additional diagramming tools, as well as a framework for adding more in the future.
Asciidoctor Diagram 1.5.0 now supports the following diagramming tools:
See the Asciidoctor Diagram guide to learn how to create diagrams from ASCII art in your AsciiDoc documents.
Curious how to load extensions like Asciidoctor Diagram from the commandline interface? Read on.
Load extensions from the CLI
Asciidoctor introduced an extensions API in 0.1.4 that enables you to extend the AsciiDoc syntax and tap into the lifecycle of the processor. However, it was only possible to load these extensions when invoking Asciidoctor via the API or by creating a custom launch script.
The asciidoctor
command now supports the -r
and -I
flags (ported from the ruby
command) to require additional paths or modify the load path, respectively.
Here’s an example of how to use the -r
flag to enable the Asciidoctor Diagram extension:
$ asciidoctor -r asciidoctor-diagram sample.adoc
The -r
flag also accepts absolute or relative paths and can be used multiple times.
$ asciidoctor -r ./my-extension-a.rb -r ./my-extension-b.rb sample.adoc
The scripts referenced by the -r
flag are loaded in the order they are listed before any other processing occurs.
Now you get the full power of the asciidoctor
command plus extensions!
Embracing DocBook 5
The DocBook 5 specification was finalized in 2008. It’s time we embrace it.
DocBook 5 is now the default output when you use the docbook
backend.
If you still need to produce DocBook 4.5, use the docbook45
backend.
Making XML parsers happy
HTML5 reintroduced flexible HTML syntax that’s only loosely based on SGML…and most certainly not XML. This decision makes HTML5 more approachable. However, it makes XML parsers .
To accommodate tools that use XML parsers to read the generated HTML, Asciidoctor can now output the XHTML variant of HTML5, known as XHTML5.
To output XHTML5 instead of HTML5, set the backend to xhtml
or, to be more explicit, xhtml5
.
The “x” at the beginning of the name cleverly tells Asciidoctor to close short tags, assign values to boolean attributes and add the xmlns
attribute to the root element.
Trust us, your XML parser will thank you.
PDF and EPUB3
Asciidoctor can now convert directly from AsciiDoc to PDF and EPUB3, using Asciidoctor PDF and Asciidoctor EPUB3, respectively. These converters are hosted in their own repositories and are distributed as separate gems.
The converters are currently alpha, but still very functional.
Asciidoctor.js is Asciidoctor
Guillaume Grossetie (@mogztter) led the effort during the 1.5.0 development cycle to align the Asciidoctor.js code base with Asciidoctor core. After a lot of fiddling and Opal patches, Asciidoctor.js now builds directly against master and the Asciidoctor 1.5.0 release. That means that for the first time, Asciidoctor.js is Asciidoctor.
Anthonny Quérouil (@anthonny) followed up by developing a Grunt build script to bundle Asciidoctor.js and publish it to npm (the Node.js package manager) and Bower (the web package manager).
Guillaume is the creator of the AsciiDoc preview for Chrome and Anthonny the creator of the AsciiDoc preview for Atom. The AsciiDoc preview for Atom complements the AsciiDoc language definition kicked off by Anton Moiseev (@antonmoiseev). Thomas Kern (@nerk) was quick to follow up with an AsciiDoc plugin for Brackets based on the aforementioned work. We also invited the veteran project of Asciidoctor.js, DocGist, into the Asciidoctor organization. DocGist was created by Anders Nawroth (@nawroth). Guillaume, Anthonny, Anders, Thomas, Anton and others have been collaborating on tooling based on Asciidoctor.js. They’re helping Asciidoctor boldly go where no AsciiDoc implementation has gone before.
The alignment of Asciidoctor.js with Asciidoctor core was a major effort. I want to sincerely thank Guillaume, Anthonny and the Opal team (Adam Beynon, meh and Elia Schito) for making this happen.
AsciiDoc syntax shuffle
The single quote ('
) and the backtick (`
) are two markup characters in the AsciiDoc syntax that often give people trouble.
They like to get in each other’s way.
We decided to shuffle some of the AsciiDoc syntax to address this problem and, in general, make it more consistent and easy to learn.
Not only do these changes reduce slip ups by the parser, they also strengthen the meaning of the plus character and bring more alignment with Markdown by making the backtick the primary character for monospace formatting.
Migrating with compat-mode
Before introducing what’s changed, we want to emphasize that you can forgo the italic, monospace and passthrough syntax changes by setting the compat-mode
attribute, shown here defined in the document header:
:compat-mode:
or by using a two-line document title:
Document Title ==============
Compat mode is used to enable legacy syntax when the new syntax deviates from it. See the migration guide for more information about migrating your AsciiDoc documents and the transitional syntax that’s available.
“+” means passthrough
The +
character in the original AsciiDoc syntax is not used consistently.
Single plus (+
) and double plus (++
) are used to format text as monospace, whereas triple plus (+++
) and quadruple plus (++++
) are used to escape text from processing.
We made AsciiDoc more intuitive and easier to teach by always using +
as a passthrough formatting mark.
Instead of using the single plus and double plus for monospaced formatting, we’ve made them constrained and unconstrained literals (i.e., “render it as it looks”), respectively.
For example:
+_bar_+ becomes _bar_ foo++_bar_++ becomes foo_bar_
We haven’t yet mentioned how to format text as monospace. For that, we’ll put the backtick back into play.
Markdown-style monospace
Authors who are familiar with Markdown are accustomed to using the backtick (`
) to format text as monospace.
We’ve embraced this convention in Asciidoctor.
Using backtick characters around text now means the text should be formatted as monospace only. The backtick characters do not add passthrough semantics, as they did before. In most cases, the passthrough semantics aren’t necessary, so using the backticks for monospaced formatting is sufficient.
`literal` becomes literal (in monospace) `{backend}` becomes html5 (in monospace) a``||``b becomes a||b (where || is monospace)
If you want to prevent substitutions in the monospaced text, just remember, “plus for passthrough”:
`+{backend}+` becomes {backend} (in monospace)
By not mixing monospace formatting with passthrough (literal) semantics, we are deviating slightly from the behavior of backticks in Markdown. However, that’s because AsciiDoc has additional features, such as attribute references, that we want to be able to leverage when formatting text as monospace.
There will be a period of time during which you’ll have to process your document with both Asciidoctor 0.1.4 and 1.5.0 (mostly while we wait on GitHub to upgrade). We’ve added special logic in the processor to handle a hybrid syntax to use in the interim. Please refer to the migration guide for details.
Smarter “smart” quotes
Legacy AsciiDoc also uses the backtick character for making curved quotes. Because the syntax was so similar to that of monospaced literal text, it often matched in unexpected ways. We’ve made the smart quotes syntax…smarter.
In Asciidoctor 1.5.0, the backtick acts as a modifier on a quote to indicate it should be curved. You now place the backtick inside the quote character, adjacent to the quoted phrase, to make it “smart”.
Dig through a copy of '`The Times`' and you're bound to see a lot of "`smart`" quotes.
This change brings the backtick closer in proximity to the quote and thus makes parsing more deterministic. See the user manual for more curved quote and apostrophe examples.
Quote means quote
Single quotes around a phrase are now left alone unless you’re running Asciidoctor in compat mode.
AsciiDoc traditionally supported single quotes as an alternate syntax for marking a phrase as italic. However, single quotes around a phrase already have a very well-defined meaning in Western languages. Making them something they aren’t just isn’t a good idea. We never recommended them for this purpose anyway. Furthermore, they conflict with the new curved quote syntax, so they had to go.
Refer to the migration guide to help ensure a smooth transition to the new syntax.
Level your offsets
The leveloffset
attribute is used to shift the level of sections when combining documents.
It works great for a single include level, but as Groovy developers Cédric and Guillaume discovered, it quickly breaks down when you get into multiple levels of nesting.
The problem is that the level offset value is assumed to be absolute. Asciidoctor now supports relative level offset values using a leading + or - operator.
:leveloffset: +1 include::chapter-01.adoc[] :leveloffset: -1
Alternatively, you can specify the leveloffset
attribute directly on the include directive so you don’t have to worry about restoring the old value.
include::chapter-01.adoc[leveloffset=+1]
Filtered tag directives
The Groovy developers use the include and tag directives a lot. They discovered that tag directives within a broader tagged range get carried over into the document. Asciidoctor now drops these lines so you can nest fine-grained ranges within broader ranges.
The tag directives are also searched using a more strict match to avoid false matches.
Substitution modifiers
When you needed to customize the substitutions on a block, you used to have to list out all the substitutions you wanted to enable.
It’s now possible to add or remove substitutions to the default substitution set using the +
and -
modifiers (e.g., [subs=+quotes]
).
That should save a lot of unnecessary typing!
Secure assets
Serving assets over SSL is a best practice to avoid man-in-the-middle attacks and preying eyes in general.
All remote assets referenced out of the box in Asciidoctor, such as Font Awesome, are now served over SSL from https://cdnjs.cloudflare.com and https://fonts.googleapis.com.
Hide the URI scheme
Asciidoctor auto-detects and auto-links URLs. Writers often don’t take advantage of this feature because the link shows the URI scheme prefix (e.g., http://). So, they end up long-handing it for the sole purpose of hiding the prefix.
https://asciidoctor.org[asciidoctor.org]
Now, Asciidoctor can produce the exact same result if you set the hide-uri-scheme
attribute on the document.
:hide-uri-scheme: https://asciidoctor.org
Human-friendly cross references
If you’re linking to an anchor point somewhere else in your document, you can refer to it by title instead of by ID.
Refer to <<Section A>>. == Section A
You’ll likely want to switch to using IDs as the document matures, but this should certainly help with flow in early drafts!
Print your docs
Leif Gruenwoldt (@leif81) pointed out that the print styles were too aggressive, causing the printed document to lose its integrity.
We worked together to tweak the stylesheet until the output looked nearly as good as the PDF generated by the DocBook toolchain.
The styles even separate chapters into different pages when using the book
doctype.
In addition to these styles, we also added the missing table border styles for all the grid and frame permutations on both web and print.
Who needs DocBook when you’ve got HTML5 and CSS3?
Open Source fonts
The culture of Asciidoctor is deeply rooted in Open Source, so we want to be Open Source all the way down.
In the past, the default stylesheet relied on Microsoft Core Fonts (Arial and Georgia) installed on the user’s system. We’ve replaced these proprietary fonts with Open Source fonts, which we load from Google Fonts.
Here are the fonts we’ve selected:
-
Noto Serif - prose and block titles
-
Open Sans Light - section headings
-
Droid Sans Mono - monospaced text and preformatted blocks
We particularly like Noto Serif because it’s an extremely readable font and it supports all the world’s languages.
We made additional refinements to the default stylesheet that give it a professional, modern appearance. Here’s a preview of the new default theme:
Font Awesome 4.1
Speaking of fonts, Asciidoctor integrates with Font Awesome 4.1, thanks to the work done by Guillaume Grossetie (@mogztter)! You now have over 400 icons available to accessorize your document!
Many icons were renamed in Font Awesome 4. If you have existing documents that use the icon macro, you may want to add the Font Awesome 3 compatibility CSS that Guillaume created to ease the transition. |
“Everything is AWESOME!!!”
Acknowledgments
The best part of Asciidoctor is, and will always be, its thriving community. We’d like to thank the following people for participating in this release.
-
Guillaume Grossetie (@mogztter)
-
Ken Dreyer (@ktdreyer)
-
James FitzGibbon (@jf647)
-
Jean-Louis Jouannic (@jljouannic)
-
Leif Gruenwoldt (@leif81)
-
Roman Priesol (@randybb)
-
Aslak Knutsen (@aslakknutsen)
-
Charles Moulliard (@cmoulliard)
-
Pepijn Van Eeckhoudt (@pepijnve)
-
Ken Finnigan (@kenfinnigan)
-
David Gamba (@davidgamba)
-
Jason Porter (@lightguard)
-
Matt Stine (@mstine)
-
Brian Carlson (@bk2204)
-
John Ericksen (@johncarl81)
-
Guillaume Laforge (@glaforge)
-
Adam Beynon (@adambeynon)
-
Romain Manni-Bucau (@rmannibucau)
-
Sarah White (@graphitefriction)
-
David Gamba (@davidgamba)
-
Cédric Champeau (@melix)
-
James Carlson (@jxxcarlson)
-
meh. (@meh)
-
Laurent Laville (@llaville)
-
Enrique Ruiz (@eruiz)
-
Alejandro Revilla (@ar)
-
Matthew Casperson (@mcasperson)
-
Rob Winch (@rwinch)
-
Anthonny Quérouil (@anthonny)
-
Peter Neubauer (@petermeubauer)
-
Andres Almiray (@aalmiray)
-
Vadim (@vad1mo)
-
Phil Webb (@philwebb)
-
Jean-Michel Bruel (@jmbruel)
-
Julien Viet (@vietj)
-
Anders Nawroth (@nawroth)
-
Romain Deltour (@rdeltour)
-
Felipe Contreras (@felipec)
-
Yuxuan ‘fishy’ Wang (@fishy)
-
Alex Soto (@lordofthejars)
-
Dave Baldwin (@davebaldwin)
-
Heiko W. Rupp (@pilhuhn)
-
Baptiste Mathus (@batmat)
-
Michael Hunger (@jexp)
We’d like to give special shout outs to the following people:
-
to Guillaume Grossetie, Ken Dreyer, Leif Gruenwoldt, @megathaum, Ken Finnigan, Brian Carlson, Aslak Knutsen, David Gamba, Wim Champagne, Charles Moulliard, Jean-Louis Jouannic, Roman Priesol and James FitzGibbon for making their first source contributions to Asciidoctor core.
-
to Guillaume Grossetie for spearheading the effort to align Asciidoctor core and Asciidoctor.js.
-
to Anthonny Quérouil for setting up a Grunt build for Asciidoctor.js and getting it published to npm and Bower.
-
to members of the Opal team (Adam Beynon, meh and Elia Schito) for helping us achieve compatibility with Opal and making necessary upstream changes.
-
to Ken Dreyer for overhauling the RPM package for Fedora and upgrading the Asciidoctor test suite to Minitest 5.
-
to Peter Neubauer for making the very first Asciidoctor t-shirt, which I wore for the release!
I (Dan) would also like to thank Sarah White for her monstrous effort providing input into the software design, editing the user manual, updating the website, testing (read as: breaking) and establishing a documentation workflow for the project. Asciidoctor would not be what it is today without her dedication.
Additional thanks to everyone who is using the project, advocating for better documentation and those who have participated in the growing ecosystem of sub-projects. The mission of Asciidoctor is to help you write, publish and communicate your content successfully, and enjoy doing it! With your feedback and participation, we can achieve that goal together! We encourage you to ask questions and discuss any aspects of the project on the mailing list, Twitter or IRC.
If you discover errors or omissions in the source code, documentation, or website content, please don’t hesitate to submit an issue or open a pull request with a fix. We’re always eager to learn about your experiences and how we can help improve them. Together, we’re making documentation fun, easy, and rewarding!
What’s next?
This release is just the beginning of the release train. Look for releases of AsciidoctorJ, Asciidoctor.js, the build plugins (Gradle and Maven), the Linux packages and more!
The next release of Asciidoctor will be the 1.5.1 point release. From now on, we plan to iterate much faster and only do announcements for major and minor versions.
See the CHANGELOG for a complete list of changes.