Skip to content

Instantly share code, notes, and snippets.

@cKlee
Created August 28, 2014 08:14
Show Gist options
  • Save cKlee/a9a4cb7a883132d3d743 to your computer and use it in GitHub Desktop.
Save cKlee/a9a4cb7a883132d3d743 to your computer and use it in GitHub Desktop.
4024/7120
"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;
}
<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