Subscriber-Only Content; You must be a PW subscriber to access the Table-of-Contents Database.

Subscribers can click the "login" button below to access the Table-of-Contents Database. (If you have not done so already, you will need to set up your digital access by going here.)

Or for immediate access you can click the "subscribe" link below.

PW “All Access” site license members have access to PW’s subscriber-only website content. Simply close and relaunch your preferred browser to log-in. To find out more about PW’s site license subscription options please email: pw@pubservice.com.

If you have questions or need assistance setting up your account please email pw@pubservice.com or call 1-800-278-2991 (U.S.) or 1-818-487-2069 (all other countries) , Monday-Friday between 5am and 5pm Pacific time for assistance.

For any other questions about PublshersWeekly.com, email service@publishersweekly.com.

Login or

The Purple Cloud Project

Adolfo E. Ramirez. Sands (Midpoint, U.S. dist.; Fitzhenry & Whiteside, Canadian dist.), $17.99 trade paper (292p) ISBN 978-1-988281-01-8

In Ramirez’s derivative and meandering debut novel, the mysterious invaders sweeping across the Earth have no interest in communicating with their victims. Their focus is conquest and extermination. Conventional weapons mean nothing against the enemy because no human has ever seen an enemy to shoot at. Human technology proves all too vulnerable. Forays against the invaders end in abject defeat. Faced with an unbeatable foe, Cpl. Christopher Denmark and other soldiers focus on the struggle to survive each battle, not on long-term goals. As Denmark’s dwindling pool of allies could attest, it does not seem like there is a future for pitiful humankind. The author fails to make his work stand out from the legion of other alien invasion books. Endless battle sequences do not compensate for the lack of characterization, polished prose, or coherent narrative. The violent work’s patina of environmental moralizing and morose philosophizing cannot distract from its essential emptiness. There is not one element that has not been done before and better. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
The Shadow Crucible: The Blind God, Book 1

T.M. Lakomy. SelectBooks, $18.95 trade paper (400p) ISBN 978-1-59079-414-2

Echoing classic gothic works, this lurid stew of a novel mixes in too many elements in search of a transcendent spiritual touch. Estella, a fosterling of the Twilit people disguised as the daughter of a duke in a vaguely premodern London, possesses preternatural second sight. Count Mikhail, a Templar from “east of the Frankish kingdoms,” is led to her manor home and tries to win her to his side in the battle against Samael, the Blind God. Unfortunately, his superior, Cardinal Pious, falls to Lucifer, while England’s King Wulfric is beholden to Samael. Estella, sought by all factions and aided by a fallen angel, makes numerous escapes as Mikhail tries to hold the forces of good together. There are also elves. Debut novelist Lakomy name-checks a broad variety of gods (Lug, Zeus, Odin, Horus, the Sophia, the Norns) and beliefs (divination, purgatory, reincarnation) and employs an archaic vocabulary (characters never see when they can “descry” or “distinguish”), but the effect is more jumbled mix-up than enlightening mash-up. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
Nebula Awards Showcase 2017

Edited by Julie E. Czerneda. Pyr, $18 trade paperback (320p) ISBN 978-1-63388-271-3

This compilation of Nebula Award–nominated and –winning fiction from 2016 is indispensable reading for anyone interested in fantastic fiction. The three short-fiction winners show the breadth of themes and ideas and the sheer creativity of the genre’s leading writers. Alyssa Wong’s “Hungry Daughters of Starving Mothers” is an unsettling tale of horror and also a haunting love story. Sarah Pinsker’s novelette “Our Lady of the Open Road” is a rumination on artistic integrity in a near future in which canned StageHolos are stifling the future of live musical performance. Nnedi Okorafor’s exceptional novella “Binti” explores cultural tribalism as humans and extraterrestrials face off. In addition to all six nominated short stories, the anthology includes excerpts from all six nominated novels, two Rhysling Award–winning poems, and tributes by Betsy Wollheim for C.J. Cherryh (winner of the Damon Knight Memorial Grand Master Award) and by Michelle Sagara for Terry Pratchett (posthumous winner of the Kate Wilhelm Solstice Award). Czerneda has curated a sterling collection of outstanding work. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
Deadmen Walking

