Changeset 1156521
- Timestamp:
- 05/08/2015 09:44:03 PM (11 years ago)
- Location:
- currently-reading/trunk
- Files:
-
- 1 added
- 5 edited
-
CurrentlyReading.php (modified) (1 diff)
-
readme.txt (modified) (4 diffs)
-
screenshot-1.png (modified) (previous)
-
screenshot-2.png (modified) (previous)
-
screenshot-3.png (modified) (previous)
-
screenshot-4.png (added)
Legend:
- Unmodified
- Added
- Removed
-
currently-reading/trunk/CurrentlyReading.php
r1143052 r1156521 1 1 <?php 2 2 /* 3 Plugin Name: Currently Reading4 Plugin URI: http://blog.damn.org.za/widgets/5 Description: Display a Currently Reading widget using an image from (and linking to) the Google Books Website 6 Author: Eugéne Roux7 Version: 3.4 8 Author URI: http://damn.org.za/3 Plugin Name: Currently Reading 4 Plugin URI: http://blog.damn.org.za/widgets/ 5 Description: Display a Currently Reading widget using the Google Books API 6 Author: Eugéne Roux 7 Version: 4.0 8 Author URI: http://damn.org.za/ 9 9 */ 10 10 11 11 // 12 // CurrentlyReading Class12 // CurrentlyReading Class 13 13 // 14 14 class CurrentlyReading extends WP_Widget { 15 /** constructor */ 16 function CurrentlyReading() { 17 $widget_ops = array( 'classname' => 'widget_reading', 'description' => __( 'Display a Currently Reading widget using an image from (and linking to) the Google Books website' ), 'internalcss' => true);18 $this->WP_Widget( 'reading', __( 'Reading', 'reading_widget' ), $widget_ops ); 19 $this->widget_defaults = array( 20 'internalcss' => true,21 'boxshadow' => true,22 );23 }24 25 //26 //@see WP_Widget::widget27 //28 function widget( $args, $instance ) {29 $args = wp_parse_args( $args, $this->widget_defaults );30 extract( $args );15 function CurrentlyReading() { 16 $widget_ops = array( 'classname' => 'widget_reading', 'description' => __( 'Display a Currently Reading widget using the Google Books API' ), 'internalcss' => true ); 17 $this->WP_Widget( 'reading', __( 'Reading', 'reading_widget' ), $widget_ops ); 18 $this->widget_defaults = [ 19 'internalcss' => true, 20 'boxshadow' => true, 21 'domain' => 'google.co.za', 22 ]; 23 } 24 25 // 26 // @see WP_Widget::widget 27 // 28 function widget( $args, $instance ) { 29 $args = wp_parse_args( $args, $this->widget_defaults ); 30 extract( $args ); 31 31 //$widget_options = wp_parse_args( $instance, $this->widget_defaults ); 32 32 33 $title = apply_filters('widget_title', $instance['title']); 34 $internalcss = $instance["internalcss"] ? true : false; 35 $boxshadow = $instance["boxshadow"] ? true : false; 36 37 if ( $instance['isbn'] != "" ) { // No point in a "Currently Reading" if you aren't, is there? 38 39 echo $before_widget; 40 41 if ( $title ) 42 echo $before_title . $title . $after_title; // This way we get to choose a "No Title" scenario... 43 44 $spacechars = array(' ', '-', '_'); 45 $myisbn = str_replace($spacechars, "", $instance['isbn']); 46 47 print("\n\t<!-- ISBN: " . $instance['isbn'] . " -->\n"); 48 49 print("\t\t<div"); 50 if ( $internalcss ) { 51 print(" style='margin: 1em; padding: 2ex;'"); 52 } 53 print( " class='currentlyreading' id='currenlyreading-ISBN" . $myisbn . "'>\n"); 54 55 print( "\t\t\t<a href='http://books.google.com/books?vid=ISBN$myisbn'>"); 56 print( "<img class='currentlyreading' id='currenlyreading-ISBN" . $myisbn . "-img' " ); 57 if ( $boxshadow ) { 58 print( "style='-moz-box-shadow: #CCC 5px 5px 5px; -webkit-box-shadow: #CCC 5px 5px 5px; " ); 59 print( "-khtml-box-shadow: #CCC 5px 5px 5px; box-shadow: #CCC 5px 5px 5px;' " ); 60 } 61 print( "src='http://books.google.com/books?vid=ISBN$myisbn&printsec=frontcover&img=1&zoom=1' "); 62 print( "alt='ISBN: " . $instance['isbn'] . "' title='ISBN: " . $instance['isbn'] . "'/></a>\n"); 63 print( "\t\t</div>\n"); 64 65 echo $after_widget; 66 } 67 } 68 69 // 70 // @see WP_Widget::update 71 // 72 function update( $new_instance, $old_instance ) { 73 $instance = $old_instance; 74 $instance['title'] = strip_tags( $new_instance['title'] ); 75 $instance['isbn'] = strip_tags( $new_instance['isbn'] ); 76 $instance['internalcss'] = $new_instance['internalcss'] ? 1 : 0; 77 $instance['boxshadow'] = $new_instance['boxshadow'] ? 1 : 0; 78 return $instance; 79 } 80 81 // 82 // @see WP_Widget::form 83 // 84 function form( $instance ) { 85 $instance = wp_parse_args( $instance, $this->widget_defaults ); 86 extract( $instance ); 87 88 $title = esc_attr( $instance['title'] ); 89 $isbn = esc_attr( $instance['isbn'] ); 90 $internalcss = $instance['internalcss'] ? "checked='checked'" : ""; 91 $boxshadow = $instance['boxshadow'] ? "checked='checked'" : ""; 92 93 print( "\t<p>\n\t\t<label for='" . $this->get_field_id("title") . "'>" ); _e( "Title:" ); 94 print( "\n\t\t\t<input class='widefat' id='" . $this->get_field_id('title') . "' name='" ); 95 print( $this->get_field_name('title') . "' type='text' value='" . $title ); 96 print( "' />\n\t\t</label>\n\t\t<em>Leave blank for no title</em>\n\t</p>\n" ); 97 98 print( "\t<p>\n\t\t<label for='" . $this->get_field_id("isbn") . "'>" ); _e( "ISBN:" ); 99 print( "\n\t\t\t<input class='widefat' id='" . $this->get_field_id("isbn") . "' name='" ); 100 print( $this->get_field_name("isbn") . "' type='text' value='" . $isbn . "' />\n\t\t</label>\n\t</p>\n" ); 101 102 print( "\t<p>\n" ); 103 print( "\t\t<input class='checkbox' type='checkbox' " . $internalcss ); 104 print( " id='" . $this->get_field_id("internalcss") . "' name='" . $this->get_field_name("internalcss") . "'/>\n" ); 105 print( "\t\t<label for='" . $this->get_field_id("internalcss") . "'>" ); _e( "Pad the Image" ); 106 print( "\n\t\t<br />\n" ); 107 print( "\t\t<input class='checkbox' type='checkbox' " . $boxshadow ); 108 print( " id='" . $this->get_field_id("boxshadow") . "' name='" . $this->get_field_name("boxshadow") . "'/>\n" ); 109 print( "\t\t<label for='" . $this->get_field_id("boxshadow") . "'>" ); _e( "Display a Box-Shadow" ); 110 print( "</label>\n\t</p>\n" ); 111 112 } 33 $title = apply_filters( 'widget_title', $instance[ 'title' ]); 34 $internalcss = $instance[ "internalcss" ] ? true : false; 35 $boxshadow = $instance[ "boxshadow" ] ? true : false; 36 $localdomain = $instance[ "domain" ] ? $instance[ "domain" ] : "google.co.za"; 37 38 if ( $instance['isbn'] != "" ) { // No point in a "Currently Reading" if you aren't, is there? 39 40 $spacechars = array( ' ', '-', '_' ); 41 $myisbn = str_replace( $spacechars, "", $instance[ 'isbn' ]); 42 $isbnjson = json_decode( file_get_contents( "https://www.googleapis.com/books/v1/volumes?q=isbn:" . $myisbn ), true ); 43 44 if ( $isbnjson[ "totalItems" ] > 0 ) { 45 46 echo $before_widget; 47 48 if ( $title ) 49 echo $before_title . $title . $after_title; // This way we get to choose a "No Title" scenario... 50 51 52 print("\n\t<!-- ISBN: " . $myisbn . " / Title: " . $isbnjson[ 'items' ][0][ 'volumeInfo' ][ 'title' ] . " -->\n"); 53 54 print( "\t\t<div" ); 55 if ( $internalcss ) { 56 print( " style='margin: 1em; padding: 2ex;'" ); 57 } 58 print( " class='currentlyreading' id='currenlyreading-ISBN" . $myisbn . "'>\n"); 59 60 $googlelink = $isbnjson[ 'items' ][0][ 'volumeInfo' ][ 'canonicalVolumeLink' ]; 61 print("\n\t<!-- Google Link: " . $googlelink . " -->\n"); 62 63 print( "\t\t\t<a href='" . str_replace( "google.com", $localdomain, $googlelink ) . "'>"); 64 print( "<img class='currentlyreading' id='currenlyreading-ISBN" . $myisbn . "-img' " ); 65 if ( $boxshadow ) { 66 print( "style='-moz-box-shadow: #CCC 5px 5px 5px; -webkit-box-shadow: #CCC 5px 5px 5px; " ); 67 print( "-khtml-box-shadow: #CCC 5px 5px 5px; box-shadow: #CCC 5px 5px 5px;' " ); 68 } 69 print( "src='" . $isbnjson[ 'items' ][0][ 'volumeInfo' ][ 'imageLinks' ][ 'thumbnail' ] . "' " ); 70 print( "alt='" . $isbnjson[ 'items' ][0][ 'volumeInfo' ][ 'title' ] . "' "); 71 print( "title='" . $isbnjson[ 'items' ][0][ 'volumeInfo' ][ 'title' ] . "'/></a>\n"); 72 print( "\t\t</div>\n"); 73 74 echo $after_widget; 75 } 76 } 77 } 78 79 // 80 // @see WP_Widget::update 81 // 82 function update( $new_instance, $old_instance ) { 83 $instance = $old_instance; 84 $instance[ 'title' ] = strip_tags( $new_instance[ 'title' ]); 85 $instance[ 'isbn' ] = strip_tags( $new_instance[ 'isbn' ]); 86 $instance[ 'internalcss' ] = $new_instance[ 'internalcss' ] ? 1 : 0; 87 $instance[ 'boxshadow' ] = $new_instance[ 'boxshadow' ] ? 1 : 0; 88 $instance[ "domain" ] = $new_instance[ "domain" ] ? $new_instance[ "domain" ] : "google.co.za"; 89 return $instance; 90 } 91 92 // 93 // @see WP_Widget::form 94 // 95 function form( $instance ) { 96 $instance = wp_parse_args( $instance, $this->widget_defaults ); 97 extract( $instance ); 98 99 $title = esc_attr( $instance[ 'title' ]); 100 $isbn = esc_attr( strip_tags( $instance[ 'isbn' ])); 101 $internalcss = $instance[ 'internalcss' ] ? "checked='checked'" : ""; 102 $boxshadow = $instance[ 'boxshadow' ] ? "checked='checked'" : ""; 103 $activedom = $instance[ 'domain' ]; 104 105 $googledomains = [ 106 'Worldwide' => 'google.com', 107 'Afghanistan' => 'google.com.af', 108 'Albania' => 'google.al', 109 'Algeria' => 'google.dz', 110 'American Samoa' => 'google.as', 111 'Andorra' => 'google.ad', 112 'Angola' => 'google.co.ao', 113 'Anguilla' => 'google.com.ai', 114 'Antigua and Barbuda' => 'google.com.ag', 115 'Argentina' => 'google.com.ar', 116 'Armenia' => 'google.am', 117 'Ascension Island' => 'google.ac', 118 'Australia' => 'google.com.au', 119 'Austria' => 'google.at', 120 'Azerbaijan' => 'google.az', 121 'Bahamas' => 'google.bs', 122 'Bahrain' => 'google.com.bh', 123 'Bangladesh' => 'google.com.bd', 124 'Belarus' => 'google.by', 125 'Belgium' => 'google.be', 126 'Belize' => 'google.com.bz', 127 'Benin' => 'google.bj', 128 'Bhutan' => 'google.bt', 129 'Bolivia' => 'google.com.bo', 130 'Bosnia and Herzegovina' => 'google.ba', 131 'Botswana' => 'google.co.bw', 132 'Brazil' => 'google.com.br', 133 'British Indian Ocean Territory' => 'google.io', 134 'British Virgin Islands' => 'google.vg', 135 'Brunei' => 'google.com.bn', 136 'Bulgaria' => 'google.bg', 137 'Burkina Faso' => 'google.bf', 138 'Burma' => 'google.com.mm', 139 'Burundi' => 'google.bi', 140 'Cambodia' => 'google.com.kh', 141 'Cameroon' => 'google.cm', 142 'Canada' => 'google.ca', 143 'Cape Verde' => 'google.cv', 144 'Catalonia Catalan Countries' => 'google.cat', 145 'Central African Republic' => 'google.cf', 146 'Chad' => 'google.td', 147 'Chile' => 'google.cl', 148 'China' => 'g.cn', 149 'China' => 'google.cn', 150 'Cocos (Keeling) Islands' => 'google.cc', 151 'Colombia' => 'google.com.co', 152 'Cook Islands' => 'google.co.ck', 153 'Costa Rica' => 'google.co.cr', 154 'Croatia' => 'google.hr', 155 'Cuba' => 'google.com.cu', 156 'Cyprus' => 'google.com.cy', 157 'Czech Republic' => 'google.cz', 158 'Democratic Republic of the Congo' => 'google.cd', 159 'Denmark' => 'google.dk', 160 'Djibouti' => 'google.dj', 161 'Dominica' => 'google.dm', 162 'Dominican Republic' => 'google.com.do', 163 'Ecuador' => 'google.com.ec', 164 'Egypt' => 'google.com.eg', 165 'El Salvador' => 'google.com.sv', 166 'Estonia' => 'google.ee', 167 'Ethiopia' => 'google.com.et', 168 'Federated States of Micronesia' => 'google.fm', 169 'Fiji' => 'google.com.fj', 170 'Finland' => 'google.fi', 171 'France' => 'google.fr', 172 'French Guiana' => 'google.gf', 173 'Gabon' => 'google.ga', 174 'Gambia' => 'google.gm', 175 'Georgia' => 'google.ge', 176 'Germany' => 'google.de', 177 'Ghana' => 'google.com.gh', 178 'Gibraltar' => 'google.com.gi', 179 'Greece' => 'google.gr', 180 'Greenland' => 'google.gl', 181 'Guadeloupe' => 'google.gp', 182 'Guatemala' => 'google.com.gt', 183 'Guernsey' => 'google.gg', 184 'Guyana' => 'google.gy', 185 'Haiti' => 'google.ht', 186 'Honduras' => 'google.hn', 187 'Hong Kong' => 'google.com.hk', 188 'Hungary' => 'google.hu', 189 'Iceland' => 'google.is', 190 'India' => 'google.co.in', 191 'Indonesia' => 'google.co.id', 192 'Iran' => 'google.ir', 193 'Iraq' => 'google.iq', 194 'Ireland' => 'google.ie', 195 'Isle of Man' => 'google.im', 196 'Israel' => 'google.co.il', 197 'Italy' => 'google.it', 198 'Ivory Coast' => 'google.ci', 199 'Jamaica' => 'google.com.jm', 200 'Japan' => 'google.co.jp', 201 'Jersey' => 'google.je', 202 'Jordan' => 'google.jo', 203 'Kazakhstan' => 'google.kz', 204 'Kenya' => 'google.co.ke', 205 'Kiribati' => 'google.ki', 206 'Kuwait' => 'google.com.kw', 207 'Kyrgyzstan' => 'google.kg', 208 'Laos' => 'google.la', 209 'Latvia' => 'google.lv', 210 'Lebanon' => 'google.com.lb', 211 'Lesotho' => 'google.co.ls', 212 'Libya' => 'google.com.ly', 213 'Liechtenstein' => 'google.li', 214 'Lithuania' => 'google.lt', 215 'Luxembourg' => 'google.lu', 216 'Macedonia' => 'google.mk', 217 'Madagascar' => 'google.mg', 218 'Malawi' => 'google.mw', 219 'Malaysia' => 'google.com.my', 220 'Maldives' => 'google.mv', 221 'Mali' => 'google.ml', 222 'Malta' => 'google.com.mt', 223 'Mauritius' => 'google.mu', 224 'Mexico' => 'google.com.mx', 225 'Moldova' => 'google.md', 226 'Mongolia' => 'google.mn', 227 'Montenegro' => 'google.me', 228 'Montserrat' => 'google.ms', 229 'Morocco' => 'google.co.ma', 230 'Mozambique' => 'google.co.mz', 231 'Namibia' => 'google.com.na', 232 'Nauru' => 'google.nr', 233 'Nepal' => 'google.com.np', 234 'Netherlands' => 'google.nl', 235 'New Zealand' => 'google.co.nz', 236 'Nicaragua' => 'google.com.ni', 237 'Niger' => 'google.ne', 238 'Nigeria' => 'google.com.ng', 239 'Niue' => 'google.nu', 240 'Norfolk Island' => 'google.com.nf', 241 'Norway' => 'google.no', 242 'Oman' => 'google.com.om', 243 'Pakistan' => 'google.com.pk', 244 'Palestine' => 'google.ps', 245 'Panama' => 'google.com.pa', 246 'Papua New Guinea' => 'google.com.pg', 247 'Paraguay' => 'google.com.py', 248 'Peru' => 'google.com.pe', 249 'Philippines' => 'google.com.ph', 250 'Pitcairn Islands' => 'google.pn', 251 'Poland' => 'google.pl', 252 'Portugal' => 'google.pt', 253 'Puerto Rico' => 'google.com.pr', 254 'Qatar' => 'google.com.qa', 255 'Republic of the Congo' => 'google.cg', 256 'Romania' => 'google.ro', 257 'Russia' => 'google.ru', 258 'Rwanda' => 'google.rw', 259 'Saint Helena, Ascension, Tristan da Cunha' => 'google.sh', 260 'Saint Lucia' => 'google.com.lc', 261 'Saint Vincent and the Grenadines' => 'google.com.vc', 262 'Samoa' => 'google.ws', 263 'San Marino' => 'google.sm', 264 'Saudi Arabia' => 'google.com.sa', 265 'Senegal' => 'google.sn', 266 'Serbia' => 'google.rs', 267 'Seychelles' => 'google.sc', 268 'Sierra Leone' => 'google.com.sl', 269 'Singapore' => 'google.com.sg', 270 'Slovakia' => 'google.sk', 271 'Slovenia' => 'google.si', 272 'Solomon Islands' => 'google.com.sb', 273 'Somalia' => 'google.so', 274 'South Africa' => 'google.co.za', 275 'South Korea' => 'google.co.kr', 276 'Spain' => 'google.es', 277 'Sri Lanka' => 'google.lk', 278 'Sweden' => 'google.se', 279 'Switzerland' => 'google.ch', 280 'São Tomé and Príncipe' => 'google.st', 281 'Taiwan' => 'google.com.tw', 282 'Tajikistan' => 'google.com.tj', 283 'Tanzania' => 'google.co.tz', 284 'Thailand' => 'google.co.th', 285 'Timor-Leste' => 'google.tl', 286 'Togo' => 'google.tg', 287 'Tokelau' => 'google.tk', 288 'Tonga' => 'google.to', 289 'Trinidad and Tobago' => 'google.tt', 290 'Tunisia' => 'google.com.tn', 291 'Tunisia' => 'google.tn', 292 'Turkey' => 'google.com.tr', 293 'Turkmenistan' => 'google.tm', 294 'Uganda' => 'google.co.ug', 295 'Ukraine' => 'google.com.ua', 296 'United Arab Emirates' => 'google.ae', 297 'United Kingdom' => 'google.co.uk', 298 'United States Virgin Islands' => 'google.co.vi', 299 'United States' => 'google.us', 300 'Uruguay' => 'google.com.uy', 301 'Uzbekistan' => 'google.co.uz', 302 'Vanuatu' => 'google.vu', 303 'Venezuela' => 'google.co.ve', 304 'Vietnam' => 'google.com.vn', 305 'Zambia' => 'google.co.zm', 306 'Zimbabwe' => 'google.co.zw', 307 ]; 308 309 print( "\t<p>\n\t\t<label for='" . $this->get_field_id("title") . "'>" ); _e( "Title:" ); 310 print( "\n\t\t\t<input class='widefat' id='" . $this->get_field_id('title') . "' name='" ); 311 print( $this->get_field_name( 'title' ) . "' type='text' value='" . $title ); 312 print( "' />\n\t\t</label>\n\t\t<em>Leave blank for no title</em>\n\t</p>\n" ); 313 314 print( "\t<p>\n\t\t<label for='" . $this->get_field_id( "isbn" ) . "'>" ); _e( "ISBN:" ); 315 print( "\n\t\t\t<input class='widefat' id='" . $this->get_field_id( 'isbn' ) . "' name='" ); 316 print( $this->get_field_name( "isbn" ) . "' type='text' value='" . $isbn . "' />\n\t\t</label>\n\t</p>\n" ); 317 318 print( "\t<p>\n" ); 319 print( "\t\t<input class='checkbox' type='checkbox' " . $internalcss ); 320 print( " id='" . $this->get_field_id( "internalcss" ) . "' name='" . $this->get_field_name( "internalcss" ) . "'/>\n" ); 321 print( "\t\t<label for='" . $this->get_field_id( "internalcss" ) . "'>" ); _e( "Pad the Image" ); 322 print( "\n\t\t<br />\n" ); 323 print( "\t\t<input class='checkbox' type='checkbox' " . $boxshadow ); 324 print( " id='" . $this->get_field_id( "boxshadow" ) . "' name='" . $this->get_field_name( "boxshadow" ) . "'/>\n" ); 325 print( "\t\t<label for='" . $this->get_field_id( "boxshadow" ) . "'>" ); _e( "Display a Box-Shadow" ); 326 print( "</label>\n\t</p>\n" ); 327 328 print( "\t<p>\n" ); 329 _e( "Choose Alternate Google Country" ); 330 print( "\t\t<select class='select' type='select' id='" . $this->get_field_id( "domain" ) . "' name='" . $this->get_field_name( "domain" ) . "'>\n"); 331 foreach ( $googledomains as $country => $domain ) { 332 if ( $domain == $activedom ) 333 print( "\t\t\t<option value='$domain' selected>$country</option>\n" ); 334 else 335 print( "\t\t\t<option value='$domain'>$country</option>\n" ); 336 } 337 print( "\t\t</select>\n"); 338 print( "\t\t<br /><em>Please change if your audience gets a Google '500' error</em>\n\t</p>\n" ); 339 } 113 340 } 114 341 115 342 // 116 // register CurrentlyReading widget343 // register CurrentlyReading widget 117 344 // 118 add_action('widgets_init', create_function('', 'return register_widget( "CurrentlyReading" );')); 345 add_action( 'widgets_init', create_function( '', 'return register_widget( "CurrentlyReading" );' )); 346 add_action( 'admin_menu', 'currently_reading_menu' ); 347 348 function currently_reading_menu() { 349 add_options_page( 'Currently Reading', 'Currently Reading', 'manage_options', "CurrentlyReading.php", "CurrentlyReading->form" ); 350 } 351 ?> -
currently-reading/trunk/readme.txt
r1143052 r1156521 3 3 Tags: books, read, reading, admin, administration, jadb 4 4 Requires at least: 2.8 5 Tested up to: 4.2 5 Tested up to: 4.2.2 6 6 Stable tag: trunk 7 7 … … 9 9 10 10 == Description == 11 Supplying an [ISBN](http://en.wikipedia.org/wiki/International_Standard_Book_Number) (and, optionally, a Title) will display a cover image of the relevant book with a link to that book's page on [Google Books](http://http://books.google.com/) .11 Supplying an [ISBN](http://en.wikipedia.org/wiki/International_Standard_Book_Number) (and, optionally, a Title) will display a cover image of the relevant book with a link to that book's page on [Google Books](http://http://books.google.com/) using the Google Books API. 12 12 13 13 Using the Widget you can choose whether to: … … 44 44 45 45 1. The Configuration of a "Currently Reading" section, with the "UL" marker suppressed. 46 2. Multiple Widgets, the first marking them as "Recently Read". 47 3. The previous configuration as rendered by Chrome. 46 2. Multiple Widgets, the first marking them as "Finished Reading". 47 3. The previous configuration as rendered by Safari. 48 4. The difference between Padding and Box-Shadow Enabled and Disabled. 48 49 49 50 == Changelog == … … 72 73 73 74 * Moved to a '<div>' based layout instead of using Lists (Kudos to James Sumners for the suggestion) 75 76 = 3.4 = 77 78 * Minor fixes to ensure WordPress compatibility 79 80 = 4.0 = 81 82 * Use the Google Books API instead of previous deep-linking 83 * Fix display of ISBN when updating the widget 84 * Allow the selection of Alternate Google Domains (books.google.com causes issues in some countries) 85 * Display book's Title instead of ISBN on mouse-over
Note: See TracChangeset
for help on using the changeset viewer.