|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = function ( graph ){ |
|
|
|
|
|
var exportMenu = {}, |
|
|
exportSvgButton, |
|
|
exportFilename, |
|
|
exportJsonButton, |
|
|
exportTurtleButton, |
|
|
exportTexButton, |
|
|
copyButton, |
|
|
exportableJsonText; |
|
|
|
|
|
var exportTTLModule = require("./exportTTLModule")(graph); |
|
|
|
|
|
|
|
|
String.prototype.replaceAll = function ( search, replacement ){ |
|
|
var target = this; |
|
|
return target.split(search).join(replacement); |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exportMenu.setup = function (){ |
|
|
exportSvgButton = d3.select("#exportSvg") |
|
|
.on("click", exportSvg); |
|
|
exportJsonButton = d3.select("#exportJson") |
|
|
.on("click", exportJson); |
|
|
|
|
|
copyButton = d3.select("#copyBt") |
|
|
.on("click", copyUrl); |
|
|
|
|
|
exportTexButton = d3.select("#exportTex") |
|
|
.on("click", exportTex); |
|
|
|
|
|
exportTurtleButton = d3.select("#exportTurtle") |
|
|
.on("click", exportTurtle); |
|
|
|
|
|
var menuEntry = d3.select("#m_export"); |
|
|
menuEntry.on("mouseover", function (){ |
|
|
var searchMenu = graph.options().searchMenu(); |
|
|
searchMenu.hideSearchEntries(); |
|
|
exportMenu.exportAsUrl(); |
|
|
}); |
|
|
}; |
|
|
function exportTurtle(){ |
|
|
var success = exportTTLModule.requestExport(); |
|
|
var result = exportTTLModule.resultingTTL_Content(); |
|
|
var ontoTitle = "NewOntology"; |
|
|
console.log("Exporter was successful: " + success); |
|
|
if ( success ) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var dataURI = "data:text/json;charset=utf-8," + encodeURIComponent(result); |
|
|
|
|
|
exportTurtleButton.attr("href", dataURI) |
|
|
.attr("download", ontoTitle + ".ttl"); |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
console.log("ShowWarning!"); |
|
|
graph.options().warningModule().showExporterWarning(); |
|
|
console.log("Stay on the page! " + window.location.href); |
|
|
exportTurtleButton.attr("href", window.location.href); |
|
|
d3.event.preventDefault(); |
|
|
} |
|
|
} |
|
|
|
|
|
exportMenu.setFilename = function ( filename ){ |
|
|
exportFilename = filename || "export"; |
|
|
}; |
|
|
|
|
|
exportMenu.setJsonText = function ( jsonText ){ |
|
|
exportableJsonText = jsonText; |
|
|
}; |
|
|
|
|
|
function copyUrl(){ |
|
|
d3.select("#exportedUrl").node().focus(); |
|
|
d3.select("#exportedUrl").node().select(); |
|
|
document.execCommand("copy"); |
|
|
graph.options().navigationMenu().hideAllMenus(); |
|
|
d3.event.preventDefault(); |
|
|
} |
|
|
|
|
|
function prepareOptionString( defOpts, currOpts ){ |
|
|
var setOptions = 0; |
|
|
var optsString = "opts="; |
|
|
|
|
|
for ( var name in defOpts ) { |
|
|
|
|
|
if ( defOpts.hasOwnProperty(name) ) { |
|
|
var def_value = defOpts[name]; |
|
|
var cur_value = currOpts[name]; |
|
|
if ( def_value !== cur_value ) { |
|
|
optsString += name + "=" + cur_value + ";"; |
|
|
setOptions++; |
|
|
} |
|
|
} |
|
|
} |
|
|
optsString += ""; |
|
|
if ( setOptions === 0 ) { |
|
|
return ""; |
|
|
} |
|
|
return optsString; |
|
|
} |
|
|
|
|
|
exportMenu.exportAsUrl = function (){ |
|
|
var currObj = {}; |
|
|
currObj.sidebar = graph.options().sidebar().getSidebarVisibility(); |
|
|
|
|
|
|
|
|
var defOntValue = graph.options().filterMenu().getDefaultDegreeValue(); |
|
|
var currentValue = graph.options().filterMenu().getDegreeSliderValue(); |
|
|
if ( parseInt(defOntValue) === parseInt(currentValue) ) { |
|
|
currObj.doc = -1; |
|
|
} else { |
|
|
currObj.doc = currentValue; |
|
|
} |
|
|
|
|
|
currObj.cd = graph.options().classDistance(); |
|
|
currObj.dd = graph.options().datatypeDistance(); |
|
|
if ( graph.editorMode() === true ) { |
|
|
currObj.editorMode = "true"; |
|
|
} else { |
|
|
currObj.editorMode = "false"; |
|
|
} |
|
|
currObj.filter_datatypes = String(graph.options().filterMenu().getCheckBoxValue("datatypeFilterCheckbox")); |
|
|
currObj.filter_sco = String(graph.options().filterMenu().getCheckBoxValue("subclassFilterCheckbox")); |
|
|
currObj.filter_disjoint = String(graph.options().filterMenu().getCheckBoxValue("disjointFilterCheckbox")); |
|
|
currObj.filter_setOperator = String(graph.options().filterMenu().getCheckBoxValue("setoperatorFilterCheckbox")); |
|
|
currObj.filter_objectProperties = String(graph.options().filterMenu().getCheckBoxValue("objectPropertyFilterCheckbox")); |
|
|
currObj.mode_dynamic = String(graph.options().dynamicLabelWidth()); |
|
|
currObj.mode_scaling = String(graph.options().modeMenu().getCheckBoxValue("nodescalingModuleCheckbox")); |
|
|
currObj.mode_compact = String(graph.options().modeMenu().getCheckBoxValue("compactnotationModuleCheckbox")); |
|
|
currObj.mode_colorExt = String(graph.options().modeMenu().getCheckBoxValue("colorexternalsModuleCheckbox")); |
|
|
currObj.mode_multiColor = String(graph.options().modeMenu().colorModeState()); |
|
|
currObj.mode_pnp = String(graph.options().modeMenu().getCheckBoxValue("pickandpinModuleCheckbox")); |
|
|
currObj.debugFeatures = String(!graph.options().getHideDebugFeatures()); |
|
|
currObj.rect = 0; |
|
|
|
|
|
var defObj = graph.options().initialConfig(); |
|
|
var optsString = prepareOptionString(defObj, currObj); |
|
|
var urlString = String(location); |
|
|
var htmlElement; |
|
|
|
|
|
if ( optsString.length === 0 ) { |
|
|
|
|
|
|
|
|
|
|
|
var hashCode = location.hash; |
|
|
urlString = urlString.split(hashCode)[0]; |
|
|
|
|
|
var lPos = hashCode.lastIndexOf("#"); |
|
|
if ( lPos === -1 ) { |
|
|
htmlElement = d3.select("#exportedUrl").node(); |
|
|
htmlElement.value = String(location); |
|
|
htmlElement.title = String(location); |
|
|
return; |
|
|
} |
|
|
var newURL = hashCode.slice(lPos, hashCode.length); |
|
|
htmlElement = d3.select("#exportedUrl").node(); |
|
|
htmlElement.value = urlString + newURL; |
|
|
htmlElement.title = urlString + newURL; |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
var numParameters = (urlString.match(/#/g) || []).length; |
|
|
var newUrlString; |
|
|
if ( numParameters === undefined || numParameters === 0 ) { |
|
|
newUrlString = urlString + "#" + optsString; |
|
|
} |
|
|
if ( numParameters > 0 ) { |
|
|
var tokens = urlString.split("#"); |
|
|
var i; |
|
|
if ( tokens[1].indexOf("opts=") >= 0 ) { |
|
|
tokens[1] = optsString; |
|
|
newUrlString = tokens[0]; |
|
|
} else { |
|
|
newUrlString = tokens[0] + "#"; |
|
|
newUrlString += optsString; |
|
|
} |
|
|
|
|
|
for ( i = 1; i < tokens.length; i++ ) { |
|
|
if ( tokens[i].length > 0 ) { |
|
|
newUrlString += "#" + tokens[i]; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
htmlElement = d3.select("#exportedUrl").node(); |
|
|
htmlElement.value = newUrlString; |
|
|
htmlElement.title = newUrlString; |
|
|
|
|
|
}; |
|
|
|
|
|
function exportSvg(){ |
|
|
graph.options().navigationMenu().hideAllMenus(); |
|
|
|
|
|
var graphSvg = d3.select(graph.options().graphContainerSelector()).select("svg"), |
|
|
graphSvgCode, |
|
|
escapedGraphSvgCode, |
|
|
dataURI; |
|
|
|
|
|
|
|
|
inlineVowlStyles(); |
|
|
hideNonExportableElements(); |
|
|
|
|
|
graphSvgCode = graphSvg.attr("version", 1.1) |
|
|
.attr("xmlns", "http://www.w3.org/2000/svg") |
|
|
.node().parentNode.innerHTML; |
|
|
|
|
|
|
|
|
graphSvgCode = "<!-- Created with WebVOWL (version " + webvowl.version + ")" + |
|
|
", http://vowl.visualdataweb.org -->\n" + graphSvgCode; |
|
|
|
|
|
escapedGraphSvgCode = escapeUnicodeCharacters(graphSvgCode); |
|
|
|
|
|
dataURI = "data:image/svg+xml;base64," + btoa(escapedGraphSvgCode); |
|
|
|
|
|
|
|
|
exportSvgButton.attr("href", dataURI) |
|
|
.attr("download", exportFilename + ".svg"); |
|
|
|
|
|
|
|
|
removeVowlInlineStyles(); |
|
|
showNonExportableElements(); |
|
|
graph.lazyRefresh(); |
|
|
} |
|
|
|
|
|
function escapeUnicodeCharacters( text ){ |
|
|
var textSnippets = [], |
|
|
i, textLength = text.length, |
|
|
character, |
|
|
charCode; |
|
|
|
|
|
for ( i = 0; i < textLength; i++ ) { |
|
|
character = text.charAt(i); |
|
|
charCode = character.charCodeAt(0); |
|
|
|
|
|
if ( charCode < 128 ) { |
|
|
textSnippets.push(character); |
|
|
} else { |
|
|
textSnippets.push("&#" + charCode + ";"); |
|
|
} |
|
|
} |
|
|
|
|
|
return textSnippets.join(""); |
|
|
} |
|
|
|
|
|
function inlineVowlStyles(){ |
|
|
setStyleSensitively(".text", [{ name: "font-family", value: "Helvetica, Arial, sans-serif" }, { |
|
|
name: "font-size", |
|
|
value: "12px" |
|
|
}]); |
|
|
setStyleSensitively(".subtext", [{ name: "font-size", value: "9px" }]); |
|
|
setStyleSensitively(".text.instance-count", [{ name: "fill", value: "#666" }]); |
|
|
setStyleSensitively(".external + text .instance-count", [{ name: "fill", value: "#aaa" }]); |
|
|
setStyleSensitively(".cardinality", [{ name: "font-size", value: "10px" }]); |
|
|
setStyleSensitively(".text, .embedded", [{ name: "pointer-events", value: "none" }]); |
|
|
setStyleSensitively(".class, .object, .disjoint, .objectproperty, .disjointwith, .equivalentproperty, .transitiveproperty, .functionalproperty, .inversefunctionalproperty, .symmetricproperty, .allvaluesfromproperty, .somevaluesfromproperty", [{ |
|
|
name: "fill", |
|
|
value: "#acf" |
|
|
}]); |
|
|
setStyleSensitively(".label .datatype, .datatypeproperty", [{ name: "fill", value: "#9c6" }]); |
|
|
setStyleSensitively(".rdf, .rdfproperty", [{ name: "fill", value: "#c9c" }]); |
|
|
setStyleSensitively(".literal, .node .datatype", [{ name: "fill", value: "#fc3" }]); |
|
|
setStyleSensitively(".deprecated, .deprecatedproperty", [{ name: "fill", value: "#ccc" }]); |
|
|
setStyleSensitively(".external, .externalproperty", [{ name: "fill", value: "#36c" }]); |
|
|
setStyleSensitively("path, .nofill", [{ name: "fill", value: "none" }]); |
|
|
setStyleSensitively("marker path", [{ name: "fill", value: "#000" }]); |
|
|
setStyleSensitively(".class, path, line, .fineline", [{ name: "stroke", value: "#000" }]); |
|
|
setStyleSensitively(".white, .subclass, .subclassproperty, .external + text", [{ name: "fill", value: "#fff" }]); |
|
|
setStyleSensitively(".class.hovered, .property.hovered, .cardinality.hovered, .cardinality.focused, circle.pin, .filled.hovered, .filled.focused", [{ |
|
|
name: "fill", |
|
|
value: "#f00" |
|
|
}, { name: "cursor", value: "pointer" }]); |
|
|
setStyleSensitively(".focused, path.hovered", [{ name: "stroke", value: "#f00" }]); |
|
|
setStyleSensitively(".indirect-highlighting, .feature:hover", [{ name: "fill", value: "#f90" }]); |
|
|
setStyleSensitively(".values-from", [{ name: "stroke", value: "#69c" }]); |
|
|
setStyleSensitively(".symbol, .values-from.filled", [{ name: "fill", value: "#69c" }]); |
|
|
setStyleSensitively(".class, path, line", [{ name: "stroke-width", value: "2" }]); |
|
|
setStyleSensitively(".fineline", [{ name: "stroke-width", value: "1" }]); |
|
|
setStyleSensitively(".dashed, .anonymous", [{ name: "stroke-dasharray", value: "8" }]); |
|
|
setStyleSensitively(".dotted", [{ name: "stroke-dasharray", value: "3" }]); |
|
|
setStyleSensitively("rect.focused, circle.focused", [{ name: "stroke-width", value: "4px" }]); |
|
|
setStyleSensitively(".nostroke", [{ name: "stroke", value: "none" }]); |
|
|
setStyleSensitively("marker path", [{ name: "stroke-dasharray", value: "100" }]); |
|
|
} |
|
|
|
|
|
function setStyleSensitively( selector, styles ){ |
|
|
var elements = d3.selectAll(selector); |
|
|
if ( elements.empty() ) { |
|
|
return; |
|
|
} |
|
|
|
|
|
styles.forEach(function ( style ){ |
|
|
elements.each(function (){ |
|
|
var element = d3.select(this); |
|
|
if ( !shouldntChangeInlineCss(element, style.name) ) { |
|
|
element.style(style.name, style.value); |
|
|
} |
|
|
}); |
|
|
}); |
|
|
} |
|
|
|
|
|
function shouldntChangeInlineCss( element, style ){ |
|
|
return style === "fill" && hasBackgroundColorSet(element); |
|
|
} |
|
|
|
|
|
function hasBackgroundColorSet( element ){ |
|
|
var data = element.datum(); |
|
|
if ( data === undefined ) { |
|
|
return false; |
|
|
} |
|
|
return data.backgroundColor && !!data.backgroundColor(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function hideNonExportableElements(){ |
|
|
d3.selectAll(".hidden-in-export").style("display", "none"); |
|
|
} |
|
|
|
|
|
function removeVowlInlineStyles(){ |
|
|
d3.selectAll(".text, .subtext, .text.instance-count, .external + text .instance-count, .cardinality, .text, .embedded, .class, .object, .disjoint, .objectproperty, .disjointwith, .equivalentproperty, .transitiveproperty, .functionalproperty, .inversefunctionalproperty, .symmetricproperty, .allvaluesfromproperty, .somevaluesfromproperty, .label .datatype, .datatypeproperty, .rdf, .rdfproperty, .literal, .node .datatype, .deprecated, .deprecatedproperty, .external, .externalproperty, path, .nofill, .symbol, .values-from.filled, marker path, .class, path, line, .fineline, .white, .subclass, .subclassproperty, .external + text, .class.hovered, .property.hovered, .cardinality.hovered, .cardinality.focused, circle.pin, .filled.hovered, .filled.focused, .focused, path.hovered, .indirect-highlighting, .feature:hover, .values-from, .class, path, line, .fineline, .dashed, .anonymous, .dotted, rect.focused, circle.focused, .nostroke, marker path") |
|
|
.each(function (){ |
|
|
var element = d3.select(this); |
|
|
|
|
|
var inlineStyles = element.node().style; |
|
|
for ( var styleName in inlineStyles ) { |
|
|
if ( inlineStyles.hasOwnProperty(styleName) ) { |
|
|
if ( shouldntChangeInlineCss(element, styleName) ) { |
|
|
continue; |
|
|
} |
|
|
element.style(styleName, null); |
|
|
} |
|
|
} |
|
|
|
|
|
if ( element.datum && element.datum() !== undefined && element.datum().type ) { |
|
|
if ( element.datum().type() === "rdfs:subClassOf" ) { |
|
|
element.style("fill", null); |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
var scrollContainer = d3.select("#menuElementContainer").node(); |
|
|
var controlElements = scrollContainer.children; |
|
|
var numEntries = controlElements.length; |
|
|
|
|
|
for ( var i = 0; i < numEntries; i++ ) { |
|
|
var currentMenu = controlElements[i].id; |
|
|
d3.select("#" + currentMenu).select("path").style("stroke-width", "0"); |
|
|
d3.select("#" + currentMenu).select("path").style("fill", "#fff"); |
|
|
} |
|
|
|
|
|
d3.select("#magnifyingGlass").style("stroke-width", "0"); |
|
|
d3.select("#magnifyingGlass").style("fill", "#666"); |
|
|
|
|
|
} |
|
|
|
|
|
function showNonExportableElements(){ |
|
|
d3.selectAll(".hidden-in-export").style("display", null); |
|
|
} |
|
|
|
|
|
exportMenu.createJSON_exportObject = function (){ |
|
|
var i, j, k; |
|
|
|
|
|
|
|
|
if (!graph.options().data()) {return {};} |
|
|
|
|
|
var unfilteredData = graph.getUnfilteredData(); |
|
|
var ontologyComment = graph.options().data()._comment; |
|
|
var metaObj = graph.options().getGeneralMetaObject(); |
|
|
var header = graph.options().data().header; |
|
|
|
|
|
if ( metaObj.iri && metaObj.iri !== header.iri ) { |
|
|
header.iri = metaObj.iri; |
|
|
} |
|
|
if ( metaObj.title && metaObj.title !== header.title ) { |
|
|
header.title = metaObj.title; |
|
|
} |
|
|
if ( metaObj.version && metaObj.version !== header.version ) { |
|
|
header.version = metaObj.version; |
|
|
} |
|
|
if ( metaObj.author && metaObj.author !== header.author ) { |
|
|
header.author = metaObj.author; |
|
|
} |
|
|
if ( metaObj.description && metaObj.description !== header.description ) { |
|
|
header.description = metaObj.description; |
|
|
} |
|
|
|
|
|
|
|
|
var exportText = {}; |
|
|
exportText._comment = ontologyComment; |
|
|
exportText.header = header; |
|
|
exportText.namespace = graph.options().data().namespace; |
|
|
if ( exportText.namespace === undefined ) { |
|
|
exportText.namespace = []; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var nodes = unfilteredData.nodes; |
|
|
var nLen = nodes.length; |
|
|
var classObjects = []; |
|
|
var classAttributeObjects = []; |
|
|
for ( i = 0; i < nLen; i++ ) { |
|
|
var classObj = {}; |
|
|
var classAttr = {}; |
|
|
classObj.id = nodes[i].id(); |
|
|
classObj.type = nodes[i].type(); |
|
|
classObjects.push(classObj); |
|
|
|
|
|
|
|
|
classAttr.id = nodes[i].id(); |
|
|
classAttr.iri = nodes[i].iri(); |
|
|
classAttr.baseIri = nodes[i].baseIri(); |
|
|
classAttr.label = nodes[i].label(); |
|
|
|
|
|
if ( nodes[i].attributes().length > 0 ) { |
|
|
classAttr.attributes = nodes[i].attributes(); |
|
|
} |
|
|
if ( nodes[i].comment() ) { |
|
|
classAttr.comment = nodes[i].comment(); |
|
|
} |
|
|
if ( nodes[i].annotations() ) { |
|
|
classAttr.annotations = nodes[i].annotations(); |
|
|
} |
|
|
if ( nodes[i].description() ) { |
|
|
classAttr.description = nodes[i].description(); |
|
|
} |
|
|
|
|
|
|
|
|
if ( nodes[i].individuals().length > 0 ) { |
|
|
var classIndividualElements = []; |
|
|
var nIndividuals = nodes[i].individuals(); |
|
|
for ( j = 0; j < nIndividuals.length; j++ ) { |
|
|
var indObj = {}; |
|
|
indObj.iri = nIndividuals[j].iri(); |
|
|
indObj.baseIri = nIndividuals[j].baseIri(); |
|
|
indObj.labels = nIndividuals[j].label(); |
|
|
if ( nIndividuals[j].annotations() ) { |
|
|
indObj.annotations = nIndividuals[j].annotations(); |
|
|
} |
|
|
if ( nIndividuals[j].description() ) { |
|
|
indObj.description = nIndividuals[j].description(); |
|
|
} |
|
|
if ( nIndividuals[j].comment() ) { |
|
|
indObj.comment = nIndividuals[j].comment(); |
|
|
} |
|
|
classIndividualElements.push(indObj); |
|
|
} |
|
|
classAttr.individuals = classIndividualElements; |
|
|
} |
|
|
|
|
|
var equalsForAttributes = undefined; |
|
|
if ( nodes[i].equivalents().length > 0 ) { |
|
|
equalsForAttributes = []; |
|
|
var equals = nodes[i].equivalents(); |
|
|
for ( j = 0; j < equals.length; j++ ) { |
|
|
var eqObj = {}; |
|
|
var eqAttr = {}; |
|
|
eqObj.id = equals[j].id(); |
|
|
equalsForAttributes.push(equals[j].id()); |
|
|
eqObj.type = equals[j].type(); |
|
|
classObjects.push(eqObj); |
|
|
|
|
|
eqAttr.id = equals[j].id(); |
|
|
eqAttr.iri = equals[j].iri(); |
|
|
eqAttr.baseIri = equals[j].baseIri(); |
|
|
eqAttr.label = equals[j].label(); |
|
|
|
|
|
if ( equals[j].attributes().length > 0 ) { |
|
|
eqAttr.attributes = equals[j].attributes(); |
|
|
} |
|
|
if ( equals[j].comment() ) { |
|
|
eqAttr.comment = equals[j].comment(); |
|
|
} |
|
|
if ( equals[j].individuals().length > 0 ) { |
|
|
eqAttr.individuals = equals[j].individuals(); |
|
|
} |
|
|
if ( equals[j].annotations() ) { |
|
|
eqAttr.annotations = equals[j].annotations(); |
|
|
} |
|
|
if ( equals[j].description() ) { |
|
|
eqAttr.description = equals[j].description(); |
|
|
} |
|
|
|
|
|
if ( equals[j].individuals().length > 0 ) { |
|
|
var e_classIndividualElements = []; |
|
|
var e_nIndividuals = equals[i].individuals(); |
|
|
for ( k = 0; k < e_nIndividuals.length; k++ ) { |
|
|
var e_indObj = {}; |
|
|
e_indObj.iri = e_nIndividuals[k].iri(); |
|
|
e_indObj.baseIri = e_nIndividuals[k].baseIri(); |
|
|
e_indObj.labels = e_nIndividuals[k].label(); |
|
|
|
|
|
if ( e_nIndividuals[k].annotations() ) { |
|
|
e_indObj.annotations = e_nIndividuals[k].annotations(); |
|
|
} |
|
|
if ( e_nIndividuals[k].description() ) { |
|
|
e_indObj.description = e_nIndividuals[k].description(); |
|
|
} |
|
|
if ( e_nIndividuals[k].comment() ) { |
|
|
e_indObj.comment = e_nIndividuals[k].comment(); |
|
|
} |
|
|
e_classIndividualElements.push(e_indObj); |
|
|
} |
|
|
eqAttr.individuals = e_classIndividualElements; |
|
|
} |
|
|
|
|
|
classAttributeObjects.push(eqAttr); |
|
|
} |
|
|
} |
|
|
if ( equalsForAttributes && equalsForAttributes.length > 0 ) { |
|
|
classAttr.equivalent = equalsForAttributes; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
classAttributeObjects.push(classAttr); |
|
|
} |
|
|
|
|
|
|
|
|
var properties = unfilteredData.properties; |
|
|
var pLen = properties.length; |
|
|
var propertyObjects = []; |
|
|
var propertyAttributeObjects = []; |
|
|
|
|
|
for ( i = 0; i < pLen; i++ ) { |
|
|
var pObj = {}; |
|
|
var pAttr = {}; |
|
|
pObj.id = properties[i].id(); |
|
|
pObj.type = properties[i].type(); |
|
|
propertyObjects.push(pObj); |
|
|
|
|
|
|
|
|
pAttr.id = properties[i].id(); |
|
|
pAttr.iri = properties[i].iri(); |
|
|
pAttr.baseIri = properties[i].baseIri(); |
|
|
pAttr.label = properties[i].label(); |
|
|
|
|
|
if ( properties[i].attributes().length > 0 ) { |
|
|
pAttr.attributes = properties[i].attributes(); |
|
|
} |
|
|
if ( properties[i].comment() ) { |
|
|
pAttr.comment = properties[i].comment(); |
|
|
} |
|
|
|
|
|
if ( properties[i].annotations() ) { |
|
|
pAttr.annotations = properties[i].annotations(); |
|
|
} |
|
|
if ( properties[i].maxCardinality() ) { |
|
|
pAttr.maxCardinality = properties[i].maxCardinality(); |
|
|
} |
|
|
if ( properties[i].minCardinality() ) { |
|
|
pAttr.minCardinality = properties[i].minCardinality(); |
|
|
} |
|
|
if ( properties[i].cardinality() ) { |
|
|
pAttr.cardinality = properties[i].cardinality(); |
|
|
} |
|
|
if ( properties[i].description() ) { |
|
|
pAttr.description = properties[i].description(); |
|
|
} |
|
|
|
|
|
pAttr.domain = properties[i].domain().id(); |
|
|
pAttr.range = properties[i].range().id(); |
|
|
|
|
|
if ( properties[i].subproperties() ) { |
|
|
var subProps = properties[i].subproperties(); |
|
|
var subPropsIdArray = []; |
|
|
for ( j = 0; j < subProps.length; j++ ) { |
|
|
if ( subProps[j].id ) |
|
|
subPropsIdArray.push(subProps[j].id()); |
|
|
} |
|
|
pAttr.subproperty = subPropsIdArray; |
|
|
} |
|
|
|
|
|
|
|
|
if ( properties[i].superproperties() ) { |
|
|
var superProps = properties[i].superproperties(); |
|
|
var superPropsIdArray = []; |
|
|
for ( j = 0; j < superProps.length; j++ ) { |
|
|
if ( superProps[j].id ) |
|
|
superPropsIdArray.push(superProps[j].id()); |
|
|
} |
|
|
pAttr.superproperty = superPropsIdArray; |
|
|
} |
|
|
|
|
|
|
|
|
if ( properties[i].inverse() ) { |
|
|
if ( properties[i].inverse().id ) |
|
|
pAttr.inverse = properties[i].inverse().id(); |
|
|
} |
|
|
propertyAttributeObjects.push(pAttr); |
|
|
} |
|
|
|
|
|
exportText.class = classObjects; |
|
|
exportText.classAttribute = classAttributeObjects; |
|
|
exportText.property = propertyObjects; |
|
|
exportText.propertyAttribute = propertyAttributeObjects; |
|
|
|
|
|
|
|
|
var nodeElements = graph.graphNodeElements(); |
|
|
var propElements = graph.graphLabelElements(); |
|
|
|
|
|
|
|
|
|
|
|
var comment = exportText._comment; |
|
|
var additionalString = " [Additional Information added by WebVOWL Exporter Version: " + "@@WEBVOWL_VERSION" + "]"; |
|
|
|
|
|
if ( comment.indexOf(additionalString) === -1 ) { |
|
|
exportText._comment = comment + " [Additional Information added by WebVOWL Exporter Version: " + "@@WEBVOWL_VERSION" + "]"; |
|
|
} |
|
|
|
|
|
var classAttribute = exportText.classAttribute; |
|
|
var propAttribute = exportText.propertyAttribute; |
|
|
|
|
|
for ( i = 0; i < classAttribute.length; i++ ) { |
|
|
var classObj_del = classAttribute[i]; |
|
|
delete classObj_del.pos; |
|
|
delete classObj_del.pinned; |
|
|
} |
|
|
var propertyObj; |
|
|
for ( i = 0; i < propAttribute.length; i++ ) { |
|
|
propertyObj = propAttribute[i]; |
|
|
delete propertyObj.pos; |
|
|
delete propertyObj.pinned; |
|
|
} |
|
|
|
|
|
|
|
|
nodeElements.each(function ( node ){ |
|
|
var nodeId = node.id(); |
|
|
for ( i = 0; i < classAttribute.length; i++ ) { |
|
|
var classObj = classAttribute[i]; |
|
|
if ( classObj.id === nodeId ) { |
|
|
|
|
|
classObj.pos = [parseFloat(node.x.toFixed(2)), parseFloat(node.y.toFixed(2))]; |
|
|
if ( node.pinned() ) |
|
|
classObj.pinned = true; |
|
|
break; |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
for ( j = 0; j < propElements.length; j++ ) { |
|
|
var correspondingProp = propElements[j].property(); |
|
|
for ( i = 0; i < propAttribute.length; i++ ) { |
|
|
propertyObj = propAttribute[i]; |
|
|
if ( propertyObj.id === correspondingProp.id() ) { |
|
|
propertyObj.pos = [parseFloat(propElements[j].x.toFixed(2)), parseFloat(propElements[j].y.toFixed(2))]; |
|
|
if ( propElements[j].pinned() ) |
|
|
propertyObj.pinned = true; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
exportText.settings = {}; |
|
|
|
|
|
|
|
|
var zoom = graph.scaleFactor(); |
|
|
var paused = graph.paused(); |
|
|
var translation = [parseFloat(graph.translation()[0].toFixed(2)), parseFloat(graph.translation()[1].toFixed(2))]; |
|
|
exportText.settings.global = {}; |
|
|
exportText.settings.global.zoom = zoom.toFixed(2); |
|
|
exportText.settings.global.translation = translation; |
|
|
exportText.settings.global.paused = paused; |
|
|
|
|
|
|
|
|
var cb_text; |
|
|
var isEnabled; |
|
|
var cb_obj; |
|
|
|
|
|
|
|
|
var classDistance = graph.options().classDistance(); |
|
|
var datatypeDistance = graph.options().datatypeDistance(); |
|
|
exportText.settings.gravity = {}; |
|
|
exportText.settings.gravity.classDistance = classDistance; |
|
|
exportText.settings.gravity.datatypeDistance = datatypeDistance; |
|
|
|
|
|
|
|
|
var fMenu = graph.options().filterMenu(); |
|
|
var fContainer = fMenu.getCheckBoxContainer(); |
|
|
var cbCont = []; |
|
|
for ( i = 0; i < fContainer.length; i++ ) { |
|
|
cb_text = fContainer[i].checkbox.attr("id"); |
|
|
isEnabled = fContainer[i].checkbox.property("checked"); |
|
|
cb_obj = {}; |
|
|
cb_obj.id = cb_text; |
|
|
cb_obj.checked = isEnabled; |
|
|
cbCont.push(cb_obj); |
|
|
} |
|
|
var degreeSliderVal = fMenu.getDegreeSliderValue(); |
|
|
exportText.settings.filter = {}; |
|
|
exportText.settings.filter.checkBox = cbCont; |
|
|
exportText.settings.filter.degreeSliderValue = degreeSliderVal; |
|
|
|
|
|
|
|
|
var mMenu = graph.options().modeMenu(); |
|
|
var mContainer = mMenu.getCheckBoxContainer(); |
|
|
var cb_modes = []; |
|
|
for ( i = 0; i < mContainer.length; i++ ) { |
|
|
cb_text = mContainer[i].attr("id"); |
|
|
isEnabled = mContainer[i].property("checked"); |
|
|
cb_obj = {}; |
|
|
cb_obj.id = cb_text; |
|
|
cb_obj.checked = isEnabled; |
|
|
cb_modes.push(cb_obj); |
|
|
} |
|
|
var colorSwitchState = mMenu.colorModeState(); |
|
|
exportText.settings.modes = {}; |
|
|
exportText.settings.modes.checkBox = cb_modes; |
|
|
exportText.settings.modes.colorSwitchState = colorSwitchState; |
|
|
|
|
|
var exportObj = {}; |
|
|
|
|
|
|
|
|
exportObj._comment = exportText._comment; |
|
|
exportObj.header = exportText.header; |
|
|
exportObj.namespace = exportText.namespace; |
|
|
exportObj.metrics = exportText.metrics; |
|
|
exportObj.settings = exportText.settings; |
|
|
exportObj.class = exportText.class; |
|
|
exportObj.classAttribute = exportText.classAttribute; |
|
|
exportObj.property = exportText.property; |
|
|
exportObj.propertyAttribute = exportText.propertyAttribute; |
|
|
|
|
|
return exportObj; |
|
|
}; |
|
|
|
|
|
function exportJson(){ |
|
|
graph.options().navigationMenu().hideAllMenus(); |
|
|
|
|
|
if ( !exportableJsonText ) { |
|
|
alert("No graph data available."); |
|
|
|
|
|
d3.event.preventDefault(); |
|
|
return; |
|
|
} |
|
|
|
|
|
var exportObj = exportMenu.createJSON_exportObject(); |
|
|
|
|
|
|
|
|
var exportText = JSON.stringify(exportObj, null, ' '); |
|
|
|
|
|
var dataURI = "data:text/json;charset=utf-8," + encodeURIComponent(exportText); |
|
|
var jsonExportFileName = exportFilename; |
|
|
|
|
|
if ( !jsonExportFileName.endsWith(".json") ) |
|
|
jsonExportFileName += ".json"; |
|
|
exportJsonButton.attr("href", dataURI) |
|
|
.attr("download", jsonExportFileName); |
|
|
} |
|
|
|
|
|
var curveFunction = d3.svg.line() |
|
|
.x(function ( d ){ |
|
|
return d.x; |
|
|
}) |
|
|
.y(function ( d ){ |
|
|
return d.y; |
|
|
}) |
|
|
.interpolate("cardinal"); |
|
|
var loopFunction = d3.svg.line() |
|
|
.x(function ( d ){ |
|
|
return d.x; |
|
|
}) |
|
|
.y(function ( d ){ |
|
|
return d.y; |
|
|
}) |
|
|
.interpolate("cardinal") |
|
|
.tension(-1); |
|
|
|
|
|
function exportTex(){ |
|
|
var zoom = graph.scaleFactor(); |
|
|
var grTranslate = graph.translation(); |
|
|
var bbox = graph.getBoundingBoxForTex(); |
|
|
var comment = " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"; |
|
|
comment += " % Generated with the experimental alpha version of the TeX exporter of WebVOWL (version 1.1.3) %%% \n"; |
|
|
comment += " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n"; |
|
|
comment += " % The content can be used as import in other TeX documents. \n"; |
|
|
comment += " % Parent document has to use the following packages \n"; |
|
|
comment += " % \\usepackage{tikz} \n"; |
|
|
comment += " % \\usepackage{helvet} \n"; |
|
|
comment += " % \\usetikzlibrary{decorations.markings,decorations.shapes,decorations,arrows,automata,backgrounds,petri,shapes.geometric} \n"; |
|
|
comment += " % \\usepackage{xcolor} \n\n"; |
|
|
comment += " %%%%%%%%%%%%%%% Example Parent Document %%%%%%%%%%%%%%%%%%%%%%%\n"; |
|
|
comment += " %\\documentclass{article} \n"; |
|
|
comment += " %\\usepackage{tikz} \n"; |
|
|
comment += " %\\usepackage{helvet} \n"; |
|
|
comment += " %\\usetikzlibrary{decorations.markings,decorations.shapes,decorations,arrows,automata,backgrounds,petri,shapes.geometric} \n"; |
|
|
comment += " %\\usepackage{xcolor} \n\n"; |
|
|
comment += " %\\begin{document} \n"; |
|
|
comment += " %\\section{Example} \n"; |
|
|
comment += " % This is an example. \n"; |
|
|
comment += " % \\begin{figure} \n"; |
|
|
comment += " % \\input{<THIS_FILE_NAME>} % << tex file name for the graph \n"; |
|
|
comment += " % \\caption{A generated graph with TKIZ using alpha version of the TeX exporter of WebVOWL (version 1.1.3) } \n"; |
|
|
comment += " % \\end{figure} \n"; |
|
|
comment += " %\\end{document} \n"; |
|
|
comment += " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n"; |
|
|
|
|
|
|
|
|
var texString = comment + "\\definecolor{imageBGCOLOR}{HTML}{FFFFFF} \n" + |
|
|
"\\definecolor{owlClassColor}{HTML}{AACCFF}\n" + |
|
|
"\\definecolor{owlObjectPropertyColor}{HTML}{AACCFF}\n" + |
|
|
"\\definecolor{owlExternalClassColor}{HTML}{AACCFF}\n" + |
|
|
"\\definecolor{owlDatatypePropertyColor}{HTML}{99CC66}\n" + |
|
|
"\\definecolor{owlDatatypeColor}{HTML}{FFCC33}\n" + |
|
|
"\\definecolor{owlThingColor}{HTML}{FFFFFF}\n" + |
|
|
"\\definecolor{valuesFrom}{HTML}{6699CC}\n" + |
|
|
"\\definecolor{rdfPropertyColor}{HTML}{CC99CC}\n" + |
|
|
"\\definecolor{unionColor}{HTML}{6699cc}\n" + |
|
|
"\\begin{center} \n" + |
|
|
"\\resizebox{\\linewidth}{!}{\n" + |
|
|
|
|
|
"\\begin{tikzpicture}[framed]\n" + |
|
|
"\\clip (" + bbox[0] + "pt , " + bbox[1] + "pt ) rectangle (" + bbox[2] + "pt , " + bbox[3] + "pt);\n" + |
|
|
"\\tikzstyle{dashed}=[dash pattern=on 4pt off 4pt] \n" + |
|
|
"\\tikzstyle{dotted}=[dash pattern=on 2pt off 2pt] \n" + |
|
|
"\\fontfamily{sans-serif}{\\fontsize{12}{12}\\selectfont}\n \n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{triangleBlack/.style = {fill=black, draw=black, line width=1pt,scale=0.7,regular polygon, regular polygon sides=3} }\n"; |
|
|
texString += "\\tikzset{triangleWhite/.style = {fill=white, draw=black, line width=1pt,scale=0.7,regular polygon, regular polygon sides=3} }\n"; |
|
|
texString += "\\tikzset{triangleBlue/.style = {fill=valuesFrom, draw=valuesFrom, line width=1pt,scale=0.7,regular polygon, regular polygon sides=3} }\n"; |
|
|
|
|
|
texString += "\\tikzset{Diamond/.style = {fill=white, draw=black, line width=2pt,scale=1.2,regular polygon, regular polygon sides=4} }\n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{Literal/.style={rectangle,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, draw=black, dashed, line width=1pt, fill=owlDatatypeColor, minimum width=80pt,\n" + |
|
|
"minimum height = 20pt}}\n\n"; |
|
|
|
|
|
texString += "\\tikzset{Datatype/.style={rectangle,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, draw=black, line width=1pt, fill=owlDatatypeColor, minimum width=80pt,\n" + |
|
|
"minimum height = 20pt}}\n\n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{owlClass/.style={circle, inner sep=0mm,align=center, \n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, draw=black, line width=1pt, fill=owlClassColor, minimum size=101pt}}\n\n"; |
|
|
|
|
|
texString += "\\tikzset{anonymousClass/.style={circle, inner sep=0mm,align=center, \n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, dashed, draw=black, line width=1pt, fill=owlClassColor, minimum size=101pt}}\n\n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{owlThing/.style={circle, inner sep=0mm,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, dashed, draw=black, line width=1pt, fill=owlThingColor, minimum size=62pt}}\n\n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{owlObjectProperty/.style={rectangle,align=center,\n" + |
|
|
"inner sep=0mm,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"fill=owlObjectPropertyColor, minimum width=80pt,\n" + |
|
|
"minimum height = 25pt}}\n\n"; |
|
|
|
|
|
texString += "\\tikzset{rdfProperty/.style={rectangle,align=center,\n" + |
|
|
"inner sep=0mm,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"fill=rdfPropertyColor, minimum width=80pt,\n" + |
|
|
"minimum height = 25pt}}\n\n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{owlDatatypeProperty/.style={rectangle,align=center,\n" + |
|
|
"fill=owlDatatypePropertyColor, minimum width=80pt,\n" + |
|
|
"inner sep=0mm,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"minimum height = 25pt}}\n\n"; |
|
|
|
|
|
texString += "\\tikzset{rdfsSubClassOf/.style={rectangle,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"inner sep=0mm,\n" + |
|
|
"fill=imageBGCOLOR, minimum width=80pt,\n" + |
|
|
"minimum height = 25pt}}\n\n"; |
|
|
|
|
|
texString += "\\tikzset{unionOf/.style={circle, inner sep=0mm,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, draw=black, line width=1pt, fill=unionColor, minimum size=25pt}}\n\n"; |
|
|
|
|
|
texString += "\\tikzset{disjointWith/.style={circle, inner sep=0mm,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"black, draw=black, line width=1pt, fill=unionColor, minimum size=20pt}}\n\n"; |
|
|
|
|
|
|
|
|
texString += "\\tikzset{owlEquivalentClass/.style={circle,align=center,\n" + |
|
|
"font={\\fontsize{12pt}{12}\\selectfont \\sffamily },\n" + |
|
|
"inner sep=0mm,\n" + |
|
|
"black, solid, draw=black, line width=3pt, fill=owlExternalClassColor, minimum size=101pt,\n" + |
|
|
"postaction = {draw,line width=1pt, white}}}\n\n"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
graph.options().navigationMenu().hideAllMenus(); |
|
|
|
|
|
if ( !exportableJsonText ) { |
|
|
alert("No graph data available."); |
|
|
|
|
|
d3.event.preventDefault(); |
|
|
return; |
|
|
} |
|
|
|
|
|
var i = 0, identifier; |
|
|
|
|
|
|
|
|
var nodeElements = graph.graphNodeElements(); |
|
|
var propElements = graph.graphLabelElements(); |
|
|
var links = graph.graphLinkElements(); |
|
|
|
|
|
|
|
|
|
|
|
for ( i = 0; i < links.length; i++ ) { |
|
|
var link = links[i]; |
|
|
|
|
|
|
|
|
var prop = link.property(); |
|
|
var dx, dy, px, py, rx, ry; |
|
|
var colorStr = "black"; |
|
|
var linkDomainIntersection; |
|
|
var linkRangeIntersection; |
|
|
var center; |
|
|
var linkStyle = ""; |
|
|
var isLoop = ""; |
|
|
var curvePoint; |
|
|
var pathStart; |
|
|
var pathEnd; |
|
|
var controlPoints; |
|
|
var len; |
|
|
var ahAngle; |
|
|
var pathLen; |
|
|
var markerOffset = 7; |
|
|
|
|
|
var arrowType = "triangleBlack"; |
|
|
var linkWidth = ",line width=2pt"; |
|
|
if ( prop.linkType ) { |
|
|
if ( prop.linkType() === "dotted" ) { |
|
|
|
|
|
linkStyle = ", dotted "; |
|
|
arrowType = "triangleWhite"; |
|
|
} |
|
|
if ( prop.linkType() === "dashed" ) { |
|
|
|
|
|
linkStyle = ", dashed "; |
|
|
} |
|
|
|
|
|
if ( prop.linkType() === "values-from" ) { |
|
|
colorStr = "valuesFrom"; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
var startX, startY, endX, endY, normX, normY, lg; |
|
|
|
|
|
if ( link.layers().length === 1 && !link.loops() ) { |
|
|
|
|
|
linkDomainIntersection = graph.math().calculateIntersection(link.range(), link.domain(), 1); |
|
|
linkRangeIntersection = graph.math().calculateIntersection(link.domain(), link.range(), 1); |
|
|
center = graph.math().calculateCenter(linkDomainIntersection, linkRangeIntersection); |
|
|
dx = linkDomainIntersection.x; |
|
|
dy = -linkDomainIntersection.y; |
|
|
px = center.x; |
|
|
py = -center.y; |
|
|
rx = linkRangeIntersection.x; |
|
|
ry = -linkRangeIntersection.y; |
|
|
|
|
|
|
|
|
pathStart = linkDomainIntersection; |
|
|
curvePoint = center; |
|
|
pathEnd = linkRangeIntersection; |
|
|
|
|
|
var nx = rx - px; |
|
|
var ny = ry - py; |
|
|
|
|
|
|
|
|
len = Math.sqrt(nx * nx + ny * ny); |
|
|
|
|
|
nx = nx / len; |
|
|
ny = ny / len; |
|
|
|
|
|
ahAngle = Math.atan2(ny, nx) * (180 / Math.PI); |
|
|
normX = nx; |
|
|
normY = ny; |
|
|
} |
|
|
else { |
|
|
if ( link.isLoop() ) { |
|
|
isLoop = ", tension=3"; |
|
|
controlPoints = graph.math().calculateLoopPoints(link); |
|
|
pathStart = controlPoints[0]; |
|
|
curvePoint = controlPoints[1]; |
|
|
pathEnd = controlPoints[2]; |
|
|
} else { |
|
|
curvePoint = link.label(); |
|
|
pathStart = graph.math().calculateIntersection(curvePoint, link.domain(), 1); |
|
|
pathEnd = graph.math().calculateIntersection(curvePoint, link.range(), 1); |
|
|
} |
|
|
dx = pathStart.x; |
|
|
dy = -pathStart.y; |
|
|
px = curvePoint.x; |
|
|
py = -curvePoint.y; |
|
|
rx = pathEnd.x; |
|
|
ry = -pathEnd.y; |
|
|
} |
|
|
|
|
|
texString += "\\draw [" + colorStr + linkStyle + linkWidth + isLoop + "] plot [smooth] coordinates {(" + |
|
|
dx + "pt, " + dy + "pt) (" + px + "pt, " + py + "pt) (" + rx + "pt, " + ry + "pt)};\n"; |
|
|
|
|
|
|
|
|
if ( link.property().markerElement() === undefined ) continue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( link.property().type() === "owl:someValuesFrom" || link.property().type() === "owl:allValuesFrom" ) { |
|
|
arrowType = "triangleBlue"; |
|
|
} |
|
|
|
|
|
lg = link.pathObj(); |
|
|
pathLen = Math.floor(lg.node().getTotalLength()); |
|
|
var p1 = lg.node().getPointAtLength(pathLen - 4); |
|
|
var p2 = lg.node().getPointAtLength(pathLen); |
|
|
var markerCenter = lg.node().getPointAtLength(pathLen - 6); |
|
|
|
|
|
if ( link.property().type() === "setOperatorProperty" ) { |
|
|
p1 = lg.node().getPointAtLength(4); |
|
|
p2 = lg.node().getPointAtLength(0); |
|
|
markerCenter = lg.node().getPointAtLength(8); |
|
|
arrowType = "Diamond"; |
|
|
} |
|
|
|
|
|
startX = p1.x; |
|
|
startY = p1.y; |
|
|
endX = p2.x; |
|
|
endY = p2.y; |
|
|
normX = endX - startX; |
|
|
normY = endY - startY; |
|
|
len = Math.sqrt(normX * normX + normY * normY); |
|
|
normX = normX / len; |
|
|
normY = normY / len; |
|
|
|
|
|
ahAngle = -1.0 * Math.atan2(normY, normX) * (180 / Math.PI); |
|
|
ahAngle -= 90; |
|
|
if ( link.property().type() === "setOperatorProperty" ) { |
|
|
ahAngle -= 45; |
|
|
} |
|
|
|
|
|
rx = markerCenter.x; |
|
|
ry = markerCenter.y; |
|
|
if ( link.layers().length === 1 && !link.loops() ) { |
|
|
|
|
|
ry = -1 * ry; |
|
|
texString += "\\node[" + arrowType + ", rotate=" + ahAngle + "] at (" + rx + "pt, " + ry + "pt) (single_marker" + i + ") {};\n "; |
|
|
} else { |
|
|
ry = -1 * ry; |
|
|
texString += "\\node[" + arrowType + ", rotate=" + ahAngle + "] at (" + rx + "pt, " + ry + "pt) (marker" + i + ") {};\n "; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var cardinalityText = link.property().generateCardinalityText(); |
|
|
if ( cardinalityText && cardinalityText.length > 0 ) { |
|
|
var cardinalityCenter = lg.node().getPointAtLength(pathLen - 18); |
|
|
var cx = cardinalityCenter.x - (10 * normY); |
|
|
var cy = cardinalityCenter.y + (10 * normX); |
|
|
cy *= -1.0; |
|
|
var textColor = "black"; |
|
|
if ( cardinalityText.indexOf("A") > -1 ) { |
|
|
cardinalityText = "$\\forall$"; |
|
|
} |
|
|
if ( cardinalityText.indexOf("E") > -1 ) { |
|
|
cardinalityText = "$\\exists$"; |
|
|
} |
|
|
|
|
|
|
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily },text=" + textColor + "] at (" + cx + "pt, " + cy + "pt) (cardinalityText" + i + ") {" + cardinalityText + "};\n "; |
|
|
} |
|
|
|
|
|
|
|
|
if ( link.property().inverse() ) { |
|
|
lg = link.pathObj(); |
|
|
pathLen = Math.floor(lg.node().getTotalLength()); |
|
|
var p1_inv = lg.node().getPointAtLength(4); |
|
|
var p2_inv = lg.node().getPointAtLength(0); |
|
|
var markerCenter_inv = lg.node().getPointAtLength(6); |
|
|
startX = p1_inv.x; |
|
|
startY = p1_inv.y; |
|
|
endX = p2_inv.x; |
|
|
endY = p2_inv.y; |
|
|
normX = endX - startX; |
|
|
normY = endY - startY; |
|
|
len = Math.sqrt(normX * normX + normY * normY); |
|
|
normX = normX / len; |
|
|
normY = normY / len; |
|
|
|
|
|
ahAngle = -1.0 * Math.atan2(normY, normX) * (180 / Math.PI); |
|
|
ahAngle -= 90; |
|
|
|
|
|
rx = markerCenter_inv.x; |
|
|
ry = markerCenter_inv.y; |
|
|
if ( link.layers().length === 1 && !link.loops() ) { |
|
|
|
|
|
ry = -1 * ry; |
|
|
texString += "\\node[" + arrowType + ", rotate=" + ahAngle + "] at (" + rx + "pt, " + ry + "pt) (INV_single_marker" + i + ") {};\n "; |
|
|
} else { |
|
|
ry = -1 * ry; |
|
|
texString += "\\node[" + arrowType + ", rotate=" + ahAngle + "] at (" + rx + "pt, " + ry + "pt) (INV_marker" + i + ") {};\n "; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
nodeElements.each(function ( node ){ |
|
|
|
|
|
px = node.x; |
|
|
py = -node.y; |
|
|
identifier = node.labelForCurrentLanguage(); |
|
|
|
|
|
if ( identifier === undefined ) identifier = ""; |
|
|
var qType = "owlClass"; |
|
|
if ( node.type() === "owl:Thing" || node.type() === "owl:Nothing" ) |
|
|
qType = "owlThing"; |
|
|
|
|
|
if ( node.type() === "owl:equivalentClass" ) { |
|
|
qType = "owlEquivalentClass"; |
|
|
} |
|
|
var textColorStr = ""; |
|
|
if ( node.textBlock ) { |
|
|
var txtColor = node.textBlock()._textBlock().style("fill"); |
|
|
if ( txtColor === "rgb(0, 0, 0)" ) { |
|
|
textColorStr = ", text=black"; |
|
|
} |
|
|
if ( txtColor === "rgb(255, 255, 255)" ) { |
|
|
textColorStr = ", text=white"; |
|
|
} |
|
|
|
|
|
|
|
|
var tspans = node.textBlock()._textBlock().node().children; |
|
|
if ( tspans[0] ) { |
|
|
identifier = tspans[0].innerHTML; |
|
|
if ( node.individuals() && node.individuals().length === parseInt(tspans[0].innerHTML) ) { |
|
|
identifier = "{\\color{gray} " + tspans[0].innerHTML + " }"; |
|
|
} |
|
|
for ( var t = 1; t < tspans.length; t++ ) { |
|
|
if ( node.individuals() && node.individuals().length === parseInt(tspans[t].innerHTML) ) { |
|
|
identifier += "\\\\ {\\color{gray} " + tspans[t].innerHTML + " }"; |
|
|
} else { |
|
|
identifier += "\\\\ {\\small " + tspans[t].innerHTML + " }"; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if ( node.type() === "rdfs:Literal" ) { |
|
|
qType = "Literal"; |
|
|
} |
|
|
if ( node.type() === "rdfs:Datatype" ) { |
|
|
qType = "Datatype"; |
|
|
} |
|
|
if ( node.attributes().indexOf("anonymous") !== -1 ) { |
|
|
qType = "anonymousClass"; |
|
|
} |
|
|
|
|
|
|
|
|
if ( node.type() === "owl:unionOf" || node.type() === "owl:complementOf" || node.type() === "owl:disjointUnionOf" || node.type() === "owl:intersectionOf" ) |
|
|
qType = "owlClass"; |
|
|
|
|
|
var bgColorStr = ""; |
|
|
var widthString = ""; |
|
|
|
|
|
if ( node.type() === "rdfs:Literal" || node.type() === "rdfs:Datatype" ) { |
|
|
var width = node.width(); |
|
|
widthString = ",minimum width=" + width + "pt"; |
|
|
} |
|
|
else { |
|
|
widthString = ",minimum size=" + 2 * node.actualRadius() + "pt"; |
|
|
|
|
|
} |
|
|
if ( node.backgroundColor() ) { |
|
|
var bgColor = node.backgroundColor(); |
|
|
bgColor.toUpperCase(); |
|
|
bgColor = bgColor.slice(1, bgColor.length); |
|
|
texString += "\\definecolor{Node" + i + "_COLOR}{HTML}{" + bgColor + "} \n "; |
|
|
bgColorStr = ", fill=Node" + i + "_COLOR "; |
|
|
} |
|
|
if ( node.attributes().indexOf("deprecated") > -1 ) { |
|
|
texString += "\\definecolor{Node" + i + "_COLOR}{HTML}{CCCCCC} \n "; |
|
|
bgColorStr = ", fill=Node" + i + "_COLOR "; |
|
|
} |
|
|
|
|
|
var leftPos = px - 7; |
|
|
var rightPos = px + 7; |
|
|
var txtOffset = py + 20; |
|
|
if ( node.type() !== "owl:unionOf" || node.type() !== "owl:disjointUnionOf" ) { |
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + px + "pt, " + py + "pt) (Node" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
} |
|
|
if ( node.type() === "owl:unionOf" ) { |
|
|
|
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + px + "pt, " + py + "pt) (Node" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + leftPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + rightPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf ,fill=none , text=black] at (" + leftPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[text=black] at (" + px + "pt, " + py + "pt) (unionText13) {$\\mathbf{\\cup}$};\n"; |
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + txtOffset + "pt) (Node_text" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
} |
|
|
|
|
|
if ( node.type() === "owl:disjointUnionOf" ) { |
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + px + "pt, " + py + "pt) (Node" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + leftPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + rightPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf ,fill=none , text=black] at (" + leftPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + py + "pt) (disjointUnoinText" + i + ") {1};\n"; |
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + txtOffset + "pt) (Node_text" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
} |
|
|
|
|
|
if ( node.type() === "owl:complementOf" ) { |
|
|
|
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + px + "pt, " + py + "pt) (Node" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + px + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[font={\\fontsize{18pt}{18}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + py + "pt) (unionText13) {$\\neg$};\n"; |
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + txtOffset + "pt) (Node_text" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
} |
|
|
|
|
|
if ( node.type() === "owl:intersectionOf" ) { |
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + px + "pt, " + py + "pt) (Node" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + leftPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf , text=black] at (" + rightPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[unionOf ,fill=none , text=black] at (" + leftPos + "pt, " + py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
|
|
|
|
|
|
texString += "\\filldraw[even odd rule,fill=owlClassColor,line width=1pt] (" + leftPos + "pt, " + py + "pt) circle (12.5pt) (" + rightPos + "pt, " + py + "pt) circle (12.5pt);\n "; |
|
|
|
|
|
|
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + py + "pt) (intersectionText" + i + ") {$\\cap$};\n"; |
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + px + "pt, " + txtOffset + "pt) (Node_text" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
i++; |
|
|
|
|
|
}); |
|
|
for ( i = 0; i < propElements.length; i++ ) { |
|
|
var correspondingProp = propElements[i].property(); |
|
|
var p_px = propElements[i].x; |
|
|
var p_py = -propElements[i].y; |
|
|
identifier = correspondingProp.labelForCurrentLanguage(); |
|
|
if ( identifier === undefined ) identifier = ""; |
|
|
var textColorStr = ""; |
|
|
if ( correspondingProp.textBlock && correspondingProp.textBlock() ) { |
|
|
var txtColor = correspondingProp.textBlock()._textBlock().style("fill"); |
|
|
|
|
|
if ( txtColor === "rgb(0, 0, 0)" ) { |
|
|
textColorStr = ", text=black"; |
|
|
} |
|
|
if ( txtColor === "rgb(255, 255, 255)" ) { |
|
|
textColorStr = ", text=white"; |
|
|
} |
|
|
var tspans = correspondingProp.textBlock()._textBlock().node().children; |
|
|
|
|
|
|
|
|
|
|
|
if ( tspans[0] ) { |
|
|
identifier = tspans[0].innerHTML; |
|
|
|
|
|
for ( var t = 1; t < tspans.length; t++ ) { |
|
|
var spanText = tspans[t].innerHTML; |
|
|
if ( spanText.indexOf("(") > -1 ) { |
|
|
identifier += "\\\\ {\\small " + tspans[t].innerHTML + " }"; |
|
|
} |
|
|
else { |
|
|
identifier += "\\\\ " + tspans[t].innerHTML; |
|
|
} |
|
|
} |
|
|
} |
|
|
else { |
|
|
} |
|
|
} |
|
|
if ( correspondingProp.type() === "setOperatorProperty" ) { |
|
|
continue; |
|
|
} |
|
|
var qType = "owlObjectProperty"; |
|
|
if ( correspondingProp.type() === "owl:DatatypeProperty" ) { |
|
|
qType = "owlDatatypeProperty"; |
|
|
} |
|
|
if ( correspondingProp.type() === "rdfs:subClassOf" ) { |
|
|
qType = "rdfsSubClassOf"; |
|
|
} |
|
|
if ( correspondingProp.type() === "rdf:Property" ) { |
|
|
qType = "rdfProperty"; |
|
|
} |
|
|
|
|
|
|
|
|
var bgColorStr = ""; |
|
|
if ( correspondingProp.backgroundColor() ) { |
|
|
|
|
|
var bgColor = correspondingProp.backgroundColor(); |
|
|
|
|
|
bgColor.toUpperCase(); |
|
|
bgColor = bgColor.slice(1, bgColor.length); |
|
|
texString += "\\definecolor{property" + i + "_COLOR}{HTML}{" + bgColor + "} \n "; |
|
|
bgColorStr = ", fill=property" + i + "_COLOR "; |
|
|
} |
|
|
if ( correspondingProp.attributes().indexOf("deprecated") > -1 ) { |
|
|
texString += "\\definecolor{property" + i + "_COLOR}{HTML}{CCCCCC} \n "; |
|
|
bgColorStr = ", fill=property" + i + "_COLOR "; |
|
|
} |
|
|
|
|
|
var widthString = ""; |
|
|
var width = correspondingProp.textWidth(); |
|
|
widthString = ",minimum width=" + width + "pt"; |
|
|
|
|
|
|
|
|
|
|
|
if ( correspondingProp.type() === "owl:disjointWith" ) { |
|
|
var leftPos = p_px - 12; |
|
|
var rightPos = p_px + 12; |
|
|
var txtOffset = p_py - 20; |
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + p_px + "pt, " + p_py + "pt) (Node" + i + ") {};\n"; |
|
|
texString += "\\node[disjointWith , text=black] at (" + leftPos + "pt, " + p_py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[disjointWith , text=black] at (" + rightPos + "pt, " + p_py + "pt) (SymbolNode" + i + ") {};\n"; |
|
|
texString += "\\node[font={\\fontsize{12pt}{12}\\selectfont \\sffamily }" + textColorStr + "] at (" + p_px + "pt, " + txtOffset + "pt) (Node_text" + i + ") {"; |
|
|
if ( graph.options().compactNotation() === false ) { |
|
|
texString += "(disjoint)"; |
|
|
} |
|
|
texString += "};\n"; |
|
|
continue; |
|
|
} |
|
|
|
|
|
|
|
|
if ( correspondingProp.inverse() ) { |
|
|
var inv_correspondingProp = correspondingProp.inverse(); |
|
|
|
|
|
var inv_identifier = inv_correspondingProp.labelForCurrentLanguage(); |
|
|
if ( inv_identifier === undefined ) inv_identifier = ""; |
|
|
var inv_textColorStr = ""; |
|
|
|
|
|
|
|
|
|
|
|
if ( inv_correspondingProp.textBlock && inv_correspondingProp.textBlock() ) { |
|
|
|
|
|
var inv_txtColor = inv_correspondingProp.textBlock()._textBlock().style("fill"); |
|
|
|
|
|
if ( inv_txtColor === "rgb(0, 0, 0)" ) { |
|
|
inv_textColorStr = ", text=black"; |
|
|
} |
|
|
if ( inv_txtColor === "rgb(255, 255, 255)" ) { |
|
|
inv_textColorStr = ", text=white"; |
|
|
} |
|
|
var inv_tspans = inv_correspondingProp.textBlock()._textBlock().node().children; |
|
|
|
|
|
|
|
|
|
|
|
if ( inv_tspans[0] ) { |
|
|
inv_identifier = inv_tspans[0].innerHTML; |
|
|
|
|
|
for ( var inv_t = 1; inv_t < inv_tspans.length; inv_t++ ) { |
|
|
var ispanText = inv_tspans[inv_t].innerHTML; |
|
|
if ( ispanText.indexOf("(") > -1 ) { |
|
|
inv_identifier += "\\\\ {\\small " + inv_tspans[inv_t].innerHTML + " }"; |
|
|
} else { |
|
|
inv_identifier += "\\\\ " + inv_tspans[inv_t].innerHTML; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
var inv_qType = "owlObjectProperty"; |
|
|
var inv_bgColorStr = ""; |
|
|
|
|
|
if ( inv_correspondingProp.backgroundColor() ) { |
|
|
|
|
|
var inv_bgColor = inv_correspondingProp.backgroundColor(); |
|
|
|
|
|
inv_bgColor.toUpperCase(); |
|
|
inv_bgColor = inv_bgColor.slice(1, inv_bgColor.length); |
|
|
texString += "\\definecolor{inv_property" + i + "_COLOR}{HTML}{" + inv_bgColor + "} \n "; |
|
|
inv_bgColorStr = ", fill=inv_property" + i + "_COLOR "; |
|
|
} |
|
|
if ( inv_correspondingProp.attributes().indexOf("deprecated") > -1 ) { |
|
|
texString += "\\definecolor{inv_property" + i + "_COLOR}{HTML}{CCCCCC} \n "; |
|
|
inv_bgColorStr = ", fill=inv_property" + i + "_COLOR "; |
|
|
} |
|
|
|
|
|
var inv_widthString = ""; |
|
|
var inv_width = inv_correspondingProp.textWidth(); |
|
|
|
|
|
var pOY1 = p_py - 14; |
|
|
var pOY2 = p_py + 14; |
|
|
inv_widthString = ",minimum width=" + inv_width + "pt"; |
|
|
texString += "% Createing Inverse Property \n"; |
|
|
texString += "\\node[" + inv_qType + " " + inv_widthString + " " + inv_bgColorStr + " " + inv_textColorStr + "] at (" + p_px + "pt, " + pOY1 + "pt) (property" + i + ") {" + inv_identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
texString += "% " + inv_qType + " vs " + qType + "\n"; |
|
|
texString += "% " + inv_widthString + " vs " + widthString + "\n"; |
|
|
texString += "% " + inv_bgColorStr + " vs " + bgColorStr + "\n"; |
|
|
texString += "% " + inv_textColorStr + " vs " + textColorStr + "\n"; |
|
|
|
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + p_px + "pt, " + pOY2 + "pt) (property" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
|
|
|
} else { |
|
|
texString += "\\node[" + qType + " " + widthString + " " + bgColorStr + " " + textColorStr + "] at (" + p_px + "pt, " + p_py + "pt) (property" + i + ") {" + identifier.replaceAll("_", "\\_ ") + "};\n"; |
|
|
} |
|
|
} |
|
|
|
|
|
texString += "\\end{tikzpicture}\n}\n \\end{center}\n"; |
|
|
|
|
|
|
|
|
var dataURI = "data:text/json;charset=utf-8," + encodeURIComponent(texString); |
|
|
exportTexButton.attr("href", dataURI) |
|
|
.attr("download", exportFilename + ".tex"); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
function calculateRadian( angle ){ |
|
|
angle = angle % 360; |
|
|
if ( angle < 0 ) { |
|
|
angle = angle + 360; |
|
|
} |
|
|
return (Math.PI * angle) / 180; |
|
|
} |
|
|
|
|
|
function calculateAngle( radian ){ |
|
|
return radian * (180 / Math.PI); |
|
|
} |
|
|
|
|
|
return exportMenu; |
|
|
}; |
|
|
|