Giter VIP home page Giter VIP logo

asciidoctor / asciidoctor-diagram Goto Github PK

View Code? Open in Web Editor NEW
434.0 434.0 106.0 208.95 MB

:left_right_arrow: Asciidoctor diagram extension, with support for AsciiToSVG, BlockDiag (BlockDiag, SeqDiag, ActDiag, NwDiag), Ditaa, Erd, GraphViz, Mermaid, Msc, PlantUML, Shaape, SvgBob, Syntrax, UMLet, Vega, Vega-Lite and WaveDrom.

Home Page: http://asciidoctor.org

License: MIT License

Ruby 99.81% Shell 0.19%

asciidoctor-diagram's Introduction

Asciidoctor

Asciidoctor is a fast, open source, Ruby-based text processor for parsing AsciiDoc® into a document model and converting it to output formats such as HTML 5, DocBook 5, manual pages, PDF, EPUB 3, and other formats.

Asciidoctor also has an ecosystem of extensions, converters, build plugins, and tools to help you author and publish content written in AsciiDoc. You can find the documentation for these projects at https://docs.asciidoctor.org.

In addition to running on Ruby, Asciidoctor can be executed on a JVM using AsciidoctorJ or in any JavaScript environment using Asciidoctor.js.

This document is also available in the following languages:
简体中文 | Deutsch | Français | 日本語

Latest Release library (API) docs Build Status (GitHub Actions) Project Chat (Zulip)

Sponsors

We want to recognize our sponsors for their commitment to improving the state of technical documentation by supporting this project. Thank you sponsors! Without your generous support, Asciidoctor would not be possible.

You can support this project by becoming a sponsor through OpenCollective.

AsciiDoc Processing and Built-in Converters

AsciiDoc is the language.
Asciidoctor is the processor.

Asciidoctor reads the AsciiDoc source, as shown in the panel on the left in the image below, and converts it to publishable formats, such as HTML 5, as shown rendered in the panel on the right.

Preview of AsciiDoc source and corresponding rendered HTML

Asciidoctor provides built-in converters for three output formats by default: HTML 5, DocBook 5, and man page (short for manual page). Additional converters, such as PDF and EPUB 3, are provided by separate gems. Asciidoctor also provides an out-of-the-box HTML experience complete with a default stylesheet and built-in integrations like Font Awesome (for icons), highlight.js, Rouge, and Pygments (for source highlighting), and MathJax (for STEM processing).

Asciidoctor Ecosystem

Although Asciidoctor is written in Ruby, it does not mean you need Ruby to use it. Asciidoctor can be executed on a JVM using AsciidoctorJ or in any JavaScript environment (including the browser) using Asciidoctor.js.

Installing an Asciidoctor processor is just the beginning of your publishing experience. Asciidoctor gives you access to a ecosystem of extensions and tools, ranging from add-on converters, to extended syntax, to build plugins, to integrated writing and preview environments:

Asciidoctor is the successor to AsciiDoc.py. If you’re using AsciiDoc.py, see Migrate from AsciiDoc.py to learn how to upgrade to Asciidoctor.

Requirements

Asciidoctor works on Linux, macOS and Windows and requires one of the following implementations of Ruby:

  • CRuby (aka MRI) 2.7 - 3.3

  • JRuby 9.2 - 9.4

  • TruffleRuby (GraalVM)

🔥

If you’re using a non-English Windows environment, you may bump into an Encoding::UndefinedConversionError when invoking Asciidoctor. To solve this issue, we recommend overriding the default external and internal character encodings to utf-8. You can do so by setting the RUBYOPT environment variable as follows:

RUBYOPT="-E utf-8:utf-8"

Once you make this change, all your Unicode headaches should be behind you.

If you’re using an IDE like Eclipse, make sure you set the encoding to UTF-8 there as well. Asciidoctor is optimized to work with UTF-8 as the default encoding.

Installation

Asciidoctor is packaged and distributed to RubyGems.org as a RubyGem (aka gem) named asciidoctor. The asciidoctor gem can be installed on all major operating systems using Ruby packaging tools (gem or bundle). Asciidoctor is also distributed as a Docker image, as a package for numerous Linux distributions, and as a package for macOS (via Homebrew and MacPorts).

Linux package managers

The version of Asciidoctor installed by the package manager may not match the latest release of Asciidoctor. Consult the package repository for your distribution to find out which version is packaged per distribution release.

If you want to use a version of Asciidoctor that’s newer than what is installed by the package manager, see the gem installation instructions.

apk (Alpine Linux)

To install the gem on Alpine Linux, open a terminal and type:

$ sudo apk add asciidoctor

pacman (Arch Linux)

To install the gem on Arch-based distributions, open a terminal and type:

$ sudo pacman -S asciidoctor

APT

On Debian and Debian-based distributions such as Ubuntu, use APT to install Asciidoctor. To install the package, open a terminal and type:

$ sudo apt-get install -y asciidoctor

DNF

On RPM-based Linux distributions, such as Fedora, CentOS, and RHEL, use the DNF package manager to install Asciidoctor. To install the package, open a terminal and type:

$ sudo dnf install -y asciidoctor

macOS

Homebrew

You can use Homebrew, the macOS package manager, to install Asciidoctor. If you don’t have Homebrew on your computer, complete the installation instructions first.