Sherrilyn Kenyon. Tor, $27.99 (384p) ISBN 978-0-7653-8568-0

Kenyon (Born of Legend) puts the lie to the old adage “Dead men tell no tales” in the jam-packed, appealing first book of her Deadman’s Cross historical fantasy series. In 1716 Jamaica, Devyl Bane is a man of many names: “Captain” to his crew of misbegotten miscreants; “Du” to Marcelina, the woman who literally is his ship; and Don-Dueli, his given name. All of them are monikers for a damned man in charge of a dead crew who are charged with earning redemption by killing demons and protecting the innocent. Cameron Jack finds Devyl in a dockside town and begs him to help her find her brother, Paden, a missing ship’s captain who’s presumed dead; Devyl agrees, beginning an epic adventure to save Paden and keep humankind’s nightmares locked away. Marcelina’s twisted sister, Vine—who’s also Devyl’s ex-wife—is leading the charge against Devyl and his crew; to find Paden, they must find Vine’s hidden, crumbling prison and challenge her growing power. This piratical tale is very heavily front-loaded with worldbuilding information, including a panoply of pantheons, but there’s still room for swashbuckling, death, glory, and just the tiniest hint of romance. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
Greedy Pigs: A Sin Du Jour Affair

Matt Wallace. Tor.com, $2.99 e-book (224p) ISBN 978-0-7653-9319-7

In the fun fifth novella featuring Sin du Jour, these caterers to the otherworldly are preparing for the inauguration of Enzo Consoné, the president-elect of the Sceadu, the supernatural governing body. It’s going to be a great big party with an all-pork theme. The team is ready to get back to normal after the male members of the crew were struck by a lust spell in Pride’s Spell, but chef Lena Tarr’s best friend, Darren Vargas, who has been trying to conquer his debilitating fear, is acting strangely. When the team members get separated en route to the Virginia woods, Lena and head chef Bronko’s half of the crew is diverted to the D.C. inauguration of the U.S. president. The others scramble to make do, but things inevitably go poorly in Virginia, and sweet-natured baker Nikki must step up to save the day. In D.C., Lena discovers the outrageous truth behind the American presidency, a twist that hits uncomfortably close to home; a cameo from the outgoing president is a poignant, bittersweet touch. Wallace’s imagination is boundless, and his wryly funny storytelling manages to be heartfelt and completely gonzo at the same time. Agent: DongWon Song, Howard Morhaim Literary. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
Haunted Futures

Edited by Salomé Jones. Ghostwoods, $14.99 trade paper (264p) ISBN 978-0-9576271-8-5

Jones has compiled a fascinating collection of 15 stories that explore the connections between the living and the dead. The portrayals of both near and distant futures show a wide variety of focuses, such as using technology to communicate with the dead (as in Warren Ellis’s “Ghostmakers” and Tricia Sullivan’s “The Psychometry of Tuvan Currency”) or grappling with the emotional reverberations of someone’s death or disappearance. The most touching stories bookend the collection: in Felicity Shoulder’s “You’re Welcome,” an empty-nester couple try to piece together their college-aged daughter’s disappearance from her online orders, and in Jeff Noon’s “Mercury Teardrops,” a musician attempts to come to terms with his cyborg girlfriend’s death. Contemporary social issues are also tackled, as in the outstanding “Split Shadow” by S.L. Huang, an essential portrayal of mental health attitudes and treatment. There is an entry for every speculative genre, including space exploration (Gethin A. Lynes’s “Remember the Sky”), Lovecraftian horror (Lynnea Glasser’s “Guardian of the Gate”), and postapocalyptic feminism (Pete Rawlik’s “Retirement Plan”), and each story lives up to or exceeds its genre’s expectations. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
The Empire’s Ghost

