literal are now objects if one of lang or datatype is not null
authorymh <ymh.work@gmail.com>
Sun, 06 Mar 2016 00:29:01 +0100
changeset 141 c0e8626a271c
parent 140 f851ec12812f
child 142 86fcf0c837c0
literal are now objects if one of lang or datatype is not null
common/corpus-common-addon/addon/components/doc-generic.js
common/corpus-common-addon/addon/components/doc-literal.js
common/corpus-common-addon/addon/helpers/get-link-type.js
common/corpus-common-addon/addon/styles/addon.scss
common/corpus-common-addon/addon/templates/components/doc-generic.hbs
common/corpus-common-addon/addon/templates/components/doc-literal.hbs
common/corpus-common-addon/addon/utils/utils.js
common/corpus-common-addon/app/components/doc-generic.js
common/corpus-common-addon/app/components/doc-literal.js
common/corpus-common-addon/app/styles/addon.scss
common/corpus-common-addon/tests/integration/components/doc-generic-test.js
common/corpus-common-addon/tests/integration/components/doc-literal-test.js
server/bo_client/server/fixtures/documents.js
server/src/app/Libraries/Utils.php
server/src/app/Models/Document.php
--- a/common/corpus-common-addon/addon/components/doc-generic.js	Sat Mar 05 08:49:17 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-import Ember from 'ember';
-import layout from '../templates/components/doc-generic';
-
-export default Ember.Component.extend({
-  layout: layout,
-  tagName: 'span'
-});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/corpus-common-addon/addon/components/doc-literal.js	Sun Mar 06 00:29:01 2016 +0100
@@ -0,0 +1,38 @@
+import Ember from 'ember';
+import layout from '../templates/components/doc-literal';
+
+export default Ember.Component.extend({
+  layout: layout,
+  tagName: 'span',
+  value: Ember.computed('url', function() {
+    var url = this.get('url');
+    if(typeof url === 'string') {
+      return url;
+    }
+    else if (typeof url === 'object' && !Array.isArray(url) && 'value' in url) {
+      return url['value'];
+    }
+    else {
+      return null;
+    }
+  }),
+  lang: Ember.computed('url', function() {
+    var url = this.get('url');
+    if (typeof url === 'object' && !Array.isArray(url) && 'lang' in url) {
+      return url['lang'];
+    }
+    else {
+      return null;
+    }
+  }),
+  datatype: Ember.computed('url', function() {
+    var url = this.get('url');
+    if (typeof url === 'object' && !Array.isArray(url) && 'datatype' in url) {
+      return url['datatype'];
+    }
+    else {
+      return null;
+    }
+  })
+
+});
--- a/common/corpus-common-addon/addon/helpers/get-link-type.js	Sat Mar 05 08:49:17 2016 +0100
+++ b/common/corpus-common-addon/addon/helpers/get-link-type.js	Sun Mar 06 00:29:01 2016 +0100
@@ -1,23 +1,19 @@
 import Ember from 'ember';
-import * as constants from 'corpus-common-addon/utils/constants'
+import * as utils from 'corpus-common-addon/utils/utils'
 
 export function getLinkType(params/*, hash*/) {
   let url = params[0];
 
   if(!url) {
-    return 'doc-generic';  
+    return 'doc-literal';
   }
-  if(url.startsWith(constants.LEXVO_BASE_URL)) {
+  if(utils.isLexvoLink(url)) {
     return 'doc-language';
   }
-  if(
-    url.startsWith(constants.BNF_BASE_URL) ||
-    url.startsWith(constants.BNF_ARK_BASE_URL) ||
-    url.startsWith(constants.BNF_ARK_BASE_ID))
-  {
+  if(utils.isBnfLink(url)) {
     return 'doc-subject';
   }
-  return 'doc-generic';
+  return 'doc-literal';
 }
 
 export default Ember.Helper.helper(getLinkType);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/corpus-common-addon/addon/styles/addon.scss	Sun Mar 06 00:29:01 2016 +0100
@@ -0,0 +1,14 @@
+.doc-supsub {
+    display: inline-block;
+    sup,
+    sub {
+        position: relative;
+        display: block;
+        font-size: .5em;
+        line-height: 1.2;
+    }
+
+    sub {
+        top: .3em;
+    }
+}
--- a/common/corpus-common-addon/addon/templates/components/doc-generic.hbs	Sat Mar 05 08:49:17 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-{{url}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/corpus-common-addon/addon/templates/components/doc-literal.hbs	Sun Mar 06 00:29:01 2016 +0100
@@ -0,0 +1,1 @@
+{{#if value}}{{value}}{{/if}}<span class="doc-supsub">{{#if lang}}<sup>{{lang}}</sup>{{/if}}{{#if datatype}}<sub>{{datatype}}</sub>{{/if}}</span>
--- a/common/corpus-common-addon/addon/utils/utils.js	Sat Mar 05 08:49:17 2016 +0100
+++ b/common/corpus-common-addon/addon/utils/utils.js	Sun Mar 06 00:29:01 2016 +0100
@@ -1,21 +1,25 @@
 import * as constants from 'corpus-common-addon/utils/constants';
 import _ from "lodash/lodash";
 
+export function isLexvoLink(s) {
+  return s && typeof s === 'string' && s.startsWith(constants.LEXVO_BASE_URL);
+};
+
 export function isBnfLink(s) {
-  return s && (s.startsWith(constants.BNF_BASE_URL) || s.startsWith(constants.BNF_ARK_BASE_URL) || s.startsWith(constants.BNF_ARK_BASE_ID));
+  return s && typeof s === 'string' && (s.startsWith(constants.BNF_BASE_URL) || s.startsWith(constants.BNF_ARK_BASE_URL) || s.startsWith(constants.BNF_ARK_BASE_ID));
 };
 
 export function isArkBnfLink(s) {
-  return s && (s.startsWith(constants.BNF_BASE_URL+constants.BNF_ARK_BASE_ID) || s.startsWith(constants.BNF_ARK_BASE_URL+constants.BNF_ARK_BASE_ID));
+  return s && typeof s === 'string' && (s.startsWith(constants.BNF_BASE_URL+constants.BNF_ARK_BASE_ID) || s.startsWith(constants.BNF_ARK_BASE_URL+constants.BNF_ARK_BASE_ID));
 };
 
 export function switchArkBnfLink(s) {
   if(!s) {
     return s;
   }
-  if(s.startsWith(constants.BNF_BASE_URL+constants.BNF_ARK_BASE_ID)) {
+  if(typeof s === 'string' && s.startsWith(constants.BNF_BASE_URL+constants.BNF_ARK_BASE_ID)) {
     return constants.BNF_ARK_BASE_URL + s.slice(constants.BNF_BASE_URL.length);
-  } else if (s.startsWith(constants.BNF_ARK_BASE_URL+constants.BNF_ARK_BASE_ID)) {
+  } else if (typeof s === 'string' && s.startsWith(constants.BNF_ARK_BASE_URL+constants.BNF_ARK_BASE_ID)) {
     return constants.BNF_BASE_URL + s.slice(constants.BNF_ARK_BASE_URL.length);
   } else {
     return s;
--- a/common/corpus-common-addon/app/components/doc-generic.js	Sat Mar 05 08:49:17 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-export { default } from 'corpus-common-addon/components/doc-generic';
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/corpus-common-addon/app/components/doc-literal.js	Sun Mar 06 00:29:01 2016 +0100
@@ -0,0 +1,1 @@
+export { default } from 'corpus-common-addon/components/doc-literal';
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/corpus-common-addon/app/styles/addon.scss	Sun Mar 06 00:29:01 2016 +0100
@@ -0,0 +1,1 @@
+@import 'addon/styles/addon.scss';
--- a/common/corpus-common-addon/tests/integration/components/doc-generic-test.js	Sat Mar 05 08:49:17 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('doc-generic', 'Integration | Component | doc generic', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });"
-
-  this.render(hbs`{{doc-generic}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:"
-  this.render(hbs`
-    {{#doc-generic}}
-      template block text
-    {{/doc-generic}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/corpus-common-addon/tests/integration/components/doc-literal-test.js	Sun Mar 06 00:29:01 2016 +0100
@@ -0,0 +1,24 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('doc-literal', 'Integration | Component | doc generic', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });"
+
+  this.render(hbs`{{doc-literal}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:"
+  this.render(hbs`
+    {{#doc-literal}}
+      template block text
+    {{/doc-literal}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});
--- a/server/bo_client/server/fixtures/documents.js	Sat Mar 05 08:49:17 2016 +0100
+++ b/server/bo_client/server/fixtures/documents.js	Sun Mar 06 00:29:01 2016 +0100
@@ -60,10 +60,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav": {
@@ -101,7 +109,7 @@
     "uri": "http://corpusdelaparole.huma-num.fr/corpus/res/crdo-09-DUN_SOUND",
     "title": "ALLOc : Dun : Parabole",
     "language": "http://lexvo.org/id/iso639-3/oci",
-    "modified": "2010-10-25T18:18:23+02:00",
+    "modified": "2016-03-04T21:54:30Z",
     "publishers": [
       "Équipe de Recherche en Syntaxe et Sémantique",
       "Bases, corpus, langage"
@@ -123,12 +131,12 @@
         "role": "http://www.language-archives.org/OLAC/1.1/depositor"
       },
       {
-        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "name": "Bases, corpus, langage",
         "url": null,
         "role": "http://www.language-archives.org/OLAC/1.1/editor"
       },
       {
-        "name": "Bases, corpus, langage",
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
         "url": null,
         "role": "http://www.language-archives.org/OLAC/1.1/editor"
       },
@@ -157,10 +165,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
-      "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://data.bnf.fr/ark:/12148/cb119766112"
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144793_09-DUN_22km.wav": {
@@ -254,10 +270,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144794_09-LABASTIDE-DE-LORDAT_22km.wav": {
@@ -351,10 +375,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144795_09-LOUBENS_22km.wav": {
@@ -448,10 +480,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144796_09-MERENS-LES-VALS_22km.wav": {
@@ -545,10 +585,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144797_09-MONTSEGUR_22km.wav": {
@@ -632,10 +680,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144798_09-PRAYOLS_22km.wav": {
@@ -729,10 +785,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144799_09-QUERIGUT_22km.wav": {
@@ -826,10 +890,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144800_09-SIGUER_22km.wav": {
@@ -923,10 +995,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144801_09-ST-MARTIN-D-OYDES_22km.wav": {
@@ -1020,10 +1100,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144802_09-SURBA_22km.wav": {
@@ -1117,10 +1205,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144803_11-GRAMAZIE_22km.wav": {
@@ -1214,10 +1310,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144804_11-MOLLEVILLE_22km.wav": {
@@ -1311,10 +1415,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144805_11-PUIVERT_22km.wav": {
@@ -1408,10 +1520,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144806_11-RIBOUISSE_22km.wav": {
@@ -1505,7 +1625,11 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112"
     ],
@@ -1601,10 +1725,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144808_11-ST-MARTIN-LALANDE_22km.wav": {
@@ -1698,10 +1830,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144810_12-AUZITS_22km.wav": {
@@ -1795,10 +1935,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144809_12-JOUELS_22km.wav": {
@@ -1892,10 +2040,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144811_12-LACASSAGNE_22km.wav": {
@@ -1989,10 +2145,18 @@
       "http://ark.bnf.fr/ark:/12148/cb11946662b",
       "http://ark.bnf.fr/ark:/12148/cb11965628b",
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
       "http://ark.bnf.fr/ark:/12148/cb11970755h",
       "http://ark.bnf.fr/ark:/12148/cb119766112",
-      "translating_and_interpreting"
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144812_12-LANUEJOULS_22km.wav": {
@@ -2078,9 +2242,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144813_12-MARNAC1LEX_22km.wav": {
@@ -2159,9 +2331,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144814_12-MARNAC2LEX_22km.wav": {
@@ -2240,9 +2420,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144815_12-MARNAC3LEX_22km.wav": {
@@ -2321,9 +2509,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144816_12-MARNAC4MORPHO_22km.wav": {
@@ -2402,9 +2598,17 @@
       }
     ],
     "subjects": [
-      "morphology",
+      {
+        "value": "morphology",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144817_12-MARNAC5MORPHO_22km.wav": {
@@ -2503,9 +2707,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144818_12-MAYRAN1LEX_22km.wav": {
@@ -2604,9 +2816,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144819_12-MAYRAN2LEX_22km.wav": {
@@ -2705,9 +2925,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144820_12-MAYRAN3LEX_22km.wav": {
@@ -2806,9 +3034,17 @@
       }
     ],
     "subjects": [
-      "lexicography",
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
       "http://lexvo.org/id/iso639-3/oci",
-      "Occitan/Languedocien"
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      }
     ],
     "mediaArray": {
       "http://cocoon.huma-num.fr/data/archi/144821_12-MAYRAN4LEX_22km.wav": {
--- a/server/src/app/Libraries/Utils.php	Sat Mar 05 08:49:17 2016 +0100
+++ b/server/src/app/Libraries/Utils.php	Sun Mar 06 00:29:01 2016 +0100
@@ -98,7 +98,16 @@
             return $val;
         }
         if($val instanceof Literal) {
-            return $val->getValue();
+            if(empty($val->getLang()) && empty($val->getDatatypeURI())) {
+                return $val->getValue();
+            }
+            else {
+                return [
+                    'value'=> $val->getValue(),
+                    'datatype'=> $val->getDatatypeURI(),
+                    'lang'=> $val->getLang()
+                ];
+            }
         }
         elseif ($val instanceof Resource) {
             return $val->getUri();
--- a/server/src/app/Models/Document.php	Sat Mar 05 08:49:17 2016 +0100
+++ b/server/src/app/Models/Document.php	Sun Mar 06 00:29:01 2016 +0100
@@ -349,11 +349,13 @@
         //put new
         foreach ($subjects as $newSubject) {
             $value = null;
-            if(filter_var($newSubject, FILTER_VALIDATE_URL)) {
+            if(is_string($newSubject) && filter_var($newSubject, FILTER_VALIDATE_URL)) {
                 $value = new Resource($newSubject);
             }
-            else {
-                $value = new Literal($newSubject, "fr", null);
+            elseif (is_string($newSubject)) {
+                $value = new Literal($newSubject, null, null);
+            } elseif(is_array($newSubject)) {
+                $value = new Literal(isset($newSubject['value'])?$newSubject['value']:null, isset($newSubject['lang'])?$newSubject['lang']:null, isset($newSubject['datatype'])?$newSubject['value']:null);
             }
 
             $this->getProvidedCHO()->add('http://purl.org/dc/elements/1.1/subject', $value);