Once Homebrew is installed, you’re ready to install the asciidoctor gem. Open a terminal and type:

$ brew install asciidoctor

Homebrew installs the asciidoctor gem into an exclusive prefix that’s independent of system gems.

MacPorts

You can also use MacPorts, another package manager for macOS, to install Asciidoctor. If you don’t have MacPorts on your computer, complete the installation instructions first.

Once MacPorts is installed, you’re ready to install the asciidoctor gem via the Asciidoctor port. Open a terminal and type:

$ sudo port install asciidoctor

Windows

To use Asciidoctor with Windows, you have two options.

Chocolatey

When you already use chocolatey on your machine, you can use:

choco install ruby

Rubyinstaller

Or you use the Rubyinstaller, download the package for your Windows Version and after the installation go ahead with gem installation instructions.

gem install

Before installing Asciidoctor using gem install, you should set up RVM (or similar) to install Ruby in your home directory (i.e., user space). Then, you can safely use the gem command to install or update the Asciidoctor gem, or any other gem for that matter. When using RVM, gems are installed in a location isolated from the system. (You should never use the gem command to install system-wide gems).

Once you’ve installed Ruby using RVM, and you have activated it using rvm use 3.0, open a terminal and type:

$ gem install asciidoctor

If you want to install a pre-release version (e.g., a release candidate), use:

$ gem install asciidoctor --pre

Bundler

  1. Create a Gemfile in the root folder of your project (or the current directory)

  2. Add the asciidoctor gem to your Gemfile as follows:

    source 'https://rubygems.org'
    gem 'asciidoctor'
    # or specify the version explicitly
    # gem 'asciidoctor', '2.0.22'
  3. Save the Gemfile

  4. Open a terminal and install the gem using:

    $ bundle

To upgrade the gem, specify the new version in the Gemfile and run bundle again. Using bundle update (without specifying a gem) is not recommended as it will also update other gems, which may not be the desired result.

Upgrade

If you installed Asciidoctor using a package manager, your operating system is probably configured to automatically update packages, in which case you don’t need to update the gem manually.

apk (Alpine Linux)

To upgrade the gem, use:

$ sudo apk add -u asciidoctor

APT

To upgrade the gem, use:

$ sudo apt-get upgrade -y asciidoctor

DNF

To upgrade the gem, use:

$ sudo dnf update -y asciidoctor

Homebrew (macOS)

To upgrade the gem, use:

$ brew update
$ brew upgrade asciidoctor

MacPorts (macOS)

To upgrade the gem, use:

$ sudo port selfupdate
$ sudo port upgrade asciidoctor

gem install

If you previously installed Asciidoctor using the gem command, you’ll need to manually upgrade Asciidoctor when a new version is released. You can upgrade the gem by typing:

$ gem install asciidoctor

When you install a new version of the gem using gem install, you end up with multiple versions installed. Use the following command to remove the old versions:

$ gem cleanup asciidoctor

Usage

If the Asciidoctor gem installed successfully, the asciidoctor command line interface (CLI) will be available on your PATH. To verify it’s available, run the following in your terminal:

$ asciidoctor --version

You should see information about the Asciidoctor version and your Ruby environment printed in the terminal.

