@piveau/piveau-hub-ui-modules 4.6.25 → 4.6.26

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.
@@ -1 +1 @@
1
- {"version":3,"file":"RDFconverter.mjs","sources":["../../../lib/data-provider-interface/utils/RDFconverter.js"],"sourcesContent":["import N3 from \"n3\";\nimport { isEmpty } from \"lodash\";\nimport { has } from \"lodash\";\n\nimport generalDpiConfig from \"../config/dpi-spec-config\";\n\nimport generalHelper from \"./general-helper\";\n\n/**\n * Converts all properties for given data from form input data into RDF (N-Triples)\n * @param {Object} data Data given within an object. Data stored as follows { datasets: {...}, distributions: [{...},...], catalogues: {...}}\n * @param {String} property Name of property which should be converted (either 'datasets' or 'catalogues')\n * @returns String of converted data in RDF format (N-Triples)\n */\nfunction convertToRDF(data, property, specification) { \n let finishedRDFdata;\n\n let dpiConfig = specification;\n\n // writer for adding data as quads\n const RDFdata = new N3.Writer({\n prefixes: dpiConfig.prefixes,\n format: \"N-Triples\",\n });\n // datasetURI also needed for distribution creation (add distributionURI to dataset (dcat:distribution))\n const datasetURI = `https://piveau.eu/set/data/${data.datasets.datasetID}`;\n\n // convert values for datasets/catalogues\n convertPropertyValues(\n RDFdata,\n data[property],\n property,\n \"\",\n \"\",\n true,\n datasetURI,\n dpiConfig\n ); // datasets and catalogues\n\n // include distribution data into same graph\n // differentiation neccessary because datasets also include distributions\n if (property === \"datasets\") {\n // multiple distributions possible -> [{data of distribution 1}, {data of distribution 2}, ...]\n for (let index = 0; index < data.distributions.length; index += 1) {\n convertPropertyValues(\n RDFdata,\n data.distributions[index],\n \"distributions\",\n \"\",\n \"\",\n true,\n datasetURI,\n dpiConfig\n );\n }\n }\n\n RDFdata.end((error, result) => (finishedRDFdata = result));\n return finishedRDFdata;\n}\n\n/**\n * Converts each single value of given form data based on type into RDF\n * @param {N3.Writer} RDFdataset Dataset the converted RDF data should be added to\n * @param {Object} data Object containing data as key-value pairs\n * @param {String} property String determining which property is handled (datasets/distributions/catalogues)\n * @param {DataFactory} preMainURI (can be undefined) Could be a namedNode or BlankNode containing an URI\n * @param {DataFactory} preMainType (can be undefined) NamedNode determining the type of the current property (e.g. dcat:Dataset (as object))\n * @param {Boolean} setMain Value determining if additional values should be set (type, id, sample...)\n * @param {String} datasetURI URI of dataset for use in distribution conversion\n */\nfunction convertPropertyValues(\n RDFdataset,\n data,\n property,\n preMainURI,\n preMainType,\n setMain,\n datasetURI,\n dpiConfig\n) {\n\n console.log( RDFdataset,\n data,\n property,\n preMainURI,\n preMainType,\n setMain,\n datasetURI,\n dpiConfig);\n \n const formatTypes = dpiConfig.formatTypes;\n\n // method can be called recursively for nested properties\n // need to access id of parent node for later use as subject -> provide via method parameters (preMainURI & preMainType)\n let mainURI;\n let mainType;\n\n // parent method can be called recursively for nested values\n // if called on non-nested values a overall id and type muste be set (setMain -> true)\n if (setMain) {\n if (property === \"datasets\") {\n mainType = generalHelper.addNamespace(\"dcat:Dataset\", dpiConfig);\n mainURI = N3.DataFactory.namedNode(datasetURI); // datasetID should never be empty because of frontend checking\n } else if (property === \"catalogues\") {\n mainType = generalHelper.addNamespace(\"dcat:Catalog\", dpiConfig);\n mainURI = N3.DataFactory.namedNode(\n `https://piveau.eu/set/data/${data.datasetID}`\n ); // datasetID should never be empty because of frontend checking\n } else {\n mainType = generalHelper.addNamespace(\"dcat:Distribution\", dpiConfig);\n const randomId = generalHelper.makeId(10);\n // distribution id can be random, will be overwritten by backend on saving data\n mainURI = N3.DataFactory.namedNode(\n `https://piveau.eu/set/data/${randomId}`\n );\n }\n\n // parent method can be called recursively to convert nested values\n // but setting the overal type and id of a dataset/catalogue is only required once at the beginning\n // -> only set additional properties when setMain === true\n setAdditionalProperties(\n RDFdataset,\n data,\n mainURI,\n mainType,\n property,\n datasetURI,\n dpiConfig\n );\n } else {\n // called on nested properties with already given URI and type which should used in the following conversion process\n mainURI = preMainURI;\n mainType = preMainType;\n }\n\n // distributions may have download URLs, if no downloadURL is provided -> provided accessUrls will be also set as downloadUrls\n // accessUrl is a required property and therefore always provided (made sure by the frontend)\n // const downloadUrlsProvided = has(data, 'dcat:downloadURL') && !isEmpty(data['dcat:downloadURL']) && data['dcat:downloadURL'].map(el => !isEmpty(el['@id'])).reduce((a, b) => b);\n\n // loop trough all keys within data object and convert values (or nested values) to RDF\n const valueKeys = Object.keys(data);\n for (let index = 0; index < valueKeys.length; index += 1) {\n const key = valueKeys[index]; // key format: either a normal name for special properties (e.g. datasetID) or namespaced keys (e.g. dct:title)\n\n if (generalHelper.propertyHasValue(data[key])) {\n // all properties are sorted by their format (see .../data-provider-interface/config/format-types.js)\n // depending on the format the corresponding conversion-method is used, writing the result to the overall RDF-writer\n if (formatTypes.singularString[property].includes(key)) {\n convertSingularString(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.singularURI[property].includes(key)) {\n convertSingularURI(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.multipleURI[property].includes(key)) {\n // if no dowloadURL is provided, set accessUrls as downloadUrls\n // if (!downloadUrlsProvided && key === 'dcat:accessURL') {\n // // copy accessurl array to donwloadurl array and convert data\n\n // data['dcat:downloadURL'] = cloneDeep(data['dcat:accessURL']);\n // convertMultipleURI(RDFdataset, mainURI, data, 'dcat:downloadURL', property, dpiConfig);\n // }\n\n convertMultipleURI(RDFdataset, mainURI, data, key, property, dpiConfig);\n } else if (formatTypes.typedStrings[property].includes(key)) {\n convertTypedString(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.multilingualStrings[property].includes(key)) {\n convertMultilingual(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.groupedProperties[property].includes(key)) {\n // grouped properties are properties provided by the form which consist of multiple properties (e.g contactPoint)\n // the properties values are stored within an object located within an array\n // for repeatable properties there are multiple objects in this array, otherwise there is just one\n\n let actualData;\n // vcard:hasAdress is an object as well as dct:creator and skos:notation\n if (\n key === \"vcard:hasAddress\" ||\n key === \"dct:creator\" ||\n key === \"skos:notation\" ||\n key === \"spdx:checksum\"\n )\n actualData = [data[key]];\n else actualData = data[key];\n\n // looping trough all existing objects within the array\n for (let groupId = 0; groupId < actualData.length; groupId += 1) {\n let currentGroupData = actualData[groupId];\n\n if (!isEmpty(currentGroupData)) {\n if (key === \"skos:notation\") {\n // property skos:notation work a little bit different then other properties\n // the form provides a value and a type from two seperated fields ({'@value': '...', '@type': '...'})\n // the resulting RDF should merge these values into a typed literal (value^^type)\n if (\n has(currentGroupData, \"@value\") &&\n !isEmpty(currentGroupData[\"@value\"])\n ) {\n let notationValue;\n\n // if a type is given, use to form typed literal\n // if no type is given, only use value to create literal\n if (\n has(currentGroupData, \"@type\") &&\n !isEmpty(currentGroupData[\"@type\"])\n ) {\n // typed literal\n notationValue = N3.DataFactory.literal(\n currentGroupData[\"@value\"],\n N3.DataFactory.namedNode(currentGroupData[\"@type\"].resource)\n );\n } else {\n // literal\n notationValue = N3.DataFactory.literal(\n currentGroupData[\"@value\"]\n );\n }\n\n // add type for adms:identifier\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"adms:Identifier\", dpiConfig)\n )\n )\n );\n\n // save quadruple with typed or untyped literal\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n notationValue\n )\n );\n\n // resulting rdf quads should look like this:\n // datasetId adms:identifier admsIdentifierUtl\n // admsIdentifierUrl rdf:type adms:Identifier\n // admsIdentifierUrl skos:notation value^^type\n }\n } else {\n let groupBlankNode;\n\n // because grouped properties have a list of nested properties we need an initial quadruple stating the parent property\n // using a blank node as object which later serves as subject for the nested properties\n // RDF example:\n // datasetID dct:contactPoint blankNodeId\n // blankNodeId foaf:mbox email@exmaple.com\n // blankNodeId fn:name InsitutionName ...\n\n // some form fields provide an URL which should serves as namedNode for other nested values (e.g. conformsTo)\n // RDF example:\n // datasetID dct:conformsTo conformsToURI\n // conformsToURI dct:title conformsTitle\n if (\n (key === \"foaf:page\" ||\n key === \"adms:identifier\" ||\n key === \"dct:conformsTo\") &&\n has(currentGroupData, \"@id\")\n ) {\n groupBlankNode = N3.DataFactory.namedNode(\n currentGroupData[\"@id\"]\n );\n }\n // all properties that don't provide an URL serving as namedNode for nested values need to define a blank node\n\n // page gets type but also has multilingual fields with preseleted langauge\n // don't create blank node if there is not data for page beside the preselected language\n let emptyPage = false;\n\n if (key === \"foaf:page\") {\n // if page has title and/or description property given, check if there are values given\n const hasTitle = has(currentGroupData, \"dct:title\");\n const hasDescription = has(currentGroupData, \"dct:description\");\n\n let hasNoValueKeysTitle = true;\n let hasEmptyValueTitle = true;\n let hasNoValueKeysDescription = true;\n let hasEmptyValueDescription = true;\n\n if (hasTitle) {\n hasNoValueKeysTitle = !currentGroupData[\"dct:title\"].every(\n (el) => has(el, \"@value\")\n );\n hasEmptyValueTitle = currentGroupData[\"dct:title\"].every(\n (el) => isEmpty(el[\"@value\"])\n );\n }\n\n if (hasDescription) {\n hasNoValueKeysDescription = !currentGroupData[\n \"dct:description\"\n ].every((el) => has(el, \"@value\"));\n hasEmptyValueDescription = currentGroupData[\n \"dct:description\"\n ].every((el) => isEmpty(el[\"@value\"]));\n }\n\n // page should be handled as empty if:\n // no title and/or no description given\n // if properties given: no value given or value empty\n if (\n (hasNoValueKeysTitle || hasEmptyValueTitle) &&\n (hasNoValueKeysDescription || hasEmptyValueDescription)\n )\n emptyPage = true;\n }\n\n if (!emptyPage) {\n if (!groupBlankNode)\n groupBlankNode = N3.DataFactory.blankNode(\"\");\n\n // save inital quadruple using the named or blank node as object\n // e.g. datasetId dct:contactPoint blankNode/namedNode\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n groupBlankNode\n )\n );\n\n // some properties provide additional types\n if (has(formatTypes.additionalPropertyTypes, key)) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n groupBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\n formatTypes.additionalPropertyTypes[key],\n dpiConfig\n )\n )\n )\n );\n }\n\n // temporal values nested inside another object: \"dct:temporal\": [{ \"dct:temporal\": { \"dcat:startDate\": \"...\", \"dcat:endDate\": \"...\" } }]\n if (key === \"dct:temporal\") {\n if (has(currentGroupData, \"dct:temporal\")) {\n currentGroupData = currentGroupData[\"dct:temporal\"];\n }\n }\n\n // convert all nested values provided by form\n convertPropertyValues(\n RDFdataset,\n currentGroupData,\n property,\n groupBlankNode,\n mainType,\n false,\n dpiConfig,\n dpiConfig\n );\n }\n }\n }\n }\n } else if (formatTypes.conditionalProperties[property].includes(key)) {\n // publisher either is an URI or a group with multiple values (name, homepage, email)\n // license either is an URI or a group with multiple values ()\n if (key === \"dct:publisher\" || key === \"dct:license\") {\n // data contains either {resource: '...', name: '...'} or object containing other keys\n if (has(data[key], \"resource\")) {\n convertSingularURI(RDFdataset, mainURI, data, key, dpiConfig);\n } else {\n const groupBlankNode = N3.DataFactory.blankNode(\"\");\n\n // some properties provide additional types\n if (has(formatTypes.additionalPropertyTypes, key)) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n groupBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\n formatTypes.additionalPropertyTypes[key],\n dpiConfig\n )\n )\n )\n );\n }\n\n // save inital quadruple using the named or blank node as object\n // e.g. datasetId dct:contactPoint blankNode/namedNode\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n groupBlankNode\n )\n );\n\n convertPropertyValues(\n RDFdataset,\n data[key],\n property,\n groupBlankNode,\n mainType,\n false,\n dpiConfig,\n dpiConfig\n );\n }\n }\n } else if (key === \"dcat:temporalResolution\") {\n // temporal resolution is displayed as group of input forms for each property (year, month, day, ...)\n // the form provides the data as following: [ { 'Year': '...', 'Month': '...', ... } ]\n // the final format of this property should look like this: P?Y?M?DT?H?M?S\n // not all values must be filled and therefore be present -> default behavior if not given: value = 0\n\n const resolutionValues = data[key];\n const valueString = `P${\n resolutionValues.Year ? resolutionValues.Year : 0\n }Y${resolutionValues.Month ? resolutionValues.Month : 0}M${\n resolutionValues.Day ? resolutionValues.Day : 0\n }DT${resolutionValues.Hour ? resolutionValues.Hour : 0}H${\n resolutionValues.Minute ? resolutionValues.Minute : 0\n }M${resolutionValues.Second ? resolutionValues.Second : 0}S`;\n\n // frontend always provides temporalResolution even if there is no value resulting in P0Y0M0DT0H0M0S\n // don't save if value is equal to P0Y0M0DT0H0M0S\n if (valueString !== \"P0Y0M0DT0H0M0S\") {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(\n valueString,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"xsd:duration\", dpiConfig)\n )\n )\n )\n );\n }\n } else if (key === \"dct:identifier\") {\n // form provides data as array of objects with strings: [ { '@value': 'string1' }, { '@value': 'string2' }, ... ]\n // create quadruple for each given object in the array\n for (let valueId = 0; valueId < data[key].length; valueId += 1) {\n const currentValue = data[key][valueId];\n if (has(currentValue, \"@value\") && !isEmpty(currentValue[\"@value\"])) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(currentValue[\"@value\"])\n )\n );\n }\n }\n } else if (key === \"dct:rights\") {\n // rights has a static type (RightsStatement) which needs to be added to linked data as additional node\n // therefore we need to create an initial quadruple for with 'rights' being the predicate having a blank node\n // blank node serves as subject for the following quadruples which contain the type and actual value of the form field\n // RDF:\n // datasetID dct:rights blankNodeID\n // blankNodeId rdf:type RightsStatement\n // blankNodeId rdfs:label LabelValue\n\n // blank node as object for inital quadruple and also as subject for following quadruples\n const rightsBlankNode = N3.DataFactory.blankNode(\"\");\n\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n rightsBlankNode\n )\n );\n\n // add additional type declaration\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n rightsBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"dct:RightsStatement\", dpiConfig)\n )\n )\n );\n\n // rights is a conditional property and provides either an URI or a string ( { rdfs:label : 'URL/string' } )\n let rightsValue;\n\n if (data[key][\"@type\"] === \"url\") {\n rightsValue = N3.DataFactory.namedNode(data[key][\"rdfs:label\"]);\n } else {\n rightsValue = N3.DataFactory.literal(data[key][\"rdfs:label\"]);\n }\n\n // add actual value\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n rightsBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdfs:label\", dpiConfig)\n ),\n rightsValue\n )\n );\n }\n }\n }\n}\n\n/**\n * Creates additional quads depending on given property and saves them to given RDF dataset\n * @param {N3.Writer} RDFdataset RDF dataset the quads are saved to\n * @param {Object} data Object containing data as key-value pairs\n * @param {DataFactory.namedNode} mainURI NamedNode defining URI of current property graph\n * @param {DataFactory} mainType NamedNode defining type of current property graph\n * @param {String} property String determining which property is converted (datasets/distributions/catalogues)\n * @param {String} datasetURI URI of dataset used to add distribution URI to dct:distribution within dataset graph\n */\nfunction setAdditionalProperties(\n RDFdataset,\n data,\n mainURI,\n mainType,\n property,\n datasetURI,\n dpiConfig\n) {\n // adding id and type of property\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(mainType)\n )\n );\n\n // catalogues always have to contain the property dct:type with the value 'dcat-ap'\n if (property === \"catalogues\") {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"dct:type\", dpiConfig)\n ),\n N3.DataFactory.literal(\"dcat-ap\")\n )\n );\n }\n\n // add distribution id to dataset graph (dcat:distribution)\n if (property === \"distributions\") {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n N3.DataFactory.namedNode(datasetURI),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"dcat:distribution\", dpiConfig)\n ),\n mainURI\n )\n );\n }\n}\n\n//-----------------------------------------------------------------------------------------------------\n// basic conversion (input to RDF) methods for different categories of data\n//-----------------------------------------------------------------------------------------------------\n// seems unnecessary at first but if we want to convert nested properties as well, we need these\n// methods (especially to provide the correct parent URI)\n\n/**\n * Converts provided data to quad and saves it to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quad\n * @param {String} data Data given by form used as object in quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quad\n */\nfunction convertSingularString(RDFdataset, id, data, key, dpiConfig) {\n if (!isEmpty(data[key])) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.literal(data[key])\n )\n );\n }\n}\n\n/**\n * Converts provided data to quad and saves it to given dataset\n * @param {N3.Writer} RDFdata Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quad\n * @param {String} data Data given by form used as object in quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quad\n */\nfunction convertSingularURI(RDFdataset, id, data, key, dpiConfig) {\n // there are two different formats the frontend delivers URIs\n // 1: 'URI' or 2: {'name': 'abc', 'resource': 'URI'}\n\n // URIs can either be a normal URL or an email address\n // mail addresses typicall include '@' which is used to determine if the given string is a normal URL or an email address\n if (!isEmpty(data[key])) {\n let singleURI;\n\n if (typeof data[key] === \"object\") {\n if (has(data[key], \"resource\")) {\n singleURI = data[key].resource;\n }\n } else {\n if (data[key].includes(\"@\")) {\n // mail address\n singleURI = `mailto:${data[key]}`;\n } else {\n // normal URL\n singleURI = data[key];\n }\n }\n\n // save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.namedNode(singleURI)\n )\n );\n }\n}\n\n/**\n * Converts provided data to quads and saves them to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quads\n * @param {Array} data Array containing URLs used as object within quads\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quads\n * @param {String} property Determining which property is concerted (datasets/distributions/catalogues)\n */\nfunction convertMultipleURI(RDFdataset, id, data, key, property, dpiConfig) {\n // there are two different formats the frontend delivers multiple URIs\n // 1: [ {\"name\": '...', \"resource\": 'URI'}, {...} ] -> multi-autocomplete fields\n // 2: [ { \"@id\": \"URI1\" }, { \"@id\": \"URI2\" } ] repeatable fields\n\n for (let uriIndex = 0; uriIndex < data[key].length; uriIndex += 1) {\n let currentURI;\n const valueObject = data[key][uriIndex];\n if (!isEmpty(valueObject)) {\n if (has(valueObject, \"resource\")) currentURI = valueObject.resource;\n else if (has(valueObject, \"@id\")) currentURI = valueObject[\"@id\"];\n }\n\n // save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.namedNode(currentURI)\n )\n );\n }\n}\n\n/**\n * Converts provided data to quad and saves them to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quad\n * @param {String} data String data used as object with type in quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quad and to determine quad-object type\n */\nfunction convertTypedString(RDFdataset, id, data, key, dpiConfig) {\n if (!isEmpty(data[key])) {\n // there is a variety of properties which can have different types\n // issued and motified already provide a type definition ({'@type': 'date/datetime', '@value': '...'})\n if (key === \"dct:issued\" || key === \"dct:modified\") {\n if (has(data[key], \"@value\") && !isEmpty(data[key][\"@value\"])) {\n const imValueType =\n data[key][\"@type\"] === \"date\" ? data[key][\"@type\"] : \"dateTime\";\n const valueType = generalHelper.addNamespace(\n `xsd:${imValueType}`,\n dpiConfig\n );\n\n /// save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(\n data[key][\"@value\"],\n N3.DataFactory.namedNode(valueType)\n )\n )\n );\n }\n } else {\n // all other properties are given as a simple string\n let valueType;\n if (key === \"dcat:endDate\" || key === \"dcat:startDate\") {\n // dcat:endDate and dcat:startDate are xsd:dateTime\n valueType = generalHelper.addNamespace(\"xsd:dateTime\", dpiConfig);\n } else if (\n key === \"dcat:spatialResolutionInMeters\" ||\n key === \"dcat:byteSize\"\n ) {\n // dcat:spatialResolutionInMeters and dcat:byteSize are xsd:decimal\n valueType = generalHelper.addNamespace(\"xsd:decimal\", dpiConfig);\n }\n else if (\n key === \"pv:DistributionType\"\n \n ) {\n valueType = generalHelper.addNamespace(\"xsd:string\", dpiConfig);\n }\n\n /// save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.literal(data[key], N3.DataFactory.namedNode(valueType))\n )\n );\n \n }\n }\n}\n\n/**\n * Converts provided data to quads and saves them to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quads\n * @param {Array} data Array of objects containing data and language converted into literal with language for quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quads\n */\nfunction convertMultilingual(RDFdataset, id, data, key, dpiConfig) {\n // multilingual fields mostly provide data as followed\n // [ { '@value': '....', '@language': '...' }, ... ]\n // only the licence title provides no language\n\n if (!isEmpty(data[key])) {\n // licence title\n if (!Array.isArray(data[key])) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.literal(data[key])\n )\n );\n } else {\n for (let langIndex = 0; langIndex < data[key].length; langIndex += 1) {\n const currentData = data[key][langIndex];\n // only save data if a value is given (forntend provides preselected language which don't need to be saved if there is no actaul value)\n if (\n !isEmpty(currentData) &&\n has(currentData, \"@value\") &&\n !isEmpty(currentData[\"@value\"])\n ) {\n let languageTag;\n\n // if there is no langauge given, set language to english\n if (\n !has(currentData, \"@language\") ||\n isEmpty(currentData, \"@language\")\n ) {\n languageTag = \"en\";\n } else {\n // if language is given, use given tag\n languageTag = currentData[\"@language\"];\n }\n\n // saving quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(currentData[\"@value\"], languageTag)\n )\n );\n }\n }\n }\n }\n}\n\nexport default {\n convertToRDF,\n};\n"],"names":["convertToRDF","data","property","specification","finishedRDFdata","dpiConfig","RDFdata","N3","datasetURI","convertPropertyValues","index","error","result","RDFdataset","preMainURI","preMainType","setMain","formatTypes","mainURI","mainType","generalHelper","randomId","setAdditionalProperties","valueKeys","key","convertSingularString","convertSingularURI","convertMultipleURI","convertTypedString","convertMultilingual","actualData","groupId","currentGroupData","isEmpty","has","notationValue","groupBlankNode","emptyPage","hasTitle","hasDescription","hasNoValueKeysTitle","hasEmptyValueTitle","hasNoValueKeysDescription","hasEmptyValueDescription","el","resolutionValues","valueString","valueId","currentValue","rightsBlankNode","rightsValue","id","singleURI","uriIndex","currentURI","valueObject","imValueType","valueType","langIndex","currentData","languageTag","toRDF"],"mappings":";;;;;;;;AAcA,SAASA,EAAaC,GAAMC,GAAUC,GAAe;AACnD,MAAIC,GAEAC,IAAYF;AAGhB,QAAMG,IAAU,IAAIC,EAAG,OAAO;AAAA,IAC5B,UAAUF,EAAU;AAAA,IACpB,QAAQ;AAAA,EACZ,CAAG,GAEKG,IAAa,8BAA8BP,EAAK,SAAS,SAAS;AAgBxE,MAbAQ;AAAA,IACEH;AAAA,IACAL,EAAKC,CAAQ;AAAA,IACbA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAM;AAAA,IACAH;AAAA,EACJ,GAIMH,MAAa;AAEf,aAASQ,IAAQ,GAAGA,IAAQT,EAAK,cAAc,QAAQS,KAAS;AAC9D,MAAAD;AAAA,QACEH;AAAA,QACAL,EAAK,cAAcS,CAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAF;AAAA,QACAH;AAAA,MACR;AAIE,SAAAC,EAAQ,IAAI,CAACK,GAAOC,MAAYR,IAAkBQ,CAAO,GAClDR;AACT;AAYA,SAASK,EACPI,GACAZ,GACAC,GACAY,GACAC,GACAC,GACAR,GACAH,GACA;AAEA,UAAQ;AAAA,IAAKQ;AAAA,IACXZ;AAAA,IACAC;AAAA,IACAY;AAAA,IACAC;AAAA,IACAC;AAAA,IACAR;AAAA,IACAH;AAAA,EAAS;AAEX,QAAMY,IAAcZ,EAAU;AAI9B,MAAIa,GACAC;AAIJ,MAAIH,GAAS;AACX,QAAId,MAAa;AACf,MAAAiB,IAAWC,EAAc,aAAa,gBAAgBf,CAAS,GAC/Da,IAAUX,EAAG,YAAY,UAAUC,CAAU;AAAA,aACpCN,MAAa;AACtB,MAAAiB,IAAWC,EAAc,aAAa,gBAAgBf,CAAS,GAC/Da,IAAUX,EAAG,YAAY;AAAA,QACvB,8BAA8BN,EAAK,SAAS;AAAA,MACpD;AAAA,SACW;AACL,MAAAkB,IAAWC,EAAc,aAAa,qBAAqBf,CAAS;AACpE,YAAMgB,IAAWD,EAAc,OAAO,EAAE;AAExC,MAAAF,IAAUX,EAAG,YAAY;AAAA,QACvB,8BAA8Bc,CAAQ;AAAA,MAC9C;AAAA,IACK;AAKD,IAAAC;AAAA,MACET;AAAA,MACAZ;AAAA,MACAiB;AAAA,MACAC;AAAA,MACAjB;AAAA,MACAM;AAAA,MACAH;AAAA,IACN;AAAA,EACA;AAEI,IAAAa,IAAUJ,GACVK,IAAWJ;AAQb,QAAMQ,IAAY,OAAO,KAAKtB,CAAI;AAClC,WAASS,IAAQ,GAAGA,IAAQa,EAAU,QAAQb,KAAS,GAAG;AACxD,UAAMc,IAAMD,EAAUb,CAAK;AAE3B,QAAIU,EAAc,iBAAiBnB,EAAKuB,CAAG,CAAC;AAG1C,UAAIP,EAAY,eAAef,CAAQ,EAAE,SAASsB,CAAG;AACnD,QAAAC,EAAsBZ,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACtDY,EAAY,YAAYf,CAAQ,EAAE,SAASsB,CAAG;AACvD,QAAAE,EAAmBb,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACnDY,EAAY,YAAYf,CAAQ,EAAE,SAASsB,CAAG;AASvD,QAAAG,EAAmBd,GAAYK,GAASjB,GAAMuB,GAAKtB,GAAUG,CAAS;AAAA,eAC7DY,EAAY,aAAaf,CAAQ,EAAE,SAASsB,CAAG;AACxD,QAAAI,EAAmBf,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACnDY,EAAY,oBAAoBf,CAAQ,EAAE,SAASsB,CAAG;AAC/D,QAAAK,EAAoBhB,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACpDY,EAAY,kBAAkBf,CAAQ,EAAE,SAASsB,CAAG,GAAG;AAKhE,YAAIM;AAEJ,QACEN,MAAQ,sBACRA,MAAQ,iBACRA,MAAQ,mBACRA,MAAQ,kBAERM,IAAa,CAAC7B,EAAKuB,CAAG,CAAC,IACpBM,IAAa7B,EAAKuB,CAAG;AAG1B,iBAASO,IAAU,GAAGA,IAAUD,EAAW,QAAQC,KAAW,GAAG;AAC/D,cAAIC,IAAmBF,EAAWC,CAAO;AAEzC,cAAI,CAACE,EAAQD,CAAgB;AAC3B,gBAAIR,MAAQ;AAIV,kBACEU,EAAIF,GAAkB,QAAQ,KAC9B,CAACC,EAAQD,EAAiB,QAAQ,CAAC,GACnC;AACA,oBAAIG;AAIJ,gBACED,EAAIF,GAAkB,OAAO,KAC7B,CAACC,EAAQD,EAAiB,OAAO,CAAC,IAGlCG,IAAgB5B,EAAG,YAAY;AAAA,kBAC7ByB,EAAiB,QAAQ;AAAA,kBACzBzB,EAAG,YAAY,UAAUyB,EAAiB,OAAO,EAAE,QAAQ;AAAA,gBAC/E,IAGkBG,IAAgB5B,EAAG,YAAY;AAAA,kBAC7ByB,EAAiB,QAAQ;AAAA,gBAC7C,GAIgBnB,EAAW;AAAA,kBACTN,EAAG,YAAY;AAAA,oBACbW;AAAA,oBACAX,EAAG,YAAY;AAAA,sBACba,EAAc,aAAa,YAAYf,CAAS;AAAA,oBACjD;AAAA,oBACDE,EAAG,YAAY;AAAA,sBACba,EAAc,aAAa,mBAAmBf,CAAS;AAAA,oBACxD;AAAA,kBACF;AAAA,gBACnB,GAGgBQ,EAAW;AAAA,kBACTN,EAAG,YAAY;AAAA,oBACbW;AAAA,oBACAX,EAAG,YAAY;AAAA,sBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,oBAC1C;AAAA,oBACD8B;AAAA,kBACD;AAAA,gBACnB;AAAA,cAMe;AAAA,mBACI;AACL,kBAAIC;AAaJ,eACGZ,MAAQ,eACPA,MAAQ,qBACRA,MAAQ,qBACVU,EAAIF,GAAkB,KAAK,MAE3BI,IAAiB7B,EAAG,YAAY;AAAA,gBAC9ByB,EAAiB,KAAK;AAAA,cACxC;AAMc,kBAAIK,IAAY;AAEhB,kBAAIb,MAAQ,aAAa;AAEvB,sBAAMc,IAAWJ,EAAIF,GAAkB,WAAW,GAC5CO,IAAiBL,EAAIF,GAAkB,iBAAiB;AAE9D,oBAAIQ,IAAsB,IACtBC,IAAqB,IACrBC,IAA4B,IAC5BC,IAA2B;AAE/B,gBAAIL,MACFE,IAAsB,CAACR,EAAiB,WAAW,EAAE;AAAA,kBACnD,CAACY,MAAOV,EAAIU,GAAI,QAAQ;AAAA,gBAC5C,GACkBH,IAAqBT,EAAiB,WAAW,EAAE;AAAA,kBACjD,CAACY,MAAOX,EAAQW,EAAG,QAAQ,CAAC;AAAA,gBAChD,IAGoBL,MACFG,IAA4B,CAACV,EAC3B,iBACpB,EAAoB,MAAM,CAACY,MAAOV,EAAIU,GAAI,QAAQ,CAAC,GACjCD,IAA2BX,EACzB,iBACpB,EAAoB,MAAM,CAACY,MAAOX,EAAQW,EAAG,QAAQ,CAAC,CAAC,KAOpCJ,KAAuBC,OACvBC,KAA6BC,OAE9BN,IAAY;AAAA,cACf;AAED,cAAKA,MACED,MACHA,IAAiB7B,EAAG,YAAY,UAAU,EAAE,IAI9CM,EAAW;AAAA,gBACTN,EAAG,YAAY;AAAA,kBACbW;AAAA,kBACAX,EAAG,YAAY;AAAA,oBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,kBAC1C;AAAA,kBACD+B;AAAA,gBACD;AAAA,cACnB,GAGoBF,EAAIjB,EAAY,yBAAyBO,CAAG,KAC9CX,EAAW;AAAA,gBACTN,EAAG,YAAY;AAAA,kBACb6B;AAAA,kBACA7B,EAAG,YAAY;AAAA,oBACba,EAAc,aAAa,YAAYf,CAAS;AAAA,kBACjD;AAAA,kBACDE,EAAG,YAAY;AAAA,oBACba,EAAc;AAAA,sBACZH,EAAY,wBAAwBO,CAAG;AAAA,sBACvCnB;AAAA,oBACD;AAAA,kBACF;AAAA,gBACF;AAAA,cACrB,GAIoBmB,MAAQ,kBACNU,EAAIF,GAAkB,cAAc,MACtCA,IAAmBA,EAAiB,cAAc,IAKtDvB;AAAA,gBACEI;AAAA,gBACAmB;AAAA,gBACA9B;AAAA,gBACAkC;AAAA,gBACAjB;AAAA,gBACA;AAAA,gBACAd;AAAA,gBACAA;AAAA,cAClB;AAAA,YAEa;AAAA,QAEJ;AAAA,MACT,WAAiBY,EAAY,sBAAsBf,CAAQ,EAAE,SAASsB,CAAG;AAGjE,YAAIA,MAAQ,mBAAmBA,MAAQ;AAErC,cAAIU,EAAIjC,EAAKuB,CAAG,GAAG,UAAU;AAC3B,YAAAE,EAAmBb,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACvD;AACL,kBAAM+B,IAAiB7B,EAAG,YAAY,UAAU,EAAE;AAGlD,YAAI2B,EAAIjB,EAAY,yBAAyBO,CAAG,KAC9CX,EAAW;AAAA,cACTN,EAAG,YAAY;AAAA,gBACb6B;AAAA,gBACA7B,EAAG,YAAY;AAAA,kBACba,EAAc,aAAa,YAAYf,CAAS;AAAA,gBACjD;AAAA,gBACDE,EAAG,YAAY;AAAA,kBACba,EAAc;AAAA,oBACZH,EAAY,wBAAwBO,CAAG;AAAA,oBACvCnB;AAAA,kBACD;AAAA,gBACF;AAAA,cACF;AAAA,YACjB,GAKYQ,EAAW;AAAA,cACTN,EAAG,YAAY;AAAA,gBACbW;AAAA,gBACAX,EAAG,YAAY;AAAA,kBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,gBAC1C;AAAA,gBACD+B;AAAA,cACD;AAAA,YACf,GAEY3B;AAAA,cACEI;AAAA,cACAZ,EAAKuB,CAAG;AAAA,cACRtB;AAAA,cACAkC;AAAA,cACAjB;AAAA,cACA;AAAA,cACAd;AAAA,cACAA;AAAA,YACd;AAAA,UACW;AAAA,iBAEMmB,MAAQ,2BAA2B;AAM5C,cAAMqB,IAAmB5C,EAAKuB,CAAG,GAC3BsB,IAAc,IAClBD,EAAiB,OAAOA,EAAiB,OAAO,CAC1D,IAAYA,EAAiB,QAAQA,EAAiB,QAAQ,CAAC,IACrDA,EAAiB,MAAMA,EAAiB,MAAM,CACxD,KAAaA,EAAiB,OAAOA,EAAiB,OAAO,CAAC,IACpDA,EAAiB,SAASA,EAAiB,SAAS,CAC9D,IAAYA,EAAiB,SAASA,EAAiB,SAAS,CAAC;AAIzD,QAAIC,MAAgB,oBAClBjC,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACbW;AAAA,YACAX,EAAG,YAAY;AAAA,cACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,YAC1C;AAAA,YACDE,EAAG,YAAY;AAAA,cACbuC;AAAA,cACAvC,EAAG,YAAY;AAAA,gBACba,EAAc,aAAa,gBAAgBf,CAAS;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,QACb;AAAA,MAEA,WAAiBmB,MAAQ;AAGjB,iBAASuB,IAAU,GAAGA,IAAU9C,EAAKuB,CAAG,EAAE,QAAQuB,KAAW,GAAG;AAC9D,gBAAMC,IAAe/C,EAAKuB,CAAG,EAAEuB,CAAO;AACtC,UAAIb,EAAIc,GAAc,QAAQ,KAAK,CAACf,EAAQe,EAAa,QAAQ,CAAC,KAChEnC,EAAW;AAAA,YACTN,EAAG,YAAY;AAAA,cACbW;AAAA,cACAX,EAAG,YAAY;AAAA,gBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,cAC1C;AAAA,cACDE,EAAG,YAAY,QAAQyC,EAAa,QAAQ,CAAC;AAAA,YAC9C;AAAA,UACf;AAAA,QAES;AAAA,eACQxB,MAAQ,cAAc;AAU/B,cAAMyB,IAAkB1C,EAAG,YAAY,UAAU,EAAE;AAEnD,QAAAM,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACbW;AAAA,YACAX,EAAG,YAAY;AAAA,cACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,YAC1C;AAAA,YACD4C;AAAA,UACD;AAAA,QACX,GAGQpC,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACb0C;AAAA,YACA1C,EAAG,YAAY;AAAA,cACba,EAAc,aAAa,YAAYf,CAAS;AAAA,YACjD;AAAA,YACDE,EAAG,YAAY;AAAA,cACba,EAAc,aAAa,uBAAuBf,CAAS;AAAA,YAC5D;AAAA,UACF;AAAA,QACX;AAGQ,YAAI6C;AAEJ,QAAIjD,EAAKuB,CAAG,EAAE,OAAO,MAAM,QACzB0B,IAAc3C,EAAG,YAAY,UAAUN,EAAKuB,CAAG,EAAE,YAAY,CAAC,IAE9D0B,IAAc3C,EAAG,YAAY,QAAQN,EAAKuB,CAAG,EAAE,YAAY,CAAC,GAI9DX,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACb0C;AAAA,YACA1C,EAAG,YAAY;AAAA,cACba,EAAc,aAAa,cAAcf,CAAS;AAAA,YACnD;AAAA,YACD6C;AAAA,UACD;AAAA,QACX;AAAA,MACO;AAAA;AAAA,EAEJ;AACH;AAWA,SAAS5B,EACPT,GACAZ,GACAiB,GACAC,GACAjB,GACAM,GACAH,GACA;AAEA,EAAAQ,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACbW;AAAA,MACAX,EAAG,YAAY;AAAA,QACba,EAAc,aAAa,YAAYf,CAAS;AAAA,MACjD;AAAA,MACDE,EAAG,YAAY,UAAUY,CAAQ;AAAA,IAClC;AAAA,EACL,GAGMjB,MAAa,gBACfW,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACbW;AAAA,MACAX,EAAG,YAAY;AAAA,QACba,EAAc,aAAa,YAAYf,CAAS;AAAA,MACjD;AAAA,MACDE,EAAG,YAAY,QAAQ,SAAS;AAAA,IACjC;AAAA,EACP,GAIML,MAAa,mBACfW,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACbA,EAAG,YAAY,UAAUC,CAAU;AAAA,MACnCD,EAAG,YAAY;AAAA,QACba,EAAc,aAAa,qBAAqBf,CAAS;AAAA,MAC1D;AAAA,MACDa;AAAA,IACD;AAAA,EACP;AAEA;AAeA,SAASO,EAAsBZ,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AACnE,EAAK4B,EAAQhC,EAAKuB,CAAG,CAAC,KACpBX,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACb4C;AAAA,MACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,MACnEE,EAAG,YAAY,QAAQN,EAAKuB,CAAG,CAAC;AAAA,IACjC;AAAA,EACP;AAEA;AASA,SAASE,EAAmBb,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AAMhE,MAAI,CAAC4B,EAAQhC,EAAKuB,CAAG,CAAC,GAAG;AACvB,QAAI4B;AAEJ,IAAI,OAAOnD,EAAKuB,CAAG,KAAM,WACnBU,EAAIjC,EAAKuB,CAAG,GAAG,UAAU,MAC3B4B,IAAYnD,EAAKuB,CAAG,EAAE,YAGpBvB,EAAKuB,CAAG,EAAE,SAAS,GAAG,IAExB4B,IAAY,UAAUnD,EAAKuB,CAAG,CAAC,KAG/B4B,IAAYnD,EAAKuB,CAAG,GAKxBX,EAAW;AAAA,MACTN,EAAG,YAAY;AAAA,QACb4C;AAAA,QACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,QACnEE,EAAG,YAAY,UAAU6C,CAAS;AAAA,MACnC;AAAA,IACP;AAAA,EACG;AACH;AAUA,SAASzB,EAAmBd,GAAYsC,GAAIlD,GAAMuB,GAAKtB,GAAUG,GAAW;AAK1E,WAASgD,IAAW,GAAGA,IAAWpD,EAAKuB,CAAG,EAAE,QAAQ6B,KAAY,GAAG;AACjE,QAAIC;AACJ,UAAMC,IAActD,EAAKuB,CAAG,EAAE6B,CAAQ;AACtC,IAAKpB,EAAQsB,CAAW,MAClBrB,EAAIqB,GAAa,UAAU,IAAGD,IAAaC,EAAY,WAClDrB,EAAIqB,GAAa,KAAK,MAAGD,IAAaC,EAAY,KAAK,KAIlE1C,EAAW;AAAA,MACTN,EAAG,YAAY;AAAA,QACb4C;AAAA,QACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,QACnEE,EAAG,YAAY,UAAU+C,CAAU;AAAA,MACpC;AAAA,IACP;AAAA,EACG;AACH;AASA,SAAS1B,EAAmBf,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AAChE,MAAI,CAAC4B,EAAQhC,EAAKuB,CAAG,CAAC;AAGpB,QAAIA,MAAQ,gBAAgBA,MAAQ;AAClC,UAAIU,EAAIjC,EAAKuB,CAAG,GAAG,QAAQ,KAAK,CAACS,EAAQhC,EAAKuB,CAAG,EAAE,QAAQ,CAAC,GAAG;AAC7D,cAAMgC,IACJvD,EAAKuB,CAAG,EAAE,OAAO,MAAM,SAASvB,EAAKuB,CAAG,EAAE,OAAO,IAAI,YACjDiC,IAAYrC,EAAc;AAAA,UAC9B,OAAOoC,CAAW;AAAA,UAClBnD;AAAA,QACV;AAGQ,QAAAQ,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACb4C;AAAA,YACA5C,EAAG,YAAY;AAAA,cACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,YAC1C;AAAA,YACDE,EAAG,YAAY;AAAA,cACbN,EAAKuB,CAAG,EAAE,QAAQ;AAAA,cAClBjB,EAAG,YAAY,UAAUkD,CAAS;AAAA,YACnC;AAAA,UACF;AAAA,QACX;AAAA,MACO;AAAA,WACI;AAEL,UAAIA;AACJ,MAAIjC,MAAQ,kBAAkBA,MAAQ,mBAEpCiC,IAAYrC,EAAc,aAAa,gBAAgBf,CAAS,IAEhEmB,MAAQ,oCACRA,MAAQ,kBAGRiC,IAAYrC,EAAc,aAAa,eAAef,CAAS,IAG/DmB,MAAQ,0BAGRiC,IAAYrC,EAAc,aAAa,cAAcf,CAAS,IAIhEQ,EAAW;AAAA,QACTN,EAAG,YAAY;AAAA,UACb4C;AAAA,UACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,UACnEE,EAAG,YAAY,QAAQN,EAAKuB,CAAG,GAAGjB,EAAG,YAAY,UAAUkD,CAAS,CAAC;AAAA,QACtE;AAAA,MACT;AAAA,IAEK;AAEL;AASA,SAAS5B,EAAoBhB,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AAKjE,MAAI,CAAC4B,EAAQhC,EAAKuB,CAAG,CAAC;AAEpB,QAAI,CAAC,MAAM,QAAQvB,EAAKuB,CAAG,CAAC;AAC1B,MAAAX,EAAW;AAAA,QACTN,EAAG,YAAY;AAAA,UACb4C;AAAA,UACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,UACnEE,EAAG,YAAY,QAAQN,EAAKuB,CAAG,CAAC;AAAA,QACjC;AAAA,MACT;AAAA;AAEM,eAASkC,IAAY,GAAGA,IAAYzD,EAAKuB,CAAG,EAAE,QAAQkC,KAAa,GAAG;AACpE,cAAMC,IAAc1D,EAAKuB,CAAG,EAAEkC,CAAS;AAEvC,YACE,CAACzB,EAAQ0B,CAAW,KACpBzB,EAAIyB,GAAa,QAAQ,KACzB,CAAC1B,EAAQ0B,EAAY,QAAQ,CAAC,GAC9B;AACA,cAAIC;AAGJ,UACE,CAAC1B,EAAIyB,GAAa,WAAW,KAC7B1B,EAAQ0B,GAAa,WAAW,IAEhCC,IAAc,OAGdA,IAAcD,EAAY,WAAW,GAIvC9C,EAAW;AAAA,YACTN,EAAG,YAAY;AAAA,cACb4C;AAAA,cACA5C,EAAG,YAAY;AAAA,gBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,cAC1C;AAAA,cACDE,EAAG,YAAY,QAAQoD,EAAY,QAAQ,GAAGC,CAAW;AAAA,YAC1D;AAAA,UACb;AAAA,QACS;AAAA,MACF;AAGP;AAEA,MAAeC,IAAA;AAAA,EACb,cAAA7D;AACF;"}
1
+ {"version":3,"file":"RDFconverter.mjs","sources":["../../../lib/data-provider-interface/utils/RDFconverter.js"],"sourcesContent":["import N3 from \"n3\";\nimport { isEmpty } from \"lodash\";\nimport { has } from \"lodash\";\n\nimport generalDpiConfig from \"../config/dpi-spec-config\";\n\nimport generalHelper from \"./general-helper\";\n\n/**\n * Converts all properties for given data from form input data into RDF (N-Triples)\n * @param {Object} data Data given within an object. Data stored as follows { datasets: {...}, distributions: [{...},...], catalogues: {...}}\n * @param {String} property Name of property which should be converted (either 'datasets' or 'catalogues')\n * @returns String of converted data in RDF format (N-Triples)\n */\nfunction convertToRDF(data, property, specification) {\n let finishedRDFdata;\n\n let dpiConfig = specification;\n\n // writer for adding data as quads\n const RDFdata = new N3.Writer({\n prefixes: dpiConfig.prefixes,\n format: \"N-Triples\",\n });\n // datasetURI also needed for distribution creation (add distributionURI to dataset (dcat:distribution))\n const datasetURI = `https://piveau.eu/set/data/${data.datasets.datasetID}`;\n\n // convert values for datasets/catalogues\n convertPropertyValues(\n RDFdata,\n data[property],\n property,\n \"\",\n \"\",\n true,\n datasetURI,\n dpiConfig\n ); // datasets and catalogues\n\n // include distribution data into same graph\n // differentiation neccessary because datasets also include distributions\n if (property === \"datasets\") {\n // multiple distributions possible -> [{data of distribution 1}, {data of distribution 2}, ...]\n for (let index = 0; index < data.distributions.length; index += 1) {\n convertPropertyValues(\n RDFdata,\n data.distributions[index],\n \"distributions\",\n \"\",\n \"\",\n true,\n datasetURI,\n dpiConfig\n );\n }\n }\n\n RDFdata.end((error, result) => (finishedRDFdata = result));\n return finishedRDFdata;\n}\n\n/**\n * Converts each single value of given form data based on type into RDF\n * @param {N3.Writer} RDFdataset Dataset the converted RDF data should be added to\n * @param {Object} data Object containing data as key-value pairs\n * @param {String} property String determining which property is handled (datasets/distributions/catalogues)\n * @param {DataFactory} preMainURI (can be undefined) Could be a namedNode or BlankNode containing an URI\n * @param {DataFactory} preMainType (can be undefined) NamedNode determining the type of the current property (e.g. dcat:Dataset (as object))\n * @param {Boolean} setMain Value determining if additional values should be set (type, id, sample...)\n * @param {String} datasetURI URI of dataset for use in distribution conversion\n */\nfunction convertPropertyValues(\n RDFdataset,\n data,\n property,\n preMainURI,\n preMainType,\n setMain,\n datasetURI,\n dpiConfig\n) {\n console.log(\n RDFdataset,\n data,\n property,\n preMainURI,\n preMainType,\n setMain,\n datasetURI,\n dpiConfig\n );\n\n const formatTypes = dpiConfig.formatTypes;\n\n // method can be called recursively for nested properties\n // need to access id of parent node for later use as subject -> provide via method parameters (preMainURI & preMainType)\n let mainURI;\n let mainType;\n\n // parent method can be called recursively for nested values\n // if called on non-nested values a overall id and type muste be set (setMain -> true)\n if (setMain) {\n if (property === \"datasets\") {\n mainType = generalHelper.addNamespace(\"dcat:Dataset\", dpiConfig);\n mainURI = N3.DataFactory.namedNode(datasetURI); // datasetID should never be empty because of frontend checking\n } else if (property === \"catalogues\") {\n mainType = generalHelper.addNamespace(\"dcat:Catalog\", dpiConfig);\n mainURI = N3.DataFactory.namedNode(\n `https://piveau.eu/set/data/${data.datasetID}`\n ); // datasetID should never be empty because of frontend checking\n } else {\n mainType = generalHelper.addNamespace(\"dcat:Distribution\", dpiConfig);\n const randomId = generalHelper.makeId(10);\n // distribution id can be random, will be overwritten by backend on saving data\n mainURI = N3.DataFactory.namedNode(\n `https://piveau.eu/set/data/${randomId}`\n );\n }\n\n // parent method can be called recursively to convert nested values\n // but setting the overal type and id of a dataset/catalogue is only required once at the beginning\n // -> only set additional properties when setMain === true\n setAdditionalProperties(\n RDFdataset,\n data,\n mainURI,\n mainType,\n property,\n datasetURI,\n dpiConfig\n );\n } else {\n // called on nested properties with already given URI and type which should used in the following conversion process\n mainURI = preMainURI;\n mainType = preMainType;\n }\n\n // distributions may have download URLs, if no downloadURL is provided -> provided accessUrls will be also set as downloadUrls\n // accessUrl is a required property and therefore always provided (made sure by the frontend)\n // const downloadUrlsProvided = has(data, 'dcat:downloadURL') && !isEmpty(data['dcat:downloadURL']) && data['dcat:downloadURL'].map(el => !isEmpty(el['@id'])).reduce((a, b) => b);\n\n // loop trough all keys within data object and convert values (or nested values) to RDF\n const valueKeys = Object.keys(data);\n for (let index = 0; index < valueKeys.length; index += 1) {\n const key = valueKeys[index]; // key format: either a normal name for special properties (e.g. datasetID) or namespaced keys (e.g. dct:title)\n\n if (generalHelper.propertyHasValue(data[key])) {\n // all properties are sorted by their format (see .../data-provider-interface/config/format-types.js)\n // depending on the format the corresponding conversion-method is used, writing the result to the overall RDF-writer\n if (formatTypes.singularString[property].includes(key)) {\n convertSingularString(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.singularURI[property].includes(key)) {\n convertSingularURI(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.multipleURI[property].includes(key)) {\n // if no dowloadURL is provided, set accessUrls as downloadUrls\n // if (!downloadUrlsProvided && key === 'dcat:accessURL') {\n // // copy accessurl array to donwloadurl array and convert data\n\n // data['dcat:downloadURL'] = cloneDeep(data['dcat:accessURL']);\n // convertMultipleURI(RDFdataset, mainURI, data, 'dcat:downloadURL', property, dpiConfig);\n // }\n\n convertMultipleURI(RDFdataset, mainURI, data, key, property, dpiConfig);\n } else if (formatTypes.typedStrings[property].includes(key)) {\n convertTypedString(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.multilingualStrings[property].includes(key)) {\n convertMultilingual(RDFdataset, mainURI, data, key, dpiConfig);\n } else if (formatTypes.groupedProperties[property].includes(key)) {\n // grouped properties are properties provided by the form which consist of multiple properties (e.g contactPoint)\n // the properties values are stored within an object located within an array\n // for repeatable properties there are multiple objects in this array, otherwise there is just one\n\n let actualData;\n // vcard:hasAdress is an object as well as dct:creator and skos:notation\n if (\n key === \"vcard:hasAddress\" ||\n key === \"dct:creator\" ||\n key === \"skos:notation\" ||\n key === \"spdx:checksum\"\n )\n actualData = [data[key]];\n else actualData = data[key];\n\n // looping trough all existing objects within the array\n for (let groupId = 0; groupId < actualData.length; groupId += 1) {\n let currentGroupData = actualData[groupId];\n\n if (!isEmpty(currentGroupData)) {\n if (key === \"skos:notation\") {\n // property skos:notation work a little bit different then other properties\n // the form provides a value and a type from two seperated fields ({'@value': '...', '@type': '...'})\n // the resulting RDF should merge these values into a typed literal (value^^type)\n if (\n has(currentGroupData, \"@value\") &&\n !isEmpty(currentGroupData[\"@value\"])\n ) {\n let notationValue;\n\n // if a type is given, use to form typed literal\n // if no type is given, only use value to create literal\n if (\n has(currentGroupData, \"@type\") &&\n !isEmpty(currentGroupData[\"@type\"])\n ) {\n // typed literal\n notationValue = N3.DataFactory.literal(\n currentGroupData[\"@value\"],\n N3.DataFactory.namedNode(currentGroupData[\"@type\"].resource)\n );\n } else {\n // literal\n notationValue = N3.DataFactory.literal(\n currentGroupData[\"@value\"]\n );\n }\n\n // add type for adms:identifier\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"adms:Identifier\", dpiConfig)\n )\n )\n );\n\n // save quadruple with typed or untyped literal\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n notationValue\n )\n );\n\n // resulting rdf quads should look like this:\n // datasetId adms:identifier admsIdentifierUtl\n // admsIdentifierUrl rdf:type adms:Identifier\n // admsIdentifierUrl skos:notation value^^type\n }\n } else {\n let groupBlankNode;\n\n // because grouped properties have a list of nested properties we need an initial quadruple stating the parent property\n // using a blank node as object which later serves as subject for the nested properties\n // RDF example:\n // datasetID dct:contactPoint blankNodeId\n // blankNodeId foaf:mbox email@exmaple.com\n // blankNodeId fn:name InsitutionName ...\n\n // some form fields provide an URL which should serves as namedNode for other nested values (e.g. conformsTo)\n // RDF example:\n // datasetID dct:conformsTo conformsToURI\n // conformsToURI dct:title conformsTitle\n if (\n (key === \"foaf:page\" ||\n key === \"adms:identifier\" ||\n key === \"dct:conformsTo\") &&\n has(currentGroupData, \"@id\")\n ) {\n groupBlankNode = N3.DataFactory.namedNode(\n currentGroupData[\"@id\"]\n );\n }\n // all properties that don't provide an URL serving as namedNode for nested values need to define a blank node\n\n // page gets type but also has multilingual fields with preseleted langauge\n // don't create blank node if there is not data for page beside the preselected language\n let emptyPage = false;\n\n if (key === \"foaf:page\") {\n // if page has title and/or description property given, check if there are values given\n const hasTitle = has(currentGroupData, \"dct:title\");\n const hasDescription = has(currentGroupData, \"dct:description\");\n\n let hasNoValueKeysTitle = true;\n let hasEmptyValueTitle = true;\n let hasNoValueKeysDescription = true;\n let hasEmptyValueDescription = true;\n\n if (hasTitle) {\n hasNoValueKeysTitle = !currentGroupData[\"dct:title\"].every(\n (el) => has(el, \"@value\")\n );\n hasEmptyValueTitle = currentGroupData[\"dct:title\"].every(\n (el) => isEmpty(el[\"@value\"])\n );\n }\n\n if (hasDescription) {\n hasNoValueKeysDescription = !currentGroupData[\n \"dct:description\"\n ].every((el) => has(el, \"@value\"));\n hasEmptyValueDescription = currentGroupData[\n \"dct:description\"\n ].every((el) => isEmpty(el[\"@value\"]));\n }\n\n // page should be handled as empty if:\n // no title and/or no description given\n // if properties given: no value given or value empty\n if (\n (hasNoValueKeysTitle || hasEmptyValueTitle) &&\n (hasNoValueKeysDescription || hasEmptyValueDescription)\n )\n emptyPage = true;\n }\n\n if (!emptyPage) {\n if (!groupBlankNode)\n groupBlankNode = N3.DataFactory.blankNode(\"\");\n\n // save inital quadruple using the named or blank node as object\n // e.g. datasetId dct:contactPoint blankNode/namedNode\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n groupBlankNode\n )\n );\n\n // some properties provide additional types\n if (has(formatTypes.additionalPropertyTypes, key)) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n groupBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\n formatTypes.additionalPropertyTypes[key],\n dpiConfig\n )\n )\n )\n );\n }\n\n // temporal values nested inside another object: \"dct:temporal\": [{ \"dct:temporal\": { \"dcat:startDate\": \"...\", \"dcat:endDate\": \"...\" } }]\n if (key === \"dct:temporal\") {\n if (has(currentGroupData, \"dct:temporal\")) {\n currentGroupData = currentGroupData[\"dct:temporal\"];\n }\n }\n\n // convert all nested values provided by form\n convertPropertyValues(\n RDFdataset,\n currentGroupData,\n property,\n groupBlankNode,\n mainType,\n false,\n dpiConfig,\n dpiConfig\n );\n }\n }\n }\n }\n } else if (formatTypes.conditionalProperties[property].includes(key)) {\n // publisher either is an URI or a group with multiple values (name, homepage, email)\n // license either is an URI or a group with multiple values ()\n if (key === \"dct:publisher\" || key === \"dct:license\") {\n // data contains either {resource: '...', name: '...'} or object containing other keys\n if (has(data[key], \"resource\")) {\n convertSingularURI(RDFdataset, mainURI, data, key, dpiConfig);\n } else {\n const groupBlankNode = N3.DataFactory.blankNode(\"\");\n\n // some properties provide additional types\n if (has(formatTypes.additionalPropertyTypes, key)) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n groupBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\n formatTypes.additionalPropertyTypes[key],\n dpiConfig\n )\n )\n )\n );\n }\n\n // save inital quadruple using the named or blank node as object\n // e.g. datasetId dct:contactPoint blankNode/namedNode\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n groupBlankNode\n )\n );\n\n convertPropertyValues(\n RDFdataset,\n data[key],\n property,\n groupBlankNode,\n mainType,\n false,\n dpiConfig,\n dpiConfig\n );\n }\n }\n } else if (key === \"dcat:temporalResolution\") {\n // temporal resolution is displayed as group of input forms for each property (year, month, day, ...)\n // the form provides the data as following: [ { 'Year': '...', 'Month': '...', ... } ]\n // the final format of this property should look like this: P?Y?M?DT?H?M?S\n // not all values must be filled and therefore be present -> default behavior if not given: value = 0\n\n const resolutionValues = data[key];\n const valueString = `P${\n resolutionValues.Year ? resolutionValues.Year : 0\n }Y${resolutionValues.Month ? resolutionValues.Month : 0}M${\n resolutionValues.Day ? resolutionValues.Day : 0\n }DT${resolutionValues.Hour ? resolutionValues.Hour : 0}H${\n resolutionValues.Minute ? resolutionValues.Minute : 0\n }M${resolutionValues.Second ? resolutionValues.Second : 0}S`;\n\n // frontend always provides temporalResolution even if there is no value resulting in P0Y0M0DT0H0M0S\n // don't save if value is equal to P0Y0M0DT0H0M0S\n if (valueString !== \"P0Y0M0DT0H0M0S\") {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(\n valueString,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"xsd:duration\", dpiConfig)\n )\n )\n )\n );\n }\n } else if (key === \"dct:identifier\") {\n // form provides data as array of objects with strings: [ { '@value': 'string1' }, { '@value': 'string2' }, ... ]\n // create quadruple for each given object in the array\n for (let valueId = 0; valueId < data[key].length; valueId += 1) {\n const currentValue = data[key][valueId];\n if (has(currentValue, \"@value\") && !isEmpty(currentValue[\"@value\"])) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(currentValue[\"@value\"])\n )\n );\n }\n }\n } else if (key === \"dct:rights\") {\n // rights has a static type (RightsStatement) which needs to be added to linked data as additional node\n // therefore we need to create an initial quadruple for with 'rights' being the predicate having a blank node\n // blank node serves as subject for the following quadruples which contain the type and actual value of the form field\n // RDF:\n // datasetID dct:rights blankNodeID\n // blankNodeId rdf:type RightsStatement\n // blankNodeId rdfs:label LabelValue\n\n // blank node as object for inital quadruple and also as subject for following quadruples\n const rightsBlankNode = N3.DataFactory.blankNode(\"\");\n\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n rightsBlankNode\n )\n );\n\n // add additional type declaration\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n rightsBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"dct:RightsStatement\", dpiConfig)\n )\n )\n );\n\n // rights is a conditional property and provides either an URI or a string ( { rdfs:label : 'URL/string' } )\n let rightsValue;\n\n if (data[key][\"@type\"] === \"url\") {\n rightsValue = N3.DataFactory.namedNode(data[key][\"rdfs:label\"]);\n } else {\n rightsValue = N3.DataFactory.literal(data[key][\"rdfs:label\"]);\n }\n\n // add actual value\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n rightsBlankNode,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdfs:label\", dpiConfig)\n ),\n rightsValue\n )\n );\n }\n }\n }\n}\n\n/**\n * Creates additional quads depending on given property and saves them to given RDF dataset\n * @param {N3.Writer} RDFdataset RDF dataset the quads are saved to\n * @param {Object} data Object containing data as key-value pairs\n * @param {DataFactory.namedNode} mainURI NamedNode defining URI of current property graph\n * @param {DataFactory} mainType NamedNode defining type of current property graph\n * @param {String} property String determining which property is converted (datasets/distributions/catalogues)\n * @param {String} datasetURI URI of dataset used to add distribution URI to dct:distribution within dataset graph\n */\nfunction setAdditionalProperties(\n RDFdataset,\n data,\n mainURI,\n mainType,\n property,\n datasetURI,\n dpiConfig\n) {\n // adding id and type of property\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"rdf:type\", dpiConfig)\n ),\n N3.DataFactory.namedNode(mainType)\n )\n );\n\n // catalogues always have to contain the property dct:type with the value 'dcat-ap'\n if (property === \"catalogues\") {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n mainURI,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"dct:type\", dpiConfig)\n ),\n N3.DataFactory.literal(\"dcat-ap\")\n )\n );\n }\n\n // add distribution id to dataset graph (dcat:distribution)\n if (property === \"distributions\") {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n N3.DataFactory.namedNode(datasetURI),\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(\"dcat:distribution\", dpiConfig)\n ),\n mainURI\n )\n );\n }\n}\n\n//-----------------------------------------------------------------------------------------------------\n// basic conversion (input to RDF) methods for different categories of data\n//-----------------------------------------------------------------------------------------------------\n// seems unnecessary at first but if we want to convert nested properties as well, we need these\n// methods (especially to provide the correct parent URI)\n\n/**\n * Converts provided data to quad and saves it to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quad\n * @param {String} data Data given by form used as object in quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quad\n */\nfunction convertSingularString(RDFdataset, id, data, key, dpiConfig) {\n if (!isEmpty(data[key])) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.literal(data[key])\n )\n );\n }\n}\n\n/**\n * Converts provided data to quad and saves it to given dataset\n * @param {N3.Writer} RDFdata Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quad\n * @param {String} data Data given by form used as object in quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quad\n */\nfunction convertSingularURI(RDFdataset, id, data, key, dpiConfig) {\n // there are two different formats the frontend delivers URIs\n // 1: 'URI' or 2: {'name': 'abc', 'resource': 'URI'}\n\n // URIs can either be a normal URL or an email address\n // mail addresses typicall include '@' which is used to determine if the given string is a normal URL or an email address\n if (!isEmpty(data[key])) {\n let singleURI;\n\n if (typeof data[key] === \"object\") {\n if (has(data[key], \"resource\")) {\n singleURI = data[key].resource;\n }\n } else {\n if (data[key].includes(\"@\")) {\n // mail address\n singleURI = `mailto:${data[key]}`;\n } else {\n // normal URL\n singleURI = data[key];\n }\n }\n\n // save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.namedNode(singleURI)\n )\n );\n }\n}\n\n/**\n * Converts provided data to quads and saves them to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quads\n * @param {Array} data Array containing URLs used as object within quads\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quads\n * @param {String} property Determining which property is concerted (datasets/distributions/catalogues)\n */\nfunction convertMultipleURI(RDFdataset, id, data, key, property, dpiConfig) {\n // there are two different formats the frontend delivers multiple URIs\n // 1: [ {\"name\": '...', \"resource\": 'URI'}, {...} ] -> multi-autocomplete fields\n // 2: [ { \"@id\": \"URI1\" }, { \"@id\": \"URI2\" } ] repeatable fields\n\n for (let uriIndex = 0; uriIndex < data[key].length; uriIndex += 1) {\n let currentURI;\n const valueObject = data[key][uriIndex];\n if (!isEmpty(valueObject)) {\n if (has(valueObject, \"resource\")) currentURI = valueObject.resource;\n else if (has(valueObject, \"@id\")) currentURI = valueObject[\"@id\"];\n }\n\n // save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.namedNode(currentURI)\n )\n );\n }\n}\n\n/**\n * Converts provided data to quad and saves them to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quad\n * @param {String} data String data used as object with type in quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quad and to determine quad-object type\n */\nfunction convertTypedString(RDFdataset, id, data, key, dpiConfig) {\n if (!isEmpty(data[key])) {\n // there is a variety of properties which can have different types\n // issued and motified already provide a type definition ({'@type': 'date/datetime', '@value': '...'})\n if (key === \"dct:issued\" || key === \"dct:modified\") {\n if (has(data[key], \"@value\") && !isEmpty(data[key][\"@value\"])) {\n const imValueType =\n data[key][\"@type\"] === \"date\" ? data[key][\"@type\"] : \"dateTime\";\n const valueType = generalHelper.addNamespace(\n `xsd:${imValueType}`,\n dpiConfig\n );\n\n /// save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(\n data[key][\"@value\"],\n N3.DataFactory.namedNode(valueType)\n )\n )\n );\n }\n } else {\n // all other properties are given as a simple string\n let valueType;\n if (key === \"dcat:endDate\" || key === \"dcat:startDate\") {\n // dcat:endDate and dcat:startDate are xsd:dateTime\n valueType = generalHelper.addNamespace(\"xsd:dateTime\", dpiConfig);\n } else if (\n key === \"dcat:spatialResolutionInMeters\" ||\n key === \"dcat:byteSize\"\n ) {\n // dcat:spatialResolutionInMeters and dcat:byteSize are xsd:decimal\n valueType = generalHelper.addNamespace(\"xsd:decimal\", dpiConfig);\n } else if (key === \"pv:distributionType\") {\n valueType = generalHelper.addNamespace(\"xsd:string\", dpiConfig);\n }\n\n /// save quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.literal(data[key], N3.DataFactory.namedNode(valueType))\n )\n );\n }\n }\n}\n\n/**\n * Converts provided data to quads and saves them to given dataset\n * @param {N3.Writer} RDFdataset Dataset the converter saves the converted data to\n * @param {DataFactory} id Node (Blank or Named) used as subject in quads\n * @param {Array} data Array of objects containing data and language converted into literal with language for quad\n * @param {String} key Name of current value (e.g. dct:title) used as predicate in quads\n */\nfunction convertMultilingual(RDFdataset, id, data, key, dpiConfig) {\n // multilingual fields mostly provide data as followed\n // [ { '@value': '....', '@language': '...' }, ... ]\n // only the licence title provides no language\n\n if (!isEmpty(data[key])) {\n // licence title\n if (!Array.isArray(data[key])) {\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(generalHelper.addNamespace(key, dpiConfig)),\n N3.DataFactory.literal(data[key])\n )\n );\n } else {\n for (let langIndex = 0; langIndex < data[key].length; langIndex += 1) {\n const currentData = data[key][langIndex];\n // only save data if a value is given (forntend provides preselected language which don't need to be saved if there is no actaul value)\n if (\n !isEmpty(currentData) &&\n has(currentData, \"@value\") &&\n !isEmpty(currentData[\"@value\"])\n ) {\n let languageTag;\n\n // if there is no langauge given, set language to english\n if (\n !has(currentData, \"@language\") ||\n isEmpty(currentData, \"@language\")\n ) {\n languageTag = \"en\";\n } else {\n // if language is given, use given tag\n languageTag = currentData[\"@language\"];\n }\n\n // saving quad to dataset\n RDFdataset.addQuad(\n N3.DataFactory.quad(\n id,\n N3.DataFactory.namedNode(\n generalHelper.addNamespace(key, dpiConfig)\n ),\n N3.DataFactory.literal(currentData[\"@value\"], languageTag)\n )\n );\n }\n }\n }\n }\n}\n\nexport default {\n convertToRDF,\n};\n"],"names":["convertToRDF","data","property","specification","finishedRDFdata","dpiConfig","RDFdata","N3","datasetURI","convertPropertyValues","index","error","result","RDFdataset","preMainURI","preMainType","setMain","formatTypes","mainURI","mainType","generalHelper","randomId","setAdditionalProperties","valueKeys","key","convertSingularString","convertSingularURI","convertMultipleURI","convertTypedString","convertMultilingual","actualData","groupId","currentGroupData","isEmpty","has","notationValue","groupBlankNode","emptyPage","hasTitle","hasDescription","hasNoValueKeysTitle","hasEmptyValueTitle","hasNoValueKeysDescription","hasEmptyValueDescription","el","resolutionValues","valueString","valueId","currentValue","rightsBlankNode","rightsValue","id","singleURI","uriIndex","currentURI","valueObject","imValueType","valueType","langIndex","currentData","languageTag","toRDF"],"mappings":";;;;;;;;AAcA,SAASA,EAAaC,GAAMC,GAAUC,GAAe;AACnD,MAAIC,GAEAC,IAAYF;AAGhB,QAAMG,IAAU,IAAIC,EAAG,OAAO;AAAA,IAC5B,UAAUF,EAAU;AAAA,IACpB,QAAQ;AAAA,EACZ,CAAG,GAEKG,IAAa,8BAA8BP,EAAK,SAAS,SAAS;AAgBxE,MAbAQ;AAAA,IACEH;AAAA,IACAL,EAAKC,CAAQ;AAAA,IACbA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAM;AAAA,IACAH;AAAA,EACJ,GAIMH,MAAa;AAEf,aAASQ,IAAQ,GAAGA,IAAQT,EAAK,cAAc,QAAQS,KAAS;AAC9D,MAAAD;AAAA,QACEH;AAAA,QACAL,EAAK,cAAcS,CAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAF;AAAA,QACAH;AAAA,MACR;AAIE,SAAAC,EAAQ,IAAI,CAACK,GAAOC,MAAYR,IAAkBQ,CAAO,GAClDR;AACT;AAYA,SAASK,EACPI,GACAZ,GACAC,GACAY,GACAC,GACAC,GACAR,GACAH,GACA;AACA,UAAQ;AAAA,IACNQ;AAAA,IACAZ;AAAA,IACAC;AAAA,IACAY;AAAA,IACAC;AAAA,IACAC;AAAA,IACAR;AAAA,IACAH;AAAA,EACJ;AAEE,QAAMY,IAAcZ,EAAU;AAI9B,MAAIa,GACAC;AAIJ,MAAIH,GAAS;AACX,QAAId,MAAa;AACf,MAAAiB,IAAWC,EAAc,aAAa,gBAAgBf,CAAS,GAC/Da,IAAUX,EAAG,YAAY,UAAUC,CAAU;AAAA,aACpCN,MAAa;AACtB,MAAAiB,IAAWC,EAAc,aAAa,gBAAgBf,CAAS,GAC/Da,IAAUX,EAAG,YAAY;AAAA,QACvB,8BAA8BN,EAAK,SAAS;AAAA,MACpD;AAAA,SACW;AACL,MAAAkB,IAAWC,EAAc,aAAa,qBAAqBf,CAAS;AACpE,YAAMgB,IAAWD,EAAc,OAAO,EAAE;AAExC,MAAAF,IAAUX,EAAG,YAAY;AAAA,QACvB,8BAA8Bc,CAAQ;AAAA,MAC9C;AAAA,IACK;AAKD,IAAAC;AAAA,MACET;AAAA,MACAZ;AAAA,MACAiB;AAAA,MACAC;AAAA,MACAjB;AAAA,MACAM;AAAA,MACAH;AAAA,IACN;AAAA,EACA;AAEI,IAAAa,IAAUJ,GACVK,IAAWJ;AAQb,QAAMQ,IAAY,OAAO,KAAKtB,CAAI;AAClC,WAASS,IAAQ,GAAGA,IAAQa,EAAU,QAAQb,KAAS,GAAG;AACxD,UAAMc,IAAMD,EAAUb,CAAK;AAE3B,QAAIU,EAAc,iBAAiBnB,EAAKuB,CAAG,CAAC;AAG1C,UAAIP,EAAY,eAAef,CAAQ,EAAE,SAASsB,CAAG;AACnD,QAAAC,EAAsBZ,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACtDY,EAAY,YAAYf,CAAQ,EAAE,SAASsB,CAAG;AACvD,QAAAE,EAAmBb,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACnDY,EAAY,YAAYf,CAAQ,EAAE,SAASsB,CAAG;AASvD,QAAAG,EAAmBd,GAAYK,GAASjB,GAAMuB,GAAKtB,GAAUG,CAAS;AAAA,eAC7DY,EAAY,aAAaf,CAAQ,EAAE,SAASsB,CAAG;AACxD,QAAAI,EAAmBf,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACnDY,EAAY,oBAAoBf,CAAQ,EAAE,SAASsB,CAAG;AAC/D,QAAAK,EAAoBhB,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACpDY,EAAY,kBAAkBf,CAAQ,EAAE,SAASsB,CAAG,GAAG;AAKhE,YAAIM;AAEJ,QACEN,MAAQ,sBACRA,MAAQ,iBACRA,MAAQ,mBACRA,MAAQ,kBAERM,IAAa,CAAC7B,EAAKuB,CAAG,CAAC,IACpBM,IAAa7B,EAAKuB,CAAG;AAG1B,iBAASO,IAAU,GAAGA,IAAUD,EAAW,QAAQC,KAAW,GAAG;AAC/D,cAAIC,IAAmBF,EAAWC,CAAO;AAEzC,cAAI,CAACE,EAAQD,CAAgB;AAC3B,gBAAIR,MAAQ;AAIV,kBACEU,EAAIF,GAAkB,QAAQ,KAC9B,CAACC,EAAQD,EAAiB,QAAQ,CAAC,GACnC;AACA,oBAAIG;AAIJ,gBACED,EAAIF,GAAkB,OAAO,KAC7B,CAACC,EAAQD,EAAiB,OAAO,CAAC,IAGlCG,IAAgB5B,EAAG,YAAY;AAAA,kBAC7ByB,EAAiB,QAAQ;AAAA,kBACzBzB,EAAG,YAAY,UAAUyB,EAAiB,OAAO,EAAE,QAAQ;AAAA,gBAC/E,IAGkBG,IAAgB5B,EAAG,YAAY;AAAA,kBAC7ByB,EAAiB,QAAQ;AAAA,gBAC7C,GAIgBnB,EAAW;AAAA,kBACTN,EAAG,YAAY;AAAA,oBACbW;AAAA,oBACAX,EAAG,YAAY;AAAA,sBACba,EAAc,aAAa,YAAYf,CAAS;AAAA,oBACjD;AAAA,oBACDE,EAAG,YAAY;AAAA,sBACba,EAAc,aAAa,mBAAmBf,CAAS;AAAA,oBACxD;AAAA,kBACF;AAAA,gBACnB,GAGgBQ,EAAW;AAAA,kBACTN,EAAG,YAAY;AAAA,oBACbW;AAAA,oBACAX,EAAG,YAAY;AAAA,sBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,oBAC1C;AAAA,oBACD8B;AAAA,kBACD;AAAA,gBACnB;AAAA,cAMe;AAAA,mBACI;AACL,kBAAIC;AAaJ,eACGZ,MAAQ,eACPA,MAAQ,qBACRA,MAAQ,qBACVU,EAAIF,GAAkB,KAAK,MAE3BI,IAAiB7B,EAAG,YAAY;AAAA,gBAC9ByB,EAAiB,KAAK;AAAA,cACxC;AAMc,kBAAIK,IAAY;AAEhB,kBAAIb,MAAQ,aAAa;AAEvB,sBAAMc,IAAWJ,EAAIF,GAAkB,WAAW,GAC5CO,IAAiBL,EAAIF,GAAkB,iBAAiB;AAE9D,oBAAIQ,IAAsB,IACtBC,IAAqB,IACrBC,IAA4B,IAC5BC,IAA2B;AAE/B,gBAAIL,MACFE,IAAsB,CAACR,EAAiB,WAAW,EAAE;AAAA,kBACnD,CAACY,MAAOV,EAAIU,GAAI,QAAQ;AAAA,gBAC5C,GACkBH,IAAqBT,EAAiB,WAAW,EAAE;AAAA,kBACjD,CAACY,MAAOX,EAAQW,EAAG,QAAQ,CAAC;AAAA,gBAChD,IAGoBL,MACFG,IAA4B,CAACV,EAC3B,iBACpB,EAAoB,MAAM,CAACY,MAAOV,EAAIU,GAAI,QAAQ,CAAC,GACjCD,IAA2BX,EACzB,iBACpB,EAAoB,MAAM,CAACY,MAAOX,EAAQW,EAAG,QAAQ,CAAC,CAAC,KAOpCJ,KAAuBC,OACvBC,KAA6BC,OAE9BN,IAAY;AAAA,cACf;AAED,cAAKA,MACED,MACHA,IAAiB7B,EAAG,YAAY,UAAU,EAAE,IAI9CM,EAAW;AAAA,gBACTN,EAAG,YAAY;AAAA,kBACbW;AAAA,kBACAX,EAAG,YAAY;AAAA,oBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,kBAC1C;AAAA,kBACD+B;AAAA,gBACD;AAAA,cACnB,GAGoBF,EAAIjB,EAAY,yBAAyBO,CAAG,KAC9CX,EAAW;AAAA,gBACTN,EAAG,YAAY;AAAA,kBACb6B;AAAA,kBACA7B,EAAG,YAAY;AAAA,oBACba,EAAc,aAAa,YAAYf,CAAS;AAAA,kBACjD;AAAA,kBACDE,EAAG,YAAY;AAAA,oBACba,EAAc;AAAA,sBACZH,EAAY,wBAAwBO,CAAG;AAAA,sBACvCnB;AAAA,oBACD;AAAA,kBACF;AAAA,gBACF;AAAA,cACrB,GAIoBmB,MAAQ,kBACNU,EAAIF,GAAkB,cAAc,MACtCA,IAAmBA,EAAiB,cAAc,IAKtDvB;AAAA,gBACEI;AAAA,gBACAmB;AAAA,gBACA9B;AAAA,gBACAkC;AAAA,gBACAjB;AAAA,gBACA;AAAA,gBACAd;AAAA,gBACAA;AAAA,cAClB;AAAA,YAEa;AAAA,QAEJ;AAAA,MACT,WAAiBY,EAAY,sBAAsBf,CAAQ,EAAE,SAASsB,CAAG;AAGjE,YAAIA,MAAQ,mBAAmBA,MAAQ;AAErC,cAAIU,EAAIjC,EAAKuB,CAAG,GAAG,UAAU;AAC3B,YAAAE,EAAmBb,GAAYK,GAASjB,GAAMuB,GAAKnB,CAAS;AAAA,eACvD;AACL,kBAAM+B,IAAiB7B,EAAG,YAAY,UAAU,EAAE;AAGlD,YAAI2B,EAAIjB,EAAY,yBAAyBO,CAAG,KAC9CX,EAAW;AAAA,cACTN,EAAG,YAAY;AAAA,gBACb6B;AAAA,gBACA7B,EAAG,YAAY;AAAA,kBACba,EAAc,aAAa,YAAYf,CAAS;AAAA,gBACjD;AAAA,gBACDE,EAAG,YAAY;AAAA,kBACba,EAAc;AAAA,oBACZH,EAAY,wBAAwBO,CAAG;AAAA,oBACvCnB;AAAA,kBACD;AAAA,gBACF;AAAA,cACF;AAAA,YACjB,GAKYQ,EAAW;AAAA,cACTN,EAAG,YAAY;AAAA,gBACbW;AAAA,gBACAX,EAAG,YAAY;AAAA,kBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,gBAC1C;AAAA,gBACD+B;AAAA,cACD;AAAA,YACf,GAEY3B;AAAA,cACEI;AAAA,cACAZ,EAAKuB,CAAG;AAAA,cACRtB;AAAA,cACAkC;AAAA,cACAjB;AAAA,cACA;AAAA,cACAd;AAAA,cACAA;AAAA,YACd;AAAA,UACW;AAAA,iBAEMmB,MAAQ,2BAA2B;AAM5C,cAAMqB,IAAmB5C,EAAKuB,CAAG,GAC3BsB,IAAc,IAClBD,EAAiB,OAAOA,EAAiB,OAAO,CAC1D,IAAYA,EAAiB,QAAQA,EAAiB,QAAQ,CAAC,IACrDA,EAAiB,MAAMA,EAAiB,MAAM,CACxD,KAAaA,EAAiB,OAAOA,EAAiB,OAAO,CAAC,IACpDA,EAAiB,SAASA,EAAiB,SAAS,CAC9D,IAAYA,EAAiB,SAASA,EAAiB,SAAS,CAAC;AAIzD,QAAIC,MAAgB,oBAClBjC,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACbW;AAAA,YACAX,EAAG,YAAY;AAAA,cACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,YAC1C;AAAA,YACDE,EAAG,YAAY;AAAA,cACbuC;AAAA,cACAvC,EAAG,YAAY;AAAA,gBACba,EAAc,aAAa,gBAAgBf,CAAS;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,QACb;AAAA,MAEA,WAAiBmB,MAAQ;AAGjB,iBAASuB,IAAU,GAAGA,IAAU9C,EAAKuB,CAAG,EAAE,QAAQuB,KAAW,GAAG;AAC9D,gBAAMC,IAAe/C,EAAKuB,CAAG,EAAEuB,CAAO;AACtC,UAAIb,EAAIc,GAAc,QAAQ,KAAK,CAACf,EAAQe,EAAa,QAAQ,CAAC,KAChEnC,EAAW;AAAA,YACTN,EAAG,YAAY;AAAA,cACbW;AAAA,cACAX,EAAG,YAAY;AAAA,gBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,cAC1C;AAAA,cACDE,EAAG,YAAY,QAAQyC,EAAa,QAAQ,CAAC;AAAA,YAC9C;AAAA,UACf;AAAA,QAES;AAAA,eACQxB,MAAQ,cAAc;AAU/B,cAAMyB,IAAkB1C,EAAG,YAAY,UAAU,EAAE;AAEnD,QAAAM,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACbW;AAAA,YACAX,EAAG,YAAY;AAAA,cACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,YAC1C;AAAA,YACD4C;AAAA,UACD;AAAA,QACX,GAGQpC,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACb0C;AAAA,YACA1C,EAAG,YAAY;AAAA,cACba,EAAc,aAAa,YAAYf,CAAS;AAAA,YACjD;AAAA,YACDE,EAAG,YAAY;AAAA,cACba,EAAc,aAAa,uBAAuBf,CAAS;AAAA,YAC5D;AAAA,UACF;AAAA,QACX;AAGQ,YAAI6C;AAEJ,QAAIjD,EAAKuB,CAAG,EAAE,OAAO,MAAM,QACzB0B,IAAc3C,EAAG,YAAY,UAAUN,EAAKuB,CAAG,EAAE,YAAY,CAAC,IAE9D0B,IAAc3C,EAAG,YAAY,QAAQN,EAAKuB,CAAG,EAAE,YAAY,CAAC,GAI9DX,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACb0C;AAAA,YACA1C,EAAG,YAAY;AAAA,cACba,EAAc,aAAa,cAAcf,CAAS;AAAA,YACnD;AAAA,YACD6C;AAAA,UACD;AAAA,QACX;AAAA,MACO;AAAA;AAAA,EAEJ;AACH;AAWA,SAAS5B,EACPT,GACAZ,GACAiB,GACAC,GACAjB,GACAM,GACAH,GACA;AAEA,EAAAQ,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACbW;AAAA,MACAX,EAAG,YAAY;AAAA,QACba,EAAc,aAAa,YAAYf,CAAS;AAAA,MACjD;AAAA,MACDE,EAAG,YAAY,UAAUY,CAAQ;AAAA,IAClC;AAAA,EACL,GAGMjB,MAAa,gBACfW,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACbW;AAAA,MACAX,EAAG,YAAY;AAAA,QACba,EAAc,aAAa,YAAYf,CAAS;AAAA,MACjD;AAAA,MACDE,EAAG,YAAY,QAAQ,SAAS;AAAA,IACjC;AAAA,EACP,GAIML,MAAa,mBACfW,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACbA,EAAG,YAAY,UAAUC,CAAU;AAAA,MACnCD,EAAG,YAAY;AAAA,QACba,EAAc,aAAa,qBAAqBf,CAAS;AAAA,MAC1D;AAAA,MACDa;AAAA,IACD;AAAA,EACP;AAEA;AAeA,SAASO,EAAsBZ,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AACnE,EAAK4B,EAAQhC,EAAKuB,CAAG,CAAC,KACpBX,EAAW;AAAA,IACTN,EAAG,YAAY;AAAA,MACb4C;AAAA,MACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,MACnEE,EAAG,YAAY,QAAQN,EAAKuB,CAAG,CAAC;AAAA,IACjC;AAAA,EACP;AAEA;AASA,SAASE,EAAmBb,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AAMhE,MAAI,CAAC4B,EAAQhC,EAAKuB,CAAG,CAAC,GAAG;AACvB,QAAI4B;AAEJ,IAAI,OAAOnD,EAAKuB,CAAG,KAAM,WACnBU,EAAIjC,EAAKuB,CAAG,GAAG,UAAU,MAC3B4B,IAAYnD,EAAKuB,CAAG,EAAE,YAGpBvB,EAAKuB,CAAG,EAAE,SAAS,GAAG,IAExB4B,IAAY,UAAUnD,EAAKuB,CAAG,CAAC,KAG/B4B,IAAYnD,EAAKuB,CAAG,GAKxBX,EAAW;AAAA,MACTN,EAAG,YAAY;AAAA,QACb4C;AAAA,QACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,QACnEE,EAAG,YAAY,UAAU6C,CAAS;AAAA,MACnC;AAAA,IACP;AAAA,EACG;AACH;AAUA,SAASzB,EAAmBd,GAAYsC,GAAIlD,GAAMuB,GAAKtB,GAAUG,GAAW;AAK1E,WAASgD,IAAW,GAAGA,IAAWpD,EAAKuB,CAAG,EAAE,QAAQ6B,KAAY,GAAG;AACjE,QAAIC;AACJ,UAAMC,IAActD,EAAKuB,CAAG,EAAE6B,CAAQ;AACtC,IAAKpB,EAAQsB,CAAW,MAClBrB,EAAIqB,GAAa,UAAU,IAAGD,IAAaC,EAAY,WAClDrB,EAAIqB,GAAa,KAAK,MAAGD,IAAaC,EAAY,KAAK,KAIlE1C,EAAW;AAAA,MACTN,EAAG,YAAY;AAAA,QACb4C;AAAA,QACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,QACnEE,EAAG,YAAY,UAAU+C,CAAU;AAAA,MACpC;AAAA,IACP;AAAA,EACG;AACH;AASA,SAAS1B,EAAmBf,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AAChE,MAAI,CAAC4B,EAAQhC,EAAKuB,CAAG,CAAC;AAGpB,QAAIA,MAAQ,gBAAgBA,MAAQ;AAClC,UAAIU,EAAIjC,EAAKuB,CAAG,GAAG,QAAQ,KAAK,CAACS,EAAQhC,EAAKuB,CAAG,EAAE,QAAQ,CAAC,GAAG;AAC7D,cAAMgC,IACJvD,EAAKuB,CAAG,EAAE,OAAO,MAAM,SAASvB,EAAKuB,CAAG,EAAE,OAAO,IAAI,YACjDiC,IAAYrC,EAAc;AAAA,UAC9B,OAAOoC,CAAW;AAAA,UAClBnD;AAAA,QACV;AAGQ,QAAAQ,EAAW;AAAA,UACTN,EAAG,YAAY;AAAA,YACb4C;AAAA,YACA5C,EAAG,YAAY;AAAA,cACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,YAC1C;AAAA,YACDE,EAAG,YAAY;AAAA,cACbN,EAAKuB,CAAG,EAAE,QAAQ;AAAA,cAClBjB,EAAG,YAAY,UAAUkD,CAAS;AAAA,YACnC;AAAA,UACF;AAAA,QACX;AAAA,MACO;AAAA,WACI;AAEL,UAAIA;AACJ,MAAIjC,MAAQ,kBAAkBA,MAAQ,mBAEpCiC,IAAYrC,EAAc,aAAa,gBAAgBf,CAAS,IAEhEmB,MAAQ,oCACRA,MAAQ,kBAGRiC,IAAYrC,EAAc,aAAa,eAAef,CAAS,IACtDmB,MAAQ,0BACjBiC,IAAYrC,EAAc,aAAa,cAAcf,CAAS,IAIhEQ,EAAW;AAAA,QACTN,EAAG,YAAY;AAAA,UACb4C;AAAA,UACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,UACnEE,EAAG,YAAY,QAAQN,EAAKuB,CAAG,GAAGjB,EAAG,YAAY,UAAUkD,CAAS,CAAC;AAAA,QACtE;AAAA,MACT;AAAA,IACK;AAEL;AASA,SAAS5B,EAAoBhB,GAAYsC,GAAIlD,GAAMuB,GAAKnB,GAAW;AAKjE,MAAI,CAAC4B,EAAQhC,EAAKuB,CAAG,CAAC;AAEpB,QAAI,CAAC,MAAM,QAAQvB,EAAKuB,CAAG,CAAC;AAC1B,MAAAX,EAAW;AAAA,QACTN,EAAG,YAAY;AAAA,UACb4C;AAAA,UACA5C,EAAG,YAAY,UAAUa,EAAc,aAAaI,GAAKnB,CAAS,CAAC;AAAA,UACnEE,EAAG,YAAY,QAAQN,EAAKuB,CAAG,CAAC;AAAA,QACjC;AAAA,MACT;AAAA;AAEM,eAASkC,IAAY,GAAGA,IAAYzD,EAAKuB,CAAG,EAAE,QAAQkC,KAAa,GAAG;AACpE,cAAMC,IAAc1D,EAAKuB,CAAG,EAAEkC,CAAS;AAEvC,YACE,CAACzB,EAAQ0B,CAAW,KACpBzB,EAAIyB,GAAa,QAAQ,KACzB,CAAC1B,EAAQ0B,EAAY,QAAQ,CAAC,GAC9B;AACA,cAAIC;AAGJ,UACE,CAAC1B,EAAIyB,GAAa,WAAW,KAC7B1B,EAAQ0B,GAAa,WAAW,IAEhCC,IAAc,OAGdA,IAAcD,EAAY,WAAW,GAIvC9C,EAAW;AAAA,YACTN,EAAG,YAAY;AAAA,cACb4C;AAAA,cACA5C,EAAG,YAAY;AAAA,gBACba,EAAc,aAAaI,GAAKnB,CAAS;AAAA,cAC1C;AAAA,cACDE,EAAG,YAAY,QAAQoD,EAAY,QAAQ,GAAGC,CAAW;AAAA,YAC1D;AAAA,UACb;AAAA,QACS;AAAA,MACF;AAGP;AAEA,MAAeC,IAAA;AAAA,EACb,cAAA7D;AACF;"}
@@ -70,13 +70,13 @@ function g(i, e, t, s, a, n) {
70
70
  if (c.singularString[i].includes(l))
71
71
  p(u, e, l);
72
72
  else if (c.singularURI[i].includes(l))
73
- D(u, e, l, n);
73
+ T(u, e, l, n);
74
74
  else if (c.multipleURI[i].includes(l))
75
- T(u, e, l, i, n);
75
+ N(u, e, l, i, n);
76
76
  else if (c.typedStrings[i].includes(l))
77
- N(u, e, l);
78
- else if (c.multilingualStrings[i].includes(l))
79
77
  S(u, e, l);
78
+ else if (c.multilingualStrings[i].includes(l))
79
+ D(u, e, l);
80
80
  else if (c.conditionalProperties[i].includes(l)) {
81
81
  if (l === "dct:publisher" || l === "dct:license") {
82
82
  for (let o of u)
@@ -197,7 +197,7 @@ function g(i, e, t, s, a, n) {
197
197
  );
198
198
  }
199
199
  } else
200
- l === "pv:DistributionType" && console.log(e[l]);
200
+ l === "pv:distributionType" && console.log(e[l]);
201
201
  }
