diff --git a/lib/phantomscript.js b/lib/phantomscript.js index 12a73c6259..8e2a26f7a9 100644 --- a/lib/phantomscript.js +++ b/lib/phantomscript.js @@ -90,8 +90,9 @@ files.forEach(function(file) { }) oDOM = oParser.parseFromString(svgContent, "text/xml") - + resolveSVGElement(oDOM.firstChild) + setSVGStyle(oDOM.firstChild, options.css) // traverse the SVG, and replace all foreignObject elements // can be removed when https://github.com/knsv/mermaid/issues/58 is resolved @@ -184,6 +185,13 @@ function resolveSVGElement(element) { } } +function setSVGStyle(svg, css) { + if (!css || !svg) {return} + var styles=svg.getElementsByTagName('style'); + if (!styles || styles.length==0) { return } + styles[0].textContent = css; +} + function resolveForeignObjects(element) { return; var children diff --git a/package.json b/package.json index 7c53ef0eb0..fa5d22e924 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "dist-slim-mermaid": "node node_modules/browserify/bin/cmd.js src/mermaid.js -t babelify -s mermaid -o dist/mermaid.slim.js -x d3 && cat dist/mermaid.slim.js | node node_modules/uglifyjs/bin/uglifyjs -mc > dist/mermaid.slim.min.js", "dist-slim-mermaidAPI": "node node_modules/browserify/bin/cmd.js src/mermaidAPI.js -t babelify -s mermaidAPI -o dist/mermaidAPI.slim.js -x d3 && cat dist/mermaidAPI.slim.js | node node_modules/uglifyjs/bin/uglifyjs -mc > dist/mermaidAPI.slim.min.js", "dist-mermaid": "node node_modules/browserify/bin/cmd.js src/mermaid.js -t babelify -s mermaid -o dist/mermaid.js && cat dist/mermaid.js | node node_modules/uglifyjs/bin/uglifyjs -mc > dist/mermaid.min.js", - "dist-mermaid-nomin": "node node_modules/browserify/bin/cmd.js src/mermaid.js -t babelify -s mermaid -o dist/mermaid.js && node bin/mermaid -v -s testgitgraph.mm && testgitgraph.mm.svg", + "dist-mermaid-nomin": "node node_modules/browserify/bin/cmd.js src/mermaid.js -t babelify -s mermaid -o dist/mermaid.js", "dist-mermaidAPI": "node node_modules/browserify/bin/cmd.js src/mermaidAPI.js -t babelify -s mermaidAPI -o dist/mermaidAPI.js && cat dist/mermaidAPI.js | node node_modules/uglifyjs/bin/uglifyjs -mc > dist/mermaidAPI.min.js", "dist": "npm run dist-slim-mermaid && npm run dist-slim-mermaidAPI && npm run dist-mermaid && npm run dist-mermaidAPI" }, diff --git a/test/cli_test-samples.js b/test/cli_test-samples.js index c043f01b91..f3fb4f7cdc 100644 --- a/test/cli_test-samples.js +++ b/test/cli_test-samples.js @@ -6,11 +6,29 @@ var path = require('path') , rimraf = require('rimraf') var test_dir = 'test/fixtures/samples/'.replace('/',path.sep) +var phantomjs = 'node_modules/.bin/phantomjs '.replace('/',path.sep) +var load_html_save_screenshot_png_scripts = test_dir+path.sep+'load_html_save_screenshot_png.phantomjs' rimraf.sync(test_dir+'*.actual.*'); - + +function prepend_output_args(args) { + return '--outputDir=' + test_dir + ' --outputSuffix=.actual' + args +} + function exec_mermaid(args, verify) { - exec('bin/mermaid.js ' + args, + var cmd = 'bin/mermaid.js ' + args + exec_cmd(cmd, verify) +} + +function exec_phantomjs_to_load_html_save_screenshot_png(html, verify) { + var cmd = (phantomjs + ' ' + load_html_save_screenshot_png_scripts + + ' ' + html + ' ' + html + '.actual.png'); + exec_cmd(cmd, verify) +} + +function exec_cmd(cmd, verify) { + console.log('cmd: ', cmd) + exec(cmd, {env: {PATH: './node_modules/.bin'+path.delimiter+process.env.PATH}}, function(error, stdout, stderr) { console.log('error:',error,'\nstdout:\n',stdout,'\nstderr:\n',stderr); @@ -18,36 +36,38 @@ function exec_mermaid(args, verify) { }); } +function verify_no_error(t) { + return function(error, stdout, stderr) { + t.notOk(stderr, 'no error') + t.end() + } +} + +function verify_error(t) { + return function(error, stdout, stderr) { + t.ok(stderr, 'should get error') + t.end() + } +} + test('mermaid cli help', function(t) { t.plan(1); var args = [ '--help' ] - exec_mermaid(args.join(' '), function(error, stdout, stderr) { - t.notOk(stderr, 'no error') - t.end() - }); + exec_mermaid(args.join(' '), verify_no_error(t)); }); test('mermaid cli help', function(t) { t.plan(1); var args = [ '--badopt' ] - exec_mermaid(args.join(' '), function(error, stdout, stderr) { - t.ok(stderr, 'should get error') - t.end() - }); + exec_mermaid(args.join(' '), verify_error(t)); }); -//todo test.skip('sequence syntax error', function(t) { t.plan(1); var args = [ '--svg', - '--outputDir=' + test_dir, - '--outputSuffix=.actual', test_dir+'sequence_err.mmd' ] - exec_mermaid(args.join(' '), function(error, stdout, stderr) { - t.ok(stderr, 'should get error') - t.end() - }); + exec_mermaid(prepend_output_args(args.join(' ')), verify_no_error(t)); }); ['', 'fo', 'tspan', 'old'].forEach(function(textPlacement) { @@ -59,35 +79,63 @@ test.skip('sequence syntax error', function(t) { textPlacement ? '--sequenceConfig='+test_dir+'sequence_text_'+textPlacement+'.cfg' : '', test_dir+'sequence_text.mmd' ] - exec_mermaid(args.join(' '), function(error, stdout, stderr) { - t.notOk(stderr, 'no error') - t.end() - }); + exec_mermaid(args.join(' '), verify_no_error(t)); }) }); test('sequence png', function(t) { t.plan(1); var args = [ '--png', - '--outputDir=' + test_dir, - '--outputSuffix=.actual', test_dir+'sequence_text.mmd' ] - exec_mermaid(args.join(' '), function(error, stdout, stderr) { - t.notOk(stderr, 'no error') - t.end() - }); -}) + exec_mermaid(prepend_output_args(args.join(' ')), verify_no_error(t)); +}); test('flowchart svg text', function(t) { t.plan(1); var args = [ '--svg', - '--outputDir=' + test_dir, - '--outputSuffix=.actual', + '--css=dist/mermaid.css', + '--width=500', test_dir+'flowchart_text.mmd' ] - exec_mermaid(args.join(' '), function(error, stdout, stderr) { - t.notOk(stderr, 'no error') - t.end() - }); -}) + exec_mermaid(prepend_output_args(args.join(' ')), verify_no_error(t)); +}); + +['svg', 'png'].forEach(function(format) { + test('flowchart '+format+'text2', function(t) { + t.plan(1); + var args = [ '--'+format, + '--css=dist/mermaid.forest.css', + '--width=500', + test_dir+'flowchart_text2.mmd' + ] + exec_mermaid(prepend_output_args(args.join(' ')), verify_no_error(t)); +}) }); + + +test('gantt axis formatter svg', function(t) { + t.plan(1); + var args = [ '--svg', + '--css=dist/mermaid.css', + '--width=500', + '--ganttConfig='+test_dir+'gantt_axis_formatter.cfg', + test_dir+'gantt_axis_formatter.mmd' + ] + exec_mermaid(prepend_output_args(args.join(' ')), verify_no_error(t)); +}); + + +test('gitgraph sample svg', function(t) { + t.plan(1); + var args = [ '-s', '-v', + '--width=500', + test_dir+'gitgraph.mmd' + ] + exec_mermaid(prepend_output_args(args.join(' ')), verify_no_error(t)); +}); + +test('load sample.html in phantomjs and save screenshot png', function(t) { + t.plan(1); + exec_phantomjs_to_load_html_save_screenshot_png(test_dir+'samples.html', + verify_no_error(t)); +}); diff --git a/test/fixtures/samples/flowchart_text2.mmd b/test/fixtures/samples/flowchart_text2.mmd new file mode 100644 index 0000000000..e15c0415c6 --- /dev/null +++ b/test/fixtures/samples/flowchart_text2.mmd @@ -0,0 +1,5 @@ +graph TD; + A-->B; + A-->C; + B-->D; + C-->D; diff --git a/test/fixtures/samples/gantt_axis_formatter.cfg b/test/fixtures/samples/gantt_axis_formatter.cfg new file mode 100644 index 0000000000..37b6520845 --- /dev/null +++ b/test/fixtures/samples/gantt_axis_formatter.cfg @@ -0,0 +1,11 @@ +{ + "titleTopMargin":25, + "barHeight":20, + "barGap":4, + "topPadding":50, + "sidePadding":75, + "gridLineStartPadding":35, + "fontSize":11, + "numberSectionStyles":3, + "axisFormatter": [["%-m/%-d", "function (d){return d.getDay() == 1;}"]] +} diff --git a/test/fixtures/samples/gantt_axis_formatter.mmd b/test/fixtures/samples/gantt_axis_formatter.mmd new file mode 100644 index 0000000000..62e1ceba3f --- /dev/null +++ b/test/fixtures/samples/gantt_axis_formatter.mmd @@ -0,0 +1,8 @@ +gantt +dateFormat YYYY-MM-DD +title Adding GANTT diagram functionality to mermaid +section A section +Completed task :done, des1, 2014-01-06,2014-01-08 +Active task :active, des2, 2014-01-09, 3d +Future task : des3, after des2, 5d +Future task2 : des4, after des3, 5d diff --git a/testgitgraph.mm b/test/fixtures/samples/gitgraph.mmd similarity index 100% rename from testgitgraph.mm rename to test/fixtures/samples/gitgraph.mmd diff --git a/test/fixtures/samples/load_html_save_screenshot_png.phantomjs b/test/fixtures/samples/load_html_save_screenshot_png.phantomjs new file mode 100644 index 0000000000..bc5e7f988e --- /dev/null +++ b/test/fixtures/samples/load_html_save_screenshot_png.phantomjs @@ -0,0 +1,15 @@ +// usage: ../../../node_modules/.bin/phantomjs +var system = require('system'); +var html = system.args[1]; +var png = system.args[2]; +console.log('png:', png) +var page = require('webpage').create(), + loadInProgress = false, + fs = require('fs'); + +page.open(html); +page.onLoadFinished = function() { + loadInProgress = false; + page.render(png); + phantom.exit(); +} diff --git a/test/fixtures/samples/samples.html b/test/fixtures/samples/samples.html new file mode 100644 index 0000000000..ca0ccdafbc --- /dev/null +++ b/test/fixtures/samples/samples.html @@ -0,0 +1,103 @@ + + + + + + + + + +

flow chart

+ +
+graph TD + A[label] + B[very very very long long long long-long-long text] + A--test-->B +
+ +
+graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +
+ +

sequence diagram

+ +
+sequenceDiagram + participant A as actor + participant B as very very very long long long long-long-long text + A->>B: hi + B-->A: + B->>A: hello +
+ +

gantt chart

+ +
+gantt +dateFormat YYYY-MM-DD +title gantt chart +section A section +Completed task :done, des1, 2014-01-06,2014-01-08 +Active task :active, des2, 2014-01-09, 3d +Future task : des3, after des2, 5d +Future task2 : des4, after des3, 5d +
+ +

git graph

+ +
+gitGraph BT: +options +{ +"nodeSpacing": 150 +} +end + commit + branch newbranch + checkout newbranch + commit + commit + checkout master + commit + commit + merge newbranch + reset newbranch^^ + commit + commit +
+ + + +