Asciidoctor 2.0.22 [https://asciidoctor.org]
Runtime Environment (ruby 3.0.1p64 [x86_64-linux]) (lc:UTF-8 fs:UTF-8 in:UTF-8 ex:UTF-8)

Command line interface (CLI)

The asciidoctor command allows you to invoke Asciidoctor from the command line (i.e., a terminal).

The following command converts the file README.adoc to HTML and saves the result to the file README.html in the same directory. The name of the generated HTML file is derived from the source file by changing its file extension to .html.

$ asciidoctor README.adoc

You can control the Asciidoctor processor by adding various flags and switches, which you can learn about using:

$ asciidoctor --help

For instance, to write the file to a different directory, use:

$ asciidoctor -D output README.adoc

The asciidoctor man page provides a complete reference of the command line interface.

Refer to the following resources to learn more about how to use the asciidoctor command.

Ruby API

Asciidoctor also provides an API. The API is intended for integration with other Ruby software, such as Rails, GitHub, and GitLab, as well as other languages, such as Java (via AsciidoctorJ) and JavaScript (via Asciidoctor.js).

To use Asciidoctor in your application, you first need to require the gem:

require 'asciidoctor'

You can then convert an AsciiDoc source file to an HTML file using:

Asciidoctor.convert_file 'README.adoc', to_file: true, safe: :safe
⚠️
When using Asciidoctor via the API, the default safe mode is :secure. In secure mode, several core features are disabled, including the include directive. If you want to enable these features, you’ll need to explicitly set the safe mode to :server (recommended) or :safe.

You can also convert an AsciiDoc string to embeddable HTML (for inserting in an HTML page) using:

content = '_Zen_ in the art of writing https://asciidoctor.org[AsciiDoc].'
Asciidoctor.convert content, safe: :safe

If you want the full HTML document, enable the header_footer option as follows:

content = '_Zen_ in the art of writing https://asciidoctor.org[AsciiDoc].'
html = Asciidoctor.convert content, header_footer: true, safe: :safe

If you need access to the parsed document, you can split the conversion into discrete steps:

content = '_Zen_ in the art of writing https://asciidoctor.org[AsciiDoc].'
document = Asciidoctor.load content, header_footer: true, safe: :safe
puts document.doctitle
html = document.convert

Keep in mind that if you don’t like the output Asciidoctor produces, you can change it! Asciidoctor supports custom converters that can handle converting from the parsed document to the generated output.

One easy way to customize the output piecemeal is by using the template converter. The template converter allows you to supply a Tilt-supported template file to handle converting any node in the document.

However you go about it, you can have 100% control over the output. For more information about how to use the API or to customize the output, see:

Contributing

New contributors are always welcome! 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.

Here are some ways you can contribute:

  • by using prerelease (alpha, beta or preview) versions

  • by reporting bugs

  • by suggesting new features

  • by writing or editing documentation

  • by writing code with tests — No patch is too small.

    • fix typos

    • add comments

    • clean up inconsistent whitespace

    • write tests!

  • by refactoring code

  • by fixing issues

  • by reviewing patches

The Contributing guide provides information on how to create, style, and submit issues, feature requests, code, and documentation to Asciidoctor.

Getting Help

Asciidoctor is developed to help you easily write and publish your content. But we can’t do it without your input. If you need assistance or want to provide feedback, please follow the links to the resources listed on the Get Help page in the docs. Here’s a quick summary:

Project chat (Zulip)

https://chat.asciidoctor.org

Discussion list (archived)

https://discuss.asciidoctor.org

Social media (Twitter)

Follow @asciidoctor or search the #asciidoctor hashtag

Further information and documentation about Asciidoctor can be found on the project’s website.

Home | News | Docs

The Asciidoctor organization on GitHub hosts the project’s source code, issue tracker, and sub-projects.

Code of Conduct

The core Asciidoctor project is governed by the Code of Conduct for the Asciidoctor community of projects. By participating, you’re agreeing to honor this code. Let’s work together to make this a welcoming, professional, inclusive, and safe environment for everyone.

Versioning and Release Policy

This project adheres to semantic versioning (major.minor.patch). Typically, patch releases are only made for the current minor release. However, exceptions are made on a case-by-case basis to address security vulnerabilities and other high-priority issues.

Copyright © 2012-present Dan Allen, Sarah White, Ryan Waldron, and the individual contributors to Asciidoctor. Use of this software is granted under the terms of the MIT License.

See the LICENSE for the full license text.

Authors

Asciidoctor is led by Dan Allen and Sarah White and has received contributions from many individuals in Asciidoctor’s awesome community. The project was initiated in 2012 by Ryan Waldron based on a prototype written by Nick Hengeveld for the Git website.

AsciiDoc.py was started and maintained by Stuart Rackham from 2002 to 2013 and has received contributions from many individuals in the AsciiDoc.py community.

Trademarks

AsciiDoc® and AsciiDoc Language™ are trademarks of the Eclipse Foundation, Inc.

Changelog

Refer to the CHANGELOG for a complete list of changes in older releases.

asciidoctor-diagram's People

Contributors

abelsromero avatar ahus1 avatar alwinator avatar antoinentl avatar chanibal avatar diguage avatar djencks avatar fatalchemist avatar ggrossetie avatar gsmecher avatar hackingotter avatar hakandilek avatar harshcasper avatar inponomarev avatar j-manu avatar joelsmith avatar lagerfeuer avatar mariuszcwikla avatar mojavelinux avatar nearnshaw avatar neher avatar nyx0 avatar pepijnve avatar puffybsd avatar robertpanzer avatar slonopotamus avatar snecklifter avatar thirtque avatar umarcor avatar vinipsmaker avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

asciidoctor-diagram's Issues

Extension Linebreak

Hi, i wrote a simple extension for example purpose;

require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'

include ::Asciidoctor

class UmlBlock < Extensions::BlockProcessor
  use_dsl

  named :uml
  on_context :open
  parse_content_as :raw

  def process parent, reader, attrs

    html = %(<div><strong>#{attrs['name']}</strong></div>
    <img src="#{attrs['src']}">
    <div><b>Content:</b> #{reader.read}</div>)

    # QUESTION should we allow attribute references in the slim source?
    create_pass_block parent, html, attrs, subs: nil
  end
end

reader.read prints words without linebreak, it print in same line, How can i generate with linebreaks?

Second question is, is there a documentation for developing asciidoctor extensions?

Thanks

Call ditaa with command line arguments

Hi,

is it possible to specify command line arguments or something equivalent in the asciidoc file when running ditaa? I would like to control effects like box shadows and box separations which is possible via ditaa command line arguments --no-separation and --no-shadows.

Thanks.

PlantUML working directory fixed at first call only

The problem only appear on consecutive calls to asciidoctor-diagram in the same process.

Context

I made a Ruby script to convert several adoc located in differents directories.
Some documents include PlantUML blocks including images using the creole syntax (e.g. <img:my_pic.png>).
The images for each document are in the same directory of it.

For each document the script changes the working directory using Dir.chdir and trigger the conversion using Asciidoctor.convert

Problem

Only the PlantUML blocks of the first rendered document has the creole images rendered correctly. With the next documents there is an error in the drawing saying that the image files were not found.
One can see in the path of the image that the directory of the first document was used instead of the current one.

My 2 cents analysis

The JVM is only launched once for perfomance concerns.
It will get the working directory set by Ruby and keep it forever.

For testing purpose I patched the Asciidoctor::Java::Java::CommandServer.instance method to have it create a new server at each call.
The performances are for sure horrible but all my documents were rendered correctly.

Use cached image if available

To speed up the processor, and avoid redundant image generation, the plugin should be smart about using a cached version of the diagram if available. A simple approach would be to take a signature of the diagram source (md5sum or lighter) and look for a matching diagram on disk. Since the file name is customizable, it may be necessary to store the signature information in an index file, such as a json, YAML or flat text file.

This optimization is especially important since diagrams change very rarely once they are sorted out.

Make RJB an optional dependency

Currently RJB is a required dependency of asciidoctor-diagram. It's used when running PlantUML and Ditaa to avoid starting a new JVM instance for each diagram. RJB uses native ruby extension which makes it more difficult to install compared to regular gems.

To make asciidoctor-diagram installation simpler, consider making RJB an optional dependency. When RJB is not available at runtime, fallback to launching a JVM using a subprocess instead. This will be considerably slower than the current RJB based codepath, so we should document that installing RJB can provide a performance improvement.

Do not require dot on path for sequence diagrams

PlantUML is able to generate sequence diagrams without using dot. However the asciidoc-diagram extension still fails with:

ERROR: Failed to generate image: PlantUML image generation failed: Bad Req
uest java.io.IOException: Could not find GraphViz 'dot' tool
at org.asciidoctor.diagram.PlantUML.getGraphviz(PlantUML.java:24)
at org.asciidoctor.diagram.PlantUML.generate(PlantUML.java:35)
at org.asciidoctor.diagram.CommandProcessor.processRequest(CommandProcessor.java:34)
at org.asciidoctor.diagram.CommandProcessor.processRequest(CommandProcessor.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

I worked around it by creating an empty "dot.bat" file that does nothing and then it works and shows the diagrams correctly, which proves it doesn't actually need dot. This is true only for sequence diagrams.

Target parameter is ignored when using the plantuml:: method

For example:

plantuml::file.puml[ "target", "svg" ]

just writes to file.svg

whereas

["plantuml", "target", "svg"]
---------------------------------
include::file.puml[]
---------------------------------

writes to target.svg

( same for png format )

Failed to build gem native extension.

Can not install extension:

#gem install asciidoctor-diagram --pre
Building native extensions.  This could take a while...
ERROR:  Error installing asciidoctor-diagram:
        ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.9.1 extconf.rb
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
        from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
        from extconf.rb:6:in `<main>'


Gem files will remain installed in /var/lib/gems/1.9.1/gems/rjb-1.4.9 for inspection.
Results logged to /var/lib/gems/1.9.1/gems/rjb-1.4.9/ext/gem_make.out

Unbundle dependencies

Currently plantuml and ditaa are packaged inside the gem, but shaape, blockdiag, etc are not. I think we should consider taking plantuml and ditaa out of the gem and treat them like the other external tool dependencies.
As a convenience a small bit of code could be added to asciidoctor-diagram to download the jars from a maven repo. Additionally new document attributes could be introduced that allow the default version numbers to be overridden which allows users to use more recent versions of plantuml.
There are two benefits to this change:

  • the gem becomes smaller
  • the version of plantuml and ditaa is decoupled from the version of asciidoctor-diagram

Add support for plantuml configuration files

The look of plantuml generated images can be controlled using skin parameters. Parameter values can be defined inline in each diagram or externally in a configuration file. In order to get a common customised look throughout a document it would be useful to be able to provide the path to a plantuml configuration via a document attribute.

Scaling the generated images

It would be nice if there would be a possiblility to scale the generated svg diagrams. Especially for plantuml this would be nice:

[plantuml, scale="200%"]


A->B


Document that digraph content must begin after newline

In my experience, the digraph for Graphviz cannot be defined on a single line. Doing so results in a broken image. This should either be documented or fixed.

For example, if I create the following digraph in my AsciiDoc document:

[graphviz]
....
digraph g { rankdir=LR; Text->Graphviz->Image }
....

I get the following image:

text-graphviz-image

If I add a newline after the opening curly brace:

[graphviz]
....
digraph g {
  rankdir=LR; Text->Graphviz->Image }
....

then I get a proper diagram.

text-graphviz-image

This minor detail could be a big stumbling block for new users. Let's give them a good start.

Use fixed prefix in auto-generated image name

Currently, the rendered images that have auto-generated image names can be hard to cleanup because there is no easy way to refer to them as a group. Introduce a fixed prefix to the auto-generated name, such as diag-, so they can easily be identified in bulk.

You can make this prefix configurable using a document-level attribute, though that may be overkill.

Take into account outdir when specified

Currently we can not specify another output folder.

We can use the 'outdir' document attribute for this.
The gem should generate images relative from this folder, if the document attribute is specified.

document dot requirement and handle missing dot more gracefully ?

Maybe i'm missing something but I don't find mention of dot being required for usage of asciidoctor-diagram but it seems it is.

At least when I add a diagram I get this error:

Could not find the Graphviz 'dot' executable in PATH; add it to the PATH or specify its location using the 'graphvizdot' document attribute

and it breaks the rendering of any asciidoc very abruptly.

Should document the requiremnets and how to install dot on the various OS's.

But that said - i would much rather prefer that a "Dot not installed - cannot render document" image put into the document rather than breaking the asciidoctor rendering completely.

This is to not require everyone to "fight" having to install dot just to render a single document out of possible hundreds that works fine without it.

Java runtime is not visible

I am running the following command:

$ asciidoctor --safe-mode unsafe -a lang=ja -b html5 -d book -r asciidoctor-diagram -o temp.html test.adoc

which gives me an error: No Java runtime present, requesting install and popups dialog inviting to install Java SE 6. I've installed Java 8 from Oracle website, but the behavior remains unchanged.

I've verified that Java 8 has been installed correctly:

$ java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

What can cause this issue?

seqdiag, packetdiag and others give errors

I'm trying to convert over to asciidoctor from asciidoc and installed the latest version of both asciidoctor (1.50) and asciidoctor-diagram (1.2.0) on my Ubuntu machine. All my ditaa and plantuml figures get generated correctly, but the only "diag" figure I can get to work is blockdiag, the others, like seqdiag and packetdiag give me:

invalid style for listing block: packetdiag
invalid style for listing block: seqdiag

Is there a step or syntax I missed someplace? Any help would be greatly appreciated.

Thanks,

-Mike

generated img tags disregard output directory

I am using jekyll-asciidoc, and when I use the asciidoctor-diagram extension, files are saved according to the imagesoutdir attribute. However, the img tag in the HTML output always uses the name of the image file with no path information (e.g., <img src="foo.svg">) regardless of location.

Inline SVG

A great feature for the PlantUML Integration would be to inline the SVG with the html5 backend. This would have the advantage that no external files would be needed.

Add support for Shaape

Add support for the Shaape diagram language and converter.

https://github.com/christiangoltz/shaape

The nice part about Shaape is that it already has an extension for AsciiDoc Python, so it should be straightforward to see how it gets invoked from plain-text input.

Since Shaape is written in Python, it will have to be invoked over the system process bridge.

ditaa diagram not render Chinese character correctly

Initially reported as pepijnve/asciidoctor-diagram-java#1 by @0000-bigtree.

i use asciidoctor-diagram (1.3.0.preview.4) CRuby(2.2.2p95 (2015-04-13 revision 50295) [i386-mingw32]) with below ditaa code in a adoc(UTF-8)

ruby -Ku -S asciidoctor -r asciidoctor-diagram xxx.adoc

[ditaa, "header", "png"]

+---------+
| 4 bytes | CRC
+---------+
| 1 byte | 协议版本(Chinese Character!)
+---------+
| 2 bytes | 消息类型 ID(命令码)

+---------+

produced png did not render Chinese character correctly.

header

but i use

java -Dfile.encoding=UTF-8 -jar ditaa0_9.jar(from sourceforge)  xxx.ditaa

produced png,it rendered fine.

message_head_structure_4

Update PlantUML to latest revision

Update PlantUML to the latest revision.

Note that the latest builds include an old version of Ditaa. We should probably repackage PlantUML using jarjar to avoid any weird behaviour due to version incompatibilities.

Restore support for `graphvizdot` document attribute

In asciidoctor-diagram 1.2.0 the location of the graphviz dot command could be specified using the graphvizdot document attribute. Since 1.3.0 this is no longer supported.
Support for this attribute should be restored.

Additionally it would be convenient to support this attribute for graphviz type diagrams as well. Currently only the dot document attribute can be used for this.

PNG rendering fails with graphviz on Windows

When I render the following block:

[graphviz,"test",svg]
----
graph G {
  clusterC -- clusterB
}
----

I get the following error message: (RuntimeError) Invalid PNG signature

I am using the basic maven setup from the maven examples (asciidoctor-diagram-example) on a french Windows 7 Pro.

I patched the file 'png.rb' which causes this error by returning a size by default. With this patched version the png file gets created but is corrupted.

I suspect this being an encoding issue UTF-8 vs ISO.

(Btw, I also tried generating the png on my command line with the exact same parameters and it works.)

Below the complete error output.

[INFO] --- asciidoctor-maven-plugin:1.5.0:process-asciidoc (generate-html-doc) @
 asciidoctor-diagram-example ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.248 s
[INFO] Finished at: 2014-11-06T13:30:58+01:00
[INFO] Final Memory: 12M/30M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.asciidoctor:asciidoctor-maven-plugin:1.5.0:pr
ocess-asciidoc (generate-html-doc) on project asciidoctor-diagram-example: Execu
tion generate-html-doc of goal org.asciidoctor:asciidoctor-maven-plugin:1.5.0:pr
ocess-asciidoc failed: (RuntimeError) Invalid PNG signature -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
ch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:

'Bumping' Ditaa version

Hi,
This is a bit 'yak shaving'ish - but here is the story.

Ditaa extension for asciidoctor-diagram (great stuff - btw) allows (recently - as of #69) for ditaa options.
One of the options on DItaa sourcecode is "transparent" background (https://github.com/stathissideris/ditaa/blob/master/src/org/stathissideris/ascii2image/core/CommandLineConverter.java#L71). However - this is not a feature available in the downloadable version of DItaa.

When I build Ditaa from source I can easily run it with

{ examples } master » java -jar /tmp/ditaa/releases/ditaa0_9.jar -S -T ditaa.txt                                               /tmp/asciidoctor-diagram/examples  

ditaa version 0.9, Copyright (C) 2004--2009  Efstathios (Stathis) Sideris

Running with options:
no-shadows
transparent
Reading file: ditaa.txt
Rendering to file: ditaa_3.png
Done in 0sec

Then for a following snippet

                   +-------------+
                   | asciidoctor |-------+
                   |  diagram    |       |
                   +-------------+       | png out
                       ^                 |
                       | ditaa in        |
                       |                 v
 +--------+   +--------+----+    /---------------\
 |        | --+ asciidoctor +--> |               |
 |  Text  |   +-------------+    |Beatiful output|
 |Document|   |   !magic!   |    |               |
 |     {d}|   |             |    |               |
 +---+----+   +-------------+    \---------------/
     :                                   ^
     |          Lots of work             |
     +-----------------------------------+

I got result as expected (with transparent background!)
ditaa_3

However that doesn't get supported by the diagram extension.
The ditaamini0_9.jar doesn't look to me as a standard ditaa distribution and simple replacement of an old jar with a new build triggers a following error

Exception in thread "main" java.lang.NoSuchMethodError: org.stathissideris.ascii2image.text.TextGrid.loadFrom(Ljava/io/InputStream;Lorg/stathissideris/ascii2image/core/ProcessingOptions;)V
    at org.asciidoctor.diagram.Ditaa.generate(Ditaa.java:61)
    at org.asciidoctor.diagram.CommandProcessor.processRequest(CommandProcessor.java:34)
    at org.asciidoctor.diagram.CommandServer.processRequests(CommandServer.java:38)
    at org.asciidoctor.diagram.CommandServer.main(CommandServer.java:20)
asciidoctor-diagram: ERROR: Failed to generate image: end of file reached

Now, when I browse further - I see some more changes are required in here https://github.com/pepijnve/asciidoctor-diagram-java/blob/master/src/main/java/org/asciidoctor/diagram/Ditaa.java#L33

Before I start drilling there and fiddling with the code further, I just want to confirm that my thoughts are right. The steps should be

  • update the ditaa.jar in the asciidoctor-diagram-java project
  • fix the api changes
  • apply "transparent" flag in both asciidoctor-diagram-java and asciidoctor-diagram
  • pull request

Additional question, if the freshly built ditta.jar is not a drop-in replacement how can I reproduce the built of ditaamini0_9.jar

--Kuba

PS. My usecase. I started to use diagram for my training presentations. I have the diagrams together with slides and when it gets rendered into any html deck - the transparent background would make a bit more sense in some cases.

Wrong embedding for SVG objects in HTML

I'm trying to use asciidoctor for a highly linked documentation mostly based on generated graphs.

I'll use graphviz and nwdiag for this.

The graphs and their integration look very good, thank you.

But the hyperlinks set in the graphs (Ex: web_srv [href="web_srv_details.html"]) are dead when clicked upon from the html page.
Actually they are useable if I view the .svg file alone, so they work well.

I found out it is caused by the way the -svg files are embedded into the html, using <img src=
This is known to make svg elements "inanimate".

An SVG embedded with an tag and one embedded as a CSS background image are treated in a similar way when it comes to CSS styling and animation. Styles and animations applied to an SVG using an external CSS resource will not be preserved once the SVG is embedded.

If I manually edit the html to embed the .svg with <object type="image/svg+xml" data=, then
it works well, with the links clickable, as expected.

I also noted another side-effect: nwdiag seems to embed icons/images (think cisco plugin) using their
full-path. When I replaced the path with a local one it didn't work (blank image).
But after using <object type="image/svg+xml" data= for the html embedding, it started to work.

I think the images of format SVG should be (at least optionally) embedded as <object ... />.

Thanks for the good job.

gemPath file seperator issue on windows

The examples using 'gemPath' are not working on windows.

[ERROR] Failed to execute goal org.asciidoctor:asciidoctor-maven-plugin:1.5.0:process-asciidoc (generate-html-doc) on project asciidoctor-diagram-example: Execution generate-html-doc of goal org.asciidoctor:asciidoctor-maven-plugin:1.5.0:process-asciidoc failed: (LoadError) no such file to load -- asciidoctor-diagram -

If I replace
<gemPath>${project.build.directory}/gems-provided</gemPath>
by
<gemPath>target/gems-provided</gemPath>
it is working.

I think it's an issue with the ${project.build.directory} using \ instead of / as file seperator on windows. And the \ is probably considered as an escape character somewhere further in the chain.

Allow the diagram font to be specified

It would be nice if it were possible to specify the font used in diagrams (for instance, in salt file trees).

This definitely isn't something we should encourage at the block-level since it mixes content and presentation. We could, however, allow document-level attributes to be used, such as:

:diagram-font-family: Noto Sans

Another option is to consider having a configuration file for Asciidoctor Diagram in which we can put all diagram-related options. For instance, it might be nice to be able to customize the look and feel of various types of nodes. Too much of this in the AsciiDoc document and it gets cluttered.

Prelease doesn't run

Prelease 1.2.0.preview.5 errors:
"""
~> ~/.gem/ruby/1.9.1/bin/asciidoctor-diagram --trace Desktop/Article.adoc
/home/thorsten/.gem/ruby/1.9.1/gems/asciidoctor-1.5.0.preview.8/lib/asciidoctor/cli/options.rb:226:in rescue in parse!': uninitialized constant OptionParser (NameError) from /home/thorsten/.gem/ruby/1.9.1/gems/asciidoctor-1.5.0.preview.8/lib/asciidoctor/cli/options.rb:36:inparse!'
from /home/thorsten/.gem/ruby/1.9.1/gems/asciidoctor-1.5.0.preview.8/lib/asciidoctor/cli/options.rb:32:in parse!' from /home/thorsten/.gem/ruby/1.9.1/gems/asciidoctor-1.5.0.preview.8/lib/asciidoctor/cli/invoker.rb:20:ininitialize'
from /home/thorsten/.gem/ruby/1.9.1/bin/asciidoctor-diagram:9:in new' from /home/thorsten/.gem/ruby/1.9.1/bin/asciidoctor-diagram:9:in

'
"""

asciidoctor-diagram was installed with
"""
gem install --prerelease --user-install asciidoctor-diagram
"""

asciidoctor-diagram-1.1.5 works without problem

Constants DL and Fiddle is not defined.

I've added the following to Gemfile:

gem 'asciidoctor', '1.5.0'
gem 'asciidoctor-diagram'

Run bundle update.

Added require 'asciidoctor-diagram' to pipeline.rb

If i do not run 'brew install graphviz' I get #41

When I have run 'brew install graphviz' I get:

"Constants DL and Fiddle is not defined."

When trying to render

[ditaa]
----
                   +-------------+
                   | Asciidoctor |-------+
                   |  Diagram    |       |
                   +-------------+       | PNG out
                       ^                 |
                       | ditaa in        |
                       |                 v
 +--------+   +--------+----+    /----------------\
 |        | --+ Asciidoctor +--> |                |
 |  Text  |   +-------------+    |Beautiful output|
 |Document|   |   !magic!   |    |                |
 |     {d}|   |             |    |                |
 +---+----+   +-------------+    \----------------/
     :                                   ^
     |          Lots of work             |
     +-----------------------------------+
----

Full stacktrace is:

/Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/util/java_rjb.rb:51:in `load'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/util/java_rjb.rb:51:in `load'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/ditaa/extension.rb:11:in `ditaa'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/ditaa/extension.rb:32:in `block (2 levels) in '
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/util/diagram.rb:130:in `call'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/util/diagram.rb:130:in `create_image_block'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/util/diagram.rb:105:in `generate_block'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-diagram-1.2.0/lib/asciidoctor-diagram/util/diagram.rb:23:in `process'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor/parser.rb:1084:in `[]'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor/parser.rb:1084:in `build_block'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor/parser.rb:891:in `next_block'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor/parser.rb:303:in `next_section'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor/parser.rb:52:in `parse'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor/document.rb:448:in `parse'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor.rb:1337:in `load'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/asciidoctor-1.5.0/lib/asciidoctor.rb:1415:in `convert'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/handlers/template/asciidoc.rb:20:in `evaluate'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/tilt-1.4.1/lib/tilt/template.rb:103:in `render'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/handlers/base_tilt_handler.rb:130:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/handlers/asciidoctor_handler.rb:87:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/handlers/layout_handler.rb:48:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/page.rb:135:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/page.rb:174:in `content'
          /Users/max/code/jbosstools/jbosstools-website/blog/index.html.haml:47:in `block (2 levels) in singletonclass'
          /Users/max/code/jbosstools/jbosstools-website/blog/index.html.haml:23:in `each'
          /Users/max/code/jbosstools/jbosstools-website/blog/index.html.haml:23:in `block in singletonclass'
          /Users/max/code/jbosstools/jbosstools-website/blog/index.html.haml:65535:in `instance_eval'
          /Users/max/code/jbosstools/jbosstools-website/blog/index.html.haml:65535:in `singletonclass'
          /Users/max/code/jbosstools/jbosstools-website/blog/index.html.haml:65533:in `__tilt_70111851345320'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/tilt-1.4.1/lib/tilt/template.rb:170:in `call'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/tilt-1.4.1/lib/tilt/template.rb:170:in `evaluate'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/tilt-1.4.1/lib/tilt/haml.rb:24:in `evaluate'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/tilt-1.4.1/lib/tilt/template.rb:103:in `render'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/handlers/base_tilt_handler.rb:130:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/handlers/layout_handler.rb:48:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/page.rb:135:in `rendered_content'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/engine.rb:310:in `generate_page'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/engine.rb:380:in `generate_page_internal'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/engine.rb:373:in `block in generate_page_by_output_path'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/engine.rb:372:in `each'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/engine.rb:372:in `generate_page_by_output_path'
          /Users/max/.rvm/gems/ruby-1.9.3-p547@jbosstools-website/gems/awestruct-0.5.4.rc3/lib/awestruct/cli/auto.rb:40:in `block (3 levels) in run'

Use same destination-dir as asciidoctor

I compile my documents from the CLI like this:

asciidoctor -r  asciidoctor-diagram   -D target/   source/samle.adoc

asciidoctor will create the output sample.html in the target/ directory.
But asciidoctor-diagram creates all the PNG files in the active directory . and not in target/. Therefore, the image links in sample.html are also wrong.

Cannot launch asciidoctor-diagram

I installed asciidoctor and asciidoctor-diagram as instructed but I can't generate a test diagram. I got an error and I'm not sure what it is:

/usr/local/Cellar/ruby/2.1.0/lib/ruby/gems/2.1.0/gems/asciidoctor-0.1.4/lib/asciidoctor/cli/invoker.rb:98:in `rescue in invoke!': java.io.FileNotFoundException:  (No such file or directory) (RuntimeError)
    from /usr/local/Cellar/ruby/2.1.0/lib/ruby/gems/2.1.0/gems/asciidoctor-0.1.4/lib/asciidoctor/cli/invoker.rb:32:in `invoke!'
    from /usr/local/Cellar/ruby/2.1.0/lib/ruby/gems/2.1.0/gems/asciidoctor-0.1.4/bin/asciidoctor:15:in `<top (required)>'
    from /usr/local/bin/asciidoctor-diagram:23:in `load'
    from /usr/local/bin/asciidoctor-diagram:23:in `<main>'

I was digging around and found out that initawt.jar is missing. Maybe this is the problem?

Generated diagram image not found when -D or -o options specified

If you specify the -D <destination dir> or -o <output file> options to asciidoctor, you get the following warning (which is actually an error as the image is not included in the document.)

WARNING: image to embed not found or not readable: <document src dir>/<diagram name>

Note that in the failing case <output file> is in a directory other than the document source directory.

This error happens because the diagram image is generated in the destination directory while asciidoc is looking for it in the source directory.

Exception when dot is not found not thrown in v1.3.1

In version 1.2.1, when dot command was not found,an exception was thrown and the conversion aborted. But in version 1.3.1 the conversion shows the exception in the console, but also inserts it into the generated HTML (see attachment). Seems to me that it is not thrown or asciidoctor (ruby) is not catching it.

I am using the example https://github.com/asciidoctor/asciidoctor-maven-examples/blob/master/asciidoctor-diagram-example/src/docs/asciidoc/example-manual.adoc with asciidoctorj-1.5.2.1 and asciidoctorj-1.5.3.2 and both have the same behaviour, so I guess it isn't a change in Asciidoctorj.

example-manual.txt

Let me know if you need anything else.

Can't get to run on windows

Just tried to install on windows+cygwin, but can't get it to work. I'm not sure if this is my instalation problem or i have found a bug.

My instalation procedure (from cygwin prompt):

$ apt-cyg install graphviz
$ apt-cyg install rubygems
$ gem install ascii-doctor-diagram
$ cd my-project-dir
$ asciidoctor -r asciidoctor-diagram Test.adoc
Error: Could not find or load main class org.asciidoctor.diagram.CommandServer
asciidoctor-diagram: ERROR: Failed to generate image: end of file reached
$ cd ~/.gem/ruby/gems/asciidoctor-diagram-1.3.0/examples
$ asciidoctor -r asciidoctor-diagram -I ../lib design.adoc
Error: Could not find or load main class org.asciidoctor.diagram.CommandServer
asciidoctor-diagram: ERROR: Failed to generate image: end of file reached
Error: Could not find or load main class org.asciidoctor.diagram.CommandServer
asciidoctor-diagram: ERROR: Failed to generate image: end of file reached

My version is:

$ gem list

*** LOCAL GEMS ***

asciidoctor (1.5.2)
asciidoctor-diagram (1.3.0)
json (1.8.2)
minitest (5.4.3)
power_assert (0.2.2)
rake (10.4.2)
rdoc (4.2.0)
test-unit (3.0.8)

Table-embedded diagram generation does not kick in

When I embed a "blockdiag" diagram into a table's cell (with cell's type = asciidoc) it does not get generated.

However, if I place the same diagram's code outside and before the table too, then it gets
a) generated and displayed before the table (which I do not want, of course)
b) the diagram, for which a file now exists, gets gracefully displayed in the table's cell (which is what I want)

