@comunica/actor-rdf-parse-html
Version:
A html rdf-parse actor
135 lines • 4.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActorRdfParseHtml = void 0;
const bus_rdf_parse_1 = require("@comunica/bus-rdf-parse");
const htmlparser2_1 = require("htmlparser2");
const readable_stream_1 = require("readable-stream");
/**
* A comunica HTML RDF Parse Actor.
* It creates an HTML parser, and delegates its events via the bus-rdf-parse-html bus to other HTML parsing actors.
*/
class ActorRdfParseHtml extends bus_rdf_parse_1.ActorRdfParseFixedMediaTypes {
/**
* @param args -
* \ @defaultNested {{
* "text/html": 1.0,
* "application/xhtml+xml": 0.9
* }} mediaTypePriorities
* \ @defaultNested {{
* "text/html": "http://www.w3.org/ns/formats/HTML",
* "application/xhtml+xml": "http://www.w3.org/ns/formats/HTML"
* }} mediaTypeFormats
*/
constructor(args) {
super(args);
}
async runHandle(action, mediaType, context) {
const data = new readable_stream_1.Readable({ objectMode: true });
data._read = () => {
// Do nothing
};
let maxSize = 0;
// Create callbacks action
let endBarrier = 1;
function error(subError) {
data.emit('error', subError);
}
function end() {
if (--endBarrier === 0) {
data.push(null);
}
}
const htmlAction = {
baseIRI: action.metadata?.baseIRI ?? '',
context,
emit: (quad) => {
maxSize--;
data.push(quad);
},
end,
error,
headers: action.headers,
};
try {
const outputs = await Promise.all(this.busRdfParseHtml.publish(htmlAction));
endBarrier += outputs.length;
const htmlParseListeners = [];
for (const output of outputs) {
// eslint-disable-next-line unicorn/no-useless-undefined
const { htmlParseListener } = await output.actor.run(htmlAction, undefined);
htmlParseListeners.push(htmlParseListener);
}
// Create parser
const parser = new htmlparser2_1.Parser({
onclosetag() {
try {
for (const htmlParseListener of htmlParseListeners) {
htmlParseListener.onTagClose();
}
}
catch (error_) {
error(error_);
}
},
onend() {
try {
for (const htmlParseListener of htmlParseListeners) {
htmlParseListener.onEnd();
}
}
catch (error_) {
error(error_);
}
end();
},
onopentag(name, attributes) {
try {
for (const htmlParseListener of htmlParseListeners) {
htmlParseListener.onTagOpen(name, attributes);
}
}
catch (error_) {
error(error_);
}
},
ontext(text) {
try {
for (const htmlParseListener of htmlParseListeners) {
htmlParseListener.onText(text);
}
}
catch (error_) {
error(error_);
}
},
}, {
decodeEntities: true,
recognizeSelfClosing: true,
xmlMode: false,
});
const read = data._read = (size) => {
maxSize = Math.max(size, maxSize);
// eslint-disable-next-line no-unmodified-loop-condition
while (maxSize > 0) {
const item = action.data.read();
if (item === null) {
action.data.once('readable', () => read(0));
return;
}
parser.write(item.toString());
}
};
action.data
.on('error', error)
.on('end', () => parser.end());
}
catch (e) {
setTimeout(() => {
data.emit('error', e);
});
}
return { data };
}
}
exports.ActorRdfParseHtml = ActorRdfParseHtml;
//# sourceMappingURL=ActorRdfParseHtml.js.map