dothtml 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e761c595a94b3bbafdbb7b7796ecc2b1f8a6690
4
- data.tar.gz: 2aa1330586afdd6bd045b35c29255ee70d0d3ddc
3
+ metadata.gz: 2b54d4c5977dab60f40ee0b8452e82d12da98864
4
+ data.tar.gz: fb18ac649d3d42f8b104e449661d5026f7b17f25
5
5
  SHA512:
6
- metadata.gz: 27d82f94a44ca6052014e949f6bd3dfaf3d3a2958c03ff71016a6ea9418b7f6ec27d84ccc5f2d888036651a461f2e73fe17e6a3380383b0599a2b2487e604df1
7
- data.tar.gz: dee8c3c7154326da5120f175e6e4be26a3c1821ae35f922aff673bb1ee6614bd1764a9a455c40b61c25526c606fc402a5f58df8a1c49fc474f7e0dcf807abef3
6
+ metadata.gz: 3767faa96b216468fa59661e58e52e51bb67c3727c57250205705e6c399d8d9733e4d5a3caa1286afd5b226f905ead7c3ef727c1ebc948b1136a15e541036d50
7
+ data.tar.gz: de96d861ff797facd40668c3ca8881484461ce46fff95cdf4d7edf7700e98ccb1b66ecdd3d69d29d14e86fe2c77d3dfcec8bc1d6404aa0c7cf3076756aa2a372
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ sample
data/CHANGELOG.md CHANGED
@@ -1,10 +1,23 @@
1
1
  # Change Log
2
2
 
3
- ## 0.0.3 - 2014-12-23
3
+ ## [Unreleased]
4
+
5
+
6
+ ## [0.1.0] - 2016-02-09
7
+ ### Added
8
+ - Rewritten CLI that supports subcommands build, create, and watch
9
+ - Detect/Add presence of outer `graph {}`
10
+ - Added minimal layout detection (neato vs dot)
11
+ - Added support for arbitrary cdn value
12
+
13
+ ### Removed
14
+ - Removed merging of id and class as class attribute is now supported by graphviz.
15
+
16
+ ## [0.0.3] - 2014-12-23
4
17
  ### Added
5
18
  - Rule to generate an svg file
6
19
 
7
- ## 0.0.2 - 2014-12-10
20
+ ## [0.0.2] - 2014-12-10
8
21
  ### Added
9
22
  - This CHANGELOG
10
23
  - Added behavior and style files. (no longer in template file)
@@ -22,3 +35,8 @@
22
35
  ### Remove
23
36
  - Removed embedding of svg images. Not ready for prime time yet.
24
37
  - Removed requirement on liquid gem. Default template now in erb.
38
+
39
+ [Unreleased]: https://github.com/kbrock/dothtml/compare/v0.1.0...HEAD
40
+ [0.2.0]: https://github.com/kbrock/dothtml/compare/v0.0.3...v0.1.0
41
+ [0.0.3]: https://github.com/kbrock/dothtml/compare/v0.0.2...v0.0.3
42
+ [0.0.2]: https://github.com/kbrock/dothtml/compare/v0.0.1...v0.0.2
data/README.md CHANGED
@@ -4,38 +4,34 @@ Graphviz is a great visualization tool for coding digraphs.
4
4
 
5
5
  d3 is a great tool for dynamic html presentations.
6
6
 