What this means:
a) my environment is correctly configured (called with asciidoctor -r ascii-diagram)
b) the asciidoc interpretation of the cell does kick in (the file link obviously gets generated)
c) but it does not kick the generation of diagrams in )-:

Thanks for your help.

Here an example:

// pre-generate the diagram
[blockdiag, target='hosts-relationships-0-from', 'png']
----
{
  A <- B -> C -- D <-> E;
}
----

// table with embeddings
[cols="2", options="header", width="100%"]
|===
a| This host is involved in following relationships

[blockdiag, target='hosts-relationships-0-from', 'png']
----
{
  A <- B -> C -- D <-> E;
}
----
a| This host is involved in following relationships

[blockdiag, target='hosts-relationships-0-to', 'png']
----
{
  A <- B -> C -- D <-> E;
}
----


|===

Unable to run asciidoctor-diagram on Mavericks without Java 6 installed

When trying to run asciidoctor-diagram on a 'clean' Mavericks installation without Java 6 installed (but with Java 7 installed from Oracle) it fails with an error stating that Java was not installed and it pops up the dreaded Install Java modal dialog, which directs to Apple's Java 6 download.

  • JAVA_HOME is pointing to the right JDK (export JAVA_HOME=$(/usr/libexec/java_home) in bash_profile)
  • jruby was installed through homebrew, and updated to the latest
  • gem is latest installation

Enable "salt" sketches in plantuml diagrams

plantuml has an included subproject called "salt".
It should be possible to draw a tree like this:

[plantuml,format="svg"]
----
salt
{T
+ A
++ a
+ B
++ b
}
----

Unfortunately I get a syntax error here. Suppose that the starting line "salt" isn't sent to plantuml.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.