{"id":19640613,"url":"https://github.com/daniel-km/omeka-s-module-bulkedit","last_synced_at":"2025-08-26T02:04:11.624Z","repository":{"id":46098118,"uuid":"194639011","full_name":"Daniel-KM/Omeka-S-module-BulkEdit","owner":"Daniel-KM","description":"Module for Omeka S that add search and replace functionality allowing curators to update and clean metadata over many resources quickly and easily.","archived":false,"fork":false,"pushed_at":"2025-05-22T11:35:52.000Z","size":862,"stargazers_count":3,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-22T13:15:43.875Z","etag":null,"topics":["curation","omeka-s","omeka-s-module"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Daniel-KM.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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,"zenodo":null}},"created_at":"2019-07-01T09:09:36.000Z","updated_at":"2025-05-22T11:35:57.000Z","dependencies_parsed_at":"2024-02-09T06:23:18.115Z","dependency_job_id":"87fcb674-f5bb-4715-b69a-1f19142508c7","html_url":"https://github.com/Daniel-KM/Omeka-S-module-BulkEdit","commit_stats":null,"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/Daniel-KM/Omeka-S-module-BulkEdit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-BulkEdit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-BulkEdit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-BulkEdit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-BulkEdit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Daniel-KM","download_url":"https://codeload.github.com/Daniel-KM/Omeka-S-module-BulkEdit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Daniel-KM%2FOmeka-S-module-BulkEdit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272160241,"owners_count":24883779,"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","status":"online","status_checked_at":"2025-08-26T02:00:07.904Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["curation","omeka-s","omeka-s-module"],"created_at":"2024-11-11T14:06:15.510Z","updated_at":"2025-08-26T02:04:11.610Z","avatar_url":"https://github.com/Daniel-KM.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Bulk Edit (module for Omeka S)\n==============================\n\n\u003e __New versions of this module and support for Omeka S version 3.0 and above\n\u003e are available on [GitLab], which seems to respect users and privacy better\n\u003e than the previous repository.__\n\n[Bulk Edit] is a module for [Omeka S] that adds tools to bulk edit resources in\norder to modify or to clean them.\n\nCurrent processes are:\n\n- Modify language codes\n- Remove duplicate values\n- Remove all trailing white spaces\n- Replace value of a property (directly or via regex)\n- Remove the literal value of a property\n- Prepend or append a string to a value of a property\n- Set or remove language of a property\n- Order values by language (in particular for the title)\n- Set visibility of a property public or private\n- Displace values from a property to another one\n- Explode a value into multiple ones\n- Merge two values into one\n- Convert a value to another data type\n- Update or remove the owner\n- Update value suggest labels\n- apply visibility for values\n- fill label for Value Suggest values\n- remove specified values\n- remove specified media\n- add or remove a thumbnail\n- update order of media\n- explode item into multiple items by media\n- explode pdf into multiple images (mainly for quick display via iiif)\n- Update the media html via item or media\n- update media source\n- Update the media type (mime-type) of a media\n- update media visibility\n\nFurthermore, values are automatically trimmed and deduplicated when a resource\nis saved.\n\n\nInstallation\n------------\n\n### Module\n\nSee general end user documentation for [installing a module].\n\nThis module requires the module [Common], that should be installed first.\n\n* From the zip\n\nDownload the last release [BulkEdit.zip] from the list of releases, and\nuncompress it in the `modules` directory.\n\n* From the source and for development\n\nIf the module was installed from the source, rename the name of the folder of\nthe module to `BulkEdit`.\n\nThen install it like any other Omeka module and follow the config instructions.\n\n### Libraries\n\nIf you want to explode a pdf, you need either the command `pdftoppm` (poppler)\n(recommended) or `gs` (ghostscript).\n\n\nUsage\n-----\n\nThe tool is available via the standard bulk process in Admin \u003e Items, Admin \u003e Item Sets,\nand Admin \u003e Media. Simply select specific resources or all, then click Go, then\nselect and config the process to do.\n\nTo improve search of resources, you can use module [Advanced Search], that\nallows to search by creation date, modification date, or by visibility.\n\nThe job is launched directly when specific resources are selected, and in the\nbackground when all resources are selected.\n\n### Cleaning metadata\n\n#### Trim property values\n\nRemove leading and trailing whitespaces preventively on any resource creation or\nupdate, or curatively via the batch edit, so values will be easier to find and\nto compare exactly (see [omeka/omeka-s#1258]). Note that the curative trimming\nuses a regex when possible (with mysql ≥ 8.0.4 or mariadb ≥ 10.0.5). There is no\ndifference in most of the cases, except when there are multiple whitespace mixed\n(space, tabulation, new line, end of line, etc.).\n\n#### Specify data type of linked resources\n\nIn some cases, in particular when using resource templates with data type \"resource\",\nlinked resources are saved in the database with the generic data type \"resource\",\nnot with the specific \"resourc:item\", \"resource:media, etc.\nThis process is needed to clarify output of the facets with module [Advanced Search],\nlists from the module [Reference], and in some other places.\n\n#### Clean languages\n\nSometime, an empty language for a value is an empty string. This option makes it\nnull.\n\n#### Modify language codes\n\nThis options allows to replace all \"fr\" or \"fre\" by \"fra\", or any other language\ncode, or into an empty code. It can be limited to specific properties.\n\n#### Deduplicate property values\n\nRemove exact duplicated values on any new or updated resource preventively.\nNote: preventive deduplication is case sensitive, but curative deduplication is\ncase insensitive (it uses a direct query and the Omeka database is case\ninsensitive by default).\n\n### Replace values\n\n#### Replace value of a property directly or via regex\n\nFill fields \"Replace\" and \"By\", specify the type of replacement (simple, html or\nregex), then select the properties to update.\n\nThe mode \"html\" means that the original string will be checked as raw string and\nas html encoded string too. For example, string `café` will be checked with\n`café` and `caf\u0026eacute;`). Be careful when simple characters are mixed with\nentities, it may be difficult to replace all strings. The replacement string is\nused unchanged, so it is recommended to use entities for it too.\n\nFor Unicode, use the mode \"Convert badly formatted characters from Microsoft to Unicode\",\nwithout option from/to.\n\nFor regex, use standard patterns. Examples:\n- Convert spaces into \"-\" for identifiers: pattern = `~\\s+~`, replacement = `-`.\n- Convert `D:20220908101423` into a normalized date: pattern = `~^D:(\\d{4})(\\d{2})(\\d{2})~`,\n  replacement = `$1-$2-$3`.\n\n#### Remove the literal value of a property\n\nSimply check the box \"Remove string\", then select the properties to update.\nThe string will be removed, but it can be prepended or appended with another\nstring. In that case, the value is kept, else it is removed.\n\n#### Prepend or append a string\n\nFill fields \"Prepend\" and/or \"Append\" and select the properties to update.\n\n#### Set or remove language of a property\n\nSelect the properties to set or remove language.\nNote: all values of the selected properties are updated, so be aware of existing\nlanguages when they are multiple.\n\n### Remove specified media\n\nYou can remove medias of items by media-types or extensions.\n\n### Add or remove a thumbnail\n\nAdd or remove a thumbnail from resources, with or without existing thumbnail.\n\n### Order values\n\n#### Order values by language\n\nSometime, we need that the title and the description to be displayed to be in\none language, but the value in this language is not always the first in the\nmetadata. This is important for the title and the description, that are\ndisplayed in many places.\n\nSo just write the language in the order you want for the properties you want.\nValues with other languages or without language will be kept after.\n\n### Set or unset visibility of a property\n\nSelect the properties to set or unset visibility.\n\n### Displace values from a property to another one\n\nSelect the source properties and the destination property, then process edit.\nSome filters (datatype, language, string, visibility) allows to move only\nselected values.\n\n### Explode a value into multiple values\n\nThis tool is useful for an import of a csv file, where the checkbox for \"multivalue\"\nwas missed. Select the properties and the separator, that may have multiple\ncharacter.\n\n### Merge two values as uri\n\nSelect the properties and their values will be merged two by two. This tool can\nonly be used when the number of values is even. When a value has already the\ndatatype \"uri\" with a label, it is not changed and all values of the property\nare skipped to avoid merge issues. When two uris follow each other, the property\nis skipped too. At least one value should be an url. When the label and the\nvalues are different urls, the property is skipped. It’s recommended to check\norder of values first.\n\n### Convert datatype\n\nSelect the source datatype and the new datatype. Only some datatype are managed\ncurrently .\n\nWhen converting from an url to geographic coordinates (module [Data Type Geometry])\nwith a uri to [Geonames], the real coordinates are fetched.\n\n### Fill data\n\n#### Update or remove owner\n\nSimply set the user to use or set \"Remove user\" in the select.\n\n### Fill labels\n\nSelect the source datatype and the new datatype. Only some datatype are managed\ncurrently .\n\n### Explode pdf into images, mainly for iiif\n\nTo explode a pdf, you need either the command `pdftoppm` (poppler) (recommended)\nor `gs` (ghostscript).\n\n### Update media html from item or media\n\nSelect the items or medias and update media html, then update it like an item\nvalue.\n\n### Update media source\n\nUpdate or clear the media source, for example remove the directory path for\nfiles imported with the full path. The source may be processed via regex or a\nstring may be prepended or appended too. The settings are the same than the ones\nused to replace values above.\n\n### Update media types (mime-types)\n\nSelect the items or medias and set the existing and the new media type. They\nshould be standard ones and usually the more precise possible, like `application/tei+xml`\ninstead of `application/xml`.\n\n### Update media visibility\n\nUpdate media visibility according to some metadata.\n\n\nTODO\n----\n\n- [x] Add conversion for custom vocab.\n- [ ] Move hard-coded xml xpath into form.\n\n\nWarning\n-------\n\nUse it at your own risk.\n\nIt’s always recommended to backup your files and your databases and to check\nyour archives regularly so you can roll back if needed.\n\n\nTroubleshooting\n---------------\n\nSee online issues on the [module issues] page.\n\n\nLicense\n-------\n\nThis module is published under the [CeCILL v2.1] license, compatible with\n[GNU/GPL] and approved by [FSF] and [OSI].\n\nThis software is governed by the CeCILL license under French law and abiding by\nthe rules of distribution of free software. You can use, modify and/ or\nredistribute the software under the terms of the CeCILL license as circulated by\nCEA, CNRS and INRIA at the following URL \"http://www.cecill.info\".\n\nAs a counterpart to the access to the source code and rights to copy, modify and\nredistribute granted by the license, users are provided only with a limited\nwarranty and the software’s author, the holder of the economic rights, and the\nsuccessive licensors have only limited liability.\n\nIn this respect, the user’s attention is drawn to the risks associated with\nloading, using, modifying and/or developing or reproducing the software by the\nuser in light of its specific status of free software, that may mean that it is\ncomplicated to manipulate, and that also therefore means that it is reserved for\ndevelopers and experienced professionals having in-depth computer knowledge.\nUsers are therefore encouraged to load and test the software’s suitability as\nregards their requirements in conditions enabling the security of their systems\nand/or data to be ensured and, more generally, to use and operate it in the same\nconditions as regards security.\n\nThe fact that you are presently reading this means that you have had knowledge\nof the CeCILL license and that you accept its terms.\n\n\nCopyright\n---------\n\n* Copyright Daniel Berthereau, 2018-2025 (see [Daniel-KM])\n\nFirst developed for the [Archives Henri Poincaré] of [Université de Lorraine],\nthen improved for various projects.\n\n\n[Bulk Edit]: https://gitlab.com/Daniel-KM/Omeka-S-module-BulkEdit\n[Omeka S]: https://omeka.org/s\n[installing a module]: https://omeka.org/s/docs/user-manual/modules/#installing-modules\n[Advanced Search]: https://gitlab.com/Daniel-KM/Omeka-S-module-AdvancedSearch\n[Common]: https://gitlab.com/Daniel-KM/Omeka-S-module-Common\n[omeka/omeka-s#1258]: https://github.com/omeka/omeka-s/issues/1258\n[Reference]: https://gitlab.com/Daniel-KM/Omeka-S-module-Reference\n[Data Type Geometry]: https://gitlab.com/Daniel-KM/Omeka-S-module-DataTypeGeometry\n[Geonames]: https://www.geonames.org/\n[module issues]: https://gitlab.com/Daniel-KM/Omeka-S-module-BulkEdit/-/issues\n[CeCILL v2.1]: https://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html\n[GNU/GPL]: https://www.gnu.org/licenses/gpl-3.0.html\n[FSF]: https://www.fsf.org\n[OSI]: http://opensource.org\n[Archives Henri Poincaré]: https://poincare.univ-lorraine.fr\n[Université de Lorraine]: https://www.univ-lorraine.fr\n[GitLab]: https://gitlab.com/Daniel-KM\n[Daniel-KM]: https://gitlab.com/Daniel-KM \"Daniel Berthereau\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-km%2Fomeka-s-module-bulkedit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaniel-km%2Fomeka-s-module-bulkedit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-km%2Fomeka-s-module-bulkedit/lists"}