diff --git a/.project b/.project new file mode 100644 index 0000000..767334d --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + graphxq + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 2eaf60f..63a2408 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -graphxq -======= +# graphxq - interface to graphviz for BaseX 7.5 -Basex restxq interface for Graphviz \ No newline at end of file +* includes dotML +* BaseX RestXQ interface diff --git a/build/deploy b/build/deploy new file mode 100755 index 0000000..6f8df8f --- /dev/null +++ b/build/deploy @@ -0,0 +1,3 @@ +#/bin/sh +cp -r src/* /home/andy/usr/basex/webapp/ +echo copied to /home/andy/usr/basex/webapp/ diff --git a/build/deploy-remote b/build/deploy-remote new file mode 100755 index 0000000..7f5f1e2 --- /dev/null +++ b/build/deploy-remote @@ -0,0 +1,4 @@ + +rsync --verbose --progress --stats --compress \ + --recursive --times --perms --links --delete \ + src/* basex@velvet:~/webapp diff --git a/src/graphxq.xqm b/src/graphxq.xqm new file mode 100644 index 0000000..fc9856d --- /dev/null +++ b/src/graphxq.xqm @@ -0,0 +1,117 @@ +(:~ +: restxq interface to graphviz +: @author andy bunce +: @since sept 2012 +:) + +module namespace grxq = 'apb.graphviz.web'; +declare default function namespace 'apb.graphviz.web'; +import module namespace gr = 'apb.graphviz' at "graphxq/graphviz.xqm"; +declare namespace rest = 'http://exquery.org/ns/restxq'; + +declare +%rest:GET %rest:path("graphxq") +%output:method("html5") +%rest:form-param("dot","{$dot}","") +%rest:form-param("url","{$url}") +function graphxq($dot,$url) { + let $edot:=if($url) then "" else fn:encode-for-uri($dot) + let $dot2:=getdot($dot,$url) + let $svg:=get-svg($dot) + return + + Graphviz + + + + + + + +

RestXQ interface to graphviz

+

Enter a string in the dot language + Examples: digraph {{ a -> b}}, + another + .

+

Or enter a Url to a xml document examples: + process, + hedgeweb + remote +

+
+ + + +

+

Or enter the url to a node XML source +

+ +
+

Inline SVG

+
{$svg}
+ +

Object referencing svg, + ( download svg)

+ + SVG Here + +

SVG xml

+
+		 {fn:serialize($svg)}
+		 
+ + +

Layout xml

+ +

About

+

Source: @github:, Twitter: + Tweet +. +

