Created
August 28, 2014 08:14
-
-
Save cKlee/a9a4cb7a883132d3d743 to your computer and use it in GitHub Desktop.
4024/7120
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
// | |
// @param string field Field content in PICA+ without field tag | |
// | |
function conv(field) | |
{ | |
var part = field.split('$0 '); | |
var subfields; | |
var s; | |
var o; | |
var pica = ''; | |
// for each part | |
for(var i = 0; i < part.length; i++) | |
{ | |
subfields = new Array(); // clear subfields | |
//split on subfields | |
subfields = part[i].split('$'); | |
o = new Array(); | |
// for each subfield | |
for(s = 0; s < subfields.length; s++) | |
{ | |
switch(subfields[s].substring(0,1)) // switch first character | |
{ | |
case 'd': | |
o['0'] = {tag:'d',val: convVolume(subfields[s].substring(1))}; | |
break; | |
case 'e': | |
o = convIssue(subfields[s].substring(1),true,o); | |
break; | |
case 'b': | |
o['2'] = {tag:'b',val: convVal(subfields[s].substring(1))}; | |
break; | |
case 'c': | |
o['3'] = {tag:'c',val: convVal(subfields[s].substring(1))}; | |
break; | |
case 'j': | |
o['4'] = {tag:'j',val: convYear(subfields[s].substring(1),true)}; | |
break; | |
case 'n': | |
o['5'] = {tag:'n',val: convVolume(subfields[s].substring(1),false)}; | |
break; | |
case 'o': | |
o = convIssue(subfields[s].substring(1), false,o); | |
break; | |
case 'l': | |
o['7'] = {tag:'l', val: convVal(subfields[s].substring(1))}; | |
break; | |
case 'm': | |
o['8'] = {tag:'m',val: convVal(subfields[s].substring(1))}; | |
break; | |
case 'k': | |
o['9'] = {tag:'k',val: convYear(subfields[s].substring(1),false)}; | |
break; | |
case '6': | |
o['-'] = {tag:'6',val:''}; | |
break; | |
} | |
} | |
if('' != pica) | |
{ | |
pica += '$0 '; | |
} | |
pica += objectToPica(o); | |
} | |
return pica; | |
} | |
function convIssue(value,start,o) | |
{ | |
o = typeof o !== 'undefined' ? o : new Array(); | |
start = typeof start !== 'undefined' ? start : true; | |
var t = 'e'; | |
var i = 1; | |
var m; | |
var ind; | |
var re; | |
var u; | |
var arr = new Array('b','e'); | |
if(!start) | |
{ | |
t = 'o'; | |
i = 6; | |
} | |
value = stripSlashes(value); | |
if(!value.match(/[^\d]/)) // only digits | |
{ | |
o[i] = {tag:t,val:value}; // shortcut simple issue e.g. 1 | |
return o; | |
} | |
if(value.match(/[^\da-zA-Z\/äÄ\-.]/)) // something other than digit, apha, slash, hyphen, dot or äÄ | |
{ | |
o[i] = {tag:t,val:''}; | |
return o; | |
} | |
if(value.match(/^feb$/i)) // avoidng problems later | |
{ | |
o[i] = {tag:t,val:'2'}; | |
return o; | |
} | |
for(u = 0;u<arr.length;u++) | |
{ | |
re = new RegExp('(?:^|[\\w\/])('+arr[u]+')(?:\\d|$)','i'); | |
m = re.exec(value); | |
if(m) // is bB/eE present? | |
{ | |
ind = value.indexOf(m[1]); | |
if(value.length -1 === ind) // end of string: just b or acb 12b | |
{ | |
o[i] = {tag:t,val:value.substring(0,value.length-1)}; | |
return o; | |
} | |
if(0 === ind) // is b first char? | |
{ | |
if(start) | |
{ | |
o[4] = {tag:'j',val:convYear(value.substring(1),start)}; | |
return o; | |
} | |
o[9] = {tag:'k',val:convYear(value.substring(1),start)}; | |
return o; | |
} | |
if(start) | |
{ | |
o[4] = {tag:'j',val:convYear(value.substring(ind+1),start)}; | |
} | |
o[9] = {tag:'k',val:convYear(value.substring(ind+1),start)}; | |
value = stripSlashes(value.substring(0,ind)); // new value | |
} | |
} | |
// now some oddities ... | |
if(value.match(/^\d\d\d\d\/\d\d$/)) // 1998/99 must be wrong subfield | |
{ | |
if(start) | |
{ | |
o[4] = {tag:'j',val:convYear(value,start)}; | |
return o; | |
} | |
o[9] = {tag:'k',val:convYear(value,start)}; | |
return o; | |
} | |
if(value.match(/^[a-zA-Z]\d/)) // first char alpha, second digit | |
{ | |
value = value.substring(1); | |
} | |
if(value.match(/\d[a-zA-Z]$/)) // last char alpha, second last digit | |
{ | |
value = value.substring(0,value.length-1); | |
} | |
// back by regular ... | |
var posi = value.indexOf('/'); // check broken issue | |
if (-1 < posi) { // broken issue yes! | |
if(start) | |
{ | |
o[i] = {tag:t,val:convNames(value.substring(0,posi))}; | |
return o; | |
} | |
o[i] = {tag:t,val:convNames(value.substring(posi+1))}; | |
return o; | |
} | |
o[i] = {tag:t,val:convNames(value)}; | |
return o; | |
} | |
function convNames(v) | |
{ | |
var names = [ | |
{name:'jan', value:'1'}, | |
{name:'feb', value:'2'}, | |
{name:'mär', value:'3'}, | |
{name:'apr', value: '4'}, | |
{name:'mai', value: '5'}, | |
{name:'jun', value: '6'}, | |
{name:'jul', value: '7'}, | |
{name:'aug', value: '8'}, | |
{name:'sep', value: '9'}, | |
{name:'okt', value: '10'}, | |
{name:'nov', value: '11'}, | |
{name:'dez', value: '12'}, | |
{name:'mrz', value: '3'} | |
]; | |
var x; | |
var re; | |
for(x = 0; x < names.length; x++) | |
{ | |
re = new RegExp('^'+names[x].name+'','i'); | |
if(re.exec(v)) | |
{ | |
return v = names[x].value; // REPLACEMENT | |
} | |
} | |
if(v.match(/[^\d]/)) | |
{ | |
return ''; | |
} | |
return v; | |
} | |
// | |
// @param {String} value end group year value | |
// @param {Boolean} start false activates end year | |
// | |
function convYear(value,start) | |
{ | |
if(!value.match(/[\/\d]{4}/)) // junky content 190Q | |
{ | |
return ''; | |
} | |
value = stripSlashes(value); | |
var len = value.length; | |
if(4 > len) // 190 | |
{ | |
return ''; | |
} | |
if(value.match(/^\d\d\d\d$/)) // 1900 | |
{ | |
return value; | |
} | |
if(!value.match(/\//)) // 19000 | |
{ | |
return value.substr(0,4); | |
} | |
if(len < 7 || len > 9 || len == 8) // 1900/0 1900/19011 1900/199 | |
{ | |
return value.substr(0,4); | |
} | |
if(value.indexOf('/') !== value.lastIndexOf('/')) // 1999//0 | |
{ | |
return value.substr(0,4); | |
} | |
start = typeof start !== 'undefined' ? start : true; | |
var p = value.split(/\//); | |
if(true === start) | |
{ | |
return p[0]; | |
} | |
if(p[1].length == 4) | |
{ | |
return p[1]; | |
} | |
// last year | |
var lastYear = p[1]; | |
// only the decade given | |
if(lastYear.length == 2) | |
{ | |
var firstYear = p[0]; // full first year | |
lastYear = value.substr(0,2) + '' + lastYear; // full assumed last year | |
if (firstYear - lastYear < 0) // first year is smaller than last year | |
{ | |
return lastYear; | |
} | |
else if (lastYear - firstYear < 0) { // first year is greater than last year. That's bad! | |
var century = value.substr(0,2) * 1.0 + 1; // calculating the right century | |
return century + '' + p[1]; | |
} | |
} | |
return lastYear; | |
} | |
function convVolume(value, start) | |
{ | |
if(value.match(/[^0-9\/\-]/g)) // junky content | |
{ | |
return ''; | |
} | |
start = typeof start !== 'undefined' ? start : true; | |
if(value.length < 2) return value; // shortcut simple volume | |
var posi = value.indexOf('/'); // check broken volume | |
if (-1 < posi) { // broken volume | |
if(start) | |
{ | |
// return first volume | |
return value.substring(0,posi); | |
} | |
// return last volume | |
return value.substr(posi+1); | |
} | |
posi = value.indexOf('-'); // check volume range | |
if (-1 < posi) { // volume range | |
if(start) | |
{ | |
// return first volume | |
return value.substring(0,posi); | |
} | |
// return last volume | |
return value.substr(posi+1); | |
} | |
return value; | |
} | |
// strips slashes at beginning and end of string | |
// @param {String} v string to analyse | |
// @return {String} v string without slashes | |
function stripSlashes(v) | |
{ | |
if('/' == v.substr(0,1)) | |
{ | |
v = v.substr(1,v.length -1); | |
} | |
if('/' == v.substr(v.length -1,1)) | |
{ | |
v = v.substr(0,v.length -1); | |
} | |
return v; | |
} | |
function objectToPica(o) | |
{ | |
var x = 0; | |
var pica = ""; | |
for(x;x<o.length;x++) | |
{ | |
if(o[x] != undefined) | |
{ | |
if(o[x].val != '') | |
{ | |
pica += '$' + o[x].tag + o[x].val; | |
} | |
} | |
} | |
if(o['-'] != undefined) | |
{ | |
pica += "$6"; | |
} | |
return pica; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html><head><title>Test</title> | |
<script src="7120_conv.js"></script> | |
</head><body><p> | |
<script type="text/javascript"> | |
function o(v,s) | |
{ | |
document.write(v + ": " +convYear(v,s)+"<br>"); | |
} | |
document.write("<hr>JAHR<br>"); | |
o("190Q"); | |
o("190"); | |
o("1900"); | |
o("19000"); | |
o("1900/0"); | |
o("1900/19011"); | |
o("1900/199"); | |
o("1900/"); | |
o("1999//0"); | |
o("1999/00",true); | |
o("1999/00",false); | |
o("1999/2000",false); | |
o("/2000/"); | |
o("2000/"); | |
o("/2000"); | |
function b(v,s) | |
{ | |
document.write(v + ": " +convVolume(v,s)+"<br>"); | |
} | |
document.write("<hr>BAND<br>"); | |
b("1"); | |
b("1/21"); | |
b("1/21",false); | |
function h(v,e,s) | |
{ | |
var con = convIssue(v,s); | |
if(con[1] != undefined) con = con[1]; | |
if(con[6] != undefined) con = con[6]; | |
if(con[4] != undefined) con = con[4]; | |
if(con[9] != undefined) con = con[9]; | |
if(e != con.val) | |
{ | |
if(con.val == "") con.val = "EMPTY"; | |
document.write(v + ": <b>" +con.val+"</b><br>"); | |
} | |
else | |
{ | |
if(con.val == "") con.val = "empty"; | |
document.write(v + ": " +con.val+"<br>"); | |
} | |
} | |
document.write("<hr>HEFT<br>"); | |
h("1","1"); | |
h("1123456","1123456"); | |
h("1123,456",""); | |
h("Julib1973","7"); | |
h("b1930","1930"); | |
h("B1930","1930"); | |
h("e1930","1930"); | |
h("E1930","1930"); | |
h("1E1930","1"); | |
h("1/E1930","1"); | |
h("1b","1"); | |
h("1a","1"); | |
h("a1","1"); | |
h("a1c","1"); | |
h("1998/99","1998"); | |
h("1998/99","1999",false); | |
h("Febr.","2"); | |
h("Febr","2"); | |
h("Feb","2"); | |
h("Sonderheft",""); | |
function p(v,e) | |
{ | |
var con = conv(v); | |
if(e != con) | |
{ | |
if(con == "") con = "EMPTY"; | |
document.write(v + ": <b>" +con+"</b><br>"); | |
} | |
else | |
{ | |
if(con == "") con = "empty"; | |
document.write(v + ": " +con+"<br>"); | |
} | |
} | |
p("$d1/3$e1/3$j1998/99$n4/5$oDez.$k2000/01$0 $d6$e6$j2002$6"); | |
</script> | |
</p></body></html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment