diff --git a/CHANGES.md b/CHANGES.md index 779201eba3a8b26f26b887d0a9c08ba1007205a5..14507e954a7c11d00e8516ea41f365b8b209eebf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,9 @@ # Changes +## Development () + +* **Update**: Updated TEI editor to address duplicate metadata issue + ## 0.8.8 (02.12.2019) * **Bugfix**: Missing menu options in the editor diff --git a/editor/static/editor/js/tei-editor.js b/editor/static/editor/js/tei-editor.js index f99bb69a4cdb65734908ca1fcf0d5316f1a87c58..a8bdf42f97c4ca922e19a3490e04f21c1566660c 100644 --- a/editor/static/editor/js/tei-editor.js +++ b/editor/static/editor/js/tei-editor.js @@ -4849,11 +4849,20 @@ else{let r=[] for(let n=0;n<t.children.length;n++){let i=this.parseContentNode(t.children[n],e) i&&r.push(i)}n.content=r}else{let r=[] for(let n=0;n<t.children.length;n++){let i=this.parseContentNode(t.children[n],e) -i&&r.push(i)}n.content=r}return n}}}}parseHeaderNode(t,e){let n=this.xpath.nodeIterator(t,e.tag),r=[],i=n.iterateNext() +i&&r.push(i)}n.content=r}return n}}}}generatePermutations(t){if(t.length>1){let e=[] +return this.generatePermutations(t.slice(1)).forEach(n=>{t[0].forEach(t=>{e.push([t].concat(n.slice(0)))})}),e}return t[0].map(t=>[t])}duplicateNode(t,e){let n=[],r=(e[0],e.map(e=>Xi([t,e.tag.substring(e.tag.indexOf(":")+1)]))) +return this.generatePermutations(r).forEach(r=>{let i=Yi([t]) +for(let t=0;t<e.length;t++)i[e[t].tag.substring(e[t].tag.indexOf(":")+1)]=r[t] +n.push(i)}),n}parseHeaderNode(t,e){let n=this.xpath.nodeIterator(t,e.tag),r=[],i=n.iterateNext() for(;i;){let t={_attrs:{},_text:0===i.children.length?this.xpath.stringValue(i,"text()"):null} for(let e=0;e<i.attributes.length;e++)t._attrs[i.attributes[e].name]=i.attributes[e].value -if(e.children)for(let n=0;n<e.children.length;n++){let r=this.parseHeaderNode(i,e.children[n]) -r&&(t[e.children[n].tag.substring(4)]=r)}r.push(t),i=n.iterateNext()}return 0===r.length?null:e.multiple?r:r[0]}parseHeader(t){let e=this.xpath.firstNode(this.dom.documentElement,t.tag),n={} +if(e.children){e.deduplicate&&e.children.forEach(t=>{e.deduplicate.merge.forEach(e=>{t.tag===e.tag&&(t.multiple=!0)})}) +for(let n=0;n<e.children.length;n++){let r=this.parseHeaderNode(i,e.children[n]) +r&&(t[e.children[n].tag.substring(e.children[n].tag.indexOf(":")+1)]=r)}e.deduplicate&&e.children.forEach(t=>{e.deduplicate.merge.forEach(e=>{t.tag===e.tag&&(t.multiple=!1)})})}r.push(t),i=n.iterateNext()}if(0===r.length)return null +if(e.multiple){if(e.deduplicate){let t=[] +r.forEach(n=>{let r=!1 +e.deduplicate.merge.forEach(t=>{let e=Xi([n,t.tag.substring(t.tag.indexOf(":")+1)]) +e&&e.length>1&&(r=!0)}),r?t=t.concat(this.duplicateNode(n,e.deduplicate.merge)):t.append(n)}),r=t}return r}return r[0]}parseHeader(t){let e=this.xpath.firstNode(this.dom.documentElement,t.tag),n={} for(let r=0;r<t.schema.length;r++){let i=this.parseHeaderNode(e,t.schema[r]) i&&(n[t.schema[r].tag.substring(4)]=i)}return n}parseMultiText(t){let e=this.xpath.firstNode(this.dom.documentElement,t.parser.selector) if(e){let n=[],r=this.xpath.nodeIterator(e,t.parts.parser.selector),i=r.iterateNext() @@ -4879,11 +4888,17 @@ let t=n t.node=null,r.forEach(e=>{if(null===t.node||t.node===e.node)t.node=e.node,Object.entries(e.attrs).forEach(e=>{t.attrs[e[0]]?t.attrs[e[0]]=t.attrs[e[0]].concat(e[1]):t.attrs[e[0]]=e[1]}) else{let n={node:e.node,attrs:e.attrs,children:[],text:t.text} t.text=null,t.children.push(n),t=n}})}else r.forEach(t=>{t.node&&(n.node=t.node),t.attrs&&Object.entries(t.attrs).forEach(t=>{n.attrs[t[0]]?n.attrs[t[0]]=n.attrs[t[0]].concat(t[1]):n.attrs[t[0]]=t[1]})})}}else t.content&&t.content.forEach(t=>{n.children.push(this.serializeTextNode(t,e))}) -return n}serializeHeader(t,e){return{node:"tei:TEI",children:[{node:e.tag,children:e.schema.map(e=>this.serializeMetadataNode(t[e.tag.substring(4)],e))}]}}serializeMetadataNode(t,e){if(e.multiple)return t.map(t=>{let n={node:e.tag} +return n}serializeHeader(t,e){return{node:"tei:TEI",children:[{node:e.tag,children:e.schema.map(e=>this.serializeMetadataNode(t[e.tag.substring(4)],e))}]}}serializeMetadataNode(t,e){if(e.multiple){let n=t.map(t=>{let n={node:e.tag} if(t._text&&(n.text=t._text),t._attrs&&(n.attrs={},Object.entries(t._attrs).forEach(t=>{n.attrs[t[0]]=[t[1]]})),e.children){n.children=[] for(let r=0;r<e.children.length;r++)if(t[e.children[r].tag.substring(4)]){let i=this.serializeMetadataNode(t[e.children[r].tag.substring(4)],e.children[r]) Array.isArray(i)?n.children=n.children.concat(i):n.children.push(i)}}return n}) -{let n={node:e.tag} +if(e.deduplicate){let t=[],r=[] +n.forEach(n=>{let i=Xi([n,e.deduplicate.key]) +i=i.length>0?i[0]:null +let s=r.indexOf(i) +if(s>=0){let r=t[s] +n.children&&n.children.length>0&&e.deduplicate.merge.forEach(t=>{n.children.forEach(e=>{if(e.node===t.tag){let t=r.children.length,n=0 +r.children.forEach((r,i)=>{0===n&&r.node===e.node?n=1:1===n&&r.node!==e.node&&(n=2,t=i),r.node===e.node&&this.objectsMatch(r,e)&&(n=3)}),3!=n&&r.children.splice(t,0,e)}})})}else r.push(i),t.push(n)}),n=t}return n}{let n={node:e.tag} if(t&&(t._text&&(n.text=t._text),t._attrs&&(n.attrs={},Object.entries(t._attrs).forEach(t=>{n.attrs[t[0]]=[t[1]]})),e.children)){n.children=[] for(let r=0;r<e.children.length;r++)if(t[e.children[r].tag.substring(4)]){let i=this.serializeMetadataNode(t[e.children[r].tag.substring(4)],e.children[r]) Array.isArray(i)?n.children=n.children.concat(i):n.children.push(i)}}return n}}serializeMultiText(t,e){let n={node:e.parts.serializer.tag,children:t.map(t=>this.serializeTextNode(t.text,e))} diff --git a/package.json b/package.json index 936d93b7b1c91b3e0aa04973cd1d5039c8979886..bbbb72c47825fdbf86daa628a62ddd81ea666b92 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "gulp-concat": "^2.6.1", "gulp-sass": "^4.0.2", "pump": "^3.0.0", - "tei-editor": "^0.3.2" + "tei-editor": "^0.4.0" }, "browserslist": [ "last 2 versions", diff --git a/yarn.lock b/yarn.lock index a8ea63c99934a833e803362f64087cdfde4298e9..4c3c368d6f83a8ab581324440a2882172a7122af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2889,10 +2889,10 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.3" -tei-editor@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/tei-editor/-/tei-editor-0.3.2.tgz#66e43b462d399e8c5681e77d7f1c5b396d388b1d" - integrity sha512-KUmfuo3/v+kcnahOa1GT4/x35gxFSzEM280sTEsCNQy+je3Z1pxREe22OfX/BuhqwZu/TEL2JdzGIgvqoxUHAA== +tei-editor@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/tei-editor/-/tei-editor-0.4.0.tgz#19956b9be21326fba0c8c7c06fe322e5123ad181" + integrity sha512-8/vwtzsEoKHX6cBjTV6X5gubEbl7zgq7BaVeqgtVKw38NsUdIjEpOGeXEuOzTAUKzPawtE+K66iHcIj9LpcUcA== through2-filter@^3.0.0: version "3.0.0"