Skip to content

Klortho/dtd-diagram

Repository files navigation

Interactive, animated DTD schema diagrams

See the demo.

This is a D3 implementation of the old XML Near & Far diagrams. See this Key to the Near & Far Diagrams and the following pages, for examples of what Near & Far diagrams look like.

Contents

This page

Implementation

Current status and to-do list

Getting started

To run from your own machine, you can use Bower, and add this as a dependency:

bower install dtd-diagram --save

Or, you download it and its dependencies manually:

To integrate it with your own DTD, you'll want to clone it and initialize a development environment, which includes DtdAnalyzer, used to convert DTDs into the JSON files that this tool consumes.

Make sure you have Node.js and npm installed, and then install gulp globally (if you haven't already). This makes the gulp command available on the command line:

npm install -g gulp

Then clone the repo, and build it:

git clone https://github.com/Klortho/dtd-diagram.git
cd dtd-diagram
npm install
gulp

Check that it worked, by bringing up the project folder in a web browser.

To generate JSON versions of DTDs, you'll need to set your PATH to include the vendor/dtd-analyzer directory, and then, for example, for the test DTD:

dtdanalyzer --roots doc --xslt daz2json.xsl test/test2.dtd > test2.json 

To work with one of the JATS DTDs, you could do this:

dtdanalyzer --roots article --xslt daz2json.xsl \
  http://jats.nlm.nih.gov/publishing/1.1d3/JATS-journalpublishing1.dtd \
  > JATS-journalpublishing1.json

Then, in the HTML file that invokes the diagram, set options to load the correct DTD JSON file, and to cause documentation hyperlinks to go to the right place. (see the index.html page for an example):

<div id='dtd-diagram'
     data-options='{
         "dtd_json_file": "JATS-journalpublishing1.json",
         "tag_doc_base": "http://jatspan.org/niso/publishing-1.1d3/#p="
     }'></div>

To work on the JavaScript modules, and have gulp watch for changes, and automatically build the combined, minified files, start a watcher in a terminal with:

gulp watch

API

The simplest way to use this is to load the code in a page that has a pre-existing <div> element with id value "dtd-diagram". For example:

<head>
  ...
  <link rel="stylesheet" type="text/css" href="dtd-diagram.css">
  <script src='es6-promise.js'></script>
  <script src="d3.min.js"></script>
  <script src="d3-flextree.js"></script>
  <script src="dtd-diagram.js"></script>
  ...
</head>
<body>
  ...
  <div id='dtd-diagram'></div>
  ...
</body>

By default, if you include the JavaScript in your HTML page, then a DtdDiagram will be instantiated at document ready, using all the default options. If you want to prevent this behavior, then set auto_start to false, before document ready. This will let you control when a diagram is created, based on (for example) user events. For example:

<head>
  ...
  <script type="text/javascript" src="dtd-diagram.js"></script>
  ...
</head>
<body>
  ...
  <div id='dtd-diagram'></div>
  <input id='button' type='button' />
  ...
  <script type="text/javascript">
    DtdDiagram.auto_start = false;
    ...
    $('#button').on("click", function() {
      new DtdDiagram();
    };
  </script>
</body>

If you create your own diagram object before document ready, that will also suppress the auto-creation. This allows you to easily override default options. For example,

<script type="text/javascript" src="dtd-diagram.js"></script>
<script type="text/javascript">
  new DtdDiagram({
    duration: 5000,
  });
</script>

You can also set options on the <div> element, in the data-options attribute, in valid JSON format.

<div id='dtd-diagram'
     data-options='{"root_element": "back"}'>
</div>

You can get a list of all of the diagrams on a page from DtdDiagram.diagrams.

Options

FIXME: need to update this list.

There are various ways to set the options; in order of higher-to-lower precedence:

  • Pass them as an object to the DtdDiagram constructor function.
  • Set them on the @data-options attribute of the <div> element. Make sure they are in strictly valid JSON format.
  • Use the defaults

dtd_json_file

The DTD JSON file; default is "dtd.json".

root_element

The root element, by default, is read from the DTD file, but can be overridden. Default is null.

tag_doc_base

Used as the base URL for links from the element and attribute nodes to documentation. Default is "doc/#p=".

tag_doc_url

By default, this is not used. You can set this to a function that takes a Node object as an argument, and returns a string with the URL of the documentation page.

min_canvas_width, min_canvas_height

Initial value for the diagram's size.

group_separation

Ratio of the separation between groups to the separation between sibling nodes. By default, this is 1.4.

duration

Duration of the animation, in milliseconds. Default is 500.

rebase_handler

You can set this to a callback function that will be invoked whenever the user rebases the diagram.

Implementation

See Implementation.md

Credits / references

License

See LICENSE.txt.