gpml2pvjson
Version:
convert GPML (XML) to pvjson (json)
159 lines (158 loc) • 12.3 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CXMLXPath = void 0;
require("source-map-support/register");
// TODO should I get rid of source-map-support/register for production build for browser?
// TODO most or all of this should go into the xpath branch of @wikipathways/cxml.
// Decide on an API and then merge most or all this code into there.
//
// TODO why does TS require that we use the Pathway's "constructor.prototype"
// instead of just the Pathway?
// Why does Pathway.Graphics not need that?
// Why do many of the other require using the prototype?
//
//// TODO why do we get an error with this (/Pathway/@* before /Pathway):
//"/Pathway/@*": GPML2013a.document.Pathway.constructor.prototype,
//"/Pathway": GPML2013a.document.Pathway.constructor.prototype,
//// And with this, we don't get an error, but nothing comes out (/Pathway before /Pathway/@*):
//"/Pathway": GPML2013a.document.Pathway.constructor.prototype,
//"/Pathway/@*": GPML2013a.document.Pathway.constructor.prototype,
var fp_1 = require("lodash/fp");
var hl = require("highland");
var cxml = require("@wikipathways/cxml");
// TODO don't use this regex when we are already also using a nice
// xpath expression parser in the xpath branch of cxml
var ATTR_SELECTOR_REGEX = /\/@(\*|([:A-Za-z_][:\w\-\.]*))$/;
function getSelectorLevel(selector) {
return selector.replace(ATTR_SELECTOR_REGEX, "").split("/").length - 1;
}
var nestedElementsToSelector = fp_1.curry(function (commonLevel, nestedElements) {
return nestedElements.slice(0, commonLevel).join("/");
});
function getSelectorNestedElements(selector) {
return selector.replace(ATTR_SELECTOR_REGEX, "").split("/");
}
var CXMLXPath = /** @class */ (function () {
function CXMLXPath(inputStream, schema, xpathNamespaceTbl) {
if (xpathNamespaceTbl === void 0) { xpathNamespaceTbl = { "": "" }; }
this._parser = new cxml.Parser(xpathNamespaceTbl);
this._schema = schema;
this._inputStream = inputStream;
}
CXMLXPath.prototype.parse = function (selectorToCXML) {
var inputStream = this._inputStream;
var parser = this._parser;
var schema = this._schema;
var result = fp_1.toPairs(selectorToCXML).reduce(function (_a, _b) {
var output = _a.output, runningSelectors = _a.runningSelectors;
var selector = _b[0], schemaElement = _b[1];
var outputStream = hl();
var useBefore = selector.match(ATTR_SELECTOR_REGEX);
parser.attach(/** @class */ (function (_super) {
__extends(CustomHandler, _super);
function CustomHandler() {
return _super !== null && _super.apply(this, arguments) || this;
}
CustomHandler.prototype._before = function () {
if (useBefore) {
outputStream.write(fp_1.cloneDeep(this));
}
};
CustomHandler.prototype._after = function () {
if (!useBefore) {
outputStream.write(fp_1.cloneDeep(this));
}
};
return CustomHandler;
}(schemaElement.constructor)), selector);
output[selector] = outputStream;
var level = getSelectorLevel(selector);
var selectorNestedElements = getSelectorNestedElements(selector);
var _c = fp_1.partition(function (runningSelector) {
var runningSelectorNestedElements = getSelectorNestedElements(runningSelector);
var commonNestedElementsToSelector = nestedElementsToSelector(Math.min(selectorNestedElements.length, runningSelectorNestedElements.length));
return (commonNestedElementsToSelector(runningSelectorNestedElements) !==
commonNestedElementsToSelector(selectorNestedElements));
}, runningSelectors), selectorsToEnd = _c[0], stillRunningSelectors = _c[1];
selectorsToEnd.forEach(function (runningSelector) {
var runningStream = output[runningSelector];
outputStream
.observe()
.head()
.each(function (x) {
runningStream.end();
});
});
// NOTE: redefining this variable
runningSelectors = stillRunningSelectors.concat([selector]);
return { output: output, runningSelectors: runningSelectors };
}, { output: {}, runningSelectors: [] });
var streamMapBySelector = result.output;
var finalRunningSelectors = result.runningSelectors;
var selectors = fp_1.keys(selectorToCXML);
parser.parse(inputStream, schema.document).then(function (Pathway) {
finalRunningSelectors.forEach(function (finalRunningSelector) {
streamMapBySelector[finalRunningSelector].end();
});
selectors.forEach(function (selector) {
var thisStream = streamMapBySelector[selector];
if (!thisStream["ended"]) {
//console.log(streamMapBySelector[selector]);
//console.log(`Failed to end stream for ${selector}. See above.`);
//throw new Error(`Failed to end stream for ${selector}. See above.`);
thisStream.end();
/*
(thisStream._observers.length === 0
? thisStream
: thisStream.observe())
.debounce(17)
.each(function() {
thisStream.end();
});
//*/
}
});
}, function (err) {
throw err;
});
/*
streamMapBySelector.startCXML = function() {
return hl(parser.parse(inputStream, schema.document)).map(function(
Pathway
) {
console.log("Pathway");
console.log(Pathway);
finalRunningSelectors.forEach(function(finalRunningSelector) {
streamMapBySelector[finalRunningSelector].end();
});
selectors.forEach(function(selector) {
const thisStream = streamMapBySelector[selector];
if (!thisStream["ended"]) {
//console.log(streamMapBySelector[selector]);
console.log(`Failed to end stream for ${selector}. See above.`);
//throw new Error(`Failed to end stream for ${selector}. See above.`);
//thisStream.end();
}
});
});
};
//*/
return streamMapBySelector;
};
return CXMLXPath;
}());
exports.CXMLXPath = CXMLXPath;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3htbC14cGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGlub2Zmcy9jeG1sLXhwYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBcUM7QUFDckMseUZBQXlGO0FBRXpGLGtGQUFrRjtBQUNsRixvRUFBb0U7QUFDcEUsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSwrQkFBK0I7QUFDL0IsMkNBQTJDO0FBQzNDLHdEQUF3RDtBQUN4RCxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLGtFQUFrRTtBQUNsRSwrREFBK0Q7QUFDL0QsK0ZBQStGO0FBQy9GLCtEQUErRDtBQUMvRCxrRUFBa0U7QUFFbEUsZ0NBQXVFO0FBQ3ZFLDZCQUErQjtBQUUvQix5Q0FBMkM7QUF1QjNDLGtFQUFrRTtBQUNsRSxzREFBc0Q7QUFDdEQsSUFBTSxtQkFBbUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUU5RCxTQUFTLGdCQUFnQixDQUFDLFFBQVE7SUFDaEMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxJQUFNLHdCQUF3QixHQUFHLFVBQUssQ0FBQyxVQUFTLFdBQVcsRUFBRSxjQUFjO0lBQ3pFLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyx5QkFBeUIsQ0FBQyxRQUFRO0lBQ3pDLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVEO0lBTUUsbUJBQ0UsV0FBVyxFQUNYLE1BQU0sRUFDTixpQkFBc0Q7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