Hi,
This can be related with:
http://drupal.org/node/586500
http://drupal.org/node/361139
But what we found is that Authors are not available from the GUI and the PHP is not executed?
Below I attached the patch we are using to create a citekey like tAuthorYY[x].
It also adds a helper function to remove accents, and minor changes to be ignored.
But one thing that can't be ignored is the change in the order of the calls:
biblio_insert_contributors($node);
biblio_insert_keywords($node);
_biblio_prepare_submit($node);
The insert/update_contributors should be called before the _prepare_submit to be able to access to the authors names to create the citekey.
Also we noticed that, since the last rc4 release, the "lastname" is no more available, but just the "name"...
So we have to get the lastname fron the name.
I know that the following code is not generic enought, but I'm only attaching it here to help anyone interested in auto-citekeys.
> diff -u sites/all/modules/biblio/biblio.module.bkp sites/all/modules/biblio/biblio.module
--- sites/all/modules/biblio/biblio.module.bkp 2013-03-11 16:24:26.000000000 +0100
+++ sites/all/modules/biblio/biblio.module 2013-03-11 18:05:57.000000000 +0100
@@ -21,6 +21,113 @@
*/
define('BIBLIO_VERSION', '7.x-1.x-dev');
+function remove_accents($string) {
+ if ( !preg_match('/[\x80-\xff]/', $string) )
+ return $string;
+
+ $chars = array(
+ // Decompositions for Latin-1 Supplement
+ chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
+ chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
+ chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
+ chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
+ chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
+ chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
+ chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
+ chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
+ chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
+ chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
+ chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
+ chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
+ chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
+ chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
+ chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
+ chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
+ chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
+ chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
+ chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
+ chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
+ chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
+ chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
+ chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
+ chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
+ chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
+ chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
+ chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
+ chr(195).chr(191) => 'y',
+ // Decompositions for Latin Extended-A
+ chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
+ chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
+ chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
+ chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
+ chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
+ chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
+ chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
+ chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
+ chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
+ chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
+ chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
+ chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
+ chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
+ chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
+ chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
+ chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
+ chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
+ chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
+ chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
+ chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
+ chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
+ chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
+ chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
+ chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
+ chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
+ chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
+ chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
+ chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
+ chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
+ chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
+ chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
+ chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
+ chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
+ chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
+ chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
+ chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
+ chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
+ chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
+ chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
+ chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
+ chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
+ chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
+ chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
+ chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
+ chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
+ chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
+ chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
+ chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
+ chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
+ chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
+ chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
+ chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
+ chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
+ chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
+ chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
+ chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
+ chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
+ chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
+ chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
+ chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
+ chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
+ chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
+ chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
+ chr(197).chr(190) => 'z', chr(197).chr(191) => 's'
+ );
+
+ $string = strtr($string, $chars);
+
+ return $string;
+}
+
+
function _biblio_get_auth_types($auth_category, $biblio_type) {
static $auth_types = array();
if (empty($auth_types)) {
@@ -537,7 +644,7 @@
'#title' => t('Biblio settings'),
'#weight' => 5,
'#collapsible' => TRUE,
- '#collapsed' => FALSE,
+ '#collapsed' => TRUE,
);
if ($admin_show_form || variable_get('biblio_show_user_profile_form', '1')) {
$form['biblio_fieldset'] += _biblio_get_user_profile_form($account);
@@ -1234,7 +1341,7 @@
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#title' => 'Authors',
- '#description' => t('Enter a single name per line using a format such as "Smith, John K" or "John K Smith" or "J.K. Smith"'),
+ '#description' => t('<B>Please note that Authors were not imported, please fill the author/s fields by yourself and let the autocomplete form assist you to avoid duplicate authors on our database.</B><BR> Enter a single name per line using a format such as "Smith, John K" or "John K Smith" or "J.K. Smith"'),
);
$tabs['biblio_authors'] += biblio_contributor_widget($node, $form_state);
@@ -1589,12 +1696,15 @@
module_load_include('inc', 'biblio', 'includes/biblio.util');
module_load_include('inc', 'biblio', 'includes/biblio.contributors');
module_load_include('inc', 'biblio', 'includes/biblio.keywords');
- _biblio_prepare_submit($node);
+
+ #_biblio_prepare_submit($node); # moved below to get access to the authors when creating citekey
biblio_insert_contributors($node);
biblio_insert_keywords($node);
+ _biblio_prepare_submit($node);
+
$node->biblio_coins = biblio_coins($node);
- $duplicate = biblio_hash($node);
drupal_write_record('biblio', $node);
+ $duplicate = biblio_hash($node);
if (isset($duplicate) && $duplicate != $node->nid) { // if this is a potential duplcate, write the nids of the pre-existing and new nodes
$dup_map = array('vid' => $duplicate, 'did' => $node->nid);
drupal_write_record('biblio_duplicates', $dup_map);
@@ -1611,9 +1721,12 @@
module_load_include('inc', 'biblio', 'includes/biblio.util');
module_load_include('inc', 'biblio', 'includes/biblio.contributors');
module_load_include('inc', 'biblio', 'includes/biblio.keywords');
- _biblio_prepare_submit($node);
+
+ #_biblio_prepare_submit($node); # moved below to get access to the authors when creating citekey
biblio_update_contributors($node);
biblio_update_keywords($node);
+ _biblio_prepare_submit($node);
+
$node->biblio_coins = biblio_coins($node);
// Update the node in the database:
@@ -1696,13 +1809,64 @@
$prefix = variable_get('biblio_citekey_prefix', '');
$primary_field = variable_get('biblio_citekey_field1', 'nid');
$secondary_field = variable_get('biblio_citekey_field2', 'nid');
- $citekey = (!empty($node->$primary_field)) ? $node->$primary_field : ((!empty($node-> $secondary_field)) ? $node-> $secondary_field : $node->nid);
+
+// $citekey = (!empty($node->$primary_field)) ? $node->$primary_field : ((!empty($node-> $secondary_field)) ? $node-> $secondary_field : $node->nid);
+
+ //
+ // Forcing a citekey pattern -> tAuthorYY[x]
+ // It not works from the GUI?
+ //
+
+ // Basic values
+ $citekey = '';
+
+ switch($node->biblio_type)
+ {
+ case 102: $citekey .= 'a'; break; // Journal Article
+ case 131: $citekey .= 'a'; break; // Journal
+ case 100: $citekey .= 'b'; break; // Book
+ case 101: $citekey .= 'b'; break; // Book Chapter
+ case 103: $citekey .= 'c'; break; // Conference Paper
+ case 104: $citekey .= 'c'; break; // Conference Proceedings
+ case 108: $citekey .= 'd'; break; // Thesis / Dissertation
+ default : $citekey .= 'x'; break; // Other
+ }
+
+ if (!empty($node->biblio_contributors)) {
+ //$citekey .= remove_accents($node->biblio_contributors[0]['lastname']);
+ $myname = $node->biblio_contributors[0]['name'];
+ $myparts = explode(",",$myname);
+ $citekey .= remove_accents($myparts[0]);
+ }
+ if (!empty($node->biblio_year)) {
+ $citekey .= $node->biblio_year[2];
+ $citekey .= $node->biblio_year[3];
+ }
+
+ // Checking if they already exists
+ $sufix = 'abcdefghijklmnopqrstuvwxyz';
+ $index = 0;
+ $citekeytmp = $citekey;
+ $prev = db_query("SELECT nid FROM {biblio} WHERE biblio_citekey = :citekeytmp ORDER BY vid DESC", array(':citekeytmp' => $citekeytmp))->fetchObject();
+
+ while( !empty($prev) && $prev->nid > 0 )
+ {
+ $citekeytmp = $citekey . $sufix[$index];
+ $prev = db_query("SELECT nid FROM {biblio} WHERE biblio_citekey = :citekeytmp ORDER BY vid DESC", array(':citekeytmp' => $citekeytmp))->fetchObject();
+
+ $index++;
+ }
+
+ $citekey = $citekeytmp;
+
return check_plain($prefix . $citekey);
}
else {
ob_start();
$return = eval($php);
ob_end_clean();
+
+// return check_plain("php: " . $php . " decode html: " . htmlspecialchars_decode($php));
return check_plain(strip_tags((string)$return));
}
}
@@ -2246,4 +2410,4 @@
if ($module == "feeds" && $api == "feeds_importer_default") {
return array("version" => 1);
}
-}
\ No newline at end of file
+}
| Comment | File | Size | Author |
|---|---|---|---|
| #2 | biblio_auto_citekey_multiauthors-1940426-2.patch | 5.15 KB | PascalAnimateur |
| #1 | biblio_auto_citekey-1940426-1.patch | 4.99 KB | PascalAnimateur |
Comments
Comment #1
PascalAnimateur commentedI adapted your solution to my needs with much simpler code for removing the special characters. I also added code to make sure citekey is regenerated every time the node is updated (this prevents the user from setting the citekey manually).
This patch bypasses the whole citekey form values (primary and secondary keys, php eval) in order to generate unique citekeys from the first author's last name + year :
kelly2007 / kelly2007a / etc.
Comment #2
PascalAnimateur commentedFixed a couple of issues with my previous patch... this one generates the citekey using all the authors' last names, ex: KellyWilsonMetcalfe2007