Skip to content

Commit e171e09

Browse files
committed
Add getCreators method to Record
1 parent 6752fa1 commit e171e09

File tree

7 files changed

+314
-2
lines changed

7 files changed

+314
-2
lines changed

src/BibliographicRecord.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Scriptotek\Marc\Exceptions\UnknownRecordType;
66
use Scriptotek\Marc\Fields\Isbn;
7+
use Scriptotek\Marc\Fields\Person;
78
use Scriptotek\Marc\Fields\Subject;
89
use Scriptotek\Marc\Fields\SubjectInterface;
910
use Scriptotek\Marc\Fields\Title;
@@ -13,7 +14,7 @@ class BibliographicRecord extends Record
1314
/**
1415
* @var array List of properties to be included when serializing the record using the `toArray()` method.
1516
*/
16-
public $properties = ['id', 'isbns', 'title', 'subjects'];
17+
public $properties = ['id', 'isbns', 'title', 'subjects', 'creators'];
1718

1819
/**
1920
* Get the descriptive cataloging form value from LDR/18. Returns any of
@@ -78,4 +79,20 @@ public function getSubjects($vocabulary = null, $tag = null)
7879
return $a && $b;
7980
}));
8081
}
82+
83+
/**
84+
* Get an array of the 100 and 700 fields as `Person` objects, optionally
85+
* filtered by tag.
86+
*
87+
* @param string|string[] $tag
88+
* @return Person[]
89+
*/
90+
public function getCreators($tag = null)
91+
{
92+
$tag = is_null($tag) ? [] : (is_array($tag) ? $tag : [$tag]);
93+
94+
return array_values(array_filter(Person::get($this), function (Person $person) use ($tag) {
95+
return empty($tag) || in_array($person->getType(), $tag);
96+
}));
97+
}
8198
}

src/Fields/Field.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,16 @@ public function __call($name, $args)
4747