Isabelle Steiger. St. Martin’s/Dunne, $25.99 (432p) ISBN 978-1-250-08848-2

Steiger’s enjoyable epic fantasy debut weaves in and out of the lives of people on all sides of the struggle to determine the destiny of a continent. A tavern kitchen boy and his friends accidentally get tangled in the affairs of Emperor Elgar, who’s trying to decide whether to turn his conquering ambitions on the kingdom of Reglay or the country of Esthrades. The boy king of Reglay seeks allies, and the marquise of Esthrades seeks power in more arcane ways, which leads her principal servant, Seren Almasy, into a chance encounter with the hapless protagonist. Steiger handles a complex plot and a multitude of viewpoints neatly and well. Revelations about the world and the characters are placed at suspenseful intervals, and the story raises many interesting questions that remain unanswered. Unfortunately, this series launch has no conclusion of its own but simply stops, and most of it is spent setting up events and revelations that readers will have no opportunity to experience until the next book is published. Steiger’s talent does make this less frustrating overall than it otherwise might be, but the lack of emotional payoff in this installment is very noticeable. Agent: Thomas Flannery Jr., AGI Vigliano. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
The Boy on the Bridge

M.R. Carey. Orbit, $26 (400p) ISBN 978-0-316-30033-9

Plausible science and solid prose and characterization elevate this dystopian thriller above similar works. In the same alternate future as Carey’s The Girl with All the Gifts, a fungus, Cordyceps, which began as an insect parasite, has infected people, repurposing their brains and turning them into “hungries,” mindless creatures with an appetite for human flesh. Carey moves quickly to engage readers’ sympathies for epidemiologist Samrina Khan, one of a group of scientists and soldiers on a research mission. They travel through the U.K. in a motor home, on a desperate quest for an inhibitor that could make people resistant to the fungus. In the midst of the devastating horror the world has become, Samrina learns that she is pregnant, news she considers “a high tide of wonder and dismay and disbelief and misery in which hope bobs like a lifeboat cut adrift.” This development radically complicates things for her, and her colleagues, as the plot builds to a satisfying conclusion. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
Vanguard

Jack Campbell. Ace, $27 (336p) ISBN 978-1-101-98834-3

Launching a trilogy in his Lost Fleet universe, the always reliable Campbell delivers an exciting tale of interstellar adventure. Robert Geary is a colonist on a newly established world, seeking an opportunity for a new beginning. The colony council is completely unprepared for the cold reality of their new system’s distance from the protection afforded by Old Earth. When the inhabitants of a neighboring star system make an attempt at extortion, Robert is the only colonist with the skills to lead a defense force. With other systems falling prey to similar attacks, Robert’s settlement must stand firm or perish unremembered. Campbell’s skillfully constructed tale keeps a riveting pace, making each character’s personal stakes into fundamental threads woven into a high-energy whole. The conclusion is well-earned and satisfying, leaving readers eager for the next volume in this saga. Agent: Joshua Bilmes, JABberwocky Literary. (May)

Reviewed on 03/24/2017 | Details & Permalink

show more
Only the Dead Know Brooklyn

Chris Vola. St. Martin’s/Dunne, $25.99 (304p) ISBN 978-1-250-07907-7

Those who have read other books about vampires living in secret in the modern world are likely to find this unengaging supernatural thriller too familiar. Ryan Driggs, who passes for human, is actually an undead supersoldier who was created through a “genetic loophole” to protect a Native American tribe. He has not physically aged in almost a century and can only digest human blood. If he crosses the boundaries of his tribe’s former territory—now known as Brooklyn—he’ll become mortal. That restriction causes problems in his relationship with his current girlfriend, who can’t understand why he won’t spend time with her in Manhattan. Ryan has more serious issues to deal with as well, as the surviving members of his tribe are being identified and hunted down. There are some nice touches, such as Ryan connecting with willing blood donors on Craigslist, but they aren’t enough to sustain interest. (June)

Reviewed on 03/24/2017 | Details & Permalink

show more
X
Stay ahead with
Tip Sheet!
Free newsletter: the hottest new books, features and more
X
X
X
Email Address

Password

Log In Lost Password

Parts of this site are only available to paying PW subscribers. Subscribers: to set up your digital access click here.

To subscribe, click here.

PW “All Access” site license members have access to PW’s subscriber-only website content. Simply close and relaunch your preferred browser to log-in. To find out more about PW’s site license subscription options please email: pw@pubservice.com.

If you have questions or need assistance setting up your account please email pw@pubservice.com or call 1-800-278-2991 (U.S.) or 1-818-487-2069 (all other countries), Monday-Friday between 5am and 5pm Pacific time for assistance.

Not Registered? Click here.
EVAL ERROR: syntax error at (eval 1925) line 207, near ""Read more about "$ENV"
Global symbol "$author" requires explicit package name at (eval 1925) line 207.
Global symbol "$html_title" requires explicit package name at (eval 1925) line 211.
Global symbol "$html_title" requires explicit package name at (eval 1925) line 211.
Global symbol "$default_title" requires explicit package name at (eval 1925) line 211.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 212.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 212.
Global symbol "$default_description" requires explicit package name at (eval 1925) line 212.
Global symbol "$meta_keywords" requires explicit package name at (eval 1925) line 213.
Global symbol "$meta_keywords" requires explicit package name at (eval 1925) line 213.
Global symbol "$default_keywords" requires explicit package name at (eval 1925) line 213.
Global symbol "$html_title" requires explicit package name at (eval 1925) line 215.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 216.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 217.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 218.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 219.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 220.
Global symbol "$twitter_description" requires explicit package name at (eval 1925) line 221.
Global symbol "$twitter_description" requires explicit package name at (eval 1925) line 222.
Global symbol "$twitter_description" requires explicit package name at (eval 1925) line 223.
Global symbol "$twitter_description" requires explicit package name at (eval 1925) line 224.
Global symbol "$meta_keywords" requires explicit package name at (eval 1925) line 225.
Global symbol "$html_title" requires explicit package name at (eval 1925) line 227.
Global symbol "$meta_keywords" requires explicit package name at (eval 1925) line 228.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 229.
Global symbol "$last_modified" requires explicit package name at (eval 1925) line 230.
Global symbol "$last_modified" requires explicit package name at (eval 1925) line 231.
Global symbol "$html_title" requires explicit package name at (eval 1925) line 234.
Global symbol "$default_image" requires explicit package name at (eval 1925) line 235.
Global symbol "$meta_description" requires explicit package name at (eval 1925) line 236.
Global symbol "$twitter_creator" requires explicit package name at (eval 1925) line 241.
Global symbol "$twitter_creator" requires explicit package name at (eval 1925) line 242.
Global symbol "$twitter_title" requires explicit package name at (eval 1925) line 244.
Global symbol "$twitter_description" requires explicit package name at (eval 1925) line 245.
Global symbol "$default_image" requires explicit package name at (eval 1925) line 246.
syntax error at (eval 1925) line 260, near "}
 }"
(eval 1925) has too many errors.

