react-pdf-ner-annotator
Version:
A React component to annotate named entities directly onto a PDF.
112 lines • 7.66 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.__esModule = true;
var react_1 = __importStar(require("react"));
var usePDF_1 = __importDefault(require("./hooks/usePDF"));
var useAnnotations_1 = __importDefault(require("./hooks/useAnnotations"));
var useTextMap_1 = __importDefault(require("./hooks/useTextMap"));
var Page_1 = __importDefault(require("./components/Page"));
var Error_1 = __importDefault(require("./components/Error"));
var ButtonGroup_1 = __importDefault(require("./components/ButtonGroup"));
var EntityVisualisation_1 = __importDefault(require("./components/EntityVisualisation"));
var annotationContext_1 = __importDefault(require("./context/annotationContext"));
var configContext_1 = __importDefault(require("./context/configContext"));
var entityContext_1 = __importDefault(require("./context/entityContext"));
var useAnnotationUpdater_1 = __importDefault(require("./hooks/useAnnotationUpdater"));
var Annotator = (0, react_1.forwardRef)(function (_a, ref) {
var _b = _a.config, config = _b === void 0 ? {} : _b, url = _a.url, data = _a.data, _c = _a.initialScale, initialScale = _c === void 0 ? 1.5 : _c, _d = _a.tokenizer, tokenizer = _d === void 0 ? new RegExp(/\w+([,.\-/]\w+)+|\w+|\W/g) : _d, entity = _a.entity, initialTextMap = _a.initialTextMap, _e = _a.defaultAnnotations, defaultAnnotations = _e === void 0 ? [] : _e, hoveredEntities = _a.hoveredEntities, getAnnotations = _a.getAnnotations, getTextMaps = _a.getTextMaps;
var _f = (0, react_1.useState)(initialScale), scale = _f[0], setScale = _f[1];
var _g = (0, usePDF_1["default"])({ url: url, data: data, httpHeaders: config.httpHeaders }), pages = _g.pages, error = _g.error, fetchPage = _g.fetchPage;
var _h = (0, useAnnotations_1["default"])(defaultAnnotations, config.readonly, config.shouldUpdateDefaultAnnotations), annotations = _h.annotations, getAnnotationsForPage = _h.getAnnotationsForPage, addAnnotation = _h.addAnnotation, updateAnnotation = _h.updateAnnotation, updateLastAnnotationForEntity = _h.updateLastAnnotationForEntity, deleteAnnotation = _h.removeAnnotation, lastActionHash = _h.lastActionHash;
var _j = (0, useTextMap_1["default"])(annotations), textMap = _j.textMap, addPageToTextMap = _j.addPageToTextMap;
(0, useAnnotationUpdater_1["default"])(lastActionHash, annotations, config.readonly, getAnnotations);
(0, react_1.useImperativeHandle)(ref, function () { return ({ removeAnnotation: removeAnnotation }); });
var removeAnnotation = function (id) {
deleteAnnotation(id);
};
(0, react_1.useEffect)(function () {
if (getTextMaps) {
getTextMaps(initialTextMap || textMap);
}
}, [textMap, initialTextMap, getTextMaps]);
var style = (0, react_1.useMemo)(function () {
if (config.hideAnnotatingEntityVisualizations) {
return {};
}
if (entity) {
return {
border: "5px solid ".concat(entity.color)
};
}
return {};
}, [entity, config]);
var getTextLayerForPage = (0, react_1.useCallback)(function (page) {
if (initialTextMap) {
var found = initialTextMap.find(function (layer) { return layer.page === page; });
var shouldRender = found.shouldRender !== undefined ? found.shouldRender : true;
return found ? [found.textMapItems, shouldRender] : [undefined, true];
}
return [undefined, true];
}, [initialTextMap]);
if (!url && !data) {
return (react_1["default"].createElement("div", { className: "annotator-container" },
react_1["default"].createElement("div", { className: "annotator-pages-container" },
react_1["default"].createElement("div", { className: "annotator-pages" },
react_1["default"].createElement(Error_1["default"], { message: "You need to provide either valid PDF data or a URL to a PDF" })))));
}
if (error) {
return (react_1["default"].createElement("div", { className: "annotator-container" },
react_1["default"].createElement("div", { className: "annotator-pages-container" },
react_1["default"].createElement("div", { className: "annotator-pages" },
react_1["default"].createElement(Error_1["default"], null)))));
}
return (react_1["default"].createElement(configContext_1["default"].Provider, { value: { config: config } },
react_1["default"].createElement("div", { className: "annotator-container", style: style },
react_1["default"].createElement(EntityVisualisation_1["default"], { entity: entity }),
react_1["default"].createElement("div", { className: "annotator-pages-container" },
react_1["default"].createElement(entityContext_1["default"].Provider, { value: { entity: entity } },
react_1["default"].createElement(annotationContext_1["default"].Provider, { value: {
annotations: annotations,
removeAnnotation: removeAnnotation,
updateAnnotation: updateAnnotation,
tokenizer: tokenizer,
hoveredEntities: hoveredEntities
} },
react_1["default"].createElement("div", { className: "annotator-pages" }, Array(pages)
.fill(0)
.map(function (_, index) {
var key = "pdf-page-".concat(index);
var pageNumber = index + 1;
var page = fetchPage(pageNumber);
var _a = getTextLayerForPage(pageNumber), initialTextLayer = _a[0], shouldRender = _a[1];
return (react_1["default"].createElement(Page_1["default"], { shouldRender: shouldRender, page: page, scale: scale, key: key, pageNumber: pageNumber, annotations: getAnnotationsForPage(pageNumber), addAnnotation: addAnnotation, updateLastAnnotationForEntity: updateLastAnnotationForEntity, addPageToTextMap: addPageToTextMap, initialTextLayer: initialTextLayer }));
}))))),
react_1["default"].createElement(ButtonGroup_1["default"], { scale: scale, setScale: setScale }))));
});
exports["default"] = (0, react_1.memo)(Annotator);
//# sourceMappingURL=Annotator.js.map