Ticket #1825: Mods.js.diff

File Mods.js.diff, 9.8 KB (added by karnesky, 5 years ago)

Revised the patch with additional fixes

  • MODS.js

     
    22        "translatorID":"0e2235e7-babf-413c-9acf-f27cce5f059c", 
    33        "translatorType":3, 
    44        "label":"MODS", 
    5         "creator":"Simon Kornblith", 
     5        "creator":"Simon Kornblith and Richard Karnesky", 
    66        "target":"xml", 
    77        "minVersion":"2.1b3", 
    88        "maxVersion":"", 
     
    2121        return name.uri == "http://www.loc.gov/mods/v3" && (name.localName == "modsCollection" || name.localName == "mods"); 
    2222} 
    2323 
    24 var partialItemTypes = ["bookSection", "journalArticle", "magazineArticle", "newspaperArticle"]; 
     24var partialItemTypes = ["bookSection", "journalArticle", "magazineArticle", "newspaperArticle", "conferencePaper", "encyclopediaArticle", "dictionaryEntry"]; 
    2525 
    2626function doExport() { 
    2727        Zotero.setCharacterSet("utf-8"); 
     
    3939                if(item.title) { 
    4040                        mods.titleInfo.title = item.title; 
    4141                } 
     42                if(item.shortTitle) { 
     43                        mods.titleInfo += <titleInfo type="abbreviated"><title>{item.shortTitle}</title></titleInfo>; 
     44                } 
    4245                 
    4346                // XML tag typeOfResource/genre; object field type 
     47                //  
     48                // The exact marcGenre of a book section can, perhaps, be debated; 
     49                // But it should have 'book' as the host's genre. 
    4450                var modsType, marcGenre; 
    45                 if(item.itemType == "book" || item.itemType == "bookSection") { 
     51                if(item.itemType == "book") { 
    4652                        modsType = "text"; 
    4753                        marcGenre = "book"; 
    48                 } else if(item.itemType == "journalArticle" || item.itemType == "magazineArticle") { 
     54                } else if(item.itemType == "journalArticle" || item.itemType == "magazineArticle" || item.itemType == "conferencePaper" || item.itemType == "encyclopediaArticle" || item.itemType == "newspaperArticle" || item.itemType == "bookSection") { 
    4955                        modsType = "text"; 
    50                         marcGenre = "periodical"; 
    51                 } else if(item.itemType == "newspaperArticle") { 
    52                         modsType = "text"; 
    53                         marcGenre = "newspaper"; 
     56                        marcGenre = "article"; 
    5457                } else if(item.itemType == "thesis") { 
    5558                        modsType = "text"; 
    5659                        marcGenre = "thesis"; 
     
    8588                if(item.thesisType) { 
    8689                        mods.genre += <genre>{item.thesisType}</genre>; 
    8790                } 
    88                 if(item.type) { 
     91                else if(item.type) { 
    8992                        mods.genre += <genre>{item.type}</genre>; 
    9093                } 
    9194                 
     
    9699                                roleTerm = "aut"; 
    97100                        } else if(item.creators[j].creatorType == "editor") { 
    98101                                roleTerm = "edt"; 
     102                        } else if(item.creators[j].creatorType == "translator") { 
     103                                roleTerm = "trl"; 
    99104                        } else { 
    100105                                roleTerm = "ctb"; 
    101106                        } 
    102107                         
    103108                        // FIXME - currently all names are personal 
    104                         if(item.creators[j].fieldMode == 1) { 
    105                                 mods.name += <name type="personal"> 
    106                                         <namePart>{item.creators[j].lastName}</namePart> 
    107                                         <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
    108                                         </name>; 
    109                         } else { 
    110                                 mods.name += <name type="personal"> 
    111                                         <namePart type="family">{item.creators[j].lastName}</namePart> 
    112                                         <namePart type="given">{item.creators[j].firstName}</namePart> 
    113                                         <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
    114                                         </name>; 
     109                        if(item.creators[j].creatorType != "seriesEditor") { 
     110                                if(isPartialItem && item.creators[j].creatorType == "editor"){ 
     111                                        if(item.creators[j].fieldMode == 1) { 
     112                                                mods.relatedItem.name += <name type="personal"> 
     113                                                        <namePart>{item.creators[j].lastName}</namePart> 
     114                                                        <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
     115                                                        </name>; 
     116                                        } else { 
     117                                                mods.relatedItem.name += <name type="personal"> 
     118                                                        <namePart type="family">{item.creators[j].lastName}</namePart> 
     119                                                        <namePart type="given">{item.creators[j].firstName}</namePart> 
     120                                                        <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
     121                                                        </name>; 
     122                                        } 
     123                                } else { 
     124                                        if(item.creators[j].fieldMode == 1) { 
     125                                                mods.name += <name type="personal"> 
     126                                                        <namePart>{item.creators[j].lastName}</namePart> 
     127                                                        <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
     128                                                        </name>; 
     129                                        } else { 
     130                                                mods.name += <name type="personal"> 
     131                                                        <namePart type="family">{item.creators[j].lastName}</namePart> 
     132                                                        <namePart type="given">{item.creators[j].firstName}</namePart> 
     133                                                        <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
     134                                                        </name>; 
     135                                        } 
     136                                } 
    115137                        } 
    116138                } 
    117139                 
     
    209231                        var tag = <{dateType}>{item.date}</{dateType}>; 
    210232                        originInfo += tag; 
    211233                } 
    212                 if(item.accessDate) { 
    213                         originInfo += <dateCaptured>{item.accessDate}</dateCaptured>; 
     234 
     235                if(item.numPages) { 
     236                        mods.physicalDescription = <physicalDescription><extent unit="pages"><total>{item.numPages}</total></extent></physicalDescription>; 
    214237                } 
     238 
    215239                if(originInfo.length() != 1) { 
    216240                        if(isPartialItem) { 
    217241                                // For a journal article, bookSection, etc., this goes under the host 
     
    220244                                mods.originInfo += <originInfo>{originInfo}</originInfo>; 
    221245                        } 
    222246                } 
     247 
     248                // eXist Solutions points out that most types are more often 
     249                // monographic than not & will use this internally. 
     250                // Perhaps comment this out in the main distribution, though. 
     251                mods.originInfo.issuance = "monographic"; 
     252 
     253                if(isPartialItem) { 
     254                        // eXist Solutions points out that these types are more often 
     255                        // continuing than not & will use this internally. 
     256                        // Perhaps comment this out in the main distribution, though. 
     257                        if(item.itemType == "journalArticle" || item.itemType == "magazineArticle" || item.itemType == "newspaperArticle") { 
     258                                mods.relatedItem.originInfo.issuance = "continuing"; 
     259                                if(item.itemType == "journalArticle" || item.itemType == "magazineArticle") { 
     260                                        mods.relatedItem.genre += <genre authority="marcgt">periodical</genre>; 
     261                                } else if (item.itemType == "newspaperArticle") { 
     262                                        mods.relatedItem.genre += <genre authority="marcgt">newspaper</genre>; 
     263                                } 
     264                        } 
     265                        else if (item.itemType == "bookSection" || item.itemType == "conferencePaper" || item.itemType == "encyclopediaArticle") { 
     266                                mods.relatedItem.originInfo.issuance = "monographic"; 
     267                                if (item.itemType == "bookSection") { 
     268                                        mods.relatedItem.genre += <genre authority="marcgt">book</genre>; 
     269                                } else if (item.itemType == "conferencePaper") { 
     270                                        mods.relatedItem.genre += <genre authority="marcgt">conference publication</genre>; 
     271                                        if (item.conferenceName) { 
     272                                                mods.relatedItem.name += <name type="conference"> 
     273                                                        <namePart>{item.conferenceName}</namePart> 
     274                                                        </name>; 
     275                                        } 
     276                                } else if (item.itemType == "encyclopediaArticle") { 
     277                                        mods.relatedItem.genre += <genre authority="marcgt">encyclopedia</genre>; 
     278                                } 
     279                        } 
     280                } 
    223281                 
    224282                // XML tag identifier; object fields ISBN, ISSN 
    225283                if(isPartialItem) { 
     
    247305                        mods.classification = item.callNumber; 
    248306                } 
    249307                 
     308                // XML tag location.url; object field archiveLocation 
     309                if(item.url) { 
     310                        mods.location.url += item.url; 
     311                        if(item.accessDate) { 
     312                                mods.location.url.@dateLastAccessed = item.accessDate; 
     313                        } 
     314                } 
     315 
    250316                // XML tag location.physicalLocation; object field archiveLocation 
    251317                if(item.archiveLocation) { 
    252                         mods.location.physicalLocation = item.archiveLocation; 
     318                        mods.location += <location><physicalLocation>{item.archiveLocation}</physicalLocation></location>; 
    253319                } 
    254320                 
    255                 // XML tag location.url; object field archiveLocation 
    256                 if(item.url) { 
    257                         mods.location.url = item.url; 
    258                 } 
    259                  
    260321                // XML tag title.titleInfo; object field journalAbbreviation 
    261322                if(item.journalAbbreviation) { 
    262323                        mods.relatedItem.titleInfo += <titleInfo type="abbreviated"><title>{item.journalAbbreviation}</title></titleInfo>; 
     
    286347                for(var j in item.tags) { 
    287348                        mods.subject += <subject><topic>{item.tags[j].tag}</topic></subject>; 
    288349                } 
     350 
     351                /** LANGUAGE **/ 
     352 
     353                if(item.language) { 
     354                        mods.language.languageTerm = <languageTerm type="text">{item.language}</languageTerm>; 
     355                } 
     356 
     357                /** EXTRA->NOTE **/ 
     358                if(item.extra) { 
     359                        mods.note += <note>{item.extra}</note>; 
     360                } 
    289361                 
    290362                 
    291363                // XML tag relatedItem.titleInfo; object field series 
    292364                if(item.seriesTitle || item.series || item.seriesNumber || item.seriesText) { 
    293365                        var series = <relatedItem type="series"/>; 
     366 
     367                        // eXist Solutions points out that these types are more often 
     368                        // continuing than not & will use this internally. 
     369                        // Perhaps comment this out in the main distribution, though. 
     370                        series.originInfo.issuance = "continuing"; 
    294371                         
    295372                        if(item.series) { 
    296373                                series.titleInfo.title = item.series; 
    297374                        } 
    298375                         
    299376                        if(item.seriesTitle) { 
    300                                 series.titleInfo.partTitle = item.seriesTitle; 
     377                                series.titleInfo.title += <title>{item.seriesTitle}</title>; 
    301378                        } 
    302379                         
    303380                        if(item.seriesText) { 
     
    305382                        } 
    306383                         
    307384                        if(item.seriesNumber) { 
    308                                 series.titleInfo.partNumber = item.seriesNumber; 
     385                                series.part.detail = <detail type="volume"><number>{item.seriesNumber}</number></detail>; 
    309386                        } 
     387 
     388                        // handle series editors 
     389                        for(var j in item.creators) { 
     390                                var roleTerm = ""; 
     391                                if(item.creators[j].creatorType == "seriesEditor") { 
     392                                        roleTerm = "pbd"; 
     393                                        if(item.creators[j].fieldMode == 1) { 
     394                                                series.name += <name type="personal"> 
     395                                                        <namePart>{item.creators[j].lastName}</namePart> 
     396                                                        <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
     397                                                        </name>; 
     398                                        } else { 
     399                                                series.name += <name type="personal"> 
     400                                                        <namePart type="family">{item.creators[j].lastName}</namePart> 
     401                                                        <namePart type="given">{item.creators[j].firstName}</namePart> 
     402                                                        <role><roleTerm type="code" authority="marcrelator">{roleTerm}</roleTerm></role> 
     403                                                        </name>; 
     404                                        } 
     405                                } 
     406                        } 
    310407                         
    311408                        // TODO: make this work in import 
    312                         /*if(item.itemType == "bookSection") { 
    313                                 // For a book section, series info must go inside host tag 
     409                        // 
     410                        if(isPartialItem) { 
    314411                                mods.relatedItem.relatedItem = series; 
    315                         } else {*/ 
     412                        } else { 
    316413                                mods.relatedItem += series; 
    317                         //} 
     414                        } 
    318415                } 
    319416                 
    320417                modsCollection.mods += mods;