Code:
line 1: package tmpevalpackage;
line 2: sub doEval { 
line 3: 	my(@sel,%data,$html_title,$meta_description,$meta_keywords,$default_title,$default_description,$default_keywords,$last_modified);
line 4: 	my($twitter_creator,$twitter_title,$twitter_description);
line 5: 	
line 6: 	$default_title = 'Book Reviews, Bestselling Books & Publishing Business News | Publishers Weekly';
line 7: 	$default_keywords = 'book news, book reviews, bestselling books, book bestsellers, book publishing, best selling books, list of books, book business, publishing business';
line 8: 	$default_description = 'Publishers Weekly is the international news website of book publishing and bookselling including business news, reviews, bestseller lists, commentaries and more.';
line 9: 	
line 10: 	my $default_image = "http://www.publishersweekly.com/images/data/IMG/img/000/000/1-3.PNG";
line 11: 	
line 12: 	# try the topic (or subtopic)
line 13: 	if($LayoutManager::url_resolved_values{'TOPIC_TREE.nickname'}) {
line 14: 		&Database::GetParentRow($LayoutManager::url_resolved_values{'TOPIC_TREE.nickname'},\%data);
line 15: 		if($data{'html_title'}) { $html_title = $data{'html_title'}; };
line 16: 		if($data{'meta_description'}) { $meta_description = $data{'meta_description'}; };
line 17: 		if($data{'meta_keywords'}) { $meta_keywords = $data{'meta_keywords'}; };
line 18: 
line 19: 		# we are in a subtopic get the topic and fill in missing fields
line 20: 		if($LayoutManager::url_values{'TOPIC'}) { 
line 21: 			&Database::Select('TOPIC_TREE','nickname',$LayoutManager::url_values{'TOPIC'},\@sel);
line 22: 			if(@sel == 1) {
line 23: 				&Database::GetRow($sel[0],'TOPIC_TREE',\%data);
line 24: 				if($data{'html_title'} && !$html_title) { $html_title = $data{'html_title'}; }
line 25: 				if($data{'meta_description'} && !$meta_description) { $meta_description = $data{'meta_description'}; }
line 26: 				if($data{'meta_keywords'} && !$meta_keywords) { $meta_keywords = $data{'meta_keywords'}; }
line 27: 			}
line 28: 		}
line 29: 	}
line 30: 
line 31: 	# fill in missing info from page
line 32: 	if($LayoutManager::url_resolved_values{'PAGE.description'}) {
line 33: 		&Database::GetParentRow($LayoutManager::url_resolved_values{'PAGE.description'},\%data);
line 34: 		if(!$html_title) { $html_title = $data{'html_title'}; };
line 35: 		if(!$meta_description) { $meta_description = $data{'meta_description'}; };
line 36: 		if(!$meta_keywords) { $meta_keywords = $data{'meta_keywords'}; };
line 37: 	}
line 38: 	
line 39: 	# article takes precidence over topic and subtopic
line 40: 	if($LayoutManager::url_resolved_values{'ARTICLE.nickname'}) {
line 41: 		&Database::GetParentRow($LayoutManager::url_resolved_values{'ARTICLE.nickname'},\%data);
line 42: 		$html_title = $data{'headline'};
line 43: 		if($data{'title_web'}) { $html_title = $data{'title_web'}; $twitter_title = $data{'title_web'}; };
line 44: 		if($data{'html_title'}) { $html_title = $data{'html_title'}; };
line 45: 		if($data{'abstract_web'}) { $meta_description = $data{'abstract_web'}; $twitter_description = $data{'abstract_web'}; };
line 46: 		if($data{'meta_description'}) { $meta_description = $data{'meta_description'}; };
line 47: 		if($data{'meta_keywords'}) { $meta_keywords = $data{'meta_keywords'}; };
line 48: 		$last_modified = &GetLastModified($data{'pub_date'});
line 49: 		
line 50: 		my($canonical,%topic_data,%sub_topic_data,%issue_data);
line 51: 		if($data{'the_topic'}) {
line 52: 			&Database::GetRow($data{'the_topic'},'TOPIC_TREE',\%sub_topic_data);
line 53: 			&Database::GetParentRow($sub_topic_data{'parent'},\%topic_data);
line 54: 			$canonical = "http://www.publishersweekly.com/pw/by-topic/$topic_data{'nickname'}/$sub_topic_data{'nickname'}/article/$data{'nickname'}.html";
line 55: 		}
line 56: 		else {
line 57: 			if($data{'issue'}) {
line 58: 				&Database::GetRow($data{'issue'},'ISSUE',\%issue_data);
line 59: 				$canonical = "http://www.publishersweekly.com/pw/print/$issue_data{'date'}/$data{'nickname'}.html";
line 60: 			}
line 61: 		}
line 62: 		if($data{'the_photo'}) {
line 63: 			my(%image_data);
line 64: 			&Database::GetRow($data{'the_photo'},'ARTICLE_PHOTO',\%image_data);
line 65: 			if($image_data{'photo__file'}) {
line 66: 				$default_image = "http://www.publishersweekly.com/images/data/$image_data{'photo__file'}";
line 67: 			}
line 68: 		}
line 69: 		if($canonical) {
line 70: 			&Templates::SetMeta("<link rel=\"canonical\" href=\"$canonical\" />");
line 71: 		}
line 72: 	}
line 73: 
line 74: 	# reviews by ISBN
line 75: 	if($LayoutManager::url_values{'ISBN'}) {
line 76: 		my($isbn,@sel,$work,%issue_data);
line 77: 		$isbn = $LayoutManager::url_values{'ISBN'};
line 78: 		
line 79: 		$isbn =~ s/\-//g;
line 80: 		$default_image = "https://booklife.com/image-factory/http/localhost/amazongetcover/$isbn.jpg/w204.jpg";
line 81: 
line 82: 		&Database::Select('WORK_INSTANCE','isbn_std',$isbn,\@sel);
line 83: 
line 84: 		if(@sel) {
line 85: 			$work = $sel[0];
line 86: 			@sel = ();
line 87: 			&Database::Select('REVIEW','book',$work,\@sel);
line 88: 			
line 89: 			# my $root = "images/cached/INGRAM";
line 90: 			# my $row_path = $isbn;
line 91: 			# $row_path =~ s/^(...)(...)(...)(.*)/$1\/$2\/$3/;
line 92: 
line 93: 			# if(-e "/disk02/PW/htdocs/$root/$row_path/$isbn\.jpg"){
line 94: 			#	 $default_image = "http://www.publishersweekly.com/$root/$row_path/$isbn\.jpg";
line 95: 			# }
line 96: 			
line 97: 			if(@sel) {
line 98: 				&Database::FetchRow($sel[0],'REVIEW',\%data);
line 99: 				my($tmp) = $data{'info_line'};
line 100: 				$tmp =~ s/<[^>]+>//g;
line 101: 				$html_title = "$data{'category'} Book Review: $data{'title'} by $tmp";
line 102: 				$meta_description = substr($data{'body'},0,200);
line 103: 				if($data{'pub_date'}) {
line 104: 					$last_modified = &GetLastModified($data{'pub_date'});
line 105: 				}
line 106: 				else {
line 107: 					&Database::GetRow($data{'issue-UNRESOLVED'},'ISSUE',\%issue_data);
line 108: 					$last_modified = &GetLastModified($issue_data{'date'});
line 109: 				}
line 110: 
line 111: 				$twitter_creator = '@publisherswkly';
line 112: 				$twitter_title = $data{'title'};
line 113: 				$twitter_description = $meta_description;
line 114: 			}
line 115: 		}
line 116: 	}
line 117: 	
line 118: 	# reviews
line 119: 	if($LayoutManager::url_resolved_rows{'REVIEW.nickname'}) {
line 120: 		my(%issue_data);
line 121: 		&Database::FetchRow($LayoutManager::url_resolved_rows{'REVIEW.nickname'},'REVIEW',\%data);
line 122: 		my($tmp) = $data{'info_line'};
line 123: 		$tmp =~ s/<[^>]+>//g;
line 124: 		$html_title = "$data{'category'} Review: $data{'title'} by $tmp";
line 125: 		$meta_description = substr($data{'body'},0,200);
line 126: 		
line 127: 		$twitter_creator = '@publisherswkly';
line 128: 		$twitter_title = $data{'title'};
line 129: 		$twitter_description = $meta_description;
line 130: 		
line 131: 		if($data{'pub_date'}) {
line 132: 			$last_modified = &GetLastModified($data{'pub_date'});
line 133: 		}
line 134: 		else {
line 135: 			&Database::GetRow($data{'issue-UNRESOLVED'},'ISSUE',\%issue_data);
line 136: 			$last_modified = &GetLastModified($issue_data{'date'});
line 137: 		}
line 138: 
line 139: 		if($data{'book-UNRESOLVED'}){
line 140: 			my (%instance_data);
line 141: 			&Database::GetRow($data{'book-UNRESOLVED'},'WORK_INSTANCE',\%instance_data);
line 142: 			
line 143: 			my $tmpisbn = $instance_data{'isbn_std'};
line 144: 			$tmpisbn =~ s/\-//g;
line 145: 			$default_image = "https://booklife.com/image-factory/http/localhost/amazongetcover/$tmpisbn.jpg/w204.jpg";
line 146: 
line 147: 			# my $root = "images/cached/INGRAM";
line 148: 			# my $row_path = $instance_data{'isbn_std'};
line 149: 			# $row_path =~ s/^(...)(...)(...)(.*)/$1\/$2\/$3/;
line 150: 	
line 151: 			# if(-e "/disk02/PW/htdocs/$root/$row_path/$instance_data{'isbn_std'}\.jpg"){
line 152: 			# 	$default_image = "http://www.publishersweekly.com/$root/$row_path/$instance_data{'isbn_std'}\.jpg";
line 153: 			# }
line 154: 		}
line 155: 	}
line 156: 
line 157: 	if($Templates::in{'channel'} && $Templates::in{'podcast'}) {
line 158: 		my(%podcast_data);
line 159: 		&Database::GetRow($Templates::in{'podcast'},'PODCAST',\%podcast_data);
line 160: 		$html_title = $podcast_data{'title'};
line 161: 		if($podcast_data{'description'}) { $meta_description = $podcast_data{'description'}; }
line 162: 		if($podcast_data{'image__file'}) {
line 163: 			$default_image = "http://www.publishersweekly.com/images/data/$podcast_data{'image__file'}";
line 164: 		}
line 165: 		$last_modified = &GetLastModified($podcast_data{'date_posted'});
line 166: 	}
line 167: 	
line 168: 	if($Templates::path =~ /\/bookit\//) {
line 169: 		if($Templates::in{'record'}) {
line 170: 			my(%data);
line 171: 			&Database::GetRow($Templates::in{'record'},'MARKETING_CALL',\%data);
line 172: 			$html_title = "$data{'headline'} | Publishers Weekly";
line 173: 		}
line 174: 		else {
line 175: 			$html_title = "BookIt | Publishers Weekly";	
line 176: 		}
line 177: 	}
line 178: 	if($Templates::path =~ /\/newsbrief\//) {
line 179: 		if($Templates::in{'record'}) {
line 180: 			my(%data);
line 181: 			&Database::GetRow($Templates::in{'record'},'NEWS_BRIEFS',\%data);
line 182: 			$html_title = "$data{'headline'}";
line 183: 			$twitter_title = "$data{'headline'}";
line 184: 			$meta_description = "$data{'abstract'}";
line 185: 			$twitter_description = "$data{'abstract'}";
line 186: 			if($data{'image__file'}) {
line 187: 				$default_image = "http://www.publishersweekly.com/images/data/$data{'image__file'}";
line 188: 			}
line 189: 		}
line 190: 		else {
line 191: 			$html_title = "BookIt | Publishers Weekly";	
line 192: 		}
line 193: 	}
line 194: 
line 195: 	if($Templates::path =~ /\/charlie\//) {
line 196: 			$html_title = "Publishers Weekly's Tribute to Freedom of Expression";
line 197: 			$twitter_title = "Publishers Weekly's Tribute to Freedom of Expression";
line 198: 			$meta_description = "Find out how to participate in a special section of the January 19 issue of Publishers Weekly and raise money for international nonprofits dedicated to freedom of expression.";
line 199: 			$twitter_description = "Find out how to participate in a special section of the January 19 issue of Publishers Weekly and raise money for international nonprofits dedicated to freedom of expression.";
line 200: 	}
line 201: 	
line 202: 	if($Templates::path =~ /\/authorpage\//) {
line 203: 		my $author = $LayoutManager::url_values{'AUTHORNAME'};
line 204: 		$author =~ s/-/ /g;
line 205: 		$author =~ s/([\w']+)/\u\L$1/g;
line 206: 		$html_title = "Books by $author and Complete Book Reviews";
line 207: 		$meta_description = "Read more about "" and other books by $author";
line 208: 	}
line 209: 
line 210: 	# use defailts is nothing else found
line 211: 	if(!$html_title) { $html_title = $default_title; };
line 212: 	if(!$meta_description) { $meta_description = $default_description; };
line 213: 	if(!$meta_keywords) { $meta_keywords = $default_keywords; };
line 214: 	
line 215: 	$html_title =~ s/\"//g;
line 216: 	$meta_description =~ s/\"//g;
line 217: 	$meta_description =~ s/<\/[^>]*>//g;
line 218: 	$meta_description =~ s/<[^>]*>//g;
line 219: 	$meta_description =~ s/<\/[^>]*//g;
line 220: 	$meta_description =~ s/<[^>]*//g;
line 221: 	$twitter_description =~ s/<\/[^>]*>//g;		
line 222: 	$twitter_description =~ s/<[^>]*>//g;
line 223: 	$twitter_description =~ s/<\/[^>]*//g;		
line 224: 	$twitter_description =~ s/<[^>]*//g;		
line 225: 	$meta_keywords =~ s/\"//g;
line 226: 	
line 227: 	&Templates::SetTitle($html_title);
line 228: 	&Templates::SetMeta("<meta name=\"keywords\" content=\"$meta_keywords\">");
line 229: 	&Templates::SetMeta("<meta name=\"description\" content=\"$meta_description\">");
line 230: 	if($last_modified) {
line 231: 		&Templates::SetMeta("<meta http-equiv=\"last-modified\" content=\"$last_modified\">");	
line 232: 	}
line 233: 	&Templates::SetMeta("<meta property=\"og:type\" content=\"article\"/>"); 
line 234: 	&Templates::SetMeta("<meta property=\"og:title\" content=\"$html_title\"/>"); 
line 235: 	&Templates::SetMeta("<meta property=\"og:image\" content=\"$default_image\"/>"); 
line 236: 	&Templates::SetMeta("<meta property=\"og:description\" content=\"$meta_description\"/>");
line 237: 	&Templates::SetMeta("<meta property=\"og:site_name\" content=\"PublishersWeekly.com\"/>"); 
line 238: 
line 239: 	&Templates::SetMeta("<meta name=\"twitter:card\" content=\"summary\"/>");		
line 240: 	&Templates::SetMeta("<meta name=\"twitter:site\" content=\"\@publisherswkly\"/>");		
line 241: 	if($twitter_creator){
line 242: 		&Templates::SetMeta("<meta name=\"twitter:creator\" content=\"$twitter_creator\"/>");			
line 243: 	}
line 244: 	&Templates::SetMeta("<meta name=\"twitter:title\" content=\"$twitter_title\"/>");
line 245: 	&Templates::SetMeta("<meta name=\"twitter:description\" content=\"$twitter_description\"/>");			
line 246: 	&Templates::SetMeta("<meta name=\"twitter:image\" content=\"$default_image\"/>"); 
line 247: 
line 248: 	
line 249: 	sub GetLastModified {
line 250: 		my($timestamp) = @_;
line 251: 		
line 252: 		my($mod);
line 253: 		
line 254: 		if(length($timestamp > 8)) {
line 255: 			$mod = substr($timestamp,0,4) . '-' . substr($timestamp,4,2) . '-' . substr($timestamp,6,2);
line 256: 		}
line 257: 		
line 258: 		return $mod;
line 259: 	}
line 260:  };
line 261: &doEval();
line 262: 1;