4848
public function __get($key)
4949
{
50-
$method = 'get' . ucfirst($key);
50+
// Convert key from underscore_case to camelCase.
51+
$key_uc = preg_replace_callback(
52+
'/_([a-z])/',
53+
function($matches) {
54+
return strtoupper($matches[1]);
55+
},
56+
$key
57+
);
58+
59+
$method = 'get' . ucfirst($key_uc);
5160
if (method_exists($this, $method)) {
5261
return call_user_func([$this, $method]);
5362
}

src/Fields/Person.php

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
3+
namespace Scriptotek\Marc\Fields;
4+
5+
use Scriptotek\Marc\Record;
6+
7+
class Person extends Field implements FieldInterface
8+
{
9+
/**
10+
* @var array List of properties to be included when serializing the record using the `toArray()` method.
11+
*/
12+
public $properties = ['type', 'vocabulary', 'name', 'titulation', 'dates', 'id', 'relator_term', 'relationship'];
13+
14+
public static $glue = ' : ';
15+
public static $termComponentCodes = ['a', 'b', 'x', 'y', 'z'];
16+
17+
const MAIN_ENTRY= '100';
18+
const ADDED_ENTRY = '700';
19+
20+
public static function get(Record $record)
21+
{
22+
$objs = [];
23+
24+
foreach (parent::makeFieldObjects($record, Person::MAIN_ENTRY) as $obj) {
25+
$objs[] = $obj;
26+
}
27+
28+
foreach (parent::makeFieldObjects($record, Person::ADDED_ENTRY) as $obj) {
29+
$objs[] = $obj;
30+
}
31+
32+
return $objs;
33+
}
34+
35+
public function getType()
36+
{
37+
return $this->getTag();
38+
}
39+
40+
/**
41+
* Return the Authority record control number
42+
*/
43+
public function getId()
44+
{
45+
// preg_match('/^\((.+)\)(.+)$/', $sf0->getData(), $matches);
46+
return $this->sf('0');
47+
}
48+
49+
public function getName()
50+
{
51+
return $this->sf('a');
52+
}
53+
54+
public function getTitulation()
55+
{
56+
return $this->sf('c');
57+
}
58+
59+
public function getDates()
60+
{
61+
return $this->sf('d');
62+
}
63+
64+
public function getRelatorTerm()
65+
{
66+
return $this->sf('e');
67+
}
68+
69+
public function getRelationship()
70+
{
71+
return $this->sf('4');
72+
}
73+
74+
public function __toString()
75+
{
76+
if ($this->getDates()) {
77+
return sprintf('%s (%s)', $this->getName(), $this->getDates());
78+
}
79+
80+
return $this->getName();
81+
}
82+
}

tests/data/examples/bibliographic.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22
"id": "999401461934702201",
33
"isbns": [],
44
"title": "The eightfold way",
5+
"creators": [
6+
{
7+
"type": "100",
8+
"name": "Gell-Mann, Murray",
9+
"id": "(NO-TrBIB)x90569757"
10+
},
11+
{
12+
"type": "700",
13+
"name": "Ne'eman, Yuval",
14+
"id": "(NO-TrBIB)x90061707"
15+
}
16+
],
517
"subjects": [
618
{
719
"type": "650",

tests/data/examples/bibliographic2.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@
44
"0471616389"
55
],
66
"title": "Acousto-optic devices : principles, design, and applications",
7+
"creators": [
8+
{
9+
"type": "100",
10+
"name": "Xu, Jieping",
11+
"id": "(NO-TrBIB)90625942"
12+
},
13+
{
14+
"type": "700",
15+
"name": "Stroud, Robert",
16+
"id": "(NO-TrBIB)90625943"
17+
}
18+
],
719
"subjects": [
820
{
921
"type": "650",
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
"id": "990929710914702204",
3+
"isbns": [
4+
"9788202308414"
5+
],
6+
"title": "Å nærme seg en katt",
7+
"subjects": [
8+
{
9+
"type": "653",
10+
"term": "regler"
11+
},
12+
{
13+
"type": "653",
14+
"term": "dikt"
15+
},
16+
{
17+
"type": "653",
18+
"term": "katter"
19+
}
20+
],
21+
"creators": [
22+
{
23+
"type": "100",
24+
"name": "Eliot, T.S.",
25+
"dates": "1888-1965",
26+
"id": "(NO-TrBIB)90052479"
27+
},
28+
{
29+
"type": "700",
30+
"name": "Brekke, Paal,",
31+
"dates": "1923-1993,",
32+
"relator_term": "overs.",
33+
"id": "(NO-TrBIB)90079454",
34+
"relationship": "trl"
35+
},
36+
{
37+
"type": "700",
38+
"name": "Scheffler, Axel,",
39+
"dates": "1957-",
40+
"relator_term": "illustr.",
41+
"id": "(NO-TrBIB)90983587"
42+
}
43+
]
44+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<record xmlns="">
3+
<leader>01420cam a2200397 c 4500</leader>
4+
<controlfield tag="001">990929710914702204</controlfield>
5+
<controlfield tag="005">20160622155135.0</controlfield>
6+
<controlfield tag="007">ta</controlfield>
7+
<controlfield tag="007">cr||||||||||||</controlfield>
8+
<controlfield tag="008">130618s2009 no#||||j |||||000|p|nob|</controlfield>
9+
<datafield tag="020" ind1=" " ind2=" ">
10+
<subfield code="a">9788202308414</subfield>
11+
<subfield code="q">ib.</subfield>
12+
<subfield code="c">Nkr 279.00</subfield>
13+
</datafield>
14+
<datafield tag="035" ind1=" " ind2=" ">
15+
<subfield code="a">092971091-47bibsys_network</subfield>
16+
</datafield>
17+
<datafield tag="035" ind1=" " ind2=" ">
18+
<subfield code="a">(NO-TrBIB)092971091</subfield>
19+
</datafield>
20+
<datafield tag="035" ind1=" " ind2=" ">
21+
<subfield code="a">(NO-OsBA)0249171</subfield>
22+
</datafield>
23+
<datafield tag="035" ind1=" " ind2=" ">
24+
<subfield code="a">(NO-OsBA)0249171</subfield>
25+
</datafield>
26+
<datafield tag="035" ind1=" " ind2=" ">
27+
<subfield code="a">(NO-TrBIB)122619072</subfield>
28+
</datafield>
29+
<datafield tag="035" ind1=" " ind2=" ">
30+
<subfield code="a">(EXLNZ-47BIBSYS_NETWORK)990929710914702201</subfield>
31+
</datafield>
32+
<datafield tag="040" ind1=" " ind2=" ">
33+
<subfield code="a">NO-OsNB</subfield>
34+
<subfield code="b">nob</subfield>
35+
<subfield code="e">katreg</subfield>
36+
</datafield>
37+
<datafield tag="041" ind1="1" ind2=" ">
38+
<subfield code="h">eng</subfield>
39+
</datafield>
40+
<datafield tag="042" ind1=" " ind2=" ">
41+
<subfield code="a">norbibl</subfield>
42+
</datafield>
43+
<datafield tag="044" ind1=" " ind2=" ">
44+
<subfield code="c">no</subfield>
45+
</datafield>
46+
<datafield tag="080" ind1=" " ind2=" ">
47+
<subfield code="a">820</subfield>
48+
</datafield>
49+
<datafield tag="082" ind1="7" ind2="4">
50+
<subfield code="a">821</subfield>
51+
<subfield code="q">NO-OsNB</subfield>
52+
<subfield code="2">5/nor</subfield>
53+
</datafield>
54+
<datafield tag="084" ind1=" " ind2=" ">
55+
<subfield code="a">S 13c/US</subfield>
56+
<subfield code="2">oosk</subfield>
57+
</datafield>
58+
<datafield tag="092" ind1=" " ind2=" ">
59+
<subfield code="a">820</subfield>
60+
<subfield code="q">NoOU</subfield>
61+
<subfield code="9">LOCAL</subfield>
62+
</datafield>
63+
<datafield tag="100" ind1="1" ind2=" ">
64+
<subfield code="a">Eliot, T.S.</subfield>
65+
<subfield code="d">1888-1965</subfield>
66+
<subfield code="0">(NO-TrBIB)90052479</subfield>
67+
</datafield>
68+
<datafield tag="245" ind1="1" ind2="0">
69+
<subfield code="a">Å nærme seg en katt</subfield>
70+
<subfield code="c">T.S. Eliot ; gjendiktet av Paal Brekke ; illustrert av Axel Scheffler</subfield>
71+
</datafield>
72+
<datafield tag="246" ind1="1" ind2=" ">
73+
<subfield code="a">Old Possum's book of practical cats</subfield>
74+
<subfield code="i">Originaltittel</subfield>
75+
</datafield>
76+
<datafield tag="260" ind1=" " ind2=" ">
77+
<subfield code="a">[Oslo]</subfield>
78+
<subfield code="b">Cappelen Damm</subfield>
79+
<subfield code="c">2009</subfield>
80+
</datafield>
81+
<datafield tag="300" ind1=" " ind2=" ">
82+
<subfield code="a">64 s.</subfield>
83+
<subfield code="b">ill.</subfield>
84+
</datafield>
85+
<datafield tag="500" ind1=" " ind2=" ">
86+
<subfield code="a">1. norske utg. Oslo : Grøndahl, 1985</subfield>
87+
</datafield>
88+
<datafield tag="653" ind1=" " ind2=" ">
89+
<subfield code="a">regler</subfield>
90+
<subfield code="a">dikt</subfield>
91+
<subfield code="a">katter</subfield>
92+
</datafield>
93+
<datafield tag="700" ind1="1" ind2=" ">
94+
<subfield code="a">Brekke, Paal,</subfield>
95+
<subfield code="d">1923-1993,</subfield>
96+
<subfield code="e">overs.</subfield>
97+
<subfield code="4">trl</subfield>
98+
<subfield code="0">(NO-TrBIB)90079454</subfield>
99+
</datafield>
100+
<datafield tag="700" ind1="1" ind2=" ">
101+
<subfield code="a">Scheffler, Axel,</subfield>
102+
<subfield code="d">1957-</subfield>
103+
<subfield code="e">illustr.</subfield>
104+
<subfield code="0">(NO-TrBIB)90983587</subfield>
105+
</datafield>
106+
<datafield tag="856" ind1="4" ind2="2">
107+
<subfield code="3">Beskrivelse fra forlaget (kort)</subfield>
108+
<subfield code="u">http://content.bibsys.no/content/?type=descr_publ_brief&amp;isbn=8202308410</subfield>
109+
</datafield>
110+
<datafield tag="856" ind1="4" ind2="2">
111+
<subfield code="3">Beskrivelse fra Forlagssentralen</subfield>
112+
<subfield code="u">http://content.bibsys.no/content/?type=descr_forlagssentr&amp;isbn=8202308410</subfield>
113+
</datafield>
114+
<datafield tag="901" ind1=" " ind2=" ">
115+
<subfield code="a">90</subfield>
116+
</datafield>
117+
<datafield tag="913" ind1=" " ind2=" ">
118+
<subfield code="a">Norbok</subfield>
119+
<subfield code="b">NB</subfield>
120+
</datafield>
121+
<datafield tag="AVA" ind1=" " ind2=" ">
122+
<subfield code="0">990929710914702204</subfield>
123+
<subfield code="8">22110775660002204</subfield>
124+
<subfield code="a">47BIBSYS_UBO</subfield>
125+
<subfield code="b">1030300</subfield>
126+
<subfield code="c">UHS Mag312</subfield>
127+
<subfield code="d">820 Eli:Old</subfield>
128+
<subfield code="e">available</subfield>
129+
<subfield code="f">1</subfield>
130+
<subfield code="g">0</subfield>
131+
<subfield code="j">k00025</subfield>
132+
<subfield code="k">8</subfield>
133+
<subfield code="p">1</subfield>
134+
<subfield code="q">UiO HumSam-biblioteket</subfield>
135+
</datafield>
136+
</record>

0 commit comments

Comments
 (0)