+ + +}; + +(:~ @return svg for hedge with download option. +:) +declare +%rest:GET %rest:path("graphxq/svg") +%rest:form-param("dot","{$dot}") +%rest:form-param("url","{$url}") +%rest:form-param("dl","{$dl}") +function graphxq-svg($dot,$url,$dl) { + let $dot2:=getdot($dot,$url) + let $svg:=get-svg($dot2) + let $down:= + + + + + return ($down[$dl],$svg) +}; + +(:~ use dot or url :) +declare %private function getdot($dot,$url) as xs:string{ + if($url) then + try{fn:unparsed-text(fn:resolve-uri($url))} catch * { "digraph {{ failed to load remote }}" } +else + $dot +}; +(:~ post process svg :) +declare %private function get-svg($dot as xs:string) as node(){ + let $svgx:=gr:dot($dot,()) + return gr:autosize($svgx) +}; \ No newline at end of file diff --git a/src/graphxq/dotml/.svn/all-wcprops b/src/graphxq/dotml/.svn/all-wcprops new file mode 100644 index 0000000..b58391e --- /dev/null +++ b/src/graphxq/dotml/.svn/all-wcprops @@ -0,0 +1,23 @@ +K 25 +svn:wc:ra_dav:version-url +V 39 +/apb/haveli/svn/!svn/ver/22/trunk/dotml +END +filters.svg +K 25 +svn:wc:ra_dav:version-url +V 51 +/apb/haveli/svn/!svn/ver/22/trunk/dotml/filters.svg +END +dotpatch.xsl +K 25 +svn:wc:ra_dav:version-url +V 52 +/apb/haveli/svn/!svn/ver/22/trunk/dotml/dotpatch.xsl +END +dotml2dot.xsl +K 25 +svn:wc:ra_dav:version-url +V 53 +/apb/haveli/svn/!svn/ver/22/trunk/dotml/dotml2dot.xsl +END diff --git a/src/graphxq/dotml/.svn/entries b/src/graphxq/dotml/.svn/entries new file mode 100644 index 0000000..64ba7c7 --- /dev/null +++ b/src/graphxq/dotml/.svn/entries @@ -0,0 +1,130 @@ +10 + +dir +31 +https://free1.projectlocker.com/apb/haveli/svn/trunk/dotml +https://free1.projectlocker.com/apb/haveli/svn + + + +2010-05-05T15:00:02.461415Z +22 +bunce.andy@gmail.com + + + + + + + + + + + + + + +fcc18bc9-29a6-4af3-8859-6d999b9301f9 + +filters.svg +file + + + + +2011-03-06T15:01:30.000000Z +e224c2cb06bf5c56caeeddf5198c6015 +2010-05-05T15:00:02.461415Z +22 +bunce.andy@gmail.com +has-props + + + + + + + + + + + + + + + + + + + + +4263 + +dotpatch.xsl +file + + + + +2011-03-06T15:01:30.000000Z +51115836e92588473c2f056c013f94ab +2010-05-05T15:00:02.461415Z +22 +bunce.andy@gmail.com +has-props + + + + + + + + + + + + + + + + + + + + +6390 + +dotml2dot.xsl +file + + + + +2011-03-06T15:01:30.000000Z +42b23cbb9e04cae1e8eaa28ca39228da +2010-05-05T15:00:02.461415Z +22 +bunce.andy@gmail.com +has-props + + + + + + + + + + + + + + + + + + + + +5556 + diff --git a/src/graphxq/dotml/.svn/prop-base/dotml2dot.xsl.svn-base b/src/graphxq/dotml/.svn/prop-base/dotml2dot.xsl.svn-base new file mode 100644 index 0000000..960cb9e --- /dev/null +++ b/src/graphxq/dotml/.svn/prop-base/dotml2dot.xsl.svn-base @@ -0,0 +1,5 @@ +K 12 +svn:keywords +V 23 +Id Date Author HeadURL +END diff --git a/src/graphxq/dotml/.svn/prop-base/dotpatch.xsl.svn-base b/src/graphxq/dotml/.svn/prop-base/dotpatch.xsl.svn-base new file mode 100644 index 0000000..960cb9e --- /dev/null +++ b/src/graphxq/dotml/.svn/prop-base/dotpatch.xsl.svn-base @@ -0,0 +1,5 @@ +K 12 +svn:keywords +V 23 +Id Date Author HeadURL +END diff --git a/src/graphxq/dotml/.svn/prop-base/filters.svg.svn-base b/src/graphxq/dotml/.svn/prop-base/filters.svg.svn-base new file mode 100644 index 0000000..960cb9e --- /dev/null +++ b/src/graphxq/dotml/.svn/prop-base/filters.svg.svn-base @@ -0,0 +1,5 @@ +K 12 +svn:keywords +V 23 +Id Date Author HeadURL +END diff --git a/src/graphxq/dotml/.svn/text-base/dotml2dot.xsl.svn-base b/src/graphxq/dotml/.svn/text-base/dotml2dot.xsl.svn-base new file mode 100644 index 0000000..46a261e --- /dev/null +++ b/src/graphxq/dotml/.svn/text-base/dotml2dot.xsl.svn-base @@ -0,0 +1,83 @@ + + + + + bgcolor fontcolor fontname fontsize label margin nodesep rankdir ranksep ratio size + bgcolor color fillcolor fontcolor fontname fontsize label labeljust labelloc style + color fillcolor fixedsize fontcolor fontname fontsize height shape style URL width + color fillcolor fontcolor fontname fontsize height style URL width + arrowhead arrowsize arrowtail constraint color decorate dir fontcolor fontname fontsize headlabel headport label labeldistance labelfloat labelfontcolor labelfontname labelfontsize minlen samehead sametail style taillabel tailport URL + + + + + + digraph g {compound="true"; + + + + } +<dot-filename></dot-filename> + + subgraph sub_graph_{rank="";} + subgraph cluster_{ + + + + } + node[label=" + + + + + + + ", + + + ] {}; + edge[ + + + lhead="cluster_ + ",ltail="cluster_ + "] struct: + -> struct: + ; + node[shape="record",label="", + + + ]{struct}; + {} | + + <> + + + + + + + + | + + + + + + + ="" + + + ="" + + + + + + + + diff --git a/src/graphxq/dotml/.svn/text-base/dotpatch.xsl.svn-base b/src/graphxq/dotml/.svn/text-base/dotpatch.xsl.svn-base new file mode 100644 index 0000000..ebbea92 --- /dev/null +++ b/src/graphxq/dotml/.svn/text-base/dotpatch.xsl.svn-base @@ -0,0 +1,120 @@ + + + + + MyFilter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Produces a 3D lighting effect suitable for pies and lines + + + + + + + + + + + + + + Simple blurred shadow (ideal for headings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/graphxq/dotml/.svn/text-base/filters.svg.svn-base b/src/graphxq/dotml/.svn/text-base/filters.svg.svn-base new file mode 100644 index 0000000..5fc5a5c --- /dev/null +++ b/src/graphxq/dotml/.svn/text-base/filters.svg.svn-base @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Produces a 3D lighting effect suitable for pies and lines + + + + + + + + + + + + + + Simple blurred shadow (ideal for headings) + + + + + + + + diff --git a/src/graphxq/dotml/dotml2dot.xsl b/src/graphxq/dotml/dotml2dot.xsl new file mode 100644 index 0000000..46a261e --- /dev/null +++ b/src/graphxq/dotml/dotml2dot.xsl @@ -0,0 +1,83 @@ + + + + + bgcolor fontcolor fontname fontsize label margin nodesep rankdir ranksep ratio size + bgcolor color fillcolor fontcolor fontname fontsize label labeljust labelloc style + color fillcolor fixedsize fontcolor fontname fontsize height shape style URL width + color fillcolor fontcolor fontname fontsize height style URL width + arrowhead arrowsize arrowtail constraint color decorate dir fontcolor fontname fontsize headlabel headport label labeldistance labelfloat labelfontcolor labelfontname labelfontsize minlen samehead sametail style taillabel tailport URL + + + + + + digraph g {compound="true"; + + + + } +<dot-filename></dot-filename> + + subgraph sub_graph_{rank="";} + subgraph cluster_{ + + + + } + node[label=" + + + + + + + ", + + + ] {}; + edge[ + + + lhead="cluster_ + ",ltail="cluster_ + "] struct: + -> struct: + ; + node[shape="record",label="", + + + ]{struct}; + {} | + + <> + + + + + + + + | + + + + + + + ="" + + + ="" + + + + + + + + diff --git a/src/graphxq/dotml/dotpatch.xsl b/src/graphxq/dotml/dotpatch.xsl new file mode 100644 index 0000000..4a8f013 --- /dev/null +++ b/src/graphxq/dotml/dotpatch.xsl @@ -0,0 +1,121 @@ + + + + MyFilter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Produces a 3D lighting effect suitable for pies and lines + + + + + + + + + + + + + + Simple blurred shadow (ideal for headings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/graphxq/dotml/filters.svg b/src/graphxq/dotml/filters.svg new file mode 100644 index 0000000..5fc5a5c --- /dev/null +++ b/src/graphxq/dotml/filters.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Produces a 3D lighting effect suitable for pies and lines + + + + + + + + + + + + + + Simple blurred shadow (ideal for headings) + + + + + + + + diff --git a/src/graphxq/graphviz.xqm b/src/graphxq/graphviz.xqm new file mode 100644 index 0000000..1619c19 --- /dev/null +++ b/src/graphxq/graphviz.xqm @@ -0,0 +1,67 @@ +(:~ +: graphviz module +: based on http://www.zorba-xquery.com/html/modules/zorba/image/graphviz +:) + +module namespace gr="apb.graphviz"; +declare default function namespace 'apb.graphviz'; +import module namespace proc="http://basex.org/modules/proc"; +import module namespace file="http://expath.org/ns/file"; +import module namespace xslt="http://basex.org/modules/xslt"; + +declare namespace svg= "http://www.w3.org/2000/svg"; +declare namespace xlink="http://www.w3.org/1999/xlink"; + +declare %private variable $gr:dotpath:=if(fn:environment-variable("DOTPATH")) + then fn:environment-variable("DOTPATH") + else "dot"; +(:~ +: folder for temp files +:) +declare %private variable $gr:tmpdir:=if(fn:environment-variable("TEMP")) + then fn:environment-variable("TEMP") + else "/tmp"; + +declare %private variable $gr:empty:= + + Empty. +; + +(:~ +:Layout one or more graphs given in the DOT language and render them as SVG. +:) +declare function dot( $dot as xs:string*, $params as xs:string*) as node()*{ + for $d in $dot + return if($d) + then dot1($d) + else $gr:empty +}; + +declare %private function dot1( $dot as xs:string) as node(){ + let $fname:=$gr:tmpdir || file:dir-separator() || random:uuid() + let $junk:=file:write-text($fname,$dot) + let $r:=proc:execute($gr:dotpath , ("-Tsvg",$fname)) + let $junk:=file:delete($fname) + + return if($r/code="0") + then fn:parse-xml($r/output) + else fn:error() +}; +(:~ +:Layout one ore more graphs given in the GXL language and render them as SVG. +: gxl2dot Test.gxl > Test.dot +:) +declare function gxl($gxl as node()*, $params as xs:string*) as node()*{ + for $g in $gxl + (: @TODO :) + return fn:error() +}; + +(:~ +: set svg to autosize 100% +:) +declare function autosize($svg as node()) as node(){ + xslt:transform($svg , fn:resolve-uri("dotml/dotpatch.xsl")) +}; + diff --git a/src/graphxq/samples/hier.dot b/src/graphxq/samples/hier.dot new file mode 100644 index 0000000..4b759b8 --- /dev/null +++ b/src/graphxq/samples/hier.dot @@ -0,0 +1,16 @@ +digraph hierarchy_of_D { + +node [color=Green,fontcolor=Blue,font=Courier] + + B -> D + C -> D + + {rank=same; B C } + + A -> B + + A -> C + + object -> A + +} \ No newline at end of file diff --git a/src/graphxq/samples/process.dot b/src/graphxq/samples/process.dot new file mode 100644 index 0000000..cf1bc18 --- /dev/null +++ b/src/graphxq/samples/process.dot @@ -0,0 +1,27 @@ +digraph process { + + subgraph cluster_0 { + style=filled; + color=lightgrey; + node [style=filled,color=white]; + a0 -> a1 -> a2 -> a3; + label = "process #1"; + } + + subgraph cluster_1 { + node [style=filled]; + b0 -> b1 -> b2 -> b3; + label = "process #2"; + color=blue + } + start -> a0; + start -> b0; + a1 -> b3; + b2 -> a3; + a3 -> a0; + a3 -> end; + b3 -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +}