adds the option keys for selecting multiple entries
based on a list of specified entries. This is compatible with other search criteria, as it is implemented as an extra filter rule in multisearch(). This is useful for presenting a selection or short-list of bibtex entries (eg, on a homepage, in a research project page, etc...) $_GET['keys'] should contain a url-encoded json-encoded array of bibtex entries. With @define(ABBRV_TYPE,'keys-index'), the array in $_GET['keys'] is considered as an associative array "$abbrv=>$bibkey" and $abbrv is used for abbreviation.
This commit is contained in:
+42
-2
@@ -64,7 +64,7 @@ function bibtexbrowser_configure($key, $value) {
|
||||
// the target frame of menu links
|
||||
@define('BIBTEXBROWSER_MENU_TARGET','main'); // might be define('BIBTEXBROWSER_MENU_TARGET','_self'); in bibtexbrowser.local.php
|
||||
|
||||
@define('ABBRV_TYPE','index');// may be year/x-abbrv/key/none/index
|
||||
@define('ABBRV_TYPE','index');// may be year/x-abbrv/key/none/index/keys-index
|
||||
|
||||
// Wrapper to use when we are included by another script
|
||||
@define('BIBTEXBROWSER_EMBEDDED_WRAPPER', 'NoWrapper');
|
||||
@@ -119,6 +119,7 @@ function bibtexbrowser_configure($key, $value) {
|
||||
@define('Q_ALL', 'all');
|
||||
@define('Q_ENTRY', 'entry');
|
||||
@define('Q_KEY', 'key');
|
||||
@define('Q_KEYS', 'keys'); // filter entries using a url-encoded, JSON-encoded array of bibtex keys
|
||||
@define('Q_SEARCH', 'search');
|
||||
@define('Q_EXCLUDE', 'exclude');
|
||||
@define('Q_RESULT', 'result');
|
||||
@@ -147,6 +148,7 @@ function bibtexbrowser_configure($key, $value) {
|
||||
|
||||
define('Q_INNER_AUTHOR', '_author');// internally used for representing the author
|
||||
define('Q_INNER_TYPE', 'x-bibtex-type');// used for representing the type of the bibtex entry internally
|
||||
@define('Q_INNER_KEYS_INDEX', '_keys-index');// used for storing indices in $_GET[Q_KEYS] array
|
||||
|
||||
// for clean search engine links
|
||||
// we disable url rewriting
|
||||
@@ -1300,6 +1302,11 @@ class BibEntry {
|
||||
if ($this->hasField('x-abbrv')) {return $this->getField('x-abbrv');}
|
||||
return $this->abbrv;
|
||||
}
|
||||
if (ABBRV_TYPE == 'keys-index') {
|
||||
if (isset($_GET[Q_INNER_KEYS_INDEX])) {return $_GET[Q_INNER_KEYS_INDEX][$this->getKey()]; }
|
||||
return '';
|
||||
}
|
||||
|
||||
// otherwise it is a user-defined function in bibtexbrowser.local.php
|
||||
$f = ABBRV_TYPE;
|
||||
return $f($this);
|
||||
@@ -1604,6 +1611,13 @@ function compare_bib_entry_by_title($a, $b)
|
||||
return strcmp($a->getTitle(),$b->getTitle());
|
||||
}
|
||||
|
||||
/** compares two instances of BibEntry by undecorated Abbrv
|
||||
*/
|
||||
function compare_bib_entry_by_raw_abbrv($a, $b)
|
||||
{
|
||||
return strcmp($a->getRawAbbrv(),$b->getRawAbbrv());
|
||||
}
|
||||
|
||||
|
||||
/** compares two instances of BibEntry by month
|
||||
* @author Jan Geldmacher
|
||||
@@ -1927,6 +1941,8 @@ function createQueryString($array_param) {
|
||||
// the inverse transformation should also be implemented into query2title
|
||||
if($key == Q_INNER_AUTHOR) { $key = Q_AUTHOR; }
|
||||
if($key == Q_INNER_TYPE) { $key = Q_TYPE; }
|
||||
if($key == Q_KEYS) { $val = urlencode(json_encode($val)); }
|
||||
if($key == Q_INNER_KEYS_INDEX) {continue;}
|
||||
$array_param[$key]=$key .'='. urlencode($val);
|
||||
}
|
||||
return implode("&",$array_param);
|
||||
@@ -2280,6 +2296,7 @@ function query2title(&$query) {
|
||||
// and we remove the regexp modifiers ^ $
|
||||
$v = preg_replace('/[$^]/','',$v);
|
||||
}
|
||||
if($k == Q_KEYS) { $v=json_encode(array_values($v)); }
|
||||
$headers[$k] = __(ucwords($k)).': '.ucwords(htmlspecialchars($v));
|
||||
}
|
||||
// special cases
|
||||
@@ -3008,11 +3025,13 @@ class BibDataBase {
|
||||
// we search in the whole bib entry
|
||||
if (!$bib->hasPhrase($fragment)) {
|
||||
$entryisselected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ($field==Q_EXCLUDE) {
|
||||
if ($bib->hasPhrase($fragment)) {
|
||||
$entryisselected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ($field==Q_TYPE || $field==Q_INNER_TYPE) {
|
||||
@@ -3023,11 +3042,19 @@ class BibDataBase {
|
||||
// moved here so that it is also used by AcademicDisplay:search2html()
|
||||
if (!$bib->hasPhrase('^('.$fragment.')$', Q_INNER_TYPE)) {
|
||||
$entryisselected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ($field==Q_KEYS) {
|
||||
if ( ! in_array( $bib->getKey(), $query[Q_KEYS] ) ) {
|
||||
$entryisselected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!$bib->hasPhrase($fragment, $field)) {
|
||||
$entryisselected = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3036,7 +3063,6 @@ class BibDataBase {
|
||||
$result[] = $bib;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
} // end class
|
||||
@@ -3718,6 +3744,20 @@ class Dispatcher {
|
||||
} else { nonExistentBibEntryError(); }
|
||||
}
|
||||
|
||||
function keys() {
|
||||
// Create array from list of bibtex entries
|
||||
if (get_magic_quotes_gpc()) {
|
||||
$_GET[Q_KEYS] = stripslashes($_GET[Q_KEYS]);
|
||||
}
|
||||
$_GET[Q_KEYS] = (array) json_decode(urldecode($_GET[Q_KEYS])); // decode and cast the object into an (associative) array
|
||||
// Make the array 1-based (keeps the string keys unchanged)
|
||||
array_unshift($_GET[Q_KEYS],"__DUMMY__");
|
||||
unset($_GET[Q_KEYS][0]);
|
||||
// Keep a flipped version for efficient search in getRawAbbrv()
|
||||
$_GET[Q_INNER_KEYS_INDEX] = array_flip($_GET[Q_KEYS]);
|
||||
$this->query[Q_KEYS]=$_GET[Q_KEYS];
|
||||
}
|
||||
|
||||
/** is used to remotely analyzed a situation */
|
||||
function diagnosis() {
|
||||
header('Content-type: text/plain');
|
||||
|
||||
Reference in New Issue
Block a user