202
202
  }
203
203
  function p(i, e, t) {
@@ -207,7 +207,7 @@ function p(i, e, t) {
207
207
  e[t] = s.object.value;
208
208
  }
209
209
  }
210
- function D(i, e, t, s) {
210
+ function T(i, e, t, s) {
211
211
  const a = s.formatTypes;
212
212
  if (i.size > 0) {
213
213
  e[t] = "";
@@ -217,7 +217,7 @@ function D(i, e, t, s) {
217
217
  }
218
218
  }
219
219
  }
220
- function T(i, e, t, s, a) {
220
+ function N(i, e, t, s, a) {
221
221
  const n = a.formatTypes;
222
222
  if (i.size > 0) {
223
223
  e[t] = [];
@@ -225,7 +225,7 @@ function T(i, e, t, s, a) {
225
225
  n.URIformat.voc.includes(t) ? e[t].push({ name: c.object.value, resource: c.object.value }) : n.URIformat.string.includes(t) ? e[t].push(c.object.value) : e[t].push({ "@id": c.object.value });
226
226
  }
227
227
  }
228
- function N(i, e, t) {
228
+ function S(i, e, t) {
229
229
  if (i.size > 0) {
230
230
  e[t] = "";
231
231
  for (let s of i)
@@ -233,7 +233,7 @@ function N(i, e, t) {
233
233
  e[t] = s.object.value;
234
234
  else if (t === "dcat:startDate" || t === "dcat:endDate")
235
235
  e[t] = s.object.value;
236
- else if (t === "pv:DistributionType")
236
+ else if (t === "pv:distributionType")
237
237
  e[t] = s.object.value;
238
238
  else {
239
239
  let a;
@@ -241,7 +241,7 @@ function N(i, e, t) {
241
241
  }
242
242
  }
243
243
  }
244
- function S(i, e, t) {
244
+ function D(i, e, t) {
245
245
  if (i.size > 0) {
246
246
  e[t] = [];
247
247
  for (let s of i)
@@ -1 +1 @@
1
- {"version":3,"file":"inputConverter.mjs","sources":["../../../lib/data-provider-interface/utils/inputConverter.js"],"sourcesContent":["import generalHelper from \"./general-helper\";\nimport { has, isEmpty } from \"lodash\";\n\n/**\n * Converts given data for given property into input form format\n * @param {*} state state from store\n * @param {*} property Property to convert data for (datasets/catalogues)\n * @param {*} data Linked data within a dataset\n */\nasync function convertToInput(state, property, data, dpiConfig) {\n let generalID;\n let namespaceKeys;\n let propertyQuads;\n\n if (property === \"datasets\") {\n propertyQuads = data.match(\n null,\n \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n \"http://www.w3.org/ns/dcat#Dataset\",\n null\n );\n } else {\n propertyQuads = data.match(\n null,\n \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n \"http://www.w3.org/ns/dcat#Catalog\",\n null\n );\n }\n\n // extract data for datasets/catalogues\n namespaceKeys = generalHelper.getPagePrefixedNames(\n property,\n dpiConfig.inputDefinition,\n dpiConfig.pageConent\n );\n state[property] = {};\n for (let el of propertyQuads) {\n // there should be only one dataset id\n generalID = el.subject.value;\n\n for (let pageName in namespaceKeys[property]) {\n state[property][pageName] = {};\n convertProperties(\n property,\n state[property][pageName],\n generalID,\n data,\n namespaceKeys[property][pageName],\n dpiConfig\n );\n }\n }\n\n // also add distribution data\n if (property === \"datasets\") {\n const distributionQuads = data.match(\n generalID,\n \"http://www.w3.org/ns/dcat#distribution\",\n null,\n null\n );\n namespaceKeys = generalHelper.getPagePrefixedNames(\n \"distributions\",\n dpiConfig.inputDefinition,\n dpiConfig.pageConent\n );\n state.datasets.Distributions[\"distributionList\"] = [];\n for (let el of distributionQuads) {\n const currentDistribution = {};\n\n const distributionId = el.object.value;\n for (let pageName in namespaceKeys[\"distributions\"]) {\n currentDistribution[pageName] = {};\n convertProperties(\n \"distributions\",\n currentDistribution[pageName],\n distributionId,\n data,\n namespaceKeys[\"distributions\"][pageName],\n dpiConfig\n );\n }\n state.datasets.Distributions.distributionList.push(currentDistribution);\n }\n }\n}\n\n/**\n * Converts value for given property from RDF into input form format\n * @param {*} property Parent property of given value (datasets/distributions/catalogues)\n * @param {*} state State from store\n * @param {*} id Id of parent node which serves as subject\n * @param {*} data Linked data\n * @param {*} propertyKeys Keys of properties to check\n */\nfunction convertProperties(property, state, id, data, propertyKeys, dpiConfig) {\n const formatType = dpiConfig.formatTypes;\n\n for (let index = 0; index < propertyKeys.length; index += 1) {\n const key = propertyKeys[index];\n let subData = data.match(\n id,\n generalHelper.addNamespace(key, dpiConfig),\n null,\n null\n );\n\n if (formatType.singularString[property].includes(key)) {\n convertSingularStrings(subData, state, key);\n } else if (formatType.singularURI[property].includes(key)) {\n convertSingularURI(subData, state, key, dpiConfig);\n } else if (formatType.multipleURI[property].includes(key)) {\n convertMultipleURI(subData, state, key, property, dpiConfig);\n } else if (formatType.typedStrings[property].includes(key)) {\n convertTypedString(subData, state, key);\n } else if (formatType.multilingualStrings[property].includes(key)) {\n convertMultilingual(subData, state, key);\n } else if (formatType.conditionalProperties[property].includes(key)) {\n // publisher either is an URI or a group with multiple values (name, homepage, email)\n if (key === \"dct:publisher\" || key === \"dct:license\") {\n for (let el of subData) {\n if (el.object.termType === \"NamedNode\") {\n state[key] = { name: el.object.value, resource: el.object.value };\n } else if (el.object.termType === \"BlankNode\") {\n // get keys for nested values without dct'title (special format)\n const nestedKeys = generalHelper\n .getNestedKeys(data.match(el.object, null, null, null), dpiConfig)\n .filter((el) => el !== \"dct:title\");\n const nestedProperties = {};\n\n // convert nested values\n if (key === \"dct:license\") {\n const licenceTitleQuad = data.match(\n el.object,\n generalHelper.addNamespace(\"dct:title\", dpiConfig),\n null,\n null\n );\n for (let el of licenceTitleQuad) {\n nestedProperties[\"dct:title\"] = el.object.value;\n }\n }\n\n convertProperties(\n property,\n nestedProperties,\n el.object,\n data,\n nestedKeys,\n dpiConfig\n );\n state[key] = nestedProperties;\n }\n }\n }\n } else if (formatType.groupedProperties[property].includes(key)) {\n if (subData.size > 0) {\n state[key] = [];\n // there could be multiple nodes with data for a property\n for (let el of subData) {\n let currentState = {};\n if (key === \"skos:notation\") {\n // skos notation behaves differently\n // there should be a typed literal given which should be seperated into @value and @type\n if (el.object.value) currentState[\"@value\"] = el.object.value;\n if (el.object.datatypeString)\n currentState[\"@type\"] = {\n name: el.object.datatypeString,\n resource: el.object.datatypeString,\n };\n } else {\n // some properties have a named node containing data, the value of this named node also is a value form the input form (typically @id)\n if (el.object.termType === \"NamedNode\")\n currentState[\"@id\"] = el.object.value;\n // get keys of node properties\n const nestedKeys = generalHelper.getNestedKeys(\n data.match(el.object, null, null, null),\n dpiConfig\n );\n convertProperties(\n property,\n currentState,\n el.object,\n data,\n nestedKeys,\n dpiConfig\n );\n }\n // creator not an array\n if (\n key === \"dct:creator\" ||\n key === \"vcard:hasAddress\" ||\n key === \"skos:notation\" ||\n key === \"spdx:checksum\"\n )\n state[key] = currentState;\n else state[key].push(currentState);\n }\n }\n } else if (key === \"dcat:temporalResolution\") {\n // temporal resolution is displayed as group of input forms for each property (year, month, day, ...)\n // the form provides the data as following: [ { 'Year': '...', 'Month': '...', ... } ]\n // the linked data format of this property looks like this: P?Y?M?DT?H?M?S\n if (subData.size > 0) {\n state[key] = {};\n\n const shorts = [\"Y\", \"M\", \"D\", \"H\", \"M\", \"S\"];\n const forms = {\n 0: \"Year\",\n 1: \"Month\",\n 2: \"Day\",\n 3: \"Hour\",\n 4: \"Minute\",\n 5: \"Second\",\n };\n\n // should be oly one quad\n let resolutionValue;\n for (let el of subData) {\n resolutionValue = el.object.value;\n }\n\n // backend converts temporalResolution values without a date into seconds for time values\n if (!resolutionValue.startsWith(\"P\")) {\n // setting year, month and day to 0\n state[key][forms[0]] = 0;\n state[key][forms[1]] = 0;\n state[key][forms[2]] = 0;\n\n // converting seconds into HH:MM:SS\n const data = new Date(resolutionValue * 1000)\n .toISOString()\n .slice(11, 19);\n state[key][forms[3]] = data.slice(0, 2);\n state[key][forms[4]] = data.slice(3, 5);\n state[key][forms[5]] = data.slice(7, 9);\n } else {\n // find index of letter for time period\n // extract substring until this index\n // extract number from string and set as according value for input\n for (let tempIndex = 0; tempIndex < shorts.length; tempIndex += 1) {\n const position = resolutionValue.indexOf(shorts[tempIndex]); // position of duration letter\n const subDuration = resolutionValue.substring(0, position); // substring until position of duration letter\n const value = subDuration?.match(/\\d+/g)?.[0] ?? \"\"; // extract number\n resolutionValue = resolutionValue.substring(position); // overwrite resolution string with shortened version (missing the extracted part)\n state[key][forms[tempIndex]] = value; // write to result object\n }\n }\n }\n } else if (key === \"dct:identifier\") {\n if (subData.size > 0) {\n // identifier should be provided as array of strings\n // [{'@value': '...'}, {'@value': '...'}, ...]\n state[key] = [];\n\n for (let el of subData) {\n state[key].push({ \"@value\": el.object.value });\n }\n }\n } else if (key === \"dct:rights\") {\n // rights is conditional and gets a string\n // rights always includes a type so everything is located within a blank node\n // also rights is a singular property\n if (subData.size > 0) {\n let nodeData;\n // get id of blank node and associated label data\n for (let el of subData) {\n const rightsBlankNode = el.object;\n nodeData = data.match(\n rightsBlankNode,\n generalHelper.addNamespace(\"rdfs:label\", dpiConfig),\n null,\n null\n );\n for (let label of nodeData) {\n if (generalHelper.isUrl(label.object.value))\n state[key] = { \"@type\": \"url\", \"rdfs:value\": label.object.value };\n else\n state[key] = {\n \"@type\": \"text\",\n \"rdfs:value\": label.object.value,\n };\n }\n }\n }\n } else if (key === \"datasetID\" && property !== \"datatsets\") {\n // id is given as complete URI\n // dataset-/catalogue-id is string following the last /\n state[key] = id.substr(id.lastIndexOf(\"/\") + 1);\n state[\"hidden_datasetIDFormHidden\"] = id.substr(id.lastIndexOf(\"/\") + 1);\n } else if (key === \"dcat:catalog\" && property === \"datasets\") {\n // datasets also have a property called dcat:catalog (not valid DCAT-AP)\n // property is needed to determine catalog the dataset belongs to\n if (!(subData.size > 0)) {\n // bceause dcat:catalog is no valid DCAT-AP it is possible that the prefix is not resolved\n // therefore it is also possible to get the data by using the shortned key\n subData = data.match(id, \"dcat:catalog\", null, null);\n }\n\n state[key] = \"\";\n\n // there should only be one catalog\n for (let cat of subData) {\n state[key] = cat.object.value;\n }\n } else if (key === \"rdf:type\") {\n // some properties have a type which can be selected\n // the type also has a namespace and therefore need to be shortened ( e.g. from https://...Individual to vcard:Individual)\n if (subData.size > 0) {\n state[key] = \"\";\n\n // typically there is only on type provided for each property instance\n for (let el of subData) {\n state[key] = generalHelper.removeNamespace(\n el.object.value,\n dpiConfig\n );\n }\n }\n } else if (key === \"pv:DistributionType\") {\n // Displays the Tag of the Distribution TODO\n console.log(state[key]);\n }\n }\n}\n\n//-----------------------------------------------------------------------------------------------------\n// basic conversion methods for different categories of data\n//-----------------------------------------------------------------------------------------------------\n// seems at first to be unnecessary but if we want to convert nested properties as well, we need these\n// methods (especially to provide the correct parent URI)\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertSingularStrings(data, state, key) {\n if (data.size > 0) {\n state[key] = \"\";\n\n for (let el of data) {\n state[key] = el.object.value;\n }\n }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertSingularURI(data, state, key, dpiConfig) {\n const formatType = dpiConfig.formatTypes;\n\n if (data.size > 0) {\n state[key] = \"\";\n\n for (let el of data) {\n const value = el.object.value;\n\n if (value.startsWith(\"mailto:\")) {\n state[key] = value.replace(\"mailto:\", \"\");\n } else {\n if (formatType.URIformat.voc.includes(key))\n state[key] = { name: value, resource: value };\n else if (formatType.URIformat.string.includes(key)) state[key] = value;\n else state[key] = { \"@id\": value };\n }\n }\n }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertMultipleURI(data, state, key, property, dpiConfig) {\n // there are two different formats the frontend need to deliver multiple URIs\n // 1: [ \"URI1\", \"URI2\" ]\n // 2: [ { \"@id\": \"URI1\" }, { \"@id\": \"URI2\" } ]\n\n const formatType = dpiConfig.formatTypes;\n\n if (data.size > 0) {\n state[key] = [];\n for (let el of data) {\n if (formatType.URIformat.voc.includes(key))\n state[key].push({ name: el.object.value, resource: el.object.value });\n else if (formatType.URIformat.string.includes(key))\n state[key].push(el.object.value);\n else state[key].push({ \"@id\": el.object.value });\n }\n }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertTypedString(data, state, key) {\n // some properties have a type\n // normally this type is not used within the forntend form and therefore won't be saved to frontend values\n if (data.size > 0) {\n state[key] = \"\";\n for (let el of data) {\n if (key === \"dcat:spatialResolutionInMeters\" || key === \"dcat:byteSize\")\n state[key] = el.object.value;\n else if (key === \"dcat:startDate\" || key === \"dcat:endDate\") {\n state[key] = el.object.value;\n } else if (key === \"pv:DistributionType\") {\n state[key] = el.object.value;\n } else {\n let dateType;\n if (el.object.value.includes(\"T\")) dateType = \"dateTime\";\n else dateType = \"date\";\n\n state[key] = { \"@type\": dateType, \"@value\": el.object.value };\n }\n }\n }\n}\n\n/**\n * Converts and writes multilingual data to store\n * @param {*} data DatasetCore containing an array of quads\n * @param {*} state State for current key\n * @param {*} key Name of current property (e.g: 'dct:title')\n */\nfunction convertMultilingual(data, state, key) {\n // multilingual data is always stored within an array containing object with the value and it's language\n // [ {'@value': '...', '@language': '...'}, ...]\n if (data.size > 0) {\n state[key] = [];\n\n for (let el of data) {\n if (!el.object.language.includes(\"-\")) {\n // machine translation language tags look like this \"fi-t-en-t0-mtec\" and should not be included\n const currentElement = {};\n currentElement[\"@value\"] = el.object.value; // actual value\n currentElement[\"@language\"] = el.object.language; // language of value\n state[key].push(currentElement);\n }\n }\n }\n}\n\nexport default {\n convertToInput,\n};\n"],"names":["convertToInput","state","property","data","dpiConfig","generalID","namespaceKeys","propertyQuads","generalHelper","el","pageName","convertProperties","distributionQuads","currentDistribution","distributionId","id","propertyKeys","formatType","index","key","subData","convertSingularStrings","convertSingularURI","convertMultipleURI","convertTypedString","convertMultilingual","nestedKeys","nestedProperties","licenceTitleQuad","currentState","shorts","forms","resolutionValue","tempIndex","position","subDuration","value","_a","nodeData","rightsBlankNode","label","cat","dateType","currentElement","toInput"],"mappings":"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"}
1
+ {"version":3,"file":"inputConverter.mjs","sources":["../../../lib/data-provider-interface/utils/inputConverter.js"],"sourcesContent":["import generalHelper from \"./general-helper\";\nimport { has, isEmpty } from \"lodash\";\n\n/**\n * Converts given data for given property into input form format\n * @param {*} state state from store\n * @param {*} property Property to convert data for (datasets/catalogues)\n * @param {*} data Linked data within a dataset\n */\nasync function convertToInput(state, property, data, dpiConfig) {\n let generalID;\n let namespaceKeys;\n let propertyQuads;\n\n if (property === \"datasets\") {\n propertyQuads = data.match(\n null,\n \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n \"http://www.w3.org/ns/dcat#Dataset\",\n null\n );\n } else {\n propertyQuads = data.match(\n null,\n \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\",\n \"http://www.w3.org/ns/dcat#Catalog\",\n null\n );\n }\n\n // extract data for datasets/catalogues\n namespaceKeys = generalHelper.getPagePrefixedNames(\n property,\n dpiConfig.inputDefinition,\n dpiConfig.pageConent\n );\n state[property] = {};\n for (let el of propertyQuads) {\n // there should be only one dataset id\n generalID = el.subject.value;\n\n for (let pageName in namespaceKeys[property]) {\n state[property][pageName] = {};\n convertProperties(\n property,\n state[property][pageName],\n generalID,\n data,\n namespaceKeys[property][pageName],\n dpiConfig\n );\n }\n }\n\n // also add distribution data\n if (property === \"datasets\") {\n const distributionQuads = data.match(\n generalID,\n \"http://www.w3.org/ns/dcat#distribution\",\n null,\n null\n );\n namespaceKeys = generalHelper.getPagePrefixedNames(\n \"distributions\",\n dpiConfig.inputDefinition,\n dpiConfig.pageConent\n );\n state.datasets.Distributions[\"distributionList\"] = [];\n for (let el of distributionQuads) {\n const currentDistribution = {};\n\n const distributionId = el.object.value;\n for (let pageName in namespaceKeys[\"distributions\"]) {\n currentDistribution[pageName] = {};\n convertProperties(\n \"distributions\",\n currentDistribution[pageName],\n distributionId,\n data,\n namespaceKeys[\"distributions\"][pageName],\n dpiConfig\n );\n }\n state.datasets.Distributions.distributionList.push(currentDistribution);\n }\n }\n}\n\n/**\n * Converts value for given property from RDF into input form format\n * @param {*} property Parent property of given value (datasets/distributions/catalogues)\n * @param {*} state State from store\n * @param {*} id Id of parent node which serves as subject\n * @param {*} data Linked data\n * @param {*} propertyKeys Keys of properties to check\n */\nfunction convertProperties(property, state, id, data, propertyKeys, dpiConfig) {\n const formatType = dpiConfig.formatTypes;\n\n for (let index = 0; index < propertyKeys.length; index += 1) {\n const key = propertyKeys[index];\n let subData = data.match(\n id,\n generalHelper.addNamespace(key, dpiConfig),\n null,\n null\n );\n\n if (formatType.singularString[property].includes(key)) {\n convertSingularStrings(subData, state, key);\n } else if (formatType.singularURI[property].includes(key)) {\n convertSingularURI(subData, state, key, dpiConfig);\n } else if (formatType.multipleURI[property].includes(key)) {\n convertMultipleURI(subData, state, key, property, dpiConfig);\n } else if (formatType.typedStrings[property].includes(key)) {\n convertTypedString(subData, state, key);\n } else if (formatType.multilingualStrings[property].includes(key)) {\n convertMultilingual(subData, state, key);\n } else if (formatType.conditionalProperties[property].includes(key)) {\n // publisher either is an URI or a group with multiple values (name, homepage, email)\n if (key === \"dct:publisher\" || key === \"dct:license\") {\n for (let el of subData) {\n if (el.object.termType === \"NamedNode\") {\n state[key] = { name: el.object.value, resource: el.object.value };\n } else if (el.object.termType === \"BlankNode\") {\n // get keys for nested values without dct'title (special format)\n const nestedKeys = generalHelper\n .getNestedKeys(data.match(el.object, null, null, null), dpiConfig)\n .filter((el) => el !== \"dct:title\");\n const nestedProperties = {};\n\n // convert nested values\n if (key === \"dct:license\") {\n const licenceTitleQuad = data.match(\n el.object,\n generalHelper.addNamespace(\"dct:title\", dpiConfig),\n null,\n null\n );\n for (let el of licenceTitleQuad) {\n nestedProperties[\"dct:title\"] = el.object.value;\n }\n }\n\n convertProperties(\n property,\n nestedProperties,\n el.object,\n data,\n nestedKeys,\n dpiConfig\n );\n state[key] = nestedProperties;\n }\n }\n }\n } else if (formatType.groupedProperties[property].includes(key)) {\n if (subData.size > 0) {\n state[key] = [];\n // there could be multiple nodes with data for a property\n for (let el of subData) {\n let currentState = {};\n if (key === \"skos:notation\") {\n // skos notation behaves differently\n // there should be a typed literal given which should be seperated into @value and @type\n if (el.object.value) currentState[\"@value\"] = el.object.value;\n if (el.object.datatypeString)\n currentState[\"@type\"] = {\n name: el.object.datatypeString,\n resource: el.object.datatypeString,\n };\n } else {\n // some properties have a named node containing data, the value of this named node also is a value form the input form (typically @id)\n if (el.object.termType === \"NamedNode\")\n currentState[\"@id\"] = el.object.value;\n // get keys of node properties\n const nestedKeys = generalHelper.getNestedKeys(\n data.match(el.object, null, null, null),\n dpiConfig\n );\n convertProperties(\n property,\n currentState,\n el.object,\n data,\n nestedKeys,\n dpiConfig\n );\n }\n // creator not an array\n if (\n key === \"dct:creator\" ||\n key === \"vcard:hasAddress\" ||\n key === \"skos:notation\" ||\n key === \"spdx:checksum\"\n )\n state[key] = currentState;\n else state[key].push(currentState);\n }\n }\n } else if (key === \"dcat:temporalResolution\") {\n // temporal resolution is displayed as group of input forms for each property (year, month, day, ...)\n // the form provides the data as following: [ { 'Year': '...', 'Month': '...', ... } ]\n // the linked data format of this property looks like this: P?Y?M?DT?H?M?S\n if (subData.size > 0) {\n state[key] = {};\n\n const shorts = [\"Y\", \"M\", \"D\", \"H\", \"M\", \"S\"];\n const forms = {\n 0: \"Year\",\n 1: \"Month\",\n 2: \"Day\",\n 3: \"Hour\",\n 4: \"Minute\",\n 5: \"Second\",\n };\n\n // should be oly one quad\n let resolutionValue;\n for (let el of subData) {\n resolutionValue = el.object.value;\n }\n\n // backend converts temporalResolution values without a date into seconds for time values\n if (!resolutionValue.startsWith(\"P\")) {\n // setting year, month and day to 0\n state[key][forms[0]] = 0;\n state[key][forms[1]] = 0;\n state[key][forms[2]] = 0;\n\n // converting seconds into HH:MM:SS\n const data = new Date(resolutionValue * 1000)\n .toISOString()\n .slice(11, 19);\n state[key][forms[3]] = data.slice(0, 2);\n state[key][forms[4]] = data.slice(3, 5);\n state[key][forms[5]] = data.slice(7, 9);\n } else {\n // find index of letter for time period\n // extract substring until this index\n // extract number from string and set as according value for input\n for (let tempIndex = 0; tempIndex < shorts.length; tempIndex += 1) {\n const position = resolutionValue.indexOf(shorts[tempIndex]); // position of duration letter\n const subDuration = resolutionValue.substring(0, position); // substring until position of duration letter\n const value = subDuration?.match(/\\d+/g)?.[0] ?? \"\"; // extract number\n resolutionValue = resolutionValue.substring(position); // overwrite resolution string with shortened version (missing the extracted part)\n state[key][forms[tempIndex]] = value; // write to result object\n }\n }\n }\n } else if (key === \"dct:identifier\") {\n if (subData.size > 0) {\n // identifier should be provided as array of strings\n // [{'@value': '...'}, {'@value': '...'}, ...]\n state[key] = [];\n\n for (let el of subData) {\n state[key].push({ \"@value\": el.object.value });\n }\n }\n } else if (key === \"dct:rights\") {\n // rights is conditional and gets a string\n // rights always includes a type so everything is located within a blank node\n // also rights is a singular property\n if (subData.size > 0) {\n let nodeData;\n // get id of blank node and associated label data\n for (let el of subData) {\n const rightsBlankNode = el.object;\n nodeData = data.match(\n rightsBlankNode,\n generalHelper.addNamespace(\"rdfs:label\", dpiConfig),\n null,\n null\n );\n for (let label of nodeData) {\n if (generalHelper.isUrl(label.object.value))\n state[key] = { \"@type\": \"url\", \"rdfs:value\": label.object.value };\n else\n state[key] = {\n \"@type\": \"text\",\n \"rdfs:value\": label.object.value,\n };\n }\n }\n }\n } else if (key === \"datasetID\" && property !== \"datatsets\") {\n // id is given as complete URI\n // dataset-/catalogue-id is string following the last /\n state[key] = id.substr(id.lastIndexOf(\"/\") + 1);\n state[\"hidden_datasetIDFormHidden\"] = id.substr(id.lastIndexOf(\"/\") + 1);\n } else if (key === \"dcat:catalog\" && property === \"datasets\") {\n // datasets also have a property called dcat:catalog (not valid DCAT-AP)\n // property is needed to determine catalog the dataset belongs to\n if (!(subData.size > 0)) {\n // bceause dcat:catalog is no valid DCAT-AP it is possible that the prefix is not resolved\n // therefore it is also possible to get the data by using the shortned key\n subData = data.match(id, \"dcat:catalog\", null, null);\n }\n\n state[key] = \"\";\n\n // there should only be one catalog\n for (let cat of subData) {\n state[key] = cat.object.value;\n }\n } else if (key === \"rdf:type\") {\n // some properties have a type which can be selected\n // the type also has a namespace and therefore need to be shortened ( e.g. from https://...Individual to vcard:Individual)\n if (subData.size > 0) {\n state[key] = \"\";\n\n // typically there is only on type provided for each property instance\n for (let el of subData) {\n state[key] = generalHelper.removeNamespace(\n el.object.value,\n dpiConfig\n );\n }\n }\n } else if (key === \"pv:distributionType\") {\n // Displays the Tag of the Distribution TODO\n console.log(state[key]);\n }\n }\n}\n\n//-----------------------------------------------------------------------------------------------------\n// basic conversion methods for different categories of data\n//-----------------------------------------------------------------------------------------------------\n// seems at first to be unnecessary but if we want to convert nested properties as well, we need these\n// methods (especially to provide the correct parent URI)\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertSingularStrings(data, state, key) {\n if (data.size > 0) {\n state[key] = \"\";\n\n for (let el of data) {\n state[key] = el.object.value;\n }\n }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertSingularURI(data, state, key, dpiConfig) {\n const formatType = dpiConfig.formatTypes;\n\n if (data.size > 0) {\n state[key] = \"\";\n\n for (let el of data) {\n const value = el.object.value;\n\n if (value.startsWith(\"mailto:\")) {\n state[key] = value.replace(\"mailto:\", \"\");\n } else {\n if (formatType.URIformat.voc.includes(key))\n state[key] = { name: value, resource: value };\n else if (formatType.URIformat.string.includes(key)) state[key] = value;\n else state[key] = { \"@id\": value };\n }\n }\n }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertMultipleURI(data, state, key, property, dpiConfig) {\n // there are two different formats the frontend need to deliver multiple URIs\n // 1: [ \"URI1\", \"URI2\" ]\n // 2: [ { \"@id\": \"URI1\" }, { \"@id\": \"URI2\" } ]\n\n const formatType = dpiConfig.formatTypes;\n\n if (data.size > 0) {\n state[key] = [];\n for (let el of data) {\n if (formatType.URIformat.voc.includes(key))\n state[key].push({ name: el.object.value, resource: el.object.value });\n else if (formatType.URIformat.string.includes(key))\n state[key].push(el.object.value);\n else state[key].push({ \"@id\": el.object.value });\n }\n }\n}\n\n/**\n *\n * @param {*} data\n * @param {*} state\n * @param {*} key\n */\nfunction convertTypedString(data, state, key) {\n // some properties have a type\n // normally this type is not used within the forntend form and therefore won't be saved to frontend values\n if (data.size > 0) {\n state[key] = \"\";\n for (let el of data) {\n if (key === \"dcat:spatialResolutionInMeters\" || key === \"dcat:byteSize\")\n state[key] = el.object.value;\n else if (key === \"dcat:startDate\" || key === \"dcat:endDate\") {\n state[key] = el.object.value;\n } else if (key === \"pv:distributionType\") {\n state[key] = el.object.value;\n } else {\n let dateType;\n if (el.object.value.includes(\"T\")) dateType = \"dateTime\";\n else dateType = \"date\";\n\n state[key] = { \"@type\": dateType, \"@value\": el.object.value };\n }\n }\n }\n}\n\n/**\n * Converts and writes multilingual data to store\n * @param {*} data DatasetCore containing an array of quads\n * @param {*} state State for current key\n * @param {*} key Name of current property (e.g: 'dct:title')\n */\nfunction convertMultilingual(data, state, key) {\n // multilingual data is always stored within an array containing object with the value and it's language\n // [ {'@value': '...', '@language': '...'}, ...]\n if (data.size > 0) {\n state[key] = [];\n\n for (let el of data) {\n if (!el.object.language.includes(\"-\")) {\n // machine translation language tags look like this \"fi-t-en-t0-mtec\" and should not be included\n const currentElement = {};\n currentElement[\"@value\"] = el.object.value; // actual value\n currentElement[\"@language\"] = el.object.language; // language of value\n state[key].push(currentElement);\n }\n }\n }\n}\n\nexport default {\n convertToInput,\n};\n"],"names":["convertToInput","state","property","data","dpiConfig","generalID","namespaceKeys","propertyQuads","generalHelper","el","pageName","convertProperties","distributionQuads","currentDistribution","distributionId","id","propertyKeys","formatType","index","key","subData","convertSingularStrings","convertSingularURI","convertMultipleURI","convertTypedString","convertMultilingual","nestedKeys","nestedProperties","licenceTitleQuad","currentState","shorts","forms","resolutionValue","tempIndex","position","subDuration","value","_a","nodeData","rightsBlankNode","label","cat","dateType","currentElement","toInput"],"mappings":"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"}