Ticket #1820: disambiguate-related.patch

File disambiguate-related.patch, 6.7 KB (added by fbennett, 5 years ago)
  • chrome/content/zotero/bindings/relatedbox.xml

    old new  
    9191                                        ]]> 
    9292                                </getter> 
    9393                        </property> 
     94                        <method name="getVolIssueJournal"> 
     95                                <parameter name="item"/> 
     96                                <body> 
     97                                        <![CDATA[ 
     98                                                var fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(item.itemTypeID, 'volume'); 
     99                                                var itemVol = item.getField(fieldID); 
     100 
     101                                                var fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(item.itemTypeID, 'issue'); 
     102                                                var itemIssue = item.getField(fieldID); 
     103 
     104                                                if (!itemIssue) { 
     105                                                        var extra = item.getField('extra'); 
     106                                                        var m = extra.match(/\{:issue:\s*([^\}]*)\}/); 
     107                                                        if (m) { 
     108                                                                itemIssue = m[1]; 
     109                                                        } 
     110                                                } 
     111                                                var volIssue = []; 
     112                                                if (itemVol) { 
     113                                                        volIssue.push(itemVol); 
     114                                                } 
     115                                                if (itemIssue) { 
     116                                                        volIssue.push(itemIssue); 
     117                                                } 
     118                                                volIssue = volIssue.join(":"); 
     119                                                var volIssueJournal = []; 
     120                                                if (volIssue) { 
     121                                                        volIssueJournal.push(volIssue); 
     122                                                } 
     123                                                // Journal name, short if poss. 
     124                                                var journalName = false; 
     125                                                if (item.getField('journalAbbreviation')) { 
     126                                                        journalName = item.getField('journalAbbreviation'); 
     127                                                } 
     128                                                if (!journalName) { 
     129                                                        var fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(item.itemTypeID, 'publicationTitle'); 
     130                                                        journalName = item.getField(fieldID); 
     131                                                } 
     132                                                if (!journalName) { 
     133                                                        journalName = item.getField('reporter'); 
     134                                                } 
     135                                                if (!journalName) { 
     136                                                        journalName = item.getField('code'); 
     137                                                } 
     138                                                if (journalName) { 
     139                                                        volIssueJournal.push(journalName); 
     140                                                } 
     141                                                return volIssueJournal.join(" "); 
     142                                        ]]> 
     143                                </body> 
     144                        </method> 
     145                        <method name="getYear"> 
     146                                <parameter name="item"/> 
     147                                <body> 
     148                                        <![CDATA[ 
     149 
     150                                                var fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(item.itemTypeID, 'date'); 
     151                                                return item.getField(fieldID, false); 
     152                                        ]]> 
     153                                </body> 
     154                        </method> 
    94155                        <method name="reload"> 
    95156                                <body> 
    96157                                        <![CDATA[ 
     158                                                var slots, itemSlots; 
     159                                                var itemAuthors = this.item.getField('firstCreator'); 
     160                                                if (!itemAuthors) { 
     161                                                        itemAuthors = ""; 
     162                                                } 
     163                                                var itemTitle = this.item.getDisplayTitle(); 
     164                                                if (!itemTitle) { 
     165                                                        itemTitle = ""; 
     166                                                } 
     167 
    97168                                                var addButton = this.id('addButton'); 
    98169                                                addButton.hidden = !this.editable; 
    99170                                                 
     
    105176                                                        var related = this.item.relatedItemsBidirectional; 
    106177                                                        if (related) { 
    107178                                                                related = Zotero.Items.get(related); 
     179 
     180                                                                // First pass 
     181                                                                // compare with current item,  
     182                                                                // fill first slot with 
     183                                                                // author or title that differs  
     184                                                                // in first 15 characters (if any) 
     185                                                                var relatedInfo = []; 
     186                                                                for (var i = 0; i < related.length; i++) { 
     187                                                                        info = []; 
     188                                                                        relatedInfo.push(info); 
     189                                                                        var otherAuthor = related[i].getField('firstCreator'); 
     190                                                                        if (otherAuthor && otherAuthor.slice(0, 15) !== itemAuthors.slice(0, 15)) { 
     191                                                                                info.push(otherAuthor); 
     192                                                                                continue; 
     193                                                                        } 
     194                                                                        var otherTitle = related[i].getDisplayTitle(); 
     195                                                                        if (otherTitle && otherTitle.slice(0, 15) !== itemTitle.slice(0, 15)) { 
     196                                                                                info.push(otherTitle); 
     197                                                                        } 
     198                                                                } 
     199 
     200                                                                // Second pass: compare each element  
     201                                                                // with all partners maybe. Max two slots 
     202                                                                var all = related.concat([this.item]); 
     203                                                                var itemVolIssueJournal = this.getVolIssueJournal(this.item); 
     204                                                                var itemYear = this.getYear(this.item); 
     205                                                                for (var i = 0, ilen = related.length; i < ilen; i += 1) { 
     206                                                                        var volIssueJournal = this.getVolIssueJournal(related[i]); 
     207                                                                        if (relatedInfo[i].length === 0) { 
     208                                                                                if (volIssueJournal) { 
     209                                                                                        relatedInfo[i].push(volIssueJournal); 
     210                                                                                } 
     211                                                                                var relatedYear = this.getYear(related[i]); 
     212                                                                                if (relatedYear) { 
     213                                                                                        relatedInfo[i].push(relatedYear); 
     214                                                                                } 
     215                                                                        } else if (relatedInfo[i].length === 1) { 
     216                                                                                // In this case only, we need to try, at least, to 
     217                                                                                // distinguish one related item from all others. 
     218                                                                                var be_pushy = true; 
     219                                                                                for (var j = 0, jlen = all.length; j < jlen; j += 1) { 
     220                                                                                        if (i === j) { 
     221                                                                                                continue; 
     222                                                                                        } 
     223                                                                                        if (itemVolIssueJournal.slice(0, 15) === volIssueJournal.slice(0, 15)) { 
     224                                                                                                be_pushy = false; 
     225                                                                                        } 
     226                                                                                } 
     227                                                                                if (be_pushy) { 
     228                                                                                        relatedInfo[i].push(volIssueJournal); 
     229                                                                                } else if (this.getYear(related[i])) { 
     230                                                                                        relatedInfo[i].push(this.getYear(related[i])); 
     231                                                                                } 
     232                                                                        } 
     233                                                                        // (The only other possible length is 2, 
     234                                                                        // in which case we were already done.) 
     235 
     236                                                                        // Tidy up. 
     237                                                                        if (!relatedInfo[i].length) { 
     238                                                                                relatedInfo[i].push("(no data)"); 
     239                                                                        } 
     240                                                                } 
    108241                                                                for (var i = 0; i < related.length; i++) { 
    109242                                                                        var icon= document.createElement("image"); 
    110243                                                                        var type = Zotero.ItemTypes.getName(related[i].itemTypeID); 
     
    129262                                                                                                break; 
    130263                                                                                } 
    131264                                                                        } 
    132                                                                         icon.setAttribute('src','chrome://zotero/skin/treeitem-' + type + '.png'); 
    133                                                          
    134                                                                         var label = document.createElement("label"); 
    135                                                                         label.setAttribute('value', related[i].getDisplayTitle()); 
    136                                                                         label.setAttribute('crop','end'); 
    137                                                                         label.setAttribute('flex','1'); 
    138                                                                          
     265                                                                        icon.setAttribute('src','chrome://zotero/skin/treeitem-' + type + '.png');                                               
    139266                                                                        var box = document.createElement('box'); 
    140267                                                                        box.setAttribute('onclick', 
    141268                                                                                "document.getBindingParent(this).showItem('" + related[i].id + "')"); 
    142269                                                                        box.setAttribute('class','zotero-clicky'); 
    143270                                                                        box.setAttribute('flex','1'); 
    144271                                                                        box.appendChild(icon); 
    145                                                                         box.appendChild(label); 
    146                                                                          
     272                                                                        for (var j = 0, jlen = relatedInfo[i].length; j < jlen; j += 1) { 
     273                                                                                var label = document.createElement("label"); 
     274                                                                                label.setAttribute('value', relatedInfo[i][j]); 
     275                                                                                label.setAttribute('crop','end'); 
     276                                                                                label.setAttribute('flex', 1); 
     277                                                                                if (j === 1 || relatedInfo[i].length === 1) { 
     278                                                                                        label.setAttribute("style", "text-align:right;"); 
     279                                                                                } 
     280                                                                                box.appendChild(label); 
     281                                                                        } 
    147282                                                                        if (this.editable) { 
    148283                                                                                var remove = document.createElement("label"); 
    149284                                                                                remove.setAttribute('value','-'); 
    150285                                                                                remove.setAttribute('onclick', 
    151286                                                                                        "document.getBindingParent(this).remove('" + related[i].id + "');"); 
    152                                                                                 remove.setAttribute('class','zotero-clicky'); 
     287                                                                                remove.setAttribute('class','zotero-clicky zotero-clicky-minus'); 
    153288                                                                        } 
    154289                                                                         
    155290                                                                        var row = document.createElement("row");