{"id":13543612,"url":"https://github.com/mauvilsa/nw-page-editor","last_synced_at":"2025-07-07T11:08:07.820Z","repository":{"id":108807591,"uuid":"68455945","full_name":"mauvilsa/nw-page-editor","owner":"mauvilsa","description":"Simple app for visual editing of Page XML files","archived":false,"fork":false,"pushed_at":"2024-01-12T09:49:23.000Z","size":2731,"stargazers_count":30,"open_issues_count":2,"forks_count":9,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-31T10:42:26.721Z","etag":null,"topics":["annotation-tool","desktop-app","docker-image","editor","pagexml","server-app"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mauvilsa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-17T14:08:16.000Z","updated_at":"2024-01-10T13:17:07.000Z","dependencies_parsed_at":"2024-10-24T08:31:31.758Z","dependency_job_id":"f1fbf760-96dd-4e6b-8fb1-fdd7a201fcc4","html_url":"https://github.com/mauvilsa/nw-page-editor","commit_stats":{"total_commits":236,"total_committers":4,"mean_commits":59.0,"dds":"0.19067796610169496","last_synced_commit":"cfe417e7a4b31e5152dbff99042523504701b7d7"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mauvilsa%2Fnw-page-editor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mauvilsa%2Fnw-page-editor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mauvilsa%2Fnw-page-editor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mauvilsa%2Fnw-page-editor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mauvilsa","download_url":"https://codeload.github.com/mauvilsa/nw-page-editor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252889508,"owners_count":21820197,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["annotation-tool","desktop-app","docker-image","editor","pagexml","server-app"],"created_at":"2024-08-01T11:00:34.069Z","updated_at":"2025-05-07T13:44:18.470Z","avatar_url":"https://github.com/mauvilsa.png","language":"JavaScript","funding_links":[],"categories":["File formats and tools","Software"],"sub_categories":["CTPN [paper:2016](https://arxiv.org/pdf/1609.03605.pdf)","OCR GUI"],"readme":"# Name\n\nnw-page-editor - Simple app for visual editing of Page XML files.\n\nVersion: 2025.04.01\n\n\n# Description\n\nnw-page-editor is an application for viewing/editing ground truth or predicted\ninformation for diverse purposes related to the areas of document processing and\ntext recognition. The edition is done interactively and visually on top of\nimages of scanned documents. Additionally the app supports many keyboard\nshortcuts to allow more efficient editing, see section [Application usage\nshortcuts](#Application-usage-shortcuts).\n\nThe app is available in two variants. The first variant is as a [desktop\napplication](#Desktop-variant) based on the NW.js framework thus making it\ncross-platform. The second variant is as a [web\napplication](#Web-server-variant) that allows remote editing by multiple users\nand can be easily setup via a docker container.\n\n## Supported formats\n\nThe format used for storing the information is the [omni:us Pages\nFormat](https://github.com/omni-us/pageformat) hightly based on the [PRImA Page\nXML schema](http://www.primaresearch.org/tools/PAGELibraries), but only supports\na subset of elements and has a few minor extensions.\n\nNew XML files created by the app are saved as the latest version of the omni:us\nschema. Modifications to existing XML files using older omni:us schemas or PRImA\nschemas since version 2013-07-15 are saved using the original schema. Note that\nthis might mean that the saved XMLs are no longer valid according to that\nschema. Additionally the app supports importing XMLs from other formats, namely:\nPRImA 2010-03-19, alto [v2](http://www.loc.gov/standards/alto/ns-v2#) and\n[v3](http://www.loc.gov/standards/alto/ns-v3#),\n[tet](http://www.pdflib.com/XML/TET5/TET-5.0) and [poppler's pdftotext\nxhtml](https://en.wikipedia.org/wiki/Poppler_(software)#poppler-utils). Many\ndetails from imported formats might be lost and there is no functionality to\nexport back to those formats.\n\n\n# Desktop variant\n\nAfter correct [installation](#Desktop-variant-installation) of the desktop app,\nthe standard way in Linux and Mac to start the app is through the command line,\nnormally specifying which file(s) to open. In windows currently it is not\npossible to open files directly from the command line, so you need to start the\napp and then select a file to open.\n\n## Command line synopsis\n\n    nw-page-editor [*page.xml*]+ [*pages_dir*]+ [--list *pages_list*]+ [--css *file.css*]+ [--js *file.js*]+\n\n## Example Page XML files\n\nYou can find example Page XML files in the nw-page-editor source code\nrepository, the directory `examples`. Thus, you can open the examples as:\n\n    nw-page-editor examples/*.xml\n\n## Desktop variant installation\n\n### Linux/Mac:\n\n1. Download the SDK version of the NW.js package appropriate for your platform\n   from http://nwjs.io/downloads. Extract it to a location where you store\n   applications and add to your PATH the directory containing the `nw|nwjs`\n   binary: root of package in Linux or `nwjs.app/Contents/MacOS` in OSX.\n   Alternatively to setting the PATH it is also possible to simply symlink the\n   `nw|nwjs` executable to a directory already in your path.\n\n2. Clone the nw-page-editor repository (using the `--recursive` option) to a\n   location where you store applications and add the package's `bin` directory\n   to your PATH. Like in the previous step, alternatively you can simply symlink\n   the `bin/nw-page-editor` executable to a directory already in your path.\n\n### Windows:\n\nIn the github repository's releases there are for selected version prebuilt\npackages for windows. To install, go to\nhttps://github.com/mauvilsa/nw-page-editor/releases and download and extract the\nlatest `nw-page-editor-win-x64.zip` file. To open the app, execute the\n`nw-page-editor.exe` and for convenience create a shortcut to open the app.\n\nIf you are interested in the latest version for which there is no prebuilt\npackage, follow the following instructions:\n\n1. Download the SDK version of the NW.js package appropriate for your platform\n   from http://nwjs.io/downloads. Extract it to a location where you store\n   applications renaming the base directory to nw-page-editor.\n\n2. Move, copy or clone the files of this github repository such that the file\n   `package.json` is in the same directory as `nw.exe`. If cloning be sure that\n   you use the `--recursive` option.\n\n3. For convenience rename the `nw.exe` executable to `nw-page-editor.exe` and\n   create a shortcut to it in your desktop to ease opening the app.\n\n### Notes:\n\n- The reason to install the SDK version of NW.js is to allow inspection of\n  elements using the Chrome DevTools and for example be able to do Page XML\n  modifications not implemented in the app.\n\n## Desktop variant startup CSS and JavaScript files\n\nThe --css and --js command line options can be used to modify the appearance or\nexecute custom code on startup. For example, the following JavaScript code\nchanges the position, color and size of overlayed text, and prints to a pdf.\n\n```javascript\nsetTimeout( function() {\n    $.stylesheet('#page_styles { #xpg .TextEquiv }').css( 'fill', 'green' ); /* Set font color to green */\n    $.stylesheet('#page_styles { #xpg .TextEquiv }').css( 'font-size', '60px' ); /* Set font size to 60px */\n    pageCanvas.cfg.textPositionOffset = [ 10, 0 ]; /* Set text position x and y offsets */\n    pageCanvas.util.positionText(); /* Update text position */\n    nw.Window.get().print({pdf_path:loadedFile.replace(/\\.xml$/,'.pdf')}); /* Print to pdf */\n}, 500 );\n```\n\nTo run this example save this code snippet to a file test.js and start the editor from the command line as\n\n    nw-page-editor --js test.js examples/lorem.xml\n\n\n# Web server variant\n\nThe page editor can also be used as a web server allowing multiple users to edit\npage xmls remotely. Moreover, the server can be configured so that all the\nhistory of changes of the page xmls are saved in a git repository with commits\nassociated to the respective users. To ease the installation and usage of the\nweb server version, [docker](https://en.wikipedia.org/wiki/Docker_(software)) is\nused.\n\n## Web server variant installation\n\nThe steps for installation are the following:\n\n1. [Install docker](https://docs.docker.com/install/) in the server and for\n   convenience configure it so that [sudo is not\n   required](https://docs.docker.com/install/linux/linux-postinstall/) to run\n   containers.\n\n2. Either pull the latest image of nw-page-editor-web from [docker\n   hub](https://cloud.docker.com/repository/docker/mauvilsa/nw-page-editor-web/tags)\n   by choosing one of the available tags or build the docker image from the\n   source.\n\n```bash\n## Pull from docker hub ##\nTAG=\"YOUR CHOSEN TAG HERE\"\ndocker pull mauvilsa/nw-page-editor-web:$TAG\n\n## Build docker image from source ##\nTAG=\"local\"\ndocker build -t mauvilsa/nw-page-editor-web:$TAG .\n```\n\n3. Create a directory for the data and copy the images and page xml that will be\n   available to access remotely. It is highly recommended to make the data\n   directory a git repository so that change history is kept.\n\n```bash\n## Create directory for data ##\nmkdir data\n\n## Copy documents, e.g. the examples in nw-page-editor source ##\ncp $NW_PAGE_EDITOR_SOURCE/examples/* data\n\n## Create list of xmls if use of lists is needed ##\nls data/*.xml | sed 's|^data/||' | head -n 2 \u003e data/xmls.lst\n\n## Init data directory as git repo ##\ngit init data\n```\n\n4. By default the web app can be accessed without authentication in which case\n   all git commits are associated to the anonymous user. Alternatively you can\n   create users with passwords to restrict the access to the app and associate\n   commits to different people. This is done by creating the file\n   `data/.htpasswd` using the htpasswd tool. This tool might not be available in\n   the server, but it is included in the nw-page-editor-web docker image. To\n   ease the usage of htpasswd within this image, it is recommended that you use\n   the [docker-cli](https://github.com/omni-us/docker-command-line-interface)\n   script. Just download it into some directory included in your PATH and then\n   do the following.\n\n```bash\n## Create users and passwords ##\ndocker-cli -- mauvilsa/nw-page-editor-web:$TAG htpasswd -cb data/.htpasswd user1@domain1.org pass1\ndocker-cli -- mauvilsa/nw-page-editor-web:$TAG htpasswd -b data/.htpasswd user2@domain2.org pass2\n\n## For more details on htpasswd usage ##\ndocker-cli -- mauvilsa/nw-page-editor-web:$TAG htpasswd --help\n```\n\n5. Start a container exposing the web server port 80 to a port of your preference\n   (e.g. 8080) and set the data directory as a volume.\n\n```bash\ndocker run --rm -d -p 8080:80 \\\n  -v $(pwd)/data:/var/www/nw-page-editor/data \\\n  mauvilsa/nw-page-editor-web:$TAG\n```\n\n6. The Page XMLs can be accessed using URLs like the example ones below. Three\n   different GET parameters can be used to specify which documents to view. In\n   all cases relative paths with respect to the data directory must be given.\n   The three supported parameters are:\n   - `f`: to specify a single xml file\n   - `l`: to specify a list of xml files\n   - `d`: to specify a directory\n\n```\nhttp://$SERVER_ADDRESS:8080/app?f=lorem.xml\nhttp://$SERVER_ADDRESS:8080/app?l=xmls.lst\nhttp://$SERVER_ADDRESS:8080/app?d=.\n```\n\n## Data owner, group and permissions\n\nBy default the files created/modified by the web server will use a default umask\nand have the same owner and group as the data directory. These defaults can be\noverridden by defining the `DATA_UMASK`, `DATA_UID` and `DATA_GID` environment\nvariables.\n\n```bash\ndocker run --rm -d -p 8080:80 \\\n  -e DATA_UMASK=007 -e DATA_UID=1234 -e DATA_GID=5000 \\\n  -v $(pwd)/data:/var/www/nw-page-editor/data \\\n  mauvilsa/nw-page-editor-web:$TAG\n```\n\n## Web server variant startup CSS and JavaScript files\n\nSimilar to the desktop variant, the web variant can also receive `css` and `js`\nfiles to modify the appearance or execute custom code on startup. To use this\nfunctionality the `css` and `js` files need to be included in some path inside\nthe data directory. Then the docker container should be started setting as value\nto the `CSS` and `JS` environment variables, relative paths to the files\nseparated by spaces. For example:\n\n```bash\ndocker run --rm -d -p 8080:80 \\\n  -e CSS=mystyle.css -e JS=mycode.js \\\n  -v $(pwd)/data:/var/www/nw-page-editor/data \\\n  mauvilsa/nw-page-editor-web:$TAG\n```\n\n\n# Application usage shortcuts\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eShortcut\u003c/th\u003e              \u003cth\u003eCommand\u003c/th\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + q\u003c/td\u003e          \u003ctd\u003eQuit application\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + o\u003c/td\u003e          \u003ctd\u003eOpen file dialog\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + s\u003c/td\u003e          \u003ctd\u003eSave changes to file\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + shift + s\u003c/td\u003e  \u003ctd\u003eSave as new file dialog\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + p\u003c/td\u003e          \u003ctd\u003ePrint\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + enter\u003c/td\u003e      \u003ctd\u003eOpen/close menu\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + n\u003c/td\u003e          \u003ctd\u003eNew window\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003epageup\u003c/td\u003e                \u003ctd\u003eLoad previous document\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003epagedown\u003c/td\u003e              \u003ctd\u003eLoad next document\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eshift + pageup\u003c/td\u003e        \u003ctd\u003eLoad previous 10th document\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eshift + pagedown\u003c/td\u003e      \u003ctd\u003eLoad next 10th document\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + z\u003c/td\u003e          \u003ctd\u003eUndo last change\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + y\u003c/td\u003e          \u003ctd\u003eRedo last change\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003emouse click\u003c/td\u003e           \u003ctd\u003eSelect or deselect element\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eesc\u003c/td\u003e                   \u003ctd\u003eDeselect the currently selected element\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003etab\u003c/td\u003e                   \u003ctd\u003eSelect the next element\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eshift + tab\u003c/td\u003e           \u003ctd\u003eSelect the previous element\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl + tab\u003c/td\u003e            \u003ctd\u003eSelect the next dragpoint\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl + shift + tab\u003c/td\u003e    \u003ctd\u003eSelect the previous dragpoint\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl + f\u003c/td\u003e              \u003ctd\u003eEnable/disable text filtering\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003emouse click\u003c/td\u003e             \u003ctd\u003eStart creating or add point to polygon/polyline\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + mouse click\u003c/td\u003e  \u003ctd\u003eAdd point to and finish creating polygon/polyline\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + del\u003c/td\u003e        \u003ctd\u003eDelete selected element\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003edel\u003c/td\u003e                   \u003ctd\u003eDelete selected element (only when text not editable)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eminus + .\u003c/td\u003e             \u003ctd\u003eDelete selected dragpoint\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eplus + .\u003c/td\u003e              \u003ctd\u003eAdd dragpoint next to selected\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + 0\u003c/td\u003e          \u003ctd\u003eView full document (initial zoom)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + 1\u003c/td\u003e          \u003ctd\u003eZoom to page of selected element or hovered\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + 2\u003c/td\u003e          \u003ctd\u003eZoom to selected element or hovered\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + plus/minus\u003c/td\u003e \u003ctd\u003eZoom in/out\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eshift + mouse wheel\u003c/td\u003e   \u003ctd\u003eZoom in/out\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + arrows\u003c/td\u003e     \u003ctd\u003eMove (pan) the image in the respective direction\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003emouse wheel\u003c/td\u003e           \u003ctd\u003eMove (pan) the image in the respective direction\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003emouse drag\u003c/td\u003e            \u003ctd\u003eMove (pan) the image in the respective direction\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl + ,\u003c/td\u003e              \u003ctd\u003eSelect the next edit mode element level\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl + shift + ,\u003c/td\u003e      \u003ctd\u003eSelect the previous edit mode element level\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl + .\u003c/td\u003e              \u003ctd\u003eSelect the next edit mode type\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl + shift + .\u003c/td\u003e      \u003ctd\u003eSelect the previous edit mode type\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + e\u003c/td\u003e          \u003ctd\u003eOpen property editor for selected element\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + shift + pageup\u003c/td\u003e     \u003ctd\u003eIncrease bottom pane text font size\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + shift + pagedown\u003c/td\u003e   \u003ctd\u003eDecrease bottom pane text font size\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + pageup\u003c/td\u003e     \u003ctd\u003eIncrease overlayed text font size\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + pagedown\u003c/td\u003e   \u003ctd\u003eDecrease overlayed text font size\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + g\u003c/td\u003e          \u003ctd\u003eChange gamma of image\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ealt + arrows\u003c/td\u003e          \u003ctd\u003eChange table selected cell in the respective direction\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eplus + c/r\u003c/td\u003e            \u003ctd\u003eSplit selected table column/row\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eminus + c/r\u003c/td\u003e           \u003ctd\u003eRemove selected table column/row\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003emove dragpoint\u003c/td\u003e        \u003ctd\u003eModifies dragpoint and its opposite dragpoint(s)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eshift+ move dragpoint\u003c/td\u003e \u003ctd\u003eModifies only the dragpoint, not the opposite(s)\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003ectrl/cmd + r\u003c/td\u003e          \u003ctd\u003eToggle selected element protection\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n\n# Copyright\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-present, Mauricio Villegas \u003cmauricio_ville@yahoo.com\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmauvilsa%2Fnw-page-editor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmauvilsa%2Fnw-page-editor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmauvilsa%2Fnw-page-editor/lists"}