7
- This tool:
8
-
9
- - converts graphviz dot files into html.
10
- - provides sample guard file
11
- - Rake tasks
12
- - hacks class attributes to embed into html file
13
- - embeds style into html file
14
-
15
- TODO:
16
- - add radio button for class association
17
- - embed external svg images into html file
18
-
7
+ Dothtml will convert your Graphviz dot files to nicely formatted html files.
8
+ It can convert them on-demand, or it can constantly convert them as you develop,
9
+ using a simple [Guard](http://guardgem.org/) process.
19
10
 
20
11
  ## Installation
21
12
 
22
- Add this line to your application's Gemfile:
23
-
24
- ```ruby
25
- gem 'dothtml'
13
+ ```
14
+ gem install dothtml
26
15
  ```
27
16
 
28
- And then execute:
17
+ ## Usage
29
18
 
30
- $ bundle
19
+ When starting a project for the first time, just call `dothtml create` with
20
+ a new directory name. Dothtml will create the directory with a sample.dot file,
21
+ and then `git init` the directory.
31
22
 
32
- Or install it yourself as:
23
+ Edit the sample.dot file, or just copy it with a new name, and then call
24
+ `dothtml build`. That's it! Dothtml has created the .html files.
33
25
 
34
- $ gem install dothtml
26
+ You can then monitor your live changes to the dot files with `dothtml watch`,
27
+ which will start a Guard process to monitor them. Change your dot files, and
28
+ they will be built into .html files upon saving.
35
29
 
36
- ## Usage
30
+ Once the Guard process has started, you can also open the .html files in your
31
+ browser and automatically have then reload with the
32
+ [LiveReload browser extension](http://livereload.com/extensions/).
37
33
 
38
- TODO: Write usage instructions here
34
+ You can get more information on the command line with `dothtml --help`
39
35
 
40
36
  ## Similar Projects
41
37
 
@@ -43,9 +39,14 @@ TODO: Write usage instructions here
43
39
  - https://github.com/kui/octopress-graphviz
44
40
  - https://github.com/glejeune/Ruby-Graphviz
45
41
 
42
+ ## TODO
43
+
44
+ - Add radio button for class association
45
+ - Embed external svg images into html file
46
+
46
47
  ## Contributing
47
48
 
48
- 1. Fork it ( https://github.com/[my-github-username]/dothtml/fork )
49
+ 1. Fork it ( https://github.com/kbrock/dothtml/fork )
49
50
  2. Create your feature branch (`git checkout -b my-new-feature`)
50
51
  3. Commit your changes (`git commit -am 'Add some feature'`)
51
52
  4. Push to the branch (`git push origin my-new-feature`)
data/dothtml.gemspec CHANGED
@@ -9,18 +9,29 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Keenan Brock"]
10
10
  spec.email = ["keenan@thebrocks.net"]
11
11
  spec.summary = %q{Make conversion of dot to html easier}
12
- spec.description = %q{Make conversion of dot to html easier}
12
+ spec.description = <<-DESCRIPTION
13
+ In a world, full of html, and javascript,
14
+ there can exist only one graphing library.
15
+ But there still is hope in trusty graphviz.
16
+
17
+ This makes the conversion of dot to html
18
+ and d3js easier.
19
+ DESCRIPTION
13
20
  spec.homepage = "http://github.com/kbrock/dothtml"
14
21
  spec.license = "MIT"
15
22
 
16
23
  spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
24
+ spec.bindir = 'exe'
25
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
26
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
27
  spec.require_paths = ["lib"]
20
28
 
21
- spec.add_dependency 'guard'
22
- spec.add_dependency 'guard-rake'
23
29
  spec.add_dependency 'nokogiri'
30
+ spec.add_dependency 'trollop'
31
+ spec.add_dependency 'colorize'
32
+ spec.add_dependency 'guard'
33
+ spec.add_dependency 'guard-shell'
34
+ spec.add_dependency 'guard-livereload'
24
35
  # possibly remove this
25
36
  spec.add_dependency 'tilt'
26
37
 
data/exe/dothtml ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+
5
+ $LOAD_PATH << File.expand_path("../lib", __dir__)
6
+ require 'dothtml'
7
+ require 'dothtml/cli'
8
+ Dothtml::CLI.new(ARGV).execute
data/lib/dothtml.rb CHANGED
@@ -1,5 +1,5 @@
1
- require "dothtml/version"
1
+ require 'dothtml/version'
2
2
 
3
3
  module Dothtml
4
- # Your code goes here...
4
+ TEMPLATES_DIR = File.expand_path("../templates", __dir__).freeze
5
5
  end
@@ -0,0 +1,129 @@
1
+ require 'trollop'
2
+ require 'dothtml/dot_task'
3
+
4
+ module Dothtml
5
+ class CLI
6
+ VERSION_STRING = "dothtml #{Dothtml::VERSION}"
7
+
8
+ COMMANDS = {
9
+ "build" => {
10
+ "usage" => "build [dotfile]",
11
+ "synopsis" => <<-EOS
12
+ Builds the specified dotfile (or all .dot files, if not specified)
13
+ into .svg and .html files. This is the default command if nothing
14
+ is specified on the command line.
15
+ EOS
16
+ },
17
+ "create" => {
18
+ "usage" => "create <dir>",
19
+ "synopsis" => <<-EOS
20
+ Generates a new Dothtml repo at the indicated dir.
21
+ EOS
22
+ },
23
+ "watch" => {
24
+ "usage" => "watch",
25
+ "synopsis" => <<-EOS
26
+ Starts a guard process, which automatically does a build as .dot
27
+ files are changed.
28
+ EOS
29
+ },
30
+ }
31
+
32
+ COMMAND_NAMES = COMMANDS.keys + %w(version help)
33
+ DEFAULT_COMMAND = "build"
34
+
35
+ attr_reader :args
36
+
37
+ def initialize(args)
38
+ @args = args
39
+ end
40
+
41
+ def execute
42
+ parse_global_options
43
+ parse_command_options
44
+ execute_command
45
+ end
46
+
47
+ private
48
+
49
+ attr_accessor :command
50
+
51
+ def parse_global_options
52
+ global_synopsis_parts = COMMANDS.each_value.flat_map do |v|
53
+ [indent(v["usage"], 1), indent(v["synopsis"], 2)]
54
+ end
55
+ global_synopsis = "\nCommands:\n#{global_synopsis_parts.join("\n")}".chomp
56
+
57
+ Trollop.options(args) do
58
+ version VERSION_STRING
59
+ usage "<command> [command_options]"
60
+ synopsis global_synopsis
61
+ stop_on COMMAND_NAMES
62
+ end
63
+ end
64
+
65
+ def parse_command_options
66
+ self.command = (args.shift || DEFAULT_COMMAND).downcase
67
+ Trollop.die "invalid command, '#{command}'" unless COMMAND_NAMES.include?(command)
68
+ return unless COMMANDS.key?(command)
69
+
70
+ command_options = COMMANDS[command]
71
+ command_synopsis = "\n#{indent(command_options["synopsis"], 1)}".chomp
72
+
73
+ Trollop.options(args) do
74
+ version VERSION_STRING
75
+ usage command_options["usage"]
76
+ synopsis command_synopsis
77
+ end
78
+ end
79
+
80
+ def indent(string, amount)
81
+ prefix = " " * amount
82
+ string.lines.map { |l| "#{prefix}#{l}" }.join
83
+ end
84
+
85
+ #
86
+ # Command handlers
87
+ #
88
+
89
+ def execute_command
90
+ send("#{command}_command")
91
+ end
92
+
93
+ def build_command
94
+ files =
95
+ if args.empty?
96
+ Dir.glob("*.dot").sort
97
+ else
98
+ args.select { |a| a.end_with?(".dot") }
99
+ end
100
+
101
+ DotTask.new.build(files)
102
+ end
103
+
104
+ def create_command
105
+ dir = args.shift
106
+ Trollop.die "dir not specified" if dir.nil?
107
+
108
+ DotTask.new.create(dir)
109
+ end
110
+
111
+ def watch_command
112
+ guardfile = File.join(TEMPLATES_DIR, "Guardfile")
113
+ env = {
114
+ "DOTHTML_PATH" => File.expand_path($0),
115
+ "BUNDLE_GEMFILE" => File.expand_path("../../Gemfile", __dir__)
116
+ }
117
+ exec(env, "bundle exec guard -G #{guardfile}")
118
+ end
119
+
120
+ def version_command
121
+ puts VERSION_STRING
122
+ exit 0
123
+ end
124
+
125
+ def help_command
126
+ Trollop.educate
127
+ end
128
+ end
129
+ end
@@ -4,6 +4,9 @@ require 'set'
4
4
  require 'open3'
5
5
 
6
6
  class DotHelper
7
+ GRAPH_REGEX = /\b(?:di)?graph\b[^\[]*\{/mi
8
+ DOT_REGEX = /->/
9
+
7
10
  def initialize(svg_contents)
8
11
  @svg_contents = svg_contents
9
12
  end
@@ -16,9 +19,21 @@ class DotHelper
16
19
  @dom ||= parse_dom(@svg_contents)
17
20
  end
18
21
 
22
+ # return the list of choices provided for a user
23
+ #
24
+ # these choices are displayed to modify the data
25
+ # on the page
26
+ #
27
+ # this will add a body css class and trigger a data
28
+ # event for d3js
19
29
  def extractChoices
20
30
  end
21
31
 
32
+ # return true if the nodes have descripions?
33
+ #
34
+ # This will create a div box where descriptions
35
+ # can be displayed
36
+ #
22
37
  def descriptions?
23
38
  #dom.css("")
24
39
  end
@@ -27,7 +42,9 @@ class DotHelper
27
42
  dom.css("title").first.content()
28
43
  end
29
44
 
30
- # this currently has too many limitations
45
+ # Embed svg image links directly into the document
46
+ #
47
+ # this currently has too many issues
31
48
  # working on making this more friendly
32
49
  # assume unique list of filenames
33
50
  def images
@@ -67,34 +84,23 @@ class DotHelper
67
84
  end
68
85
  end
69
86
 
70
- def merge_id_class(old_id, old_class)
71
- new_id, new_class = extract_id_class(old_id)
72
- [new_id, [old_class, new_class].compact.join(" ")]
73
- end
74
-
75
- # some nodes are of the form <div id="x1 class='other'" class="c1">
76
- # assume (class= is present)
77
- def fix_node_id(node)
78
- new_id, new_class = merge_id_class(node["id"], node["class"])
79
- node["id"] = new_id
80
- node["class"] = new_class
81
- node
82
- end
83
-
84
87
  def embed_images
85
- dom.at("svg").children.before(images)
88
+ node.children.before(images)
86
89
  self
87
90
  end
88
91
 
89
- def fix_ids
90
- dom.xpath("//*[contains(@id,'class=')]").each { |n| fix_node_id(n) }
92
+ def remove_comments
93
+ dom.xpath('//comment()').each { |comment| comment.remove }
91
94
  self
92
95
  end
93
96
 
97
+ def node
98
+ dom.at("svg")
99
+ end
94
100
 
95
101
  # uses a fragment to remove extra xml declarations
96
102
  def to_xml
97
- dom.at("svg").to_xml
103
+ node.to_xml
98
104
  end
99
105
 
100
106
  def write(file_name, template_name, locals)
@@ -105,12 +111,36 @@ class DotHelper
105
111
  new(svg_from_dot(File.read(filename)))
106
112
  end
107
113
 
108
- def self.from_dot(contents)
109
- new(svg_from_dot(contents))
114
+ def self.detect_language(contents, language = nil)
115
+ language || ((contents =~ DOT_REGEX) ? 'dot' : 'neato')
116
+ end
117
+
118
+ def self.enhance(contents, language)
119
+ if contents =~ GRAPH_REGEX
120
+ contents
121
+ elsif language == 'dot'
122
+ <<-GRAPH
123
+ digraph {
124
+ #{contents}
125
+ }
126
+ GRAPH
127
+ else
128
+ <<-GRAPH
129
+ graph {
130
+ #{contents}
131
+ }
132
+ GRAPH
133
+ end
134
+ end
135
+
136
+ def self.from_dot(contents, language = 'dot')
137
+ language = detect_language(contents, language)
138
+ contents = enhance(contents, language)
139
+ new(svg_from_dot(contents, language))
110
140
  end
111
141
 
112
- def self.svg_from_dot(contents)
113
- Open3.popen3('dot -Tsvg') do |stdin, stdout, stderr|
142
+ def self.svg_from_dot(contents, language = 'dot')
143
+ Open3.popen3("#{language} -Tsvg") do |stdin, stdout, stderr|
114
144
  stdout.binmode
115
145
  stdin.print contents
116
146
  stdin.close
@@ -1,78 +1,106 @@
1
- require 'rake'
2
- require 'rake/tasklib'
3
- require_relative 'dot_helper'
1
+ require 'dothtml/dot_helper'
4
2
 
5
3
  module Dothtml
6
- class DotTask < Rake::TaskLib
4
+ class DotTask
7
5
  attr_accessor :template
8
6
  attr_accessor :style
9
7
  attr_accessor :behavior
10
8
  attr_accessor :cdn
11
9
  attr_accessor :d3js
12
10
 
13
- attr_accessor :dot_folder
14
- attr_accessor :html_folder
15
-
16
- def initialize(name = :dot)
17
- templates = File.expand_path(File.join(File.dirname(__FILE__), "..", "..","templates"))
18
- @name = name
19
- @style = File.join(templates, 'style.css')
20
- @behavior = File.join(templates, 'behavior.js')
21
- @template = File.join(templates, 'index.html.erb')
11
+ def initialize
12
+ @style = File.join(TEMPLATES_DIR, 'style.css')
13
+ @behavior = File.join(TEMPLATES_DIR, 'behavior.js')
14
+ @template = File.join(TEMPLATES_DIR, 'index.html.erb')
22
15
  self.cdn = true
23
16
  yield self if block_given?
24
- define
25
17
  end
26
18
 
27
19
  def cdn=(val)
28
- @d3js = val ? "//cdnjs.cloudflare.com/ajax/libs/d3/3.4.13/d3.min.js" : "d3.v3.js"
20
+ @cdn = val
21
+ @d3js = case val
22
+ when true then "//cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"
23
+ when false then "d3.v3.js"
24
+ else val
25
+ end
29
26
  end
30
27
 
31
- def define
32
- desc "convert dot file into an html file"
33
- task :dot_html, [:src, :target] do |t, params|
34
- source = params[:src]
35
- target = params[:target]
36
-
37
- puts "#{source} -> #{target}"
38
-
39
- doc = DotHelper.from_dotfile(source).fix_ids#.embed_images
40
- doc.write target, @template,
41
- title: doc.extractTitle,
42
- body: doc.to_xml,
43
- choices: doc.extractChoices,
44
- descriptions: doc.descriptions?,
45
- style: File.read(style),
46
- behavior: File.read(behavior),
47
- d3js: d3js
28
+ def build(*files)
29
+ files.flatten.each do |f|
30
+ dot_to_svg(f)
31
+ dot_to_html(f)
48
32
  end
33
+ end
49
34
 
50
- desc "convert dot file into an svg file"
51
- task :dot_svg, [:src, :target] do |t, params|
52
- source = params[:src]
53
- target = params[:target]
54
-
55
- puts "#{source} -> #{target}"
35
+ def create(dir)
36
+ require 'colorize'
56
37
 
57
- doc = DotHelper.from_dotfile(source).fix_ids#.embed_images
58
- File.write(target, doc.to_xml)
38
+ if Dir.exists?(dir)
39
+ say_status(:exists, dir)
40
+ else
41
+ FileUtils.mkdir_p(dir)
42
+ say_status(:create, dir)
59
43
  end
60
44
 
61
- rule '.html' => [".dot", style, template, behavior] do |t|
62
- Rake::Task["dot_html"].execute(:target => t.name, :src => t.source)
63
- Rake::Task["refresh_browser"].invoke
45
+ sample = File.join(dir, "sample.dot")
46
+ if File.exists?(sample)
47
+ say_status(:exists, sample)
48
+ else
49
+ sample_source = File.join(TEMPLATES_DIR, "sample.dot")
50
+ FileUtils.cp(sample_source, sample)
51
+ say_status(:create, sample)
64
52
  end
65
53
 
66
- rule '.svg' => [".dot"] do |t|
67
- Rake::Task["dot_svg"].execute(:target => t.name, :src => t.source)
54
+ gitignore = File.join(dir, ".gitignore")
55
+ if File.exists?(gitignore)
56
+ say_status(:exists, gitignore)
57
+ else
58
+ File.write(gitignore, "*.html\n*.svg")
59
+ say_status(:create, gitignore)
68
60
  end
69
61
 
70
- #TODO find proper tab, offer non chrome options
71
- desc "use applescript to refresh front most window in chrome"
72
- task :refresh_browser do
73
- puts "refreshing browser"
74
- `osascript -e 'tell application "Google Chrome" to tell the active tab of its first window to reload'`
62
+ git_dir = File.join(dir, ".git")
63
+ if Dir.exists?(git_dir)
64
+ say_status(:exists, git_dir)
65
+ else
66
+ system("git init", :chdir => dir)
75
67
  end
76
68
  end
69
+
70
+ private
71
+
72
+ def dot_to_html(source)
73
+ target = source.sub(/.dot$/, ".html")
74
+ puts "#{source} -> #{target}"
75
+
76
+ doc = DotHelper.from_dotfile(source)#.embed_images
77
+ doc.write target, @template,
78
+ title: doc.extractTitle,
79
+ body: doc.to_xml,
80
+ choices: doc.extractChoices,
81
+ descriptions: doc.descriptions?,
82
+ style: File.read(style),
83
+ behavior: File.read(behavior),
84
+ d3js: d3js
85
+ end
86
+
87
+ def dot_to_svg(source)
88
+ target = source.sub(/.dot$/, ".svg")
89
+ puts "#{source} -> #{target}"
90
+
91
+ doc = DotHelper.from_dotfile(source)#.embed_images
92
+ File.write(target, doc.to_xml)
93
+ end
94
+
95
+ def say_status(mode, text)
96
+ mode_text =
97
+ case mode
98
+ when :exists then mode.to_s.yellow.bold
99
+ when :create then mode.to_s.green.bold
100
+ else mode.to_s.bold
101
+ end
102
+
103
+ puts "\t#{mode_text}\t#{text}"
104
+ end
77
105
  end
78
106
  end
@@ -1,3 +1,3 @@
1
1
  module Dothtml
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
data/templates/Guardfile CHANGED
@@ -1,6 +1,10 @@
1
- guard 'rake', :task => :html do
2
- watch(/.dot$/)
3
- #watch('index.html.erb')
4
- #watch('style.css')
5
- #watch('behavior.js')
1
+ guard :shell do
2
+ watch(/.dot$/) do |m|
3
+ dothtml_path = ENV["DOTHTML_PATH"] || "dothtml"
4
+ system("#{dothtml_path} build #{m.join(" ")}")
5
+ end
6
+ end
7
+
8
+ guard :livereload do
9
+ watch(/.html$/)
6
10
  end
@@ -0,0 +1,13 @@
1
+ digraph Sample {
2
+ graph [ fontname="Helvetica-Bold" ]
3
+ node [ id="\N" shape="Mrecord" style="filled" fontname="Helvetica" fillcolor="#ffffff" penwidth="2" ]
4
+ edge [ arrowsize="0.5" fontname="Helvetica" ]
5
+
6
+ label="Sample"
7
+ style="rounded"
8
+
9
+ object1 -> object2
10
+ object1 -> object3
11
+ object2 -> object4 [style="dotted"]
12
+ object3 -> object4 [style="dashed"]
13
+ }
@@ -5,46 +5,6 @@ class TestDotHelper < Minitest::Test
5
5
  DotHelper.new contents
6
6
  end
7
7
 
8
- def test_extract_id_class_with_id
9
- assert_equal ["x1"], dot_helper.extract_id_class("x1")
10
- end
11
-
12
- def test_extract_id_class_with_class_eq
13
- assert_equal ["", "x1"], dot_helper.extract_id_class("class=x1")
14
- end
15
-
16
- def test_extract_id_class_with_id_class_eq
17
- assert_equal ["x1", "c1"], dot_helper.extract_id_class("x1 class=c1")
18
- end
19
-
20
- def test_extract_id_class_with_id_class_eq_quote
21
- assert_equal ["x1", "c1"], dot_helper.extract_id_class("x1 class='c1'")
22
- end
23
-
24
- def test_extract_id_class_with_id_class_eq_dbl_quote
25
- assert_equal ["x1", "c1"], dot_helper.extract_id_class('x1 class="c1"')
26
- end
27
-
28
- def test_merge_id_class_with_id_class_eq_and_class
29
- assert_equal ["x1", "c0 c1"], dot_helper.merge_id_class('x1 class="c1"', "c0")
30
- end
31
-
32
- def test_merge_id_class_with_id_multi_class_eq_and_class
33
- assert_equal ["x1", "c0 c1 c2"], dot_helper.merge_id_class('x1 class="c1 c2"', "c0")
34
- end
35
-
36
- def test_fix_node_id_with_id_class_eq_and_class
37
- node = dot_helper.fix_node_id(dom(%{<x><div id="x1 class=c1"></div></x>}, "div"))
38
- assert_equal "x1", node["id"]
39
- assert_equal "c1", node["class"]
40
- end
41
-
42
- def test_fix_ids
43
- node = dot_helper(%{<x><div id="x1 class=c1" class="c0"></div></x>}).fix_ids.dom
44
- assert_equal "x1", node.at("div")["id"]
45
- assert_equal "c0 c1", node.at("div")["class"]
46
- end
47
-
48
8
  private
49
9
 
50
10
  def dom(contents, at=nil)
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dothtml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keenan Brock
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2015-03-11 00:00:00.000000000 Z
11
+ date: 2016-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: colorize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: guard
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -25,7 +67,7 @@ dependencies:
25
67
  - !ruby/object:Gem::Version
26
68
  version: '0'
27
69
  - !ruby/object:Gem::Dependency
28
- name: guard-rake
70
+ name: guard-shell
29
71
  requirement: !ruby/object:Gem::Requirement
30
72
  requirements:
31
73
  - - ">="
@@ -39,7 +81,7 @@ dependencies:
39
81
  - !ruby/object:Gem::Version
40
82
  version: '0'
41
83
  - !ruby/object:Gem::Dependency
42
- name: nokogiri
84
+ name: guard-livereload
43
85
  requirement: !ruby/object:Gem::Requirement
44
86
  requirements:
45
87
  - - ">="
@@ -108,7 +150,13 @@ dependencies:
108
150
  - - ">="
109
151
  - !ruby/object:Gem::Version
110
152
  version: '0'
111
- description: Make conversion of dot to html easier
153
+ description: |2
154
+ In a world, full of html, and javascript,
155
+ there can exist only one graphing library.
156
+ But there still is hope in trusty graphviz.
157
+
158
+ This makes the conversion of dot to html
159
+ and d3js easier.
112
160
  email:
113
161
  - keenan@thebrocks.net
114
162
  executables:
@@ -123,18 +171,18 @@ files:
123
171
  - LICENSE.txt
124
172
  - README.md
125
173
  - Rakefile
126
- - bin/dothtml
127
174
  - dothtml.gemspec
175
+ - exe/dothtml
128
176
  - lib/dothtml.rb
177
+ - lib/dothtml/cli.rb
129
178
  - lib/dothtml/dot_helper.rb
130
179
  - lib/dothtml/dot_task.rb
131
180
  - lib/dothtml/version.rb
132
- - templates/Gemfile
133
181
  - templates/Guardfile
134
- - templates/Rakefile
135
182
  - templates/behavior.js
136
183
  - templates/d3.v3.js
137
184
  - templates/index.html.erb
185
+ - templates/sample.dot
138
186
  - templates/style.css
139
187
  - test/minitest_helper.rb
140
188
  - test/test_dot_helper.rb
@@ -160,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
208
  version: '0'
161
209
  requirements: []
162
210
  rubyforge_project:
163
- rubygems_version: 2.0.14
211
+ rubygems_version: 2.4.5
164
212
  signing_key:
165
213
  specification_version: 4
166
214
  summary: Make conversion of dot to html easier
data/bin/dothtml DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'dothtml'
data/templates/Gemfile DELETED
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- group "diagram" do
4
- gem 'dothtml'
5
- end
data/templates/Rakefile DELETED
@@ -1,23 +0,0 @@
1
-
2
- # Rakefile to build dot files
3
- # dependencies:
4
- # mac
5
- # graphviz to convert dot files to svg
6
-
7
- require "dothtml/dot_task"
8
-
9
- Dothtml::DotTask.new do |t|
10
- #t.cdn = true
11
- #t.template = 'index.html.liquid'
12
- #t.style = 'style.css'
13
- #t.behavior = 'behavior.js'
14
- end
15
-
16
- task :default => :html
17
-
18
- #task :html => %w(file1.html file2.html)
19
- task :html do
20
- Dir.glob("*.dot").each do |f|
21
- Rake::Task[f.sub(/\.dot$/, '.html')].invoke
22
- end
23
- end