wp/bibliography.html0000644000106600010660000015227411075151276012005 0ustar Bibliography - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Bibliography | Joe Nick Patoski

Each year is organized alphabetically by article name.

2007 |2006 |2005 |2004 | 2003 | 2002 | 2001 |2000 | 1999 | 1997 | 1995

2008

  • Willie Nelson: An Epic Life The book is in many ways the culmination of my writings about music, Texas, and Texans. [Little, Brown & Company, April 2008] Order the book from Amazon here.
  • "Big time in Cowtown" In 1965, Willie Nelson came home to Panther Hall, a country-music oasis deep in the heart of Cowtown, to record a live album his way [Fort Worth Star-Telegram, April 14, 2008]
  • "Radio Days" Fort Worth was where the quest began for a hungry young musician who worked as a DJ named Willie Nelson [Fort Worth Star-Telegram, Music Feature, April 13, 2008]

2007

  • Big Bend Field Notes The author jumps over a watery passage in the Chihuahuan Desert. Two and a half million acres (one million hectares) of this desert straddle the Texas-Mexico border in a block of protected land known as El Carmen–Big Bend Transboundary Megacorridor. [National Geographic, Texas Feature, February 2007]
  • BLOG, Joe Nick's original Selina, Ladybird Johnson, Obama, Sam the Sham and more. [active 2004-2007]
  • Border Crossing in the Chihuahua Desert Cross-boundary conservation efforts secure North America's hidden wilderness. [Nature Conservancy, Winter 2007, pdf file]
  • Desolate Majesty: Preserving beauty without borders Straddling Texas and Mexico, the Big Bend region is high in biodiversity and low in footprints. It's a place so untamed that if something doesn't bite, stick, or sting, it's probably a rock. [National Geographic, Texas Feature, February 2007] Listen to National Geographic staffer Kathleen Ridgely read "Desolate Majesty: Beyond Big Bend."
  • The Great Divide Habitat destruction vs. clean fuel. Is wind power the scourge its critics claim it is? Joe Nick reports from Texas on the big brawl in the Nation's wind power capital. [The Land Report, Texas Feature, November 2007]
  • Saved by the Belle She rose from welfare mom to Nashville queen. No wonder Naomi Judd has so much to tell the world about healing, finding joy, and beating the disease that nearly took her life. [AARP The Magazine, Music Feature, May & June 2007]

2006

  • Back in Black With or without a stocking program, the black bear is returning to East Texas. [Texas Parks and Wildlife Magazine, Texas Feature, February 2006]
  • Big Bend National Park The land has many names: El Despoblado. The Empty Space on the Map. The Chisos. El Rio. La Frontera. Sky Island in a Desert Sea. The Last Frontier. For more than fifty years, the heart of it has been officially known as Big Bend National Park. [University of Texas Press, October 2006, Hardcover: 112 pages, 82 color phots, ISBN-10: 0-292-71441-6; ISBN-13: 978-0-292-71441-0]
  • The Boys with the Bands Joe Nick Patoski interviews Roland Swenson, Nick Barbaro, and Louis Black - founders of the infamous SXSW Festival. [The Texas Observer, Music Feature, March 10, 2006]
  • The Fall and Rise of Blaze Foley Mike Fuller loved his friends, drank too much, applied duct tape liberally, and was shot to death in 1989. His songs have made him a legend. [No Depression, Music Festures, September-October 2006] blog Blaze Letters
  • Fighting for Independence The Nature Conservancy, along with a few determined individuals, struggled for years to save this one-of-a-kind desert wetland. [Texas Parks and Wildlife Magazine, Water Feature, July 2006]
  • Hi Fi Nation The first time I saw High Fidelity, I thought my life story had been put on the big screen. [Southwest Spirit Magazine, Music Feature, July 2006]
  • Isles and isles of Greece Whether you crave the serenity of Syros or the merriment of Mykonos, there's a Greek island -- with fabulous food and views -- waiting for you. [The Austin American-Statesman, Travel Feature, September 10, 2006]
  • Keeping Up With Jones The King of Country Music shows us his Nashville [AARP The Magazine, Music Feature, July & August 2006]
  • Okie Dokie Stomp Clifford Antone called the tune and the world danced. [Austin Chronicle, Music Feature, May 26, 2006]
  • Park and Parcel The underfunded Texas Parks and Wildlife Department struggles to sell itself [The Texas Observer, Texas Feature, April 7, 2006]
  • Rita's Wakeup Call While the hurricane carved a path of destruction, it also helped shine a spotlight on a more insidious problem -- human impact on wetlands. [Texas Parks and Wildlife Magazine, Water Feature, July 2006]

2005

  • About Them Shoes, Hubert Sumlin [Harp Magazine, Music Review, May 2005] view article
  • And the Hot Tub Goes to . . . Austin When Mayor Will Wynn of Austin announced last December that MTV's "Real World" would be filming its 16th season in his city, he did so with the enthusiasm of a civic leader who had just persuaded a Fortune 500 company to move to his neighborhood. [The New York Times, Music Feature, June 19, 2005]
  • Far Out Far West Texas When the bumpy dirt road to this Far West Texas ghost town was coated with asphalt four years ago, Terlingua became convenient. Its days as a sleepy, unpretentious, off-the-beaten-path reinvented mining town were over. [The Texas Observer, Texas Feature, December 16, 2005]
  • Billy F Gibbons: Rock + Roll Gearhead [Austin Chronicle, Music Review, December 2, 2005] view article
  • Eliza Gilkyson The Long Way Around - extended feature. [No Depression, Music Feature, Issue No. 59 September-October 2005]
  • Grant Street, Sonny Landreth Artists [Harp Magazine, Music Review, March/April 2005] view article
  • Russell Graves: Pied Piper of Ag Science The "Home of Champions" sign in front of Childress High School refers to its National FFA Organization chapter, not the football team. One of the reasons for the agriculture program's success is that teacher Russell Graves has led his ag students out of the box...way out of the box. [Texas Co-op Power, Texas Feature, August 2005] Read the story as a PDF document using Adobe Acrobat Reader.
  • Hill Country Review: Live at Bonnaroo, North Mississippi All-Stars [Harp Magazine, Music Review, January/February 2005] view article
  • Hotel, Moby [Harp Magazine, Music Review, May 2005] view article
  • Hotwalker - Tom Russell Outsider art commands bully pulpit "I'm a frustrated writer," Tom Russell confessed to me a couple years ago. He finally did something about it. [Harp Magazine, Music Review, May 2005]
  • Katrina Mississippi Coast Report When I got the call, I agreed to help cover the hurricane with the stipulation I go to Mississippi. I was listening to Talk of the Nation on NPR and a caller complained she'd heard zero coverage about Waveland, which was in Katrina's bulls-eye. [Misc. Feature, September 8, 2005] [Katrina photos] [Listen to NPR's Day to Day (Sept. 12, 2005) "Weathering Katrina at the Log Cabin Bar".
  • Los Super Seven The Long Way Around - extended feature. [No Depression, Music Feature, Issue No. 56 March-April 2005]
  • The Only Honest Lake in Texas It looks like a winner has emerged in the struggle for Caddo Lake. [Texas Observer, Water Feature, July 8, 2005]
  • The Park That Time Forgot Boasting the world's largest spring-fed pool and a retro-cool motel, Balmorhea State Park is the great oasis of the Chihuahuan Desert. [Texas Parks and Wildlife Magazine, Water Feature, April 2005] blog Kinney Water Wars
  • Paging Dr. Frankendeer A controversy over cloned deer erupts in Texas. [Field & Stream, Texas Feature, November 30, 2005]
  • Seadrift Nation "Unreasonable Woman: A True Story of Shrimpers, Politicos, Polluters, and the Fight For Seadrift, Texas" [Texas Observer, Books and the Culture, November 04, 2005]
  • Texas Coast This beautiful book combines Laurence Parent's magnificent photographs with Joe Nick Patoski's entertaining text to create a one-of-a-kind portrait of the Texas coast. [University of Texas Press, October 2005, Hardcover: 108 pages, 68 color photos, ISBN: 029270299X]
  • Top 10 Swimming Holes [Texas Parks and Wildlife Magazine, Water Feature, July 2005]
  • The Ultimate Big Bend Hike Six days and 70 miles of aching backs, oozing blisters, lost toenails, lightning storms and unimaginable beauty. [Texas Parks and Wildlfe magazine, Travel Feature, August 2005]
  • Water Wars How growing demand, fuzzy legal rulings and plain old stubbornness have turned Kinney County into a hotbed of water politics. [Texas Parks and Wildlife Magazine, Water Feature, July 2005] blog Kinney Water Wars
  • Windblown, Kimmie Rhodes [Harp Magazine, Music Review, March/April 2005] view article
  • You Ain't Talkin' to Me: Charlie Poole and the Roots of Country Music, Charlie Poole [Harp Magazine, Music Review, June 2005] view article
2004
  • Guad is Good; Guad is Great It's the finest recreational river in Texas, but how long can it last? [Texas Parks and Wildlife Magazine, Water Feature, July 2004]
  • It's a Texas Thang - Or Is It? From the Texas Observer's 50th Anniversary issue...It was on a trip to my mother's native country of Greece that I realized there really is such a thing as Texas culture. [The Texas Observer, Texas Feature, December 3, 2004]
  • Resentments: Sunday Evening Coming Down How the Resentments rose from under-the-radar lark to become a real band with a higher place and purpose. [No Depression, Music Feature, March-April, 2004]
  • The Ride - Los Lobos When it comes to defining American music over the past quarter century, no band comes close to Los Lobos. [Harp Magazine, Music Review, September/October 2004]
  • Stay All Night - Buddy Holly's Country Roots [West Texas Roots, Music Review, July 2004]
  • Up Close and Texan Visitors for the big 'fooba' game have their own ways. So listen up, all y'all. [The Los Angeles Times, Texas Feature, December 30, 2004]
  • Walk Like Cleto H-town's Chingo Bling slings tamale beats [Austin Chronicle, Music Feature, June 11, 2004]
  • Willie Nelson How much is one picker's word worth. And whatever happened to peace on earth? [No Depression, Music Feature, September-October, 2004]
2003
  • Catching a Break: Surf City Texas It's too flat to surf the beach and not quite warm enough to chase oil tankers in the bay. [The Dallas Morning News, Water Feature]
  • Cool, clear water The sweetest pleasure of a Texas summer is the swimming hole. [The Dallas Morning News, Water Feature, August 31, 2003] plus Swimming Holes Across Texas
  • The Cult of Ray Ray Benson steps out from behind the Wheel. [Austin Chronicle, Music Feature, July 18, 2003]
  • A Force of Nature a 4-part series of articles about the Guadalupe covering issues at the headwaters around Canyon Lake to Victoria and rural areas, and on to the Gulf Coast. [San Antonio Current, Water Feature, December 4, 2003]
  • The House That Judd Built Late artist Donald Judd worked and lived at the busy corner of Mercer and Spring Streets. His building and its contents–the art collection Judd accrued over a lifetime-may soon be available for public viewing. [Time Out New York, Misc Feature, August 14-21, 2003]
  • My Obsession Joe Nick Patoski leaves this terrestrial plane -- radio plane, that is. [Austin Chronicle, Music Feature, December 19, 2003]
  • A Night at the Opry The Celeste Opry features old-fashioned jamborees with country-fried fun for the whole family. [The Dallas Morning News, October 18, 2003]
  • Pit Stops; The Best of the Best; Top Fifty Where are the best places to eat barbecue in Texas? Six years ago we published a highly subjective-and hotly debated- list of our fifty favorite joints, and now we've gone back for seconds. [Texas Monthly, Travel Feature, May 2003]
  • Pom-pom and Circumstance Why you can't spell "cheerleader" without "leader." [Texas Monthly, My Life, Texas Feature, February 2003 ]
  • The Real Texas: Caprock Canyons Trailway History pulses along the Caprock Canyons Trailway as it courses by ancient flatlands, wild canyons and authentic, old Texas towns. [Rails to Trails, Travel Feature, Winter 2003]
  • 60-Minute Man Leaving on a Jet Plane, the pop hit by Peter, Paul and Mary, may have put the romance in flying. [The Dallas Morning News, Travel Feature, October 24, 2003]
  • See the Forest of Cooperation for the Trees The first shot marking a new phase in the great American environmental war was fired last week -- in Fort Worth, of all places. But hardly anyone heard it. [Fort Worth Star-Telegram, Texas Feature, May 19, 2003]
  • Songwriter helps lead the fight against development Mr. Russell and five of his neighbors managed to reroute massive overhead power lines. [The Dallas Morning News, Music Feature, December 12, 2003]
  • Texas Water Safari: 260 miles of rowing your boat To finish the Texas Water Safari, you have to paddle nonstop in a canoe or kayak for 260 miles from Aquarena Center. [The Dallas Morning News, Water Feature, June 27, 2003]
  • A Time to Drill? Last year the feds went toe-to-toe with environmentalists over allowing natural-gas drilling on Padre Island, but neither side has scored a knockout. Here's what to expect in the next few rounds. [Texas Monthly, Texas Feature, March 2003]
2002
  • Alive and Kicking; Boot Anatomy; 25 Top Custom Bootmakers Nothing advertises your Texas bona fides more these days than a pair of handmade cowboy boots. Here's everything you need to know about them - how to tell a vamp from a pull, which toe style is right with a suit - and where to buy the best. [Texas Monthly, Texas Feature, June 2002]
  • Alternate Routes [Texas Monthly, May 2002]
  • Big Adventure Senior editor Joe Nick Patoski tells the story behind this month's cover story, "Big Bend 2002." [Texas Monthly, March 2002]
  • Big Bend 2002 Whether you want to hike it, raft it, drive it, or all of the above, here's everything you need to know to get the most out of a trip to Texas' greatest treasure. [Texas Monthly, Travel Feature, March 2002]
  • James Luther Dickinson [Austin Chronicle, Music Review, October 18, 2002]
  • Driving Music [Texas Monthly, May 2002]
  • Get Your Groove Back A new book on dance halls explains why Texans are itching to go boot-scootin'. [Texas Monthly, August 2002]
  • It's Simply a Matter of Taste For some of us, there's nothing better than a cold longneck bottle of Big Red. [Texas Monthly, March 2002]
  • The Next 25 Bootmakers More of the best bootmakers in the state. [Texas Monthly, June 2002]
  • Paper Chase Read all about it: Alpine residents win big during the town's newspaper war. [Texas Monthly, January 2002 Media]
  • Pass The Bass, Por Favor Barra Del Tordo, a jungly sanctuary on the San Rafael River. [Outside Magazine, Travel Feature, December 2002]
  • Pretty Drives [Texas Monthly, May 2002]
  • Reliant Stadium Tackling the ins and outs of Reliant Stadium. [Texas Monthly, September 2002 Reporter]
  • Rough Roads These drives are sure to get your attention. [Texas Monthly, May 2002]
  • Survival Guide Everything you need to know about getting around in Big Bend, from where to stay inside the park to where to get diesel fuel. [Texas Monthly, March 2002]
  • Touchdown! Houston kicks off with a new NFL team and a state-of-the-art stadium. [Texas Journey, Sports Feature, July/August 2002]
  • Two Towns Still Terrific A family's summer trip to Washington and New York finds unexpected enrichment in the poignant aftermath of 9-11. [San Antonio Express-News, Travel Feature, July 28, 2002]
  • Tune In, Turn On Why Grand Prarie's Bobby Patterson of KKDA-AM is my favorite deejay in Texas. [Texas Monthly, May 2002 Media]
  • Undammed and Unforgiving Why would a veteran paddler go through hell and low water to take on the last wild river? The Devils made him do it. [Texas Parks and Wildlife Magazine, Water Feature, July 2002]
  • Water Foul When the City of Marshall wanted to pump millions of gallons of water out of Caddo Lake and sell them to the highest bidder, the state said, "Sure." Residents of Karnack, Uncertain, and other tiny northeast Texas towns said, "Hell, no." [Texas Monthly, Water Feature, October 2002]
  • Water Hazard The mayor of San Antonio says a 2,600-acre golf resort on top of the Edwards Aquifer Recharge Zone won't ruin the city's sole source of drinking water. Who wants to tee off on that one? [Texas Monthly, November 2002 Environment] Prairie Dogma Birders and their allies want to preserve the vanishing grassland of the farm and ranch country west of Houston, but time is running out. [Texas Monthly, September 2002 Environment]
  • West Side Horns [Austin Chronicle, Music Review, September 13, 2002] Texas Platters
  • Which Side of the Fence Are You On? All over Texas, ranchers are putting up eight-foot fences to keep their deer from roaming so they can charge more for hunting leases. Purists say shooting such deer doesn't amount to "fair chase." [Texas Monthly, February 2002]
  • Yelapa [Texas Monthly, October 2002]
  • You Cheated [Austin Chronicle, Music Feature, November 8, 2002]
2001
  • A Ballad of the West by Bobby Bridger [Texas Monthly, March 2001]
  • Book Drive Colleyville's library plot. [Texas Monthly, April 2001 Reporter]
  • Boone Pickens Wants To Sell You His Water And you're going to need it, eventually, since Texas' most precious natural resource is being depleted at an alarming rate. His plan is to pump vast amounts from his land in the Panhandle and pipe it to parched cities like El Paso and San Antonio-for a hefty price, of course. [Texas Monthly, August 2001]
  • Laura Canales [Texas Monthly, September 2001 Culture]
  • David Clyde [Texas Monthly, September 2001 Sports]
  • Dead On Deadline Why reporters who cover the border are finding themselves more and more under the gun. [Texas Monthly, May 2001 Media]
  • Joe Dealey [Texas Monthly, September 2001 Business]
  • Distress Signal San Antonio's Clear Channel Communications may dominate Texas' airways, but the way it does business is tuning out to the best things on the radio. [Texas Monthly, November 2001 Media]
  • Extra! Extra! Bob Mong knows he's facing many challenges, and he certainly didn't ask me what I'd do if I were in charge of the Dallas Morning News. I thought I'd offer some nickel advice anyway. [Texas Monthly, August 2001]
  • 50 Things Every Texan Should Do Have you gotten lost in the Big Thicket? Attended a South Texas pachanga? [Texas Monthly, March 2001]
  • Guad Is Great Forget about the Rocky Mountains. For first-class kayaking, fishing, and bird-watching, head to the Lower Guadalupe after Labor Day, when the drunken armada of tubers retreats to shore and nature returns in full strength. [Texas Monthly, Water Feature, December 2001 Great Outdoors]
  • Hot Box Notes on notable musicians. [Texas Monthly, December 2001]
  • Liberalism Lives! In a state that's becoming more conservative, two young editors at the Texas Observer are reenergizing a magazine that won't leave the left behind. [Texas Monthly, July 2001 Media]
  • The New Guy What's the story on Bob Mong, the new editor of the The Dallas Morning News? He has a newshound's instinct, an insider's touch, and his work cut out for him. [Texas Monthly, August 2001 Media]
  • Nifty Fifty Senior editors Anne Dingus and Joe Nick Patoski tell the story behind this month's cover story, "50 Things Every Texan Should Do." [Texas Monthly, March 2001]
  • Old-Fashioned Texas Texas is changing before our eyes, but fried pies, drive-in movie theaters, and other vestiges of earlier days are all around. To find these treasures, we risked life, limb, and cholesterol count-and had a blast from the past. [Texas Monthly, August 2001]
  • On the Water Front Summer's blast furnace is firing up. Luckily, Texas is a paradise of spring-fed pools, sparkling beaches, and more. [Texas Monthly, June 2001]
  • The Original Dallas Cowboy Cheerleaders [Texas Monthly, September 2001 Texana]
  • The Reformer The El Paso mayor's race. [Texas Monthly, April 2001 Reporter]
  • Riding High McAllen's terminal condition. [Texas Monthly, April 2001 Reporter]
  • Scenes From Nowhere by Will Sexton [Texas Monthly, February 2001]
  • Talking Ed Fort Worth's horse play. [Texas Monthly, April 2001 Reporter]
  • Tall Tales Photographer Laurence Parent and senior editor Joe Nick Patoski talk about climbing, the best shot, and their new book, Texas Mountains. [Texas Monthly Interview, November 2001]
  • Texas Ranges In an excerpt from their forthcoming book, Texas Mountains, senior editor Joe Nick Patoski and freelance photographer Laurence Parent celebrate the wild beauty of the state's sierras. [Texas Monthly Feature, November 2001]
  • Tropical Paradise Jeff Henry believes his new Schlitterbahn on South Padre Island will be a success. It just might take a while-but, hey, that's okay. [Texas Monthly, July 2001]
  • True Story When one of his reporters turned up missing in Mexico, the editor of the San Antonio Express-News took on one of the most important assignments of his life. [Texas Monthly, Media, October 2001]
  • What Would Donald Judd Do? Seven years after Donald Judd's death, the residents of a cow town in far west Texas are caught in the middle of an estate war between the renowned artist's former lover and his children. [Texas Feature, July 2001]
  • The Widow's Pique In Lubbock they call her the "Spanish Yoko Ono," and Mara Elena Holly, Buddy Holly's widow, has always had a troubled relationship with his conservative hometown. Some folks rave on that it's her greed that has killed the city's Buddy Holly Music Festival. [Texas Monthly, February 2001]
  • The Wild Coast The untamed beach of Boca Chica, the birds of High Island, and the wilderness of Matagorda Island--these and other hidden treasures await you--if you know where to look. [Texas Bound, Travel Feature, May 2001]
2000
  • Angels & Outlaws What is Texas music? [Texas Monthly, May 2000 Behind the Lines]
  • Airport 2000 These days, a plane trip can entail more time in the terminal than in the air. But why get stressed when you can have a massage, taste Texas wines, go for a jog, check your e-mail-even eat gumbo while watching (other people's) planes take off? [Texas Monthly, November 2000]
  • Bigger Bend Rising high above the floor of the Chihuahuan Desert, Mexico's Museo Maderas del Carmen nature reserve is like a whole other country. Plus: information on how to visit the park. [Texas Monthly, October 2000 Travel]
  • Catfish, Carp, and Diamonds: 35 Years of Texas Blues [Texas Monthly, February 2000]
  • The Coast Explore 620 miles of fun and sun on the Texas Gulf Coast. [Texas Bound, Travel Feature, Spring/Summer 2000]
  • Contigo by La Mafia [Texas Monthly, December 2000]
  • Crashed At heart, Dewey Winburne was an educator, not an entrepreneur; he saw technology as a tool for doing good rather than doing well. Even so, he was able to survive in Austin's heady new economy - until the pressure got to him. [Texas Monthly, March 2000]
  • Environment * Steve Manning For the birds. [Texas Monthly, September 2000]
  • Executive Ranch Life around the town of Crawford sure was slow until George W. Bush bought a ranch there. [Texas Monthly, June 2000 Reporter]
  • Hot Night Tonight by Barbara Lynn [Texas Monthly, October 2000]
  • Jacksboro Highway by Rob Roy Parnell [Texas Monthly, February 2000]
  • The King of Clubs The longtime impresario of the coolest chain of nightlife spots in Texas remembers well what it was like to be a Cellar dweller. Me too. [Texas Monthly, April 2000 Profile]
  • Land That I Love City folks with money to burn are driving up the cost of living in the Davis Mountains and the state's other pretty places. What's a rancher to do? [Texas Monthly, March 2000]
  • Live at the Austin Outhouse by Blaze Foley [Texas Monthly, January 2000]
  • Most Requested by Mean Gene Kelton [Texas Monthly, February 2000]
  • Noise and Smoke by Little Jack Melody and His Young Turks [Texas Monthly, February 2000]
  • One Endless Night by Jimmie Dale Gilmore [Texas Monthly, February 2000]
  • Jimmy Reed, Emancipator of the South: An Oral History The quest begins with the discovery of a black and white photograph taken in 1961. [Blues Access magazine, Music Feature, Summer 2000, Issue No. 42]
  • Places in Between by Terri Hendrix [Texas Monthly, June 2000]
  • Play Ball, Y'all Meet eight Texas teams that are bringing America's pastime-the gimmicky, anything-goes minor league version-to a stadium near you. [Texas Monthly, April 2000]
  • Quiero Un Camaro by Los #3 Dinners [Texas Monthly, February 2000]
  • The Return of Wayne Douglas by Doug Sahm [Texas Monthly, August 2000]
  • Chris Rybak by Chris Rybak [Texas Monthly, April 2000]
  • SRV by Stevie Ray Vaughan and Double Trouble [Texas Monthly, November 2000]
  • Doug Sahm To Sir, with love: Why Doug Sahm was my hero. [Texas Monthly, January 2000 Texas Primer] reporter
  • San Antonio Rock: The Harlem Recordings, 1957-1961 by Doug Sahm [Texas Monthly, May 2000]
  • Sand Dollars The economics of beach tourism. [Texas Monthly, June 2000]
  • Splendor in the Grass Thirty years ago J. David Bamberger bought "the worst piece of land in Blanco County," then cleared the cedar and planted native trees and grasses. [Texas Monthly, October 2000]
  • Superfast by Dynamite Hack [Texas Monthly, March 2000]
  • Tomorrow People Meet the senior class of what might be called Texas Music U. - four up-and-coming acts that should graduate to the big time. [Texas Monthly, May 2000]
  • Tuned Out Five years after Selena's death, tejano music is struggling to be heard. [Texas Monthly, May 2000 Reporter]
  • Y'all in the Family How did Lloyd Maines get to be a revered guitarist and record producer? How did his daughter Natalie find fame as a Dixie Chick? [Texas Monthly, May 2000]
  • Zoolgico Tropical by Rodolfo "Fito" Olivares [Texas Monthly, September 2000]
1999
  • Team Player How George W. Bush ran the Texas Rangers and became, finally, a successful businessman. [Texas Monthly, Texas Feature, June 1999]
  • My Wimberley Why Wimberley is not Columbine. [Texas Monthly, Behind the Lines, Texas Feature, June 1999]
  • The Show Must Go On Its stars may be senior citizens, but The Fabulous Palm Springs Follies rivals any spectacular in Vegas or on Broadway.[American Way, Misc. Feature, October 15, 1999]
  • Wind, Rain, Sleet or Snow Go behind the scenes at The Weather Channel, the cable empire whose seventy-two million households depend on it come hell or high water. [American Way, Misc. Feature, March 1, 1999]
  • Wasted Days, Wasted Nights The night in 1974 when Doug Sahm brought Freddy Fender to Soap Creek to play. [Austin Chronicle, Music Feature, November 26, 1999]

1997

  • The Road to Nowhere For a singular West Texas adventure, take a drive through Pinto Canyon to tiny Candelaria. [Texas Monthly, Travel, October 1997]
  • Mr. Robinson Means Business David Robinson is back – healthy, stronger and glad that Tim Duncan is on his side. [NBA Inside Stuff, Sports Feature, November 1997]
  • Rough and Ready The remote backcountry of Big Bend Ranch State Park is finally open to the public. Welcome to the best wilderness getaway in Texas. [Texas Monthly, Travel Feature, October 1997]
  • Sweating It Out How I learned to love the poisonous plants, treacherous terrain, and hellish heat of the Chihuahuan Desert. [Texas Monthly, Travel, October 1997]

1995

  • The Queen Is Dead Selena Quintanilla Perez, tejano's first superstar, was about to become an international pop sensation. Instead, she's another victim of gun violence in Texas. [Texas Monthly, Music Feature, May 1995]

1990

  • The Passing of Grass Domed ballparks all commit the one sin: The good Lord never intended the great game of baseball to he played on carpet. [Americay Way, Sports Feature, October 15, 1990]

Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/bio.html0000644000106600010660000004144511075151276010100 0ustar Bio - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Bio | Joe Nick Patoski

 
Wyatt McSpadden, photographer

JOE NICK PATOSKI is in his fourth decade writing about Texas and Texans. He has authored and co-authored biographies on Selena and Stevie Ray Vaughan, both published by Little, Brown and Company and the coffeetable books Texas Mountains, Texas Coast, and Big Bend National Park all published by the University of Texas Press. He spent 18 years as a staff writer for Texas Monthly and more recently has written for the Texas Observer, National Geographic, No Depression, People magazine, Texas Parks & Wildlife Magazine, Field & Stream, the Los Angeles Times, the New York Times, the Big Bend Sentinel, Southwest Spirit, American Way, the Austin Chronicle, Harp, and TimeOut New York, and other publications. He also contributed an essay to the photo book Conjunto by John Dyer, also published by University of Texas Press.

In 2003-4, he recorded the oral histories of B.B. King, Clarence Fountain of the Blind Boys of Alabama, Memphis musician and producer Jim Dickinson, Tejano superstar Little Joe Hernandez, and 15 other subjects for the Voice of Civil Rights oral history project, some of which appeared in the book My Soul Looks Back in Wonder by Juan Williams, published by Sterling, and rode on the The Voices of Civil Rights bus tour, a 70 day journey across the nation where personal oral histories on civil rights were collected for the Library of Congress.

His biography of Willie Nelson will be published this spring by Little, Brown & Company. An avid swimmer and kayaker, he lives near the village of Wimberley in the Texas Hill Country.

Books:

  • Willie Nelson: An Epic Life The book is in many ways the culmination of my writings about music, Texas, and Texans. [Little, Brown & Company, April 2008] Order the book from Amazon here.
  • Big Bend National Park University of Texas Press, 2006
  • Texas Coast University of Texas Press, 2005
  • Texas Mountains, University of Texas Press, 2001
  • Selena: Como La Flor, Little, Brown & Company, 1996 ("If you're going to buy one Selena biography, this one is it," Cristina Saralegui, the Cristina Show, Univision; excerpted for VH1's "Behind The Music")
  • Stevie Ray Vaughan: Caught in the Crossfire, Little, Brown & Company, 1993 (with Bill Crawford); optioned by Miramax Films, 1993-present
  • Southern Rock chapter, Rolling Stone Illustrated History of Rock & Roll, Random House, revised 1992
  • contributed chapter on Tex-Mex music for The Book of Tex-Mex by Robb Walsh, 2004
  • currently collaborating with Eddie Wilson, founder of the Armadillo World Headquarters, on his memoirs.
  • contributed a chapter on the cumbia for the Oxford U.S. Latino/Latina Encyclopedia, Oxford Press, 2004

Selected album liner notes:

  • From Hell to Gone and Back: Texas Blues (Vanguard) 2003
  • Lightnin' Hopkins, The Tradition Masters (Rykodisc, 2002)
  • Freda & The Firedogs (Plug Music) 2002
  • Robert Ealey, Turn Out the Lights (Black Top) 1996
  • Joe Ely, Letter to Laredo (Rounder) 1995
  • The Best of the Texas Tornados (Warners) 1994
  • The Voice: Freddy Fender's Greatest Hits, the Crazy Cajun Recordings (Edsel/UK), 1999
  • Texas Monthly Presents: Honed On the Range: Texas Music, Volumes 1-5, 1989 to present (Texas Monthly magazine special products)
  • Flaco Jimenez, El Sonido de San Antonio (Arhoolie) 1980

Magazine experience:

  • Staff writer, Texas Monthly magazine, 1985-2003

Freelance experience:

  • 2002-2006 articles in No Depression, Harp, Austin Chronicle, Dallas Morning News (including profile on Mathew Knowles, father and manager of Beyonce Knowles and Destiny's Child). Also contributed to Rolling Stone, Spin, and Country Music magazines, among other publications.

Radio:

  • Radio commentary, Joe Nick is a weekly guest on Kevin & Kevin KGSR in the Morning, Austin, 1991-present
  • Radio personality and co-producer of two 12 hour Texas music specials, KUT-FM, Austin, 1975-1979
  • Radio personality, KFAD-FM, Arlington, 1971

Newspapers

  • Austin American-Statesman, 1977-1978
  • Dallas Morning News, 2003

Management

  • Joe King Carrasco & the Crowns, recording artists for Stiff, MCA, Big Beat, and New Rose records, 1979-1985
  • True Believers, recording artists for Rounder/EMI records, 1985-1986

Membership:


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/0000755000106600010660000000000011075151302007534 5ustar wp/books/texascoast.html0000644000106600010660000006072311075151301012607 0ustar Texas Coast - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Texas Coast | Reviews

Texas Coast - inside photo Texas Coast - inside photo Texas Coast - inside photo Texas Coast - cover

TEXAS COAST
Buy Now from UT PRESS
View photos

TEXAS COAST
Text by Joe Nick Patoski
Photographs by Laurence Parent

Buy Now from UT PRESS

The Texas coast attracts everyone—children playing in the surf and building sand castles; high school and college students partying at spring break; adults easing workaday stresses by beachcombing, birding, fishing, or just watching the waves roll in one after another. In the coast's elemental landscape of low dunes, sandy beaches, salt water, and sea breezes, life itself seems simpler. There's time to watch the seagulls fighting over a fish, bodysurf in the waves, pick up shells on the beach, and reconnect with the healing rhythms of nature.

This beautiful book combines Laurence Parent's magnificent photographs with Joe Nick Patoski's entertaining text to create a one-of-a-kind portrait of the Texas coast. Parent's images capture Texas beaches, bays, estuaries, and salt marshes from Sabine Pass near the Louisiana border to Boca Chica, where the Rio Grande (sometimes) enters the Gulf of Mexico. He records all the familiar and distinctive scenes—sunrise over the Gulf of Mexico and sunset over the bays, sand dunes covered in goat-foot morning glories, historic lighthouses, shrimp boats and sailboats in harbor, and our favorite destinations of Galveston, Port Aransas, Corpus Christi, and South Padre Island. He also highlights lovely, lesser-known places you may not have discovered yet, such as Brazos Bend State Park.

Joe Nick Patoski takes you on a verbal tour of the Texas coast. He describes the irresistible allure of this undramatic yet somehow unforgettable chain of barrier islands and bays. He also acknowledges the human activity that has always been a part of the coastal story—the arrival of immigrants to settle Texas; Civil War battles at Sabine Pass, Galveston, and Palmetto Ranch; towns, such as Indianola, that flourished and then suddenly folded after devastating hurricanes; the building of a huge petrochemical industry; and the successful effort to create wildlife refuges to sustain migrating birds and endangered species such as whooping cranes and Kemp's ridley sea turtles.

Together, Parent and Patoski make it plain why people return to the coast as regularly as waves lap the beach. Looking through Texas Coast may well be where your next visit begins.

Buy Now from UT PRESS


 


Excerpt from Texas Coast

The long, languid coastline of Texas takes her own sweet time seducing the senses. Lacking the immediate drama of an initial encounter with California's Big Sur, where the Pacific crashes against craggy cliffs and rugged outcroppings, or the soothing tropical ambience of the Florida Keys, she is not a stunner at first sight. But give her time, and that fine line where Texas meets the sea will steal your heart.

The Texas coast is the essence of the shore: sun, sand, surf, dunes, flats, wetlands, bays, estuaries, islands, and peninsulas. On the whole, it is a complex soup rich in marine life, shorebirds, and waterfowl. Industry is abundant along the same coastline for different reasons, mainly the easy access to the Gulf and the world beyond. Many of the more scenic parts of the coast have been obscured by resorts, condos, homes, and businesses. But even with those distractions and diversions, the Texas coast, that precise point at which sand, sky, and water converge, nourishes the soul like no other physical place on Earth.

***

The Texas coast emerges out of the murky swamps of southwest Louisiana at Sabine Pass and makes a near perfect crescent for 377 miles all the way to the dry, desiccated flats of Boca Chica, where the Rio Grande enters the Gulf of Mexico. Along that path, the story of a state, its people, and the natural world surrounding them unfolds.

***

The Gulf of Mexico is the most American of all waters, encompassing 596,000 square miles. It is the ninth-largest body of water in the world. Five states including Texas, five states in Mexico, and the island nation of Cuba share its waters, utilizing it as a source of sustenance and a means of getting around.

The Gulf is the primary supplier of water vapor that brings rain to the central and eastern United States. It produces a quarter of the United States' commercial fish and shrimp catch. Nine-tenths of the country's offshore oil and gas production comes from the Gulf. In return, it receives sediment and pollution from two-thirds of the United States, mostly from the Mississippi River.

The Texas coast plays a critical role in this productivity. Most migrating birds traveling the eastern and midwestern flyways leave and reenter the country via the Texas coast. Seventy-five percent of the migratory fowl in the United States depend on the wetlands of the Texas coast. So do the nation's automobiles and trucks—two-thirds of the country's petrochemical refineries are located near the Texas coastline.

Seven major bays, some as much as thirty-five miles in length or breadth, define the landmass behind the beaches along the Texas coast. Except during storm events, the Gulf's waves are relatively insignificant, though constant enough to work like a washboard to form three sets of sandbars off the shore.

***

The actual beginning of the Texas coast is an ill-defined spit of salt marsh called Texas Point, on the west side of Sabine Pass, where the Sabine River, separating Texas from Louisiana, meets the Gulf. Land's end is most easily reached by boat. A small two-lane bridge spans the river several miles above the pass, linking Louisiana Highway 82 to downtown Port Arthur, where it intersects Texas Highway 87. Highway 87 cuts through a major refinery zone before reaching open land and the town of Sabine Pass. Dowling Road and Jetty Road lead past a collection of rock pilings and mud flats to the pass proper, where the old lighthouse on the Louisiana side is the most prominent landmark. Sabine Pass Battleground State Park, upriver, is where Lieutenant Dick Dowling and a band of forty-six tough Irish dockhands from Galveston on behalf of the Confederacy used six cannons to destroy four Union gunboats in a notorious Civil War battle back in 1863. Sabine Pass was initially envisioned as a major port, but its exposure to hurricanes ultimately made Port Arthur (farther inland) the port of preference. The town of Sabine Pass later became famous for a messy culinary specialty called barbecued crab. (Blue crab is one of the culinary delicacies of the Texas coast, exported to restaurants around Chesapeake Bay when the local fare there is out of season.)

***

The upper Texas coast goes underappreciated, in no small part because of its steadily eroding shoreline. Highway 87, which once hugged the beach from Sabine Pass to the Port Bolivar (pronounced BALL-iver) Lighthouse and the Galveston ferry, no longer exists along a twenty-mile stretch. High Island, where the road resumes, marks the beginning of the Bolivar Peninsula, a slim sandbar twenty-seven miles long and no more than three miles wide, the first in a succession of offshore barrier islands that define the coast. The communities of High Island, Port Bolivar, Crystal Beach, Gilchrist, and Caplen aren't real towns so much as scattered clusters of beach homes and fishing businesses. Bolivar is renowned for its fishing, crabbing, hunting, and, increasingly, its birding. High Island is directly across the Gulf from the Yucatán Peninsula, which explains its world-class reputation for observing the spring and fall migrations. The biggest landowner on the peninsula is the Houston Audubon Society.

Bolivar's illustrious past is not evident. The Karankawa and Orcoquisa Indians lived on the peninsula as far back as 10,000 years ago, and it served as the gateway to Galveston Island for tribes from East Texas. Cabeza de Vaca, the Spanish explorer who provided the first written descriptions of Texas, walked around Bolivar after washing ashore on Galveston Island in November of 1528. Rebels waging a private war against Spanish rule and pirates used Bolivar as a base of operations. The French-Creole pirate Jean Lafitte, who headquartered in Galveston after fighting on behalf of the United States in the 1815 Battle of New Orleans, used the peninsula to move African slave traffic via slave runners, including Jim Bowie, from Galveston to the Sabine River, where Louisiana sugar planters paid one dollar a pound for the human cargo. Cotton, cattle, oysters, and watermelon have been mainstays of the peninsula's economy at one time or another. The salt dome of High Island and other nearby domes store the bulk of the United States' strategic oil reserves.

The Port Bolivar Ferry to the island is the longest ferry ride in Texas linking public roadways. It takes eighteen minutes to travel 2.7 miles across the maw of busy Galveston Bay. It's the best free ride in the state, passing Civil War bunkers and the black cast-iron Bolivar lighthouse, a parade of shipping traffic, and Sea Wolf Park.

***

In Galveston, you're somebody if you're BOI—Born on the Island—especially if you're a Moody, a Kempner, or a Maceo. Galveston is old Texas, and those families are old Galveston money.

Galveston used to be the state's biggest port until the Houston Ship Channel became a deepwater port in 1919. The city was once upon a time synonymous with high times and high rolling until May 30, 1957, when new sheriff Paul Hopkins raided the Balinese Room, a storied nightclub on stilts that extended several hundred feet into the Gulf, where illegal gambling was a long-tolerated tradition. The gift shop and museum that now occupy the space capitalize on those faded memories.

This is a real port town, the most urban beach resort in Texas, and a cloudy dream version of a New Orleans that hardly exists even in New Orleans anymore. Cruise down Broadway under the elderly palms, by the streetcar line flanked by elegant mansions, and you could just as well be on St. Charles Avenue. Galveston is where cutting-edge research is conducted on biological terrorism at a University of Texas lab and where marine science is studied at Texas A&M facilities.

Galveston bore the brunt of the Great Storm of 1900, a stealth hurricane that drowned the island and killed six thousand people, more than any other disaster in Texas history. Galveston is the Seawall, the location of the original spring break, Alpha weekend, Stewart Beach, the tall ship Elissa and the Texas Seaport Museum, and the Flagship Pier. Galveston is the biggest Mardi Gras this side of the Crescent City and the Moody Gardens rain-forest-under-glass, IMAX included.

Enough remnants of the past survive to qualify the city as Texas's most historic, though San Antonians might quibble with that brag. The Hotel Galvez is still a grande dame. The Strand, several city blocks of sturdy red-brick and cast-iron structures, has been gussied up and now bustles more than it has since it was the Wall Street of the South back at the close of the nineteenth century. But there's still just enough funk between the city's toes, such as the Poop Deck, "Where the Elite Meet in Their Bare Feet," and the stepped-up rice and turnip greens at Leon's World's Finest In and Out B-B-Q House, to keep the place honest, just as the jalousies of the weathered French provincial homes on the back streets keep the Bishop's Palace, perhaps the most majestic edifice in Texas, and the ancient Rosenberg Library in perspective.

TEXAS COAST
Buy Now from UT PRESS

Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/williereviews.html0000644000106600010660000004554411075151303013331 0ustar Reviews of Willie Nelson: An Epic Life - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Willie Nelson: An Epic Life | Reviews

Read my MVP Q&A with Mickey Raphael. You can read a chapter from the book. [ Chapter 1, 2, 3 ]

Order Willie Nelson: An Epic Life from Amazon here.


Joe Nick PatoskiREVIEWS -- REVIEWS -- REVIEWS -- REVIEWS -- REVIEWS

4 Star Review in American Songwriter by Holly Gleason

American Way: Always on His Mind The product of several years of intense research, Patoski's nearly 500-page opus charts the breadth of Nelson's 75 years, from the depths of his hardscrabble upbringing to the peaks of his fame to his falls -- numerous falls -- from grace. Patoski effectively captures Nelson's transformation from struggling songwriter to American musical icon. But more importantly, he shows what Nelson's career has meant to Nelson's and Patoski's native state: Texas. By Bob Mehr

CMT News: Nashville Skyline: What Would Willie Nelson Do? by Chet Flippo

Creative Loafing: The red-headed wild-ass by John Grooms

Dallas Morning News: New Willie Nelson biography offers intimate details but light on revelations by Mario Tarradell

Entertainment Weekly: Freewheeling Willie Willie Nelson fans will have their blue eyes cryin' in the rain -- with joy -- over the arrival of such a richly reported bio. Willie might be the least conflicted hero in biographical history, once he trades being a ''bad drunk'' for placid pot and metaphysics. (When he cries after a snub from girlfriend Amy Irving, it's practically his only vulnerable moment in 500 pages.) But despite Joe Nick Patoski's reluctance to psychoanalyze his beatific subject in Willie Nelson, there are scores of funny firsthand stories in his account of how a ramshackle hillbilly career sparked an unlikely convergence of redneck, hippie, and Hollywood culture. B+ By Chris Willman

Los Angeles Times: How the boy from a hardscrabble Texas town became a country music icon. By Robert Hilburn

The Village Voice: "Willie Nelson's Trigger Cuts: Shotgun Willie gets the respect he deserves" by Michael Hoinski

San Antonio Express-News: "Biography tackles larger-than-life Willie Nelson" by Steve Bennett

Rolling Stone: "Excellent... Patoski, who's been writing Willie's story for thirty-five years for publications ranging from Texas Monthly to Rolling Stone, seamlessly weaves together the good, the bad and the ugly to form a three-dimensional portrait of the singer.... For Nelson, his hit 1980 single 'On the Road Again' isn't just a silly song he wrote for the movie Honeysuckle Rose--it's literally the story of his life. And Patoski has fleshed it out beautifully."

Publishers Weekly: This impressive, entertaining chronicle of Willie Nelson's life is replete with exactly what you'd expect--honky-tonk, long nights on the open road, whiskey, womanizing and weed--but Texas writer Patoski (Stevie Ray Vaughan: Caught in the Crossfire, Texas Mountains) looks beyond country music trappings to find the funny, talented, determined man who became an unlikely icon. Raised in Abbott, Texas, by impoverished grandparents, Nelson was writing songs about "love, betrayal and cheating" by the age of seven, but was told throughout his life that he couldn't sing, play or keep a beat. As an adult, Nelson worked odd jobs--encyclopedia salesman among them--while selling songs in Nashville; he had an early hit in 1961 with Patsy Cline's "Crazy," and soon began recording for RCA. Fourteen albums later, "with not much to show," Nelson fled to Austin, Texas, a move many viewed as career suicide; instead, it was a launching pad to stardom, propelled by the up-and-coming hippie movement and the strength of his groundbreaking album Red Headed Stranger. Patoski conducted over a hundred interviews for this thorough, well-noted "epic," peopling it with "pickers, gypsies, pirates, vagabonds, wanderers and carneys," including fellow performers like Kris Kristofferson, Kinky Friedman and Leona Williams. Writing with an affectionate country twang, Patoski gives his subject the consideration he deserves in a fine, fluid piece of storytelling that any Nelson fan will appreciate.

Austin American-Statesman: Austin writer Joe Nick Patoski's epic biography includes everything you'd ever need to know about the Red Headed Stranger by Rich Kienzle

Houston Chronicle: Willie Nelson: a life in full Ups, downs, booze, pot, wives, ex-wives and Julio Iglesias figure in Joe Nick Patoski's biography by Bob Ruggiero

Fort Worth Star-Telegram:

"Radio Days" Fort Worth was where the quest began for a hungry young musician who worked as a DJ named Willie Nelson [Fort Worth Star-Telegram, April 13, 2008]

"Big time in Cowtown" In 1965, Willie Nelson came home to Panther Hall, a country-music oasis deep in the heart of Cowtown, to record a live album his way [Fort Worth Star-Telegram, April 14, 2008]

Texas-music writer tells Willie Nelson's story with warmth and simplicity [Fort Worth Star-Telegram, April 20, 2008]

Cowboy philosopher not pondering legacy [Fort Worth Star-Telegram, April 26, 2008]

*****


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books/bigbend.html0000644000106600010660000004402111075151300012013 0ustar Big Bend National Park - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Big Bend National Park | Reviews

BIG BEND NATIONAL PARK
Text by Joe Nick Patoski; Photographs by Laurence Parent

"Laurence Parent's work is superb. He is without a doubt one of the signature photographers of Texas. He has shot many of the iconic images of Big Bend National Park—images that have appeared in the New York Times, Texas Highways, Texas Monthly, and Texas Parks & Wildlife, as well as in books about the park and West Texas."
—Jack Lowry, Editor, Texas Highways

"Joe Nick Patoski's writing in Big Bend National Park is compelling and knowledgeable, done with great confidence and passion for the subject."
—Jan Reid, author of The Bullet Meant for Me and editor of Rio Grande

 

Big Bend National Park
Buy Now from UT PRESS

BIG BEND NATIONAL PARK
OCTOBER 2006

Big Bend National Park is one of the few places left in America where a person can literally get away from it all. Nestled in the great bend of the Rio Grande that forms one of the most distinctive features of the silhouette of Texas, the park is several hundred miles from any large city. Within its 1,250 square miles of mountains, canyons, desert, and river, Big Bend National Park offers visitors respite from the stresses of urban living—a place for taking stock and charting new courses. That's one reason why many people return to the park year after year.

This book is the first and only comprehensive photographic and word portrait of Big Bend National Park. Laurence Parent presents a magnificent photo gallery of park scenes. He portrays the mountain ranges—Chisos, Dead Horse, Rosillos, and Sierra del Carmen—from first light to moonrise and in all seasons and weather. He includes dramatic images of Santa Elena, Mariscal, and Boquillas canyons, as well as landmark features such as Mule Ears Peaks, Elephant Tusk, and the Chisos Basin Window. Parent also portrays the ephemeral beauty of Big Bend wildflowers, including giant bluebonnets and blooming prickly pear cactus, as well as the traces of human habitation at ghost towns scattered around the park.

Joe Nick Patoski complements Parent's images with a masterfully crafted word portrait of Big Bend National Park. Patoski describes the powerful geologic and volcanic forces that created the awe-inspiring landscape of the Big Bend. He reviews the park's natural history and also its human history, from the prehistoric hunter-gathers who ranged over the region to Cabeza de Vaca, who was probably the first European to see Big Bend, to the creation of the national park in the 1930s and 1940s. Patoski also summarizes recent conservation efforts that have led to the protection of 2.1 million acres on both sides of the Rio Grande.

Although no single book could ever hope to contain the vastness of Big Bend National Park between two covers, this one beautifully captures its essence.


 


EXCERPT from Big Bend National Park

The land has many names:

El Despoblado. The Empty Space on the Map.

The Chisos. El Rio. La Frontera.

Sky Island in a Desert Sea.

The Last Frontier.

For more than fifty years, the heart of it has been officially known as Big Bend National Park.

***

I first saw Big Bend as a young boy.

My father had taken my sister and me on a trip through Texas in his brand-new Studebaker Silver Hawk. We'd come directly from the Alamo, whose stature and location in downtown San Antonio was a big disappointment to a seven-year-old smitten with Fess Parker and all things Davy Crockett. Big Bend made up for that letdown. At first glance, I immediately realized I had found the Texas of my dreams. These were real mountains, magnificent and grand, rising abruptly from the dusty plain. There was no mistaking that this was a desert, not the greened-up prairies and woodlands I'd known in North Texas, where we lived. The scenery was thorny and prickly—and dangerous. The distances were long. The sun was hot. This was not the kind of place to be lost in. The higher and wetter Chisos was a whole other world. Real mountain country. In Texas.

Big Bend National Park has been an integral part of my life ever since—it's my salvation, my respite, my escape from the real world, my quiet space far from the static of humanity, where my mind can wander and my soul be replenished.

I have never witnessed a sunrise as illuminating as the ones lighting up the mighty Chisos, thrust skyward aeons ago by volcanic forces. The luminous light that paints the ruddy bands of the limestone face of the Del Carmen Mountains above Boquillas at the end of the day makes the term "Technicolor" too understated. From the top of South Rim, I can see all the way to tomorrow. More than once when I've been camping in Big Bend, I've gone to sleep wearing my glasses—in case I wake up in the middle of the night I want to be able to gaze into the infinity of the brightest star-showered skies on the continent.

I have floated in awe through Big Bend's majestic river canyons, climbed its mountains, and trekked its deserts. I've ridden on horseback through the tall grasses and oak woodlands, driven its pavement, and spun around its back roads. I've wandered its trails and spent a week backpacking across more than seventy miles just so I could say I'd walked across the big bend of Big Bend.

I have tried and failed to count the exact number of layers that constitute the surreal, not-of-this-earth walls of the Big Tinaja—each limestone slice a lingering bathtub ring marking centuries of changing water levels.

I've witnessed crude petroglyphs, delicate pictographs, petrified forests and yucca forests, palisades turned into raging waterfalls in violent thunderstorms outside the entrance of Santa Elena Canyon, too close lightning bolts on the Mesa de Anguila.

Not everybody gets Big Bend—which is fine for those of us who do. The great American folksinger Woody Guthrie wandered here. The great Southwestern writer Ed Abbey extolled its virtues.

Being a Big Bend true believer amounts to having an innate willingness to drive five hundred miles at the drop of a hat to see a sunset where sunsets really mean something and then cracking a smile when you realize that for all that distance and all those extraterrestrial sensations imparted, you're still in Texas.

The more I go, the more I realize I've just scratched the surface. Big Bend National Park is too huge and too complex to ever fully understand. Which are two good reasons to love the place all the more.

**********************************

BIG BEND NATIONAL PARK
Buy Now from
UT PRESS

Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/willie-chapter1.html0000644000106600010660000003245611075151301013425 0ustar Willie Nelson, Chapter 1 - Books - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Willie Nelson: An Epic Life| Chapter 1

You are here: Books » Willie Nelson: An Epic Life » Chapter 1, 2, 3

Order Willie Nelson: An Epic Life from Amazon here. Read REVIEWS here.


Joe Nick PatoskiSomewhere In America, 2007

Willie Nelson: An Epic Life
BY JOE NICK PATOSKI
April 2008

 

The sea of humanity swells and roils all the way to the horizon, a sea of thousands of eyes fixed on him, thousands of hands clapping, a chorus of voices cheering and yelling, lips whistling, feet stomping, smiles everywhere all because of him. Lone Star flags and arms thrusting skyward, hands clutching cigarette lighters and cans of beer above heads bobbing like buoys because of the music. The old man with the wild white eyebrows and crinkled skin, his long white hair pulled back into two braids tries to make eye contact with as many eyes as he can in ten seconds before glancing offhandedly over his shoulder at the musicians standing and sitting in place behind him, strapping on his guitar, and stepping to the microphone with a casualness that betrays a lifetime of going through the very same ritual night after night, year after year. He half-sings, half-talks five magic words that trigger a sonic roar.

 

Whisk-key Riv-verrr take my miiiiiind.

 

Copyright 2008 Joe Nick Patoski

Chapter 1, 2, 3

****************

Read my MVP Q&A with Mickey Raphael, which ran in the next to last issue of No Depression.

Those seeking all things Willie should visit willienelson.com and stillisstillmoving.com.

Order Willie Nelson: An Epic Life from Amazon here.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books/willie-chapter2.html0000644000106600010660000003365611075151301013431 0ustar Willie Nelson, Chapter 2 - Books - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Willie Nelson: An Epic Life| Chapter 2

You are here: Books » Willie Nelson: An Epic Life » Chapter 1, 2, 3

Order Willie Nelson: An Epic Life from Amazon here. Read REVIEWS here.


Joe Nick PatoskiAbbott, 1938

Willie Nelson: An Epic Life
BY JOE NICK PATOSKI
April 2008

 

Eyes had been gazing at him wherever folks tended to gather ever since he could remember. His first audience was a group of families at the Brooken Homecoming, an all-day reunion, picnic, and songfest in a shady grove by the small community eight miles southeast of Abbott, Texas. His grandmother had dressed him up in a white sailor suit with matching shorts. The stage was the back of a flatbed truck. The five-year-old boy showed little sign of nervousness other than picking his nose, as young boys are known to do. There was praying, singing, eating, visiting, more singing and more praying and so much nose-picking that when it was his turn to stand and recite the Psalm his grandmother had taught him, the white Navy suit was splattered with blood redder than the boy's red hair. The boy acted like the nosebleed was no big deal. He followed the prayer with a poem he recited while holding one nostril shut with his hand. In a voice that was small but not shy, he said:

What are you looking at me for?

I ain't got nothin' to say.

If you don't like the looks of me,

You can look some other way.

The audience clapped and cheered. The boy beamed. He'd remembered all the words. The people seemed to like him. He liked the attention, all eyes on him. He liked making them smile. The people listening felt like family. He flashed a not-so-shy grin of gratitude. From that moment forward, Willie Hugh Nelson, who earned the nickname Booger Red for his bloody nose, was determined to give a good show.

Copyright 2008 Joe Nick Patoski

Chapter 1, 2, 3

****************

Read my MVP Q&A with Mickey Raphael, which ran in the next to last issue of No Depression.

Those seeking all things Willie should visit willienelson.com and stillisstillmoving.com.

Order Willie Nelson: An Epic Life from Amazon here.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books/talltales.html0000644000106600010660000005240111075151301012410 0ustar Tall Tales - Texas Mountains Interview - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Texas Mountains| Interview

You are here: Books » Texas Mountains » Tall Tales Interview


Tall Tales

Texas Monthly
November 2001

Photographer Laurence Parent and senior editor Joe Nick Patoski talk about climbing, the best shot, and their new book, Texas Mountains. Interview with Laurence Parent and Joe Nick Patoski

Texas Mountains - Joe Nick Patoski

texasmonthly.com: When was the first time you saw a mountain? Do you remember where you were and what you thought?

Laurence Parent: I was born in the mountains of New Mexico, so I guess that I saw them when I was pretty young. They must have made an impression, although I sure don't remember my first thoughts.

Joe Nick Patoski: The mountains I remember seeing were in the Big Bend. We'd driven in my daddy's new ‘59 Studebaker Silver Hawk from Fort Worth to San Antonio one day, then from San Antonio to Ciudad Acuña and on to Marathon the next, arriving at night. The following morning we got up and drove to Big Bend National Park and up to the Chisos Basin. I thought it was pretty cool.

texasmonthly.com: Laurence, your father was a National Park Service ranger and your mother wrote travel pieces. Do you think you may have a different perspective on the outdoors because of their influence?

LP: My parents had a huge influence on me. Growing up in beautiful National Park Service sites with parents who loved the outdoors greatly shaped what I do for a living (outdoor photography) and what I love to do for fun (hike, run, camp, and climb).

texasmonthly.com: Why did you decide to publish a book on the Texas mountains?

LP: No one had ever done such a book. Some Texans don't even realize Texas has mountains. Many others don't realize that there are beautiful mountains in Texas besides the Guadalupe, Davis, and Chisos mountains. I wanted to surprise people. The Texas mountains have waterfalls, movie sets, pine forests, aspens, and many other surprises.

texasmonthly.com: How long did it take to come up with the material for your book and put it all together?

JNP: A little more than a couple years. I'd really been working on it for more than forty years, but just didn't realize.

LP: Some of the photos go back to the mid-nineties (they were shot for other projects). Most, however, were shot specifically for this book beginning around mid-1999. The West Texas drought didn't help. The schedule accelerated last fall, though, when rains finally came to West Texas. The grass greened, the air cleared, and the waterfalls flowed. I made two trips in October and November to wrap up the book that lasted 26 and 17 days each. After that, I was ready to be done.

Joe Nick Patoski at Coal Mine Ranch
Joe Nick Patoski
at Coal Mine Ranch.
Photo by Laurence Parent

texasmonthly.com: Joe Nick, what was involved in getting your information? Did you go on many climbs?

JNP: Lots of time was spent in libraries, online, and on the phone. But the best part of doing it was getting to go on-site. A lot of the ranges are on private land, so our research involved introducing ourselves to folks, asking permission for access, and in many cases, assuring sources that we wouldn't identify precisely where we were lest trespassers and poachers try to go where they're not welcome.

I should mention that the photography required getting to vantage points on peaks and pinnacles that were not necessarily the highest points in a particular range. Nonetheless, we climbed a bunch. There's one photo Laurence took of me standing on a smaller pinnacle in the Chinatis that ran in Texas Highways (Laurence needed a model and I was the only other human around). The picture is pretty great, capturing me standing on this high point overlooking the rugged, desolate valley of the Rio Grande, with no other human being or any man-made structure in sight. What you don't see is how I propped myself up on the rock, trying to maintain my balance, and how I was seized by a severe case of acrophobia while trying to stand still and remain calm. The wind was gusting, and I kept trying not to look down, because one false move and I was a goner. Standing across the way, on an equally perilous promontory, was Laurence, snapping away, changing cameras, loading film, trying to get the shot. It's one thing to ramble around high points and scurry up to the top; it's another thing to do that while carrying sixty pounds of equipment on your back. Laurence, I think, has a little mountain goat blood in him.

texasmonthly.com: Laurence, what type of format do you use? Why?

LP: I mostly use a large-format camera, 4x5, for my landscape work. Only a tiny handful of the photos in this book were done with a 35mm camera. A 4x5 reproduces larger, with greater sharpness, less grain, and potentially greater depth of field. I do use a 35mm for shooting outdoor sports, but there wasn't any of that in this book.

texasmonthly.com: Do you find the mountains in Texas that different from the mountains in Colorado? Why or why not?

LP: The mountains in Texas are significantly lower and drier that those in Colorado. However, many of the Texas mountains have considerable relief (above the surrounding plains) and are still very impressive.

JNP: Much different. As a University of Texas at Austin professor from Germany told me recently: "We in Germany know about the Rockies, the Cascades, the Sierra Nevadas, the Appalachians. We have mountains like that. But there's nothing in Germany like the Texas mountains. That's why we love to come here." It's the delicate combination of mountains and desert. Nowhere but Texas.

Joe Nick Patoski at Sierra Diablo
Joe Nick Patoski and Chris Gill
at Sierra Diablo.
Photo by Laurence Parent

texasmonthly.com: What is necessary to get such spectacular shots? Can you describe a shoot for me?

LP: First and foremost, you have to be a pack mule. My camera pack usually weighs between 35 and 40 pounds just for day hikes. A lot of strenuous hiking was required for this book to reach the photo locations that I wanted. Quite a few hikes were cross-country in areas with no trails. Several shots were taken on overnight trips, and my pack weighed 60 pounds or so. Besides dragging my gear to ideal locations, I have to anticipate the light and weather to try to get the best possible images. Many times the weather does not cooperate, requiring me to repeat a trip, often several times.

texasmonthly.com: When is the best time of day to take nature shots? Why?

LP: Most commonly, the light right before, during, and after sunset works best because contrast decreases, long shadows give depth, and the light turns gold and pink. However, weather is at least as big a factor. Dramatic skies, especially from breaking storms, add immeasurably to photos.

texasmonthly.com: What is your favorite photo in the book? Why?

JNP: I don't really have a favorite. I love‘em all. But when I first thumbed through the book, the shots of ZH Canyon really stirred me. Sunrise on a perfect June morning, seeing and hearing and witnessing all the life in this "isolated" spot—the canyon was a veritable aviary, choked with raptors and Neotropical songbirds. It was one of the more blessed moments in my life. The photos brought it all back.

LP: Tough question. I'm not sure that I have a particular favorite. I do like the cover, in part, I guess, because it was taken during a miserable windy sunrise in a spring dust storm, which is why the light is so red—not because of a filter. Another favorite is probably the aspens shot because it was such a bear to hike to them, plus it reminds me of the New Mexico mountains, where I did a lot of my growing up.

Joe Nick Patoski at Coal Mine Ranch
Joe Nick Patoski
at Coal Mine Ranch.
Photo by Laurence Parent

texasmonthly.com: What was your most difficult shoot? Why?

LP: Several are contenders. The aspens shot was difficult because it required carrying my heavy gear cross-country up and down very steep, loose, and treacherous slopes. I twisted my knee when a slope shifted under me; it still hasn't completely recovered. The shot of El Capitan taken from the summit of Guadalupe Peak required carrying my pack four and a half miles up a trail while gaining three thousand feet of elevation in a howling, frigid dust storm in January. After taking my sunset shots and getting almost hypothermic, I hiked all the way down in the dark.

texasmonthly.com: What is your favorite mountain range in Texas? Why?

JNP: My favorite ranges are the Franklin, Hueco, Guadalupe, Sierra Diablo, Sierra Vieja, Davis, Chinati, Chisos, Bofecillo, and Glass ranges. Each has qualities separate from the others. Laurence has convinced me that there is much more to the Quitmans than initially meets the eye. The Eagles, which parallel Interstate 10 to the south for twenty miles or so, west of Van Horn, are the most underappreciated. The view from Eagle peak was one of the most breathtaking of them all.

LP: I'm not sure that I have a single favorite. They're all really different. Some favorites are the Sierra Vieja, Davis, Guadalupe, Chisos, Beach, Quitman, and Sierra Diablo mountains.

texasmonthly.com: If you could climb any mountain in Texas, which would it be? Why?

JNP: North Franklin Mountain. Because I haven't done it yet.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/willie.html0000644000106600010660000003661711230234257011730 0ustar Willie Nelson: An Epic Life - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Willie Nelson: An Epic Life | Why I wrote this book

Read my MVP Q&A with Mickey Raphael. You can read a chapter from the book. [ Chapter 1, 2, 3 ]

Order Willie Nelson: An Epic Life from Amazon here. Read REVIEWS here.


Joe Nick PatoskiCelebrate Willie Nelson's 75th birthday
with Joe Nick Patoski
WILLIE NELSON: AN EPIC LIFE
In stores April 21st, 2008

The realization Texans are different from everybody else hit me about an hour after I'd first set foot on Texas soil. I was only two years old but I distinctly remember my father picking up my mother, my sister and me at the Greater Fort Worth International Airport and driving us to our new home in Fort Worth, stopping along the way at the Big Apple Barbecue on Highway 183. The waitresses talked funny and the smoked beef brisket covered in barbecue sauce we were served tasted like nothing I'd experienced, vaguely familiar and strange and exotic all once. Even as the hot spices set fire to my lips and the inside of my mouth, I immediately wanted more.

I've been trying to figure out Texas and Texans ever since. Fifty two years later, I realized the answer had been right in front of me for most of my life. There were vague memories of the smiling friendly face flickering on Channel 11 singing songs live from Panther Hall on the Cowtown Jamboree and on Ernest Tubb's show in a voice that could have only come from Texas. I grew familiar with the songs by listening KCUL, the Country & Western radio station, although versions of "Hello Walls" and "Crazy" by other people were Top 40 hits in Fort Worth. The first interview came in 1973 for Zoo World magazine. After thirty five years of writing about him and many others, I can now safely say no single public person living in the 20th or 21st century defines Texas or Texans better than Willie Hugh Nelson.

Texans by nature are independent, free-thinkers, open, outgoing and friendly. Iconoclasts, they respect tradition but are not beholden to it. Whether it's God or sin, they tend to embrace excess. The good ones have a whole lot of heart. They are creatures of geography, exuding a sense of place. They reflect their climate and sometimes are a little crazy from the heat. They are wanderers and explorers, keen to improvise, curious enough to discover They are loud and boisterous when they need to be. They seem to go out of their way to make friends with strangers. They are great storytellers and some of the most distinctive music makers on earth. You know Texas music when you hear it, just like you know Willie's music.

A certain red headed stranger was once said to say, "Don't let the truth get in the way of a good story." I tried my best to ignore that sage advice once I took on this project. On the back side, all I can say is that getting all the facts straight while piecing together the history of a culture considered too low, too sordid, and too wild to be worth documenting in print was no sure thing. Many characters were too busy living life to the fullest, sometimes under the influence of alcohol, nicotine, Dexedrine, Black Mollies, marijuana, boredom, and being caught up in the adage, "If you can remember the sixties, you weren't there" to remember the trivial details of time and place. Then there were those who were inclined to con for the pure sport of it.

Fortunately, my subject was accommodating and open - exactly the person I've always thought him to be. He's the story. I'm just the teller.

Copyright 2008 Joe Nick Patoski

*****


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books/texasranges.html0000644000106600010660000004417611075151301012761 0ustar Texas Ranges - Texas Mountains Feature - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Texas Mountains| Feature

You are here: Books » Texas Mountains » Texas Ranges Feature


Texas Mountains - coverTexas Ranges

Texas Monthly
by Joe Nick Patoski
November 2001

 

For most of their lives, senior editor Joe Nick Patoski and freelance photographer Laurence Parent have explored and chronicled the mountains of the Trans-Pecos. In this excerpt from their forthcoming book, Texas Mountains, they show and tell where their love of the outdoors is at its peak.

I GOT HOOKED ON THE TEXAS MOUNTAINS at the age of six, when I climbed to the top of a small hill adjacent to the Chisos Basin lodge in Big Bend National Park, rode on horseback to the Window, and peered over what seemed then to be the edge of the world. I became fixated on the idea that there was actually a place called the Christmas Mountains; it was visible through the Window's massive slickrock aperture, beyond the park's northwestern border.

The relationship continued through my youth, when I discovered that there wasn't a more enchanting city view in Texas than the twinkling lights of El Paso and Juárez at night, seen from Scenic Drive on Mount Franklin. I climbed the pilgrims' path to the top of Mount Christo del Rey and straddled the line between Texas, New Mexico, and Chihuahua. As an adult, I've touched the roof of Texas atop Guadalupe Peak, perched on the edge of the South Rim of the Chisos in Big Bend on a brilliantly clear day when objects two hundred miles distant were visible—the biggest view in the whole world—and watched a comet from the top of Mount Locke at McDonald Observatory, illuminated by more stars than the eye can comprehend in the darkest skies in America.

These mountains are located in the Trans-Pecos part of Texas, which stretches for some 250 miles east to west and extends about 200 miles north to south—about the size of South Carolina. It is the most sparsely populated part of the state. Save for the city of El Paso, where more than half a million people live, no more than 30,000 residents live here. "Wide-open spaces" is not just some catchphrase in this part of the state. They really do exist. Within the boundaries of the Trans-Pecos sprawl the thirty-odd named ranges of Texas. The Trans-Pecos is a region so expansive that several of its counties are bigger than entire states. This is the Texas of dreams.

The easternmost ranges, the Housetops and Spencers, flank U.S. 90 twenty miles east of Marathon like two sentinels. The Glass Mountains, the first range of significant height and breadth, swell up more than a mile above sea level between Marathon, Fort Stockton, and Alpine. From there all the way to the state and the international boundaries to the northwest, west, and southwest, mountains dominate the landscape. Some consider the Texas mountains to be the southern extension of the Rocky Mountains, tumbling out of Colorado and New Mexico. But only the Davis Mountains, the wettest and one of the highest ranges in the state, and the Guadalupes, the highest range of all, with the four tallest peaks in Texas, really resemble their Colorado neighbors.

These are not easy mountains to love. They lack the altitude and drama of either the Sierra Nevadas or the Rockies. The tallest mountain in Texas, the 8,751-foot Guadalupe Peak, would hardly rate a glance on the other side of the New Mexico line. They are located in one of the least accessible places in the continental United States, far from most population centers. As a result, few people even know they are here. Even though Interstate 10 cuts through several ranges, most travelers keep their eyes glued to the road and have no idea what they're passing through. The two most impressive ranges in the state, the Guadalupes and the Chisos, are protected as national parks, but most of the other ranges in the Trans-Pecos and the Big Bend remain unknown and unseen because they're off-limits. Unlike other western states, where federal lands sometimes comprise more than half of a given state's land area, Texas is mostly private property, mountains included.

This is a harsh country. Annual rainfall averages barely ten inches a year, and a severe drought persisted for almost a decade at the close of the twentieth century. Each of the four seasons has its own hellish peculiarity. The blistering winds of early spring are brutal. An ovenlike heat can set in as early as March. The soothing midsummer monsoons of July, August, and September, which can green up the countryside overnight, can bring killer floods with them too.

When the monsoons don't come—which happens more and more frequently these days—the furnace effect down on the desert floor of the Big Bend becomes so severe that every living thing, it seems, either burns, dies, or withers away. But even when that kind of heat is on, up on the Marfa Highlands or in the Davises and the Guadalupes, in August it's chilly enough at night to sleep with a blanket. The coolest summer nights in Texas are in the Texas mountains. Starting in mid-November, blue northers blast in the bitterest cold, dropping temperatures as much as fifty degrees in as little as an hour and occasionally leaving a dusting of snow on the mountaintops, stirring visions of the Rockies or the Alps if only for a day or two. Yet the same season can also bring temperatures above 100 degrees to the lower desert.

For the people who love these mountains, such realities are really blessings that have kept away the crowds. After all, who wants to share the stands of quaking aspen found in the Davis range, the maples of the Guadalupes and the Sierra Vieja, and the small slivers of greened-up high country that flourish on the mountaintops and in crevices and crannies, far from public view? If you're blowing through at 70 miles per hour on the interstate or peering out the window of a jet plane at 30,000 feet, you won't get it. Those of us who do get it like that just fine. We know, as I have learned, that there is much more than meets the eye. These mountains just require a little more patience and a whole lot more effort.

Many of the Texas ranges—the Guadalupes, the Delawares, the Huecos, and the Franklins—are largely devoid of vegetative cover because of a dearth of moisture. Because they are so naked, they expose thousands and millions of years in their layers and folds and are a playground for geologists. Within the Texas mountains are geological features and formations found nowhere else on the planet: a stone freak show of weird globs, jagged spires, gravity-defying balancing acts, marbled swirls, scoops of melted ice cream, and dribbled sand castles that wildly vary from extraterrestrial to lunar in appearance. In spite of their apparent desolation, the mountains harbor a huge variety of plant and animal species. The area is part of the Chihuahuan Desert, the largest and highest desert in North America. Here life flourishes in surprising places: on a remote cloud-catching ridgeline or under a rare canopy of shade in hidden canyons fed by springs and waterfalls.

Even though they are not the highest mountains around, these ranges offer some of the most striking panoramas anywhere. Range after range fades to the vanishing point, each separated from the next by vast desert floors that go on forever. From the top of Mount Livermore in the Davis Mountains, the highest peak in the second-highest range in Texas, mountain landmarks are clearly visible in every direction: the rectangular hump of Chinati Peak to the south; the long ridgeline of the Sierra Viejas bulging out of the flats to the south and toward the west, fading into the Van Horns, the Apaches, the Eagles, the Beaches, the Baylors, and the Sierra Diablos. Beyond them all is the lone sentinel of Sierra Blanca, marking the route to El Paso and the Pacific.

The last time I was in the Chisos Basin, I noticed that little hill by the lodge again. Forty-three years had passed since I first scaled it. For much of that time, the little hill didn't seem that big. It was but another example of how things shrink and diminish when you grow up. Lately though, it has started looking more like a mountain to me again, just like it did when I was a kid. Just like it does to kids scurrying up its rocks today, I'll bet.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/mvpq.html0000644000106600010660000010336611075151301011415 0ustar Mickey Raphael Q&A - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Willie Nelson: An Epic Life| Mickey Raphael Q&A

You are here: Books » Willie Nelson: An Epic Life » Mickey Raphael Q&A

Order Willie Nelson: An Epic Life from Amazon here.


Mickey Raphael Q&A

No Depression
BY JOE NICK PATOSKI
May-June 2008

Willie Nelson is known for his distinctive voice, the tone of his rugged Martin guitar named Trigger, and for the harmonica played by that tall lanky guy who imbues his sound with a timeless, rootsy quality.

The man playing that harmonica is Mickey Raphael, the tall, lanky Family Band stalwart who has stood to Willie's left for 35 years and remains by his side whenever Willie solos with orchestras or joins other musical ensembles such as the jazz trumpet player Wynton Marsalis and his quartet. If Mickey's not there, it's not Willie. While he has recorded outside the Willie Nelson orbit including several albums with Emmylou Harris and most recently with Kenny Chesney, Mickey's harmonica is joined at the hip with his boss.

When did you start playing harmonica?

My dad's lawyer played washtub bass in a little jug band and he gave me a harmonica when I was a kid. Every kid has a harmonica. I grew up in Dallas. I was a terrible guitar player, but I loved music. I played a little guitar in junior high. The folk scene was happening and the Beach Boys and the heavy stuff. I was really into Dylan, Pete Seeger, Dave Van Ronk, the acoustic blues guys, Sonny Terry and Brownie McGhee. I wanted to be a guitar player but just was not any good. I heard a guy play harmonica named Donnie Brooks at a tiny little coffeehouse called the Rubiyat where I used to hang out. Michael Murphey played there, Jerry Jeff Walker, Guy Clark. Donnie Brooks was playing with Johnny Vandiver [a Houston folkie later murdered in a drug deal gone bad]. When I heard Donnie Brooks, he just blew me away. I started to take this thing a little more seriously. I carried a harmonica with me wherever I went, I was always playing and listening to other harmonica players, blues records. And I had gone to a Canned Heat concert and was so inspired that I got home, was doodling around on my harmonica and was able to reproduce a lick that I heard "Blind" Al Wilson play. I thought, 'Wait. There's a pattern here. There is a method to the madness. I'd played a blues lick that I had heard in my mind. This is starting to make sense.' That night I had an epiphany.

What were you listening to?

Acoustic blues. Sonny Terry, John Hammond, Jr., James Cotton, Musselwhite. I think the first album I bought was the Siegel-Schwall Band. That folk scene because it was obtainable at the Rubiyat, the music I was able to see live. Jimmy Reed. Butterfield. I was committed to the harmonica at this point. I got with Donnie Brooks on the steps out in front of the Rubiyat and he showed me how to play the diatonic scale starting at the low end of the harmonica and how the pattern worked, how you play all the way to the top, how the notes work. It was just a little pattern, like Draw hole number one, Blow two and three, draw three and four. It's just a pattern, how the notes worked. It was my job to put those notes together.

Did you hear music on records or live?

Mostly records. I was still in school at the time. I'd go down to the Rubiyat when I first got my driver's license when I was junior in high school. By high school I was hanging around Sumet-Bernet Recording Studio and got some session work. There was an engineer there named Phil York and he'd let me know when there was work. Ed Bernet, one of the owners of the studio owned a club called the Levee and the music director at the club was Smokey Montgomery the banjo player from the Light Crust Doughboys. Smokey and the Levee band would do these demos, these country packages. One of their clients was Boxcar Willie. He would come in there with thirty songs. They paid me five bucks a song. We'd do as many as we could. I learned my recording chops from doing demos there.

Since Dallas was the world capital of radio jingles, did you do any jingle work in the studio?

I'd get a call every once in awhile from Euell Box who did commercials. The music would be written out. He would have a string section. His wife would take me into another room and play the part for me on the piano. Then we'd go and record.

Were you playing with anyone live?

When I went to El Centro Community College I played with a guy named Mike Ames. He played flat-pick guitar in the style of Doc Watson. I played harmonica. We played the split shift at the Cellar [a notorious afterhours beatnik club where Stevie Vaughan and Dusty Hill of ZZ Top earned their spurs] from 8 to 8:30 and 4-4:30. He wrote some, he did a couple of originals, we did "Deep River Blues," Michael Murphey songs, Steve Fromholz, Jerry Jeff Walker. I'd go to the Rubiyat and sit in with Michael Murphey, Guy Clark, Ray Wylie Hubbard. My playing wasn't very refined. I was listening to Donnie Brooks who was playing on Jerry Jeff's record and to Charlie McCoy. Then Donnie went to New York and was playing with Judy Collins. Murphey would bring me up from out of the audience to play a song or two.

After that in 1971 I got with B.W. Stevenson [a larger-than-life figure with a larger-than-life voice]. We played the same circuit, restaurant bars around Dallas, sports bars, and were loud. I remember playing these ballads and B.W. would get mad at the audience and tell them to 'Shut up.' They were not wanting to listen. We learned the hard way you can't argue with the audience.

Were you playing the same stylistically as you are now?

Yeah, except I didn't know how to listen and I was playing all the time. Now it's OK not to play all the time. My playing wasn't as refined. I didn't know much about country music. The only country I'd heard growing up was 'Blood on the Saddle' by Tex Ritter. I was listening to Charlie McCoy a lot.

B.W. got a record deal with RCA and we went on the road. I went to New York for the first time. We played Gerde's Folk City, opened up for NRBQ. We went all across the country in a van. I recorded with him too, did three albums.

When did Willie Nelson come into your life?

I was touring with B.W. but we didn't work all the time. When we were in Dallas, I hung around with Ronnie Dawson. He had been a rockabilly as a teenager known as the Blonde Bomber and was in a band called Steelrail with Bobby Rambo [an all-star player who'd recorded with the rock band the Five Americans and Ray Sharpe of "Linda Lu" fame]. They played the Silver Helmet [where Dallas Cowboys football players hung out]. Sitting in with them, I really honed my skills. I played with him when they taped a special for the local Public Broadcasting television station at McFarland Auditorium and Willie was on the show. He was two hours late and rolled up in an Open Road camper. It was just Willie and Paul [English, Willie's drummer and best friend]. Paul was wearing his cape. I didn't know much about Willie. I had gotten one record Willie Nelson and Family raiding the RCA storehouse with B.W. so I wanted to check him out. They did their show, the two of them, and just took off. I was going, 'What was that?' They made a strong impression.

I got a call a couple months later from Darrell Royal [the coach of the University of Texas Longhorns football team]. He said, 'I've seen you play and I want to meet you. We're having a little picking session in my hotel room after the ball game. Come on over and meet some of my friends.' Willie was there. Charley Pride was there, [storied Houston attorney] Joe Jamail, Finley Ewing who has the Mercedes dealership in Dallas. They're passing around the guitar and singing songs. I didn't know any of the tunes. A lot of the songs Willie had written. I think I'd learned 'I'm So Lonesome I Could Cry' off the Charlie McCoy album. I was this hippie kid with an Afro. I was into the Stones, the Band. But it was fun playing with them. Afterwards, Willie said, 'If you're ever around, come play with us.'

A couple weeks later I saw they were playing a benefit for the volunteer fire department in the high school gymnasium in Lancaster, just south of Dallas. I sat in with them even though I was totally lost. I didn't know these songs. But I fit in because there was a big hole. Jimmy Day [the pedal steel guitarist] had just left. There was room. There wasn't a fiddle. Willie was the only guitar player. Willie would give me a solo now and then. I was just hanging on for dear life because I didn't know the songs and even if I did know, it wouldn't have made any difference because Willie was playing the songs like Willie, not like anybody else. All the rules were broken. Anything I had built up in my arsenal about how to follow a song, those skills were out the window because Willie made up his own rules. B.W. and Murphey were in time. Willie was jazz, like playing with Miles Davis.

Willie wasn't that successful yet. He was still playing beer joints. B.W. and Murphey were bigger draws. Jerry Jeff was probably the biggest drawn. Willie was a little left of center. He was an old guy, 39.

We went to a truck stop after the Lancaster gig [in the spring of 1973] for breakfast. I stayed for one more cup of coffee and that's when Willie said, 'Hey, we're going to New York next month. Why don't you come with us?' [for the release of Willie's new album Shotgun Willie]. I was still playing with B.W. but he was drinking pretty heavily at that time. I wasn't digging that. So I'd see where Willie was playing and I'd go sit in with him. I realized when he played the Western Place in Dallas he had this incredible fan base I knew nothing about. We played Big G's in Round Rock, a cowboy joint north of Austin and they didn't like long hair. So I kept close to the bandstand and close to Paul because these were the kind of places where I'm thinking, 'Gee I hope I don't get my ass whupped when I get out of here' because I was a hippie.

I'd been playing three months with him when Willie asked Paul, 'What are we paying him?' Paul said, 'Nothing.' Willie said, 'Fine. Then double his salary.' I came aboard and was paid $50 a gig. We drove to gigs in our own cars. I carried Willie's guitar. Paul carried Willie's amp. I remember asking Paul how old he was. He said, 'Forty.' I was 21. He said, 'If you're lucky, you'll make it to 40.' Bee [Spears, the bassist] had left to go play with Waylon. I wanted to go play with Waylon. Donnie Brooks was playing harmonica with Waylon. I think because Waylon had a harmonica player that opened up the door [with Willie].

Your first Willie album was a live recording at the Texas Opry House in 1974 for Atlantic Records, but Atlantic's Nashville division folded before the album could be released. Released in Atlantic's Willie box set, it reveals a hard-charging, rocking band. But wasn't the second album you did with Willie that changed everything?

We were playing in Dallas. We were doing these four-hour sets because the crowds were getting so crazy, it was safer to stay on stage. When we were properly fueled, it just didn't end. Willie said, 'I've written this album called The Red Headed Stranger.' I told him, 'I know this studio in Dallas.' I called Phil York [the engineer Mickey had worked with at Sumet-Bernet studios]. He set us up. It only took a day or two. He would play a song, we'd listen to it, then play along with it. There wasn't a lot of preparation. He had it written out on a piece of paper. The record company thought it was a demo, it was so simple. That's the way Willie heard the songs. It was a concept record. I hadn't heard that before, where all the songs tied together and told a story. This went against all the rules. Willie didn't care. I thought it was pretty cool because it was so sparse. I thought there's something here. At that point, I felt like a contributing member Jody was in the band, Bobbie was playing piano, Bee came back from Waylon, and Paul. The album gave me some validity as a band member. Willie never said anything to me except when not to play.

Charlie McCoy was working a lot then, but mainly playing on record. I went back and listened to what he did with Tom T. Hall, Tammy Wynette, Roy Orbison, the old Willie stuff he did for RCA. I thought Charlie blazed the trail on record and I'd play it live.

Does the description sideman sing to you or not?

I like being a sideman. Jokingly, I asked Willie, 'When do I get to stand in the middle?'

He said, 'Any time you want.'

Where's the Mickey Rayfield album? (back when they first met, Coach Royal bubbafied Raphael into Rayfield)

I did a little instrumental record in 1988 with Ben Keith [the pedal steel guitarist best known for his work with Neil Young]. We turned on the tape machine and just played myself and this keyboard player and Ben. It was kind of a light jazz ethereal deal. I got tons of airplay in LA on The Wave [a New Age music formatted radio station] and was on one of their compilation CDs.

I've been in the studio with Tony Scher who's this wonderful guitar player in New York. He plays with Bill Frissell, he plays guitar on Norah Jones' record. We cut "Spanish Harlem" just messing around and also I'm doing some rock stuff here [Nashville] with Jay Joyce who co-produced and played on Patty Griffin's Flaming Red. .

There isn't a lot of call for a harmonica record by major labels. I'm doing it on my own. I don't have that much time off to jump on it. I want it to be good. I don't want it to be a bunch of instrumentals like "By The Time I Get To Phoenix."

Do you always go with him when he has outside projects?

Willie wouldn't pick favorites and say that I come and not Jody or Bobbie. It's usually the producer that asks me to come.

When did you start doing outside projects on your own?

Rodney Crowell got me out to LA when he was playing with Emmylou [Harris]. I ended up playing on four of her albums. I moved to LA because I was getting [outside] work and I wanted a change from Austin. We'd get back to Austin from touring and it was like the tour never ended. It was so wild and I needed a break. I wanted to know the difference between touring and home. I liked playing live but I enjoyed working in the studio with other people. I loved doing 'Here, There, and Everywhere' with Emmylou. I did some soundtracks with Ry Cooder and Jack Nietzsche including 'Blue Collar' a Hal Needham movie where he used the harmonica and saxophone as the main instrument for the whole film. Ry played guitar and John Hiatt was the rhythm guitar player and sat in the corner and never talked to anybody. The producers didn't like the soundtrack so they scrapped the whole thing and used fiddles and banjos.

I'll get a call every now and then to play a session and think, 'I don't hear any harmonica on this.' I'll ask what they want me to do and the producer will say, 'Just do whatever you want to do.'

And wherever you want evidently. I hear you record on your laptop in your hotel room.

Somebody will send me a file and I'll play it on the computer. I did that on Kenny Chesney's record. I recorded on five tracks; I think they used one. With the computer and Pro Tools, I can do an overdub easy.

What kind of microphone do you use?

I use a Beyer M160 ribbon microphone.

Your tools of the trade?

I use Hohner Marine Band. There's twelve keys so I have harmonicas for all the keys and with different tunings. I have an Echo Harp which is a double reed harmonica that sounds like an accordion. They're made in six keys. I have those. Then I have to have backups of everything because they go out of tune all the time. And I have some harps that are customized. Joe Filisko from Joliet, Illinois and Jimmy Gordon out of Vermont both customize Marine Bands for me. The body of the harp is like a composite material. The reeds are hand-tuned and set by hand. It's like having a master craftsman take apart a stock harmonica and put it back together. It sounds better and plays better. They're a lot more responsive.

What about the front man, does he keep you on your toes, do you know what to expect when you're playing with him?

I never know what to expect. There's no set list. I don't start any of the songs. He'll start the song. That's my tip off.

What happens when he pulls out something from 1964 that you've never heard (as he did last year at the Fillmore)?

It's unsaid, but if you don't know what to play, don't play. It's OK to lay out. If you listen to it, you have time to figure it out. If there's a question, don't do anything.

Are there songs he'll pull out that are technically hard to play?

We do some jazz standards that we play in soundcheck that I still struggle with or have to have written out in front of me like "All the Things You Are."

Any favorites?

I like to play "Still Is Still Moving." That's always a fun song to play. That really moves.

You involved in any other projects?

I helped edit the four-CD box set Sony Legacy just put out. They gave me a list of 200 songs and I picked 60 out of the 100 they used. I know what Willie likes. I wanted to stay away from the same choices that are on other box sets. I also wrote liners about what it is like to play in the band with Willie.

So what is it like to play with Willie Nelson?

It doesn't feel like a job. The guy's crazy but it doesn't feel like you're working for a lunatic. All you need up there is Willie and his guitar. All the rest is icing on the cake. The way it's always worked is, we listen to Willie, and we just play accordingly. You never want to cover him up and you always want to give him room to do what he does so well, which is play and sing. Grady Martin told me and he told Charlie McCoy in the studio: 'Do not play when the singer is singing. Make sure you don't cover up the words.' He gave me the best advice, although he wasn't very tactful in saying it. One night after a show he goes, 'Man, smoke a cigarette. Take that damn thing out of your mouth. You play too much.'

What's the Naked Willie project?

I love the music from the 60s that Willie did [for RCA], the tracks that are heavily covered with strings and voices. One day, Willie was saying, 'We went in and recorded and I really thought we had a hit. I really liked what we played. Then we'd come back a few days later and they had done the Nashville Sound [over the recordings].' The tracks had been heavily orchestrated and put backing vocals on it, which is what Nashville did at the time. They did it to everybody. RCA didn't know what to do with Willie.

So I thought it would be great to go back and see what these tracks sounded like without the heavy strings and backing vocals. Strip it down like they did with Beatles' Let It Be when they took Phil Spector's string parts off. I'm hearing some great stuff. Willie's playing some great guitar. Chet Atkins and Grady Martin are playing great guitar that was covered up on a lot of the tracks. With Willie's singing you don't really need a great big choir echoing what he's doing. Those strings were so overpowering. We took the strings off of 'Bring Me Sunshine' [a Bobby Darin-esque swing tune that was Willie's first Top 10 country single for RCA]. On some tracks, we couldn't take the strings out completely because there was leakage - the recordings were done on two or three tracks - so what strings you do hear are subtle. It might not be totally naked, but it's really quiet and it fits.

Are you tempted to add some harmonica?

No. If I did that, I'd use Charlie McCoy.

*********

I'm the author of the biography Willie Nelson: An Epic Life, published by Little, Brown & Company on April 21, 2008.

You can read a chapter from the book [ Chapter 1, 2, 3 ] and order it from Amazon here.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books/willie-chapter3.html0000644000106600010660000011040411075151302013416 0ustar Willie Nelson, Chapter 3 - Books - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Willie Nelson: An Epic Life| Chapter 3

You are here: Books » Willie Nelson: An Epic Life » Chapter 1, 2, 3

Order Willie Nelson: An Epic Life from Amazon here. Read REVIEWS here.


Joe Nick PatoskiEast of Western Grove on Pindall Ridge, 1925

Willie Nelson: An Epic Life
BY JOE NICK PATOSKI
April 2008

 

Music was in the Nelson blood long before Texas, back into the rugged hills of north central Arkansas where the isolated communities of settlers could hardly be described settlements.

The rickety wooden shack on cedar blocks that passed for a one-room schoolhouse was hardly fit to be occupied. The floor sagged and creaked with every step taken. And yet, the room was packed to the rafters. Structural shortcomings were the last thing on the minds of those present, with smiling faces. They were just happy to be there.

Singing school was in session. Singing school was the social event of the year for many folks living in the hills, hollows, and backwoods of Searcy, Newton, Boone, and Marion counties in north central Arkansas. Sometimes singing school was the only social event of the year outside of church, a funeral or a barn-raising unless a wayward medicine show happened to pass through. Singing school brought out the whole community from babies to elders and everyone in between. For a week or two, the singing school students would learn music theory, how to sight read by recognizing music notations, how to write lyrics, and how to write multiple parts to a song for harmonizing. Mostly, they would sing exotic harmonies.

They were humble students dressed in sackcloth dresses and shirts, overalls if they were fortunate. Many went barefoot. They used frayed songbooks in which notes were represented by distinctive shapes: a triangle for Fa, an oval for Sol, a square for La, and a diamond for Mi. The major scale was sung in syllables- Fa Sol La Fa Sol La Mi Fa. Shapes made it easy for people who couldn't read words to follow the music. The songbooks featured spiritual hymns well-known to Baptist and Methodist congregations, the faiths of the God-fearing white folks attending the schools. Singers warmed up for each song by singing the words of the notes on the scale. Their voices were robust. No instrumental accompaniment was needed. When a particular song roused the gathering, they clapped hands and stomped feet, about as loose as Protestants got around Pindall, and sang with such power the whole building would shake.

At times like that Alfred and Nancy Nelson knew they were doing their job.

They were traveling singing school masters - teachers - and making a joyful noise was their mission. Teaching singing school was another means of putting beans in the larder and an opportunity to spread the gospel of music. Alfred was a blacksmith by trade, but . music was his pleasure. Nancy embraced music formally, earning a degree through mail correspondence from the Chicago School of Music. She gave lessons to children around Pindall Ridge throughout the year, and they both taught singing school in surrounding communities with names as lyrical as the music they taught: Western Grove, Union Y, Everton, Snowball, Gilbert, Morning Star, Lone Pine, Evening Star, Harriet, Canaan, Hasty, Erby, Valley Springs, Zinc, Canaan, and Eros.

Their love of teaching music came from Nancy's father, William Marion Smothers, a farmer born in Barren Creek, Marion County Arkansas whose people had emigrated from Carroll County, Tennessee. William had married twice, fathering 18 children, and learned music from his parents well enough to teach it himself.

For the first one hundred and fifty years of the United States, William Smothers, Nancy and Alfred Nelson and other singing school masters were the most influential music educators in America. Few folks in the hills and hollows and backwoods in and around Searcy, Newton, Marion and Boone counties could read, but shapes were familiar, easy to follow when cued by the teacher or in the songbooks. Shapes kept music alive.

The roots of singing schools and Shape Note singing, also known as Sacred Harp - white, rural choral music sung in unison - went back to congregational singing in reformist churches in the American colonies of New England (Alfred's people extended back to John Nelson, a major in the Revolutionary War) and to England and Scotland, and to Reformation psalmody and Renaissance polyphony. The term Sacred Harp refers to the tune book of 550 hymns and anthems sung in four-part harmony that was published in Philadelphia in 1844.

When pioneers fanned out across the southern United States, Shape Note evolved into a popular form of social recreation in Anglo Protestant communities into the early 20th Century. The sound endured into the 21st century in small pockets all over the United States; modern Shape Note singing conventions were held in churches, school houses, and campgrounds with singing sessions extending from hours into days with voices the sole musical instrument and the participants the audience. The singing was vigorous, sometimes bordering on shouts. Subtlety was no virtue.

Subtlety was not part of the curriculum in Arkansas singing schools. Alfred Nelson led the singing in his rich bass voice complemented by Nancy's alto. If there was a pump organ or piano where they gathered, Nancy played it while Alfred led the singing. If not, their voices led together. Either way, they made beautiful music.

Students paid their traveling teachers with shelter, food, other necessities and sometimes moneyjust enough for them to do it again when the opportunity arose, and when Alfred wasn't pounding hot steel into horseshoes, wagons, barrel staves, and fencing. The Nelsons lived in a hollow tucked back in the hills of the Boston Mountains, a vast woodlands of sharp ridge lines and steep valleys in the southwestern part of a highlands known as the Ozark Mountains, a vague western extension of the Appalachian Mountains rising out of the eastern landmass of the United States.

The sparsely-populated ridges were Caddo Indian territory until the 1600s when the Osage Nation moved in. In 1808, the Osage ceded the territory to the United States by signing a treaty with the white man [was the treaty with the gov't? YES]. For the next twenty years the land was a throughway of the Trail of Tears, the forced march by thousands of Cherokee people from their native lands in what became known as the American South. Most Cherokee eventually wound up in Oklahoma, but many just peeled away into the same woods that were the final destination for immigrants from Ireland, England, and Scotland, attempting to settle the same land from which the Indians were being removed.

The forebears of the Nelsons stopped in the Buffalo Mountains by the Buffalo River in the mid 19th century, along with a few thousand others -sufficient numbers to push the Cherokee Nation into Oklahoma "beyond the Permanent Indian Frontier" where many settlers eventually moved too. The ones who stayed were called Arkies or, more generically, hillbillies. Many of them had Cherokee blood.

Arkies were a curious mixture of self-reliance and self-denial. The caves on the bluffs above the Buffalo River were believed to shelter bears, Indians, and "carpet baggers and men of unknown character," or so folks said. Most settlers were religious. Even after prohibition ended, the counties around north central Arkansas continued to ban the sale of alcohol. At the time, moonshine stills proliferated in back hollows for those who took a nip of liquid corn or enjoyed gargling "White Mule." Few African-Americans lived among them; the farms were so small and farmers so poor that owning slaves was a luxury.

The one thing Pindall Ridge and most of north central Arkansas had going for it was water. The area's springs, caves, and sinkholes spawned grist mills, water mills, and stave mills through the valley. If you were near water, you could survive.

#

In 1882, Franklin C. Nelson paused at a spring in an area designated Prairie Township, between the settlements of Western Grove, Pindall, and Everton, where Newton, Searcy and Boone counties meet. He liked what he saw. He and his wife Prilly settled the land and fifteen years later, on June 11, 1887, made it official with a homestead declaration: Eighty acres, located at 1,320 feet above sea level near Boat Mountain in the Boston Mountains, half of Section 29 of Township 17N/ 18W of the Fifth Principal meridian. Enough for a man to make something out of himself and raise a family.

The Nelson homestead contained a grove of hardwoods shading a trickling stream that emerged from the pile of rocks marking the headwaters of Clear Creek, a stream that drained into the mighty Buffalo River a few miles away. A log house would be raised a few hundred paces east of the spring along with a barn and a smokehouse. Chickens, hogs, cows and mules were kept nearby. Franklin came to be called Uncle Peck, and his wife, Aprilla Ann, or "Prilly" Marshall, kept a sizeable garden and cultivated hollyhocks and other ornamental flowers around the home.

A small clearing was made near the path to Western Grove and Pindall by an old stagecoach stop under a towering walnut tree by the creek, 100 yards from the spring for Uncle Peck's blacksmith shop. Notorious for his persistent bad gas, neighbors swore you could taste his farts in the corn meal he ground for them with the one-lunger, the noisy, popping one cylinder engine he fired his forge with.

Uncle Peck mentored his son, William Alfred - Daddy Nelson - in making horseshoes, wagon wheels, staves for barrels, wheels, gates, plows, gigging poles, tools, whatever was needed to keep the whole grand enterprise of an agrarian and industrial society going in the hills and hollows.

William Alfred, one of Uncle Peck and Prilly's seven children, married an Arkansas girl with Tennessee roots named Nancy Elizabeth Smothers in 1900. They built their own log house over a rise on the other side of the creek on a gentle slope in a hardwood grove of walnut and red oak.

The Nelson family went back a ways in the Ozarks, around Boone, Marion, Newton and Searcy counties, and before then, to Tennessee, North Carolina, Rhode Island, England, and Ireland. They and all their relations had pretty much the same story: Anglo blood, Cherokee blood mixed in, everyone moving west, Arkies through and through.

Nancy gave birth to five children in Arkansas - Clara May, born in 1902, Rose Lusetta, born 1903, a stillborn child in 1904, a stillborn daughter 1909, and Ira Doyle, born July 9, 1913.

The youngest, Ira, the only boy to survive birth, was a free-spirit who enjoyed playing guitar and banjo and working with his father around his blacksmith forge. He had a striking presence and rode a jenny mule to school. "He was tall and handsome and would make music," recalled Irene Young who attended Pindall School with him through grade 8 - anyone seeking a higher education had to go somewhere else. Irene was one of dozens of children who took music lessons from Nancy Nelson. "She had a big ol' pump organ. She'd go all around teaching lessons at country schools. She taught at Glencoe school, Union Y school. Nobody had no money so sometimes she took chickens for teaching." Young admitted she didn't take to the lessons. "I was married, had a family, and worked at a grocery," she said. But she knew Miz Nelson was special. "She and the rest of the family was talented. They could sing. All the Nelsons and Smothers played guitars and French harp. All them Nelsons was musicians."

But (perhaps for the last time in their lives), music was not enough to sustain them in this tough place, and in the fading heat of the summer of 1929, a few weeks before Black Friday, the October day when the stock market would crash and send the economy of the United States tumbling into the Great Depression (not that the Nelsons would have noticed), Alfred, his wife, his son, and Mildred Turney, the niece they were raising, decided to go to Texas.

Alfred had lost his mother earlier in the year and he missed his daughter Rosa Lusetta badly. After Rosa married, she and her husband Ernest Nichols had moved to Hill County, Texas, a place where cotton grew tall and plentiful on the blackland prairie. The living was good down there, she informed her father and mother in letters. After their Ira came back from visiting his Texas kinfolks and declared he was ready to move, his parents were persuaded to go with him. The family needed to be closer together, Alfred reasoned. He left little behind except blacksmith customers, the land, and his parents; his father Frank - Uncle Peck - was determined to die on the homestead.

Before they left, Ira, the youngest of Alfred and Nancy's children, married his girlfriend, Myrle Greenhaw, on September 6, 1929 in Newton County and took her along.

Myrle's family, the Greenhaws, came from Western Grove a few miles west of Pindall Ridge and from all around Searcy and Newton counties. Some Greenhaws were store owners and business people in Marshall. Talmage Greenhaw started the Newton County Times at Mount Judea in 1908. Ephraim Greenhaw was a postmaster and social leader in the Big Creek Valley. His son Frank - who married Margaret Baker of Marcella Falls, Tennessee in 1868 - worked on improving schools and churches in and around Jasper, a rough and tumble cattle town in Newton County.

Like the Nelsons and just about everybody in this part of the Ozarks, a fair amount of Greenhaws were music people. Myrle's daddy, William, a noted moonshiner in the area, was an expert banjo player. Myrle's brother Carl played piano, and Myrle played guitar. The whole family sang. Myrle was a well-known flirt around Pindall with a wild streak attributed to her being three-quarters Cherokee. But if Ira was game for settling down, she was game, too.

The family left the rocky outcroppings and impenetrable thickets and headed south four hundred miles where the farm fields were like fertile river bottom. And just like that, the Nelsons were GTT. Gone To Texas.

Like tens of thousands of pioneer families before them who had been moving south and west since the first boat landed at Plymouth, the Nelsons had moved on. To some folks, GTT was a kiss-off pejorative, as in "Gone to Texas, catch me if you can," To others, GTT was merely a declaration of relocation to what was hoped to be a better place.

The Nelsons were gone to the part of Texas where the Great Plains descended into the Brazos River Valley. Gone to Hill County, more than 1,000 square miles of Blackland Prairie, Grand Prairie and Eastern Cross Timbers - a sprawling plain that opened up to the heavens in a way not seen back in Arkansas. The sky dominated the Texas landscape, there. Although the county was relatively flat, the white rock rise where Abbott was established at 712 feet above sea level was the highest point between Denison on the Oklahoma border and the Gulf of Mexico. The Brazos, the longest river in Texas, marked the county's western border on its 840 mile journey to the Gulf of Mexico. The county was lush with native grasses including buffalo grass, big bluestem, and switchgrass. Post oak, live oak, pecan, and hackberry were the most common trees. An average of 35 inches of rain fell on the prairie every year, enough to make one or two crops, although one quickly learned that in Texas, "average" was merely an arbitrary number halfway between drought and flood.

By 1929, 300 folks had settled Abbott around a railroad stop surrounded by open fields of corn, wheat, sorghum and especially cotton. Woodlands were limited to tree lines for windbreaks and small motts and thickets of pecan, elm, oak and hackberry. It was pretty country in the spring, when the fields turned electric with bluebonnets, Indian blankets, and a passel of wildflowers, but by the end of summer the land had typically been baked a harsh brown by the relentless sun, just in time for the cotton to come in.

Except for the cultivated crops, the small communities, the railroads and highways, the land had been little altered since the time when wooly mammoths and later buffalos rumbled through on seasonal migrations, eventually followed by native people who set up seasonal campgrounds to take advantage of the abundant wildlife before moving on. Indians knew better than to establish permanent settlements in a location subject to tornadoes and seasonal drought. The pioneers, who began arriving from the east in the 1830s, thought otherwise.

Human occupation of the Hill County region had been traced back to AD 1300. The Waco and Tawakoni groups of the Wichita tribe established hunting camps in and around Hill County through the early 1700s, followed by Spanish and French explorers. The first Anglo, Phillip Nolan, arrived in 1801, only to be killed by the Spanish the same year. Stephen F. Austin, the Father of Texas, made a survey map in 1822 that included the county, but in 1830, the Mexican government ruled the land belonging to Sterling Clack Robertson, another Anglo colonizer who laid claim to the land and who formed Robertson's Colony there six years before Texas declared independence from Mexico in 1836.

Comanche and Towash Indians had migrated into the area in the early 1820s, followed by Hasini and Anadarko Indians from East Texas. Although Indian raids on Anglo settlements were common outside the county, none were recorded within, affirming the land's status as a "council-spot" where treaties were made and safe passage guaranteed.

The county's Anglo settlers considered themselves Southerners. At the beginning of the Civil War of 1861-1865, voters in Hill County overwhelmingly approved secession from the United States by a vote of 376-63. But despite allegiance to the Confederacy and the county's future as farming country, Hill County was western in outlook too. The outlaw John Wesley Hardin arrived in 1869 to barter cotton and hides and murdered a citizen. Other outlaws, led by Kinch West and the Cox brothers, created more serious problems especially along The Chisholm Trail, the storied cattle route up the middle of Texas to the Kansas railheads that crossed the county's northwest corner in the early 1870s.

Abbott's destiny ultimately became intertwined with the rest of the world's with the arrival of the railroad in 1881. The need for a watering stop inspired a town site, named for Jo Abbott, a lawyer, banker, civic leader, judge and U.S. Congressman from Hill County. The 15 block plat of streets and alleysten blocks east of the railroad, five blocks west of the railroad-- was formally dedicated in April, 1891, nine years after the first building in town, Winston Treadwell's general store, managed by L.C. Barrett, opened. A hotel and a drugstore followed.

On September 15, 1896, in the middle of the cotton harvest, many locals dropped everything to join 40,000 spectators a few miles south of West to watch the Crash at Crush, a publicity stunt that was the world's first planned train wreck, in which two steam locomotives were intentionally crashed into each other near the Katy line. Two men and one woman were killed by flying debris while six others were seriously injured. Everyone who attended had a firsthand tutorial how to promote an event, draw a crowd, and put on a show.

The original town of Abbott burned the next year. Seed and steel were no match for the kind of fire that occasionally swept over the plain. The town was rebuilt, only to burn again in 1903.

#

In 1910, Hill County produced more cotton than any county or parish in the nation except Ellis County, the next county north. Sixty per cent of the cropland in the county was in cotton. Railroads followed. By 1913 two hundred miles of rail crisscrossed Hill County representing the Cotton Belt, the Gulf, Colorado and Santa Fe, the Trinity and Brazos Valley, and the Texas Electric lines. With the train came Germans and Eastern European farmersCzech immigrants in particularwho would have a major impact on the development of towns in southeastern Hill County such as Mertens, Penelope, and Abbott, and on the local culture including the night life.

Seed and steel were also no match for the boll weevil. The infestation of the pernicious insect that feasted on cotton sapped Hill County's upward spiral. What the weevil didn't waste, the Great Depression destroyed. As good as the town with three cotton gins looked to a newly-arrived Arkie, three-quarters of the farmers in the county were working land they did not own, and with the economic downturn, the train didn't stop in Abbott anymore. Riders had to flag it down.

By 1929, Abbott was in fact little more than a scattering of houses and barns, churches for Methodists, Baptists, and Disciples of Christ (the Catholic Church for the Czechs moving into town would come later), a Baptist church for the colored folks, a tabernacle for singing conventions and revivals, three cotton gins, and the three transportation routes bisecting town--Highway 81/77, the north-south border-to-border routes connecting Canada and Mexico, the Missouri-Kansas-Texas railroad which also ran north-south and the Interurban trolley which ran from Waco, 24 miles south, to Fort Worth and Dallas, 63 and 73 miles north, respectively. A traveler passing through might not give the town a second glance. For those who lived there, though, Abbott was something to be proud of. As native son Leo Ruzicka pointed [out in 19xx], "Abbott is the first town in Texas, alphabetically."

Copyright 2008 Joe Nick Patoski

Chapter 1, 2, 3

****************

Read my MVP Q&A with Mickey Raphael, which ran in the next to last issue of No Depression.

Those seeking all things Willie should visit willienelson.com and stillisstillmoving.com.

Order Willie Nelson: An Epic Life from Amazon here.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books/texasmountains.html0000644000106600010660000003363511075151301013515 0ustar Texas Mountains - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Texas Mountains | Reviews

Texas Moutains - inside photo Texas Moutains - inside photo Texas Moutains - cover

Tall Tales
Texas Monthly
Read an interview with
Laurence Parent and Joe Nick Patoski
Look inside this book.

Buy Now from UT PRESS

Excerpt |Texas Ranges
Texas Monthly Feature, November 2001

For most of their lives, senior editor Joe Nick Patoski and freelance photographer Laurence Parent have explored and chronicled the mountains of the Trans-Pecos. In this excerpt from their forthcoming book, Texas Mountains, they show and tell where their love of the outdoors is at its peak.

Texas Mountains
University of Texas Press

In this book, Laurence Parent and Joe Nick Patoski join forces to offer breathtaking views of the Texas mountains. With magnificent images and words, they take us on a journey not only through the familiar Guadalupe, Davis, and Chisos mountains, but also through lesser-known ranges with evocative names such as Sierra Diablo, Eagle, Chinati, Beach, and Christmas.

Amazon.com: Books: Texas Mountains
A Magical Book
December 9, 2002 Reviewer: A reader from Dallas, TX
"I'm a photographer not easily impressed. This book is simply the best rendering of this breathtaking, little known part of Texas that I've seen. The essay is well written and together with the photography makes for a classic."

Pages as Presents
by Dan Oko December 7, 2001

These almost-too-gorgeous photos transcend the prettiness of postcards; the 10-by-11-inch, coffeetable format allows Parent to effectively hint at the scale of the landscape. By contrast, Patoski applies most of his able-bodied prose to the job of documenting the ranchers, restaurateurs, teachers, and scientists who people West Texas. Parent's full-color photographs, capturing the many moods of the Texas highlands -- rich tableaus of various ranges, valleys, and stony outcroppings documented in an array of seasons and under a variety of conditions. Patoski describes them as "a stone freak show of weird globs, jagged spires, gravity-defying balancing acts, marbled swirls, scoops of melted ice cream, and dribbled sandcastles that vary wildly from extraterrestrial to lunar in appearance."

Amarillo Globe-News
December 9, 2001

Takes the reader on a tour of some of the most magnificent views in Texas. Prepare to visit well-known sites in the Guadalupe, Davis, and Chisos Mountains and also less familiar but equally impressive views in areas identified as Sierra Diablo, Eagle, Chinati, and Christmas. In words and pictures, the book captures its subjects at all times of the day - dawn to dusk - and all seasons, summer drought to winter snow. Patoski's "field notes" are enlightening. According to the publisher, the work by Parent, Austin free-lance photographer, and Patoski, a senior editor of Texas Monthly, produces a result that is as close to being there as you can get without endless driving across the daunting distances of the Lone Star State.

Related Articles:

  • Big Bend 2002 Whether you want to hike it, raft it, drive it, or all of the above, here's everything you need to know to get the most out of a trip to Texas' greatest treasure. [Texas Monthly, Travel Feature, March 2002]


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/crossfire.html0000644000106600010660000003147011075151300012424 0ustar Caught in the Crossfire - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Caught in the Crossfire | Reviews


In the Studio | Part 2
Read the radio interview
"The Best of Stevie Ray Vaughan"

Look inside this book
.

Amazon.com: Books
The best book on Stevie Ray Vaughan available right now

Caught in the Crossfire - book coverJuly 9, 2004 Reviewer: "rooster1956" from Harrison, Arkansas
This biography on Stevie Ray Vaughan is the best I have seen so far. To me, it is the defining biography until Dan Forte comes out with the "official" bio. It shows that while many view Stevie as a god, and thought that he was this mystical figure, it shows that he was just an average joe, who happened to have extraordinary abilities. The most interesting part of the book to me is when the fan presents him with a rubbing of Hendrix's gravestone, and he tells the fan to get rid of it, saying that it is too creepy. This book also shows how Stevie became who he was, and how the insecurities that he had enabled him to become the great guitar player that he was. I've reread this book 6 times since I owned it. It's like my favorite movie: I just keep going back to it again and again. Rave On Stevie Ray, may you rest in peace, and may you play a hell of a jam with Hendrix and Albert King in that Great Gig In The Sky.

Crawford/Patoski Stevie Ray Vaughan Biography Papers
Southwestern Writers Collection - Texas State University-San Marcos
ALBERT B. ALKEK LIBRARY - SPECIAL COLLECTIONS
Bill Crawford and Joe Nick Patoski have been involved in writing and the music industry for most of their adult lives. From 1990 to 1993, they combined their literary talents and connections with the music industry insiders to write an unauthorized biography of blues guitar legend Stevie Ray Vaughan (1954-1990), who died in a helicopter accident near East Troy, Wisconsin. read more

"It did not take long for Stevie Ray Vaughan the man to be replaced in the public eye by Stevie Ray Vaughan, the legend. Dying tragically at the age of thirty-five made him an immediate object of worship in the great rock-and-roll tradition. Dying under such tragic circumstances after overcoming his own personal battles with the demons of booze and drugs elevated him to something just short of sainthood."

--- Joe Nick Patoski and Bill Crawford, Caught in the Crossfire

Album Review: SRV by Stevie Ray Vaughan and Double Trouble [Texas Monthly, November 2000]


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/books/Willie-ST-2.pdf0000644000106600010660000016057111075151302012151 0ustar %PDF-1.4 % 9 0 obj <> endobj xref 9 40 0000000016 00000 n 0000001359 00000 n 0000001437 00000 n 0000001616 00000 n 0000001887 00000 n 0000002318 00000 n 0000002731 00000 n 0000003293 00000 n 0000003328 00000 n 0000003373 00000 n 0000003418 00000 n 0000003463 00000 n 0000003691 00000 n 0000003925 00000 n 0000004147 00000 n 0000004224 00000 n 0000005941 00000 n 0000006265 00000 n 0000007836 00000 n 0000007959 00000 n 0000009248 00000 n 0000010055 00000 n 0000010772 00000 n 0000011713 00000 n 0000012139 00000 n 0000012382 00000 n 0000013165 00000 n 0000014166 00000 n 0000016859 00000 n 0000020157 00000 n 0000020397 00000 n 0000020612 00000 n 0000021138 00000 n 0000021469 00000 n 0000022003 00000 n 0000022664 00000 n 0000046240 00000 n 0000046339 00000 n 0000046549 00000 n 0000001096 00000 n trailer <]>> startxref 0 %%EOF 48 0 obj <>stream xb```f`` AXa$Hr )IV!\F %RTAQyO @DY,7:.iAxւBLo{4;R\k:03+L \fa`8H3s00& endstream endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj [/ICCBased 36 0 R] endobj 17 0 obj [/Indexed 16 0 R 255 40 0 R] endobj 18 0 obj [/Indexed 16 0 R 255 42 0 R] endobj 19 0 obj [/Indexed 16 0 R 255 45 0 R] endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <>stream HlVY6~[blf&= CY-5:"3lo XZӊ0_F,i0#\x'HvTȕ0_8<߱8m>I:Pc? VHGf-sM0';7?liGwJ$_Y^\{:Fbޟh{4,,Bf܅yͨ"tX堟}\v|2OP6&Ql4& )$ҺJolM6WP?N#"o j;Cb%KNJEqIPtH\չrU#JApLNBO' ӛ:N#>9C G1-`o [Zy}D ë;5H~•BݞddAhyEuyΈ *C9ޱ 7┱+E 9; 1i/i z\ZC)_=Xz!P^Sw6P1y.%\œ& X?NqB? S^]s$1InjE"h0Hq-)= ?򉱼@:hMLtwh5`6OhG;4U 4XðJa `^aցgy-" D>3oJT٥J.3 O9AߖۍrE  0g endstream endobj 25 0 obj <> endobj 26 0 obj <>stream H|VM6 V%dm&3ugMD[JKz: PM/@ <<`.Ieۇ?R *+TӀ>eHd˥hŦ*I9P4+W"~,D(~,7ލ$=z99z7V49546iZYI:Rm|y)QHPO^A|NAXC \-w\\o5OF~ue"cdu nt{}J FFgL $IX67Js:U`(wِ)t_Ohx'A o5< 5 k;xR'yVV]#ij a.I!iV|YBΖ`ɇFI @mRHdp-^;›Y*#' -n`vx:[l99/[#;w$AB6|NY)t|::OpI2ֹW^gy1/n\,SNIF$Nhz>fc i,pi6yftDŀ[N¥llhcOB\xYI,! j2H6sLE Hk_+Fk hk/7`O*֤F8̉U V:u]HscJ3|]2;`Xfk tGW'}iwL&2gXQd! 7٘(}:Hb GF05ZjRlރ Xϼ7Q{"z5z%~}5`X M4/TTYrǘÐ[J`Ʊ ]\M\Wv{ǿ[dWyқqZ0SчW_nɈDCh$L̀X} ?ggv e\!\ i]F"7tR)ML>VQomOVS<+XTϋIW{z W7 vxs΢ /#Gp0}3Q.6HBH?kX5?}Frg\(%qk3ߌq4% anoTƞTVQQ,6|{:~kvTAd8e d٨!5)*;JA|!;-n:4[\v= 0ۅ endstream endobj 27 0 obj <> endobj 28 0 obj <>stream HVmo6_P|imI-MC8Zc#% 1"ϑzx󂓙`RsnIāRz.ҫE9r7˚t=mْ1Ar晢[hiB|f7?vE]MuM΋U }!p 5q2 y 9#]mCH93(S iZ{^rdvl h-D2/I_SX2r]?[ r_(m5x2~E\ţUq0"eFI^vҀc5Qd0JKJ D` '{6 ~G$Oq?&f|"s 4&yqD>4Z3wQC 7LF0pP7>Â>XT8 Cxs8 P'S<~F\]&@ 8 DaȕǴ=,Я^/t܏N`j} i nqn4ZJ{Av*/I65Ґt61X.6*2ObP7[}7,{&NχciMδcSv ǀIb>ȠbG1.sX,`^d0WHC0ks(EIOaAf2G3%"ylGi*'.S< Q2=8B:Gʌ Ќa 93)%y W)]8:IlTЍsKR Lh-" hj3qa.?9L2#i4o̳X1.9>,8ঝD&4\8h9pˑ9^{A6~ ` b~SLe\A PPȪ"~?PB endstream endobj 29 0 obj <>stream HtMo1 +8{I|^\4*[RDծ4&qʏK B*QYkҁ@1Xj N8MaBPdrdrdJHf H(# )QC2SESD">3bB ̙2+U$2w֫$b$ Xd@ɬLpXdJX(fg M(#-V!=P@2;SD2{"2K)c7\`ͅ\Bno_Χ;=ۏqia'C|X>Boz!o {:u\ت1nV+$!xzEգKݽ/N$qv/Og}i4ZzNVf͟1>1.3͟gS bcPH]N$S' ?dB5%O0M8Nb SB2gY5[Y)"Db6[Y5gucr0g$ْϚْ+Sْ؜Ս)y89ϺR4c12S0Cs0g,Y̖|mA fK>sV7d>>fK.qؒd~L-7flgl3}POZ$ǩL`a^|FV"~“y+|`>⩀{} ~•y+qG[_>pY:V?` endstream endobj 30 0 obj <>stream HtM1 Fu:DZ? u@,>6UB O#Lnuv1jr2;:̘ &bFL*K Ĕ * Y;uN5!FjFbkٙم6bNUOtP(樄>iQ)TPi xYysRkm?.G3"?,G^dKi JpxS^F y@e^ގy@e<$I5HQ4>4{Fy#}x} J hTӀ MP+@: 3"+!i4 hu;U GA-@.~&dQE}4=H6G}56%\#[}L9L#!V'm&3Φi6UY6E(#A>{,x.^_l'O;K6{>>1|}s}GӪ endstream endobj 31 0 obj <>stream HtMo1>Jd/PaoCZ5*=uZ£Vw~]?柘e0E5ݯ. ]n蠦haE=h83TO{ڜӗ1@""zg6gMdjJ.I.)T.nI|FH>#mkIg-`Qn|F&>k\Lh:ńvqRY#,U>k[_EQr1\L[Dψ(>k9SEV219'\M"!ģ3T }Eb R']ܢ t|F>kMȵtjKJZ-K7gĥֱ7ul-ul:rB:ul-ulR?' endstream endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <>stream Hn1>&ؖ4&Rc'h@(=%{?IQuI)({kdLўD eR J1 ˉ2YfRQ /,JQDU  *0D I$0R"& ƞ}E&PxQ hd!fnLEh0yJ `2bpLf&Yr"[;e*xb$%%R%QIA>SgʡYl(#gbһxm/G|>#b\zQ]T4g{Ś#pԻx .#A>-,!7+ {7?N| }pm=4Vׇfu=8y>5;VJ+Z9N}9Ձ;zhZtZ9sKbOW~Z}ܯmvn}Un{.glp7%n.E[Ku+n~z7O);Wi5VV[j;Ֆڎ`#֎} mY+Yu ?$~ 0 endstream endobj 35 0 obj <>stream HM6<@4"ïHz(T@EaﺵV(ߡEn5EԶVC$WlTP6͖%JɁ)D\$ A$W׳՜#9+9qA^`p<א Ywyy) (M-y@|d4H  yCOZDSWЂ$b/b Z#Y*BZ`@@B gDJJ?)Bĵ +%?#OUޗ~VKQb Zb $*ggMg{StS WRҥJ~FJ?+蛘7tܞe؀\~ͷy7Z|.%p\؀6}ېgkZ^(/Pj޼o  ŀ72,AMևx|1o+qTV\Û܆eQr>tlYF%{\cc[+N=U!ǠC/\$i̲E~aVᔏ_ {?{کݕ|GAǼrRO>côcp`hW:z8UߕP㑁{FٟZ<8O9ZuagsL_?B~K-_nW&Hw+euNO=ypSfJG2A.O?cQ []nP,N|n^^^<; Ao55 QL-hG Í|.&ܙ`_1< Cenaܝ0[<XipB2:<yo4Lk endstream endobj 36 0 obj <>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 37 0 obj <>stream hX pTu>] $T1oYK!H0H@vؕvcVYɲe;\W"Ujř8cFŽЄ8(6.3vNSeIL<1q[OPJE$vN;9s=oITtu$4zKO b9Dʆ}{I6{:b|rtt_g40t'K'r MzﭯN>kDX-33K]5. -ݦ!}wђD{?hndä ?&oSD2҅#m͆A_U3T3s^>Rjc +Ԋ@2}h `Bjw)ZM K4Vx_ Y1Fؐ?G!{|_Ax')E<~ztIBJ M2>Af9%9d\stɊ"h8KGsK|-a>M+)5[]ǩB"ڟS3VnGg;X dQp̀^]E)$?W*_MjO*b+22nFU~9G.ϢAAGi4N/wĚtޢН k`@AP`U6^B~rTmS Y3m>ߓHrH{VG:&^^ʣS SLSjz:^! ڋZQWBU:LIkAgBMU"ղ:v+(vzؽ=Þe:2g}UNjk|__DNs-8ͯ4)[ʕnRE]W:(I/K[|\)*߉/ϱ\eԩW(ʓ83ʌnu%[]nTG ZhZڴ~Qr$t=/tߩ2vR t-";N} 9QH)Jiڻt::EǴ>vN I31@h?.2}_zTJX2Ȏxl]`^.#tN#) *_Nˣ_9>t)Sôr)V ur?\ߺn^[\S+?YXpgX~'np-y9K23/JOs:tMUd3*{BY2B֭^1_Tu }L#d =}lg{=Y6y 0cL;z9c,Y.0p1w& ~3"xSuziܙ1 Ygux8'}2<~S+R08b6k]nw[l6OIj3rkS15kKCxd&#H)b"srtx=05Zgav`~6(Vˮ ܗ}}.)207*;xYpԧ|5Z1vpa[ l~]/w1]8joZ]{c[`}:^o|[0??J!5V.1op!ǖ\~ &R"tC Yo1?}zjclN;nm͎ڬf[mf6٬flVa3f$1v7?? |NǁG''! b~=f6{fl͞YͪlvLb3n3^ 73<0 5Dq8 O>_666|Dk1m]jwhû6nW~~L=[SuUu㌚KF\mjiL2ݦffv#5TL~zd}ax8K>|ĕ `ufB[=MhB;li&Z }>bE]ܦN;l>Ӝ'r2+6^ _ٛE0yU„O,aZ,Rݮ),+& "= 5&ƞ&gIβ^ɜͿĽlM;2)Y:F#6|H7ĸEb" a<:"~>[ ,0+o&Jcd2)Y<5Ix'^JfdK)b6ͦdxiJV!I%_Ļ] bƶD'k%FU,f^=hO4Ąr;j4cwv~Mjvu=ޝюcğoPFxGD8N5OEn%TCqEI(G+h5ySZ q-_1?%(2h|k«_+ͯP] 2醗A͈ ~D(R۟vjB**]HX3:N˜-LtXu ubzOYsB'v-n͚rS)x2!U@R|{26]]H{h]mr[x OO` endstream endobj 38 0 obj <> endobj 39 0 obj <>/DW 1000/Type/Font>> endobj 40 0 obj <>stream h޺ݳf_:ߏ{]b_5)7$G=ο.,SMnO/zkϱ#]O~ϳz;횮ǽ^eIO/LQ{ݏ9v?~y5wZOԯy1@y O.|fo}U%]e{5إEC -fYޯ_/sՇV;9U{&{>曑J}Z⒧~Q0^rO81A6oCFVD>]ZYKZo~~[>-qs6'NZt.xn̓"O-J:ofJ; Jce?(10 0 endstream endobj 41 0 obj <>stream cm %A|d1q{tu j$2X`r WanMh;SzPl+&J~yQ[.)#'7] :vO^fFTo30RD endstream endobj 42 0 obj <>stream hb`s3g9s&--omKZڙA[>?Wn?{{W5lԒƺpZZKK ҥK3>}՛? ϜaP[Ss%yURG|cUI -S?_[pCtIHHUWlݺ܊C~޽щ\Ǧw_QW_f"|jaP\Yzߚu{~kV.ݧ腬mV ‚?FWZyo}Vٍ?ZF#bU;r{Xv1Ho?NwRwzۑw=c^kuZy "[2(e6>stream hޤo@RfY7jEg})@V-ƢkSVсBΉ~:tf}6|(!z5¨cP ωNWtKBz 燾>stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?q2&UłCN^ V~,W[ o: 'y%AZ7"C\fC=%VS^g[bHnacy`yDs4IM[$G'S?V0Wiv䔨y?H5؏sh9;PrtyǬXH-/q;YXԹyѳ*_[>~@.N..+ߒZt,8vǖ]!׷sqAoL+$qK}Lk??:첊CeI;Ktu0"%kO3SO[0 :53Tߗ^΀n?1H& fLtrR2Ӑ@Ν F.>t䓺Po7Lj#8ůڂ?X lihsčCI$gP!dԺwZ#?:tA{Ljtt RAkvq~H/@Q1πPYkoLe5eM= ptz0Zw@`sƄw绨g/v HIL8A:ZV1`&;(oGg{6 !9ynqh @:*?m:zC̶D@"zÜ $s;/Ryɹt*fD'S`dSnFA?GAѯEIț kovZc @P()?c=NRPI31AަK#*C:p; *UB\$Ú\z4$˜<Hl2Grb%=gOR[o{+ItD6csaS͏^GsPck-:|Hx2d %v`>%Z6jD n(tA\ u-Yq)FUvU8|4H%tw%4r. YR^[ |VwK/ښZ\In ꧕o S[Ǫ4"~3lw gthC?)C+y՗A5%Rĩ^Cb`ØLy; 馆фnm^wIF{uh<'NVFkhqlyɔU}?dεr5$ο+#uQ[g#>ϳ7`-Vշ  zLqЙ%y&'`:Tg]n;GtK?II]xa2ET l2I'ǡdfӏ2ӑ#ǦՒ*c790$ƽUǸV9lI:K)X s ,hvv4m/~vEX`AGA[ieLp0㯼kӴ鯚?Ků d s ?9Y}Aa.qcGU $pӏ=nꙍunhdD2*s'uc'LI|$BAoq't+3cY\?;]>Kv++ۨHn=`[va9F!J 0AAA,@:ۅ1` 0>Ё5{4@#k͸z;B2'"A?pJh$Hݧ ^FbJgOdNCGA`sxyI$2 %[hJ@y⭒ GTf- {$nuU>jT|आp"6 Y ~W $$|UP/xuBHn>c!;\ZasJۢ(;c5dt[c (k#P5Z=J͌pXv ? )uߪVCk185" AnXq><4;Ȧ\QIN'^< ,fGE0Ch-{IMM k;`4^s*R>AqWWTml@BV5[M rpoqƝ$[/~f[]%[Cĕn|,~* $m:c2Z4t~갺]ȲY:˥6tؐu4B7muΩU2^@%a>sjx%jI.2|y.ڡۙne΍=Q$iuEp ] _2!A @O&4Iwx`3~rGD>J, 3J%jQt#q߽W ITƄHcR<%I.hyI/Ihȭ_ZctTǑ[A\iՀFH)"@UgR'ATRS}y<K{+mLВ!̓Wy :Um0yhxHz ,T^u"A2`DOx5nƟN*GuL^k ؁-h'UWEm\Z6A7p:5nwsZ6ehk`疳u BEmh' _28c]Uu]7$\ Z&>E$7y=:+Ĭ^&Z5Ǒ2,p.'Sj&4Z7*Kdvw;X 9dWoy%퍢;@ cKuv$$ku>I@%WWN[kv]uA1H|2>48ݡ<+`iBK>?Yx-{Imn3$p4H0TгPOywT:{pSO#L NN':uU_6# :8q:߅sz^QHyK+Z5:6 ig.9g/b[ý* ]!Z}`8b>띠 8ZH*R|OJǷ-Bz]k*%^Hixr 5RIu"\k窯P~KG顼9Fɩտk bIBR׶;p|$_I$cI<ơUMlUZ>NB5$B d‚$J ca-׀jiIL c|ZczF #ͮ>c[2"~Mz`!TM2HAiߍU^z H%1)kj"-jCF5҅:"[10wInduLm(i"7$3BѾz[Oi*.[D_uYló8q~uv:\O"v:^!fI  $J㺾5L~HVt ?x.Ѷ@Ifx+Om^n8`%Ct]2[É"@OeIKHȎʦƻ < tCNgY5 \:Ͽ'fm50$NKC^Bӕڭ. . ٹx]GLvfC :N]13vX6mFT}(b\wJ];èrn#ji$I:>j>XaԹD-E9͝@5#tHFƲH0 G6K ;u~k-JIJ/87QߟƲ&y k"؂A$?d\5 =$QSEav53Ú"4c\NǛ ,k~l | 'W3a:: ;ebguZ)}iht\ >djp"+-ji!hx+-uez+}قg ,Cf[iOvRXdAlN.|{3we@;\dA >`<`.V\O 'C\|LOWkO?RO8<\ W\5@MM#?(ܒԬ{a4U.#6O )vNZx`}0*H Hx$'`Σtx k\O-jk"$vXT0{yj$*WXv}?) ?NDhͣ~EVs}Ȯ 6kcx邏<܆ Ǧks:: TuacZc}RfUa4Qqx{}FL4 |:\ӄOXcȗO)"p,k9Xa'Yp]=6FkII8=]ED v g(n^׽HYf? 7-LAdƞ|'zV 0 5UX\.5&K{H}$t-cT, ׹' v~E !ADŽxh[FEE;:wm><4:SivhX !u՝Ul]]@\5xK˳{)qǶY_"Kt0gӍ]s,hh:5mAĥX~@s-\,ݳ8yY?}@pGc߅Y0z-xN ]IׄKӱhf;(}ֆ%.{vXA1'P[â.ӺgnebX ~5x`}$%."sODܒhyI( )$B 9Ub|DcXSk08B MISk]В@ʅ 6$|'e5@aٸ֎{m9ktcNvƾ_gٙH֑Z$E'״v4gOlZ~j. 2lk51)e=.ceNl<52z8tSiKI$4L' FW DwMŦ0I $֝!i.:<83 AV\jyihA m}Ϋv1ıcSZɏTz."Kb$DvT]13F5#|BI'Btt>`!dP$cXkG#_jbٍvE̲fC>BW5E3p-k :1(Ɗ,ʀ&xDm>dv\ }ߊK%:7D"O~d.ŠN1||zOZu/Nָ1ď=mF6 ΍cCId >`NݣiwjS4Y6Y2 k>_w:Ihkss9 icZ@${BYov#=S[~ m8&,UW!8鴖5wn85xum|(ŜiXm m h$p>?G\bCwfO:{c̼ }9<{}eį@VnKȁ$ +Z LI0O'{W@ 8l _9[6'O':*= mgu|,lw>x2[&hsK`gN$~P缍y-=>U}hi&Hl:A,$i @" )DI Nڜğ$%[7RDAGIvN*i:R5盛|--DF%'\Za5&%a1eX%%ŭMP9qltgMf1"EL N+7 +]V;K+#贻II߷&~k t8\?8U?Yf% & ߟ9ͣ 0p̖$Y "אۅmk.v珈$aeMd||Z-LV8 /0c%u<\ HIC lAk4qxN@&ν̦%տcqLx>jWc7~ENA`~&RSzͽ;{Г:k]V~O}հ4o$jv #^x6;H;=ò 6n'S%A }WryVA:an|6;# m#i&wݾK=>vM{I {a`S_+u[~,#{ kFFG*e[^5g,,fB\^=^`8R9gckkwFͮL[`nv@$ZHs@m{tu=ʭ݅v;"ǒXb]>>P峦k`7m$gmD:UoWCPIGuN}D4KIu$ ?u,d?Eh,0=l 6fF*pzSG2j{~kCGP5LY`u[oi2FY?kYNUAUnx7I-iF$)Ok $h$@dh5 ySN:==v-&7|NbO=J$f|juH~ )ځixIF_HI.sq9 ]9U1Hۯ _ȥ[,ﭟʹom!+uX%[l96M4'c=0i~_¶tX qCŲ0ܗI' 7eV5o<_KjcX pxeeV3V1:fO V!WYI" Cv^I3߹YBX Y=<+^X펏?p@=zޙ;1f^$ Ϋ09=?G#/R`> 6Zdw-{[4]| mO({H#k<}{HGQΣ]N7{H9RA#μgݐH2Zu⻌`gosF=FHyu\v̏>)OO^Ƿ/e%ckG};% v~[?e7!ƶ;珂Ӯ2;,lnFK7YsL 5?/ͱVVHluZ7K[qBw:^Q:^.s'`vϳ,cyYZKF nڰZYH;>q+Rk; !5_$6yqsm6j\>QޖYI,q%ĆrقOmDxJߡ5+mo "=0w۪Yv5氷G:wr*y[9†d$2drLH?r@ND@1)؏?R`# $'#Q87JM`Ƭ0˞$kJ+m 4 F$ >`tqŽ˦+xkX9;+x:}cc7jYY~*FHAq35:xx$JF6N^Coh.%䅋 4tqgG}:[Yc袢(Z {dht:+̑6d^ߔP*u2l*o3AGpI=BϘ12 "ִNf4מ/7$\]k\KXHݨuFXqt{LcƐuSm>׸& Hlnם4L_Ycop{>x5> OosQGr #-/-M:N5Ru6ԁ X Nݤdg}Z& s)ӯs7Z50IO$ KNDw2H.0I TC%%qL^MG\ad_}IIk@ --$q؀eѱ@k:5:4X<H`Ak%g%7<Ů"GxqkQ\@;7#CzCp-2\7']͙$϶? Kg[閐p"ۑ:v7JG{هJ紓k.0DHoUlf%'gOؿ}&>bg^aPvf@VLKA1p7R8M1oin^).!s(; 5*[Z,Ĵjװvu,V 8|W֭~=}ѡ'9e˅ :F *֭ kZY"@t@,=$ 9ЏğdѠ@i(<%32O8Qi@'#ѿ hwI%*БI(%:AhN,mzìZn'@IkYYov p?t;LI2OM ((xi㦪N{ :A: yi5(TXjw8u OE H,`e 4{nj:e4Vk{Z-HOr1/m$ jᦧp#HV%BV? * c Im.DZ߿yypi !!]jZė̓Qk1KL&@DEΤ8ܒ,-PpU%˷2`>L $WU1[=?8V,=1!kH[ x\tZBmuαRQKUdHp,1pL%}[S ~V 26 \ IC4hI,/>ɤ1jHPU9'HL$~ L|bH4HINGIkhyI$4>A$Vt/pqĝ|Bv}u)dS\ę{F8]uRl?EÁ'E9S :Ha%x% $<'ɀMedcts8yO-?B;D.5k.uTl/v@gRHKU6CA'`os:$9]sV0H6u۞te۴i!ݙö{t']>d%np1W<<ʫwhAϐ Uϵ4r=GH'씴Hӷ;CN`apt3PfCu Oc/aAh}3*%mu$L5:-<[ʙloӐ ~#B-1A5dƶICwm'qV}a1qkDns[ '5}@{@5! {uzEoz[O$.?KA0{!ӻf>몭Ζ4\ Gt<ΝW>- aC <-شۀsOtD릺wγTޡ} {3q<>In_ 2@߂gP'Rd c/F[-FNSIh3U$6t f:: '4dT4_%W]KG2<P%n,%mn1#S'Ub럺Uu8t̫c&zE~@.-p.i1R>.x uiM 6Ev5 3?T85F́-0 0Wzmp&H H u(H-H h>]Ω(,9%<&u>?% 2K ='VnQ%Z\c}+5P~˦u5տtZv$;;{'_"K wKGc׉i= ODm({d3e{\ps!U;Lj91%6FlD'u[ZC[ cOw@-״M {,@ԹāMV12MRN^`!VC^_ә.c[􃤐~2)EfCCI$zN>@L>D`=Ŭ4$G̜]`~Q\Um`C[#_5]@u \4z͸!'x%Tkuf&˜ KL'IAf-6}AǑV-mz[=&+yy/23Xu%H?:j굄㮌P>$J):˨oq ˜'F-,+Í{kZ\i-Ml#Oİ uɭL=]mGʉ5<@>p 2'-#&I2AqsK`tn`kUlýgh:w13UwKγ!mZÉn(9L$A%-wO;#eSU6,m|A]xG2e:[${3|0HN?zR^dlo`;;x<p!%S8 1ѱ)1|K<$Ԫ,mcݒt0& l.2hkA G,CY[C`45[5~tO8ff Gˏx1n3Zέn hN'*vL5l`|ppUmԲ}g46UV);m R$#Nt A{4$iNMuNh a ԻMK,} 'W=92'XvYvA<ϐyBbecx:8㷟-1J:ǗewIgfTS$ ӎRR7:I<$ >GOs9=.0$'IMkƶ\>}3:|Jө sLTlŕ -$jGka{m^ #sYYi#$= \Di$1GsĹ i׺U^n}.`hu?ҩwwh@ٵr4dhn 7'ck &I;L!v$tki8L:Gxld };TKn+. 4ӧ:w)]Uwi'c\`}`2G_4a-ZvI${4=(6ݑe[ f*Ѡ0{pu68jnH dxvKK5ƭ#\$i11˲VǴ :6foƮj u|:\KDK;> knjֵ6=n{p@> G Pth:NҁCHTڟKYƇ4$!j \@L:GHn}\fKhp i Qp5elo]lm:6s]EW!Va A@<~wNͱ2vZق|I%1NUlu}vch {+ǥjsZmkI-kih2aiiVdC1K9'9KMi'H`bghR%:?RO?$kk[p2[ ii$fp˽OZF-d' ? Q[n%1z)6cHx$x`IX,or\,v5=sZ $6\iv83: ch$͸ž B_]&; YY4Y}Š7Xh]|G(u0r:@8@ n5̮A4'_J1p=5N "b6d :ho}`dN]cLh>\5o\@3 &;Js\m۾魣IhǏ4zAn xh6y̪WY ڟ?eK+>qd@kׁ|$jØJ@dc\Kh[=3 $yI 9O3Qx2 슃 y"ZǼ=SaǠPksD7P>vYg:6KYtah|<^q3] 켂^㫶y%s1Xh2oùY얗׾9i|tӟޣwDyd]`=谞4$xzmudK32փw!/ޡ̬g~AN՛[:MMnp>`9Z O9:X홶WcX]csXv<~.Hêzny ]9:R)Zr e @\u£V[uw4'Es~vFnӓt246t<@v&A,NK/?b XEVn ѯ%nlűZQsUDҿ$Q| = 5<>z-7?J?;/Qgy4Wsx,wJJՊٱ U_RO./q$ɛ₨SX{r1 n'ˎSXqk3o(;`pA]UŞ_ ɵQtUdYhGEBxuM34k}:Uޣ^#ACu$?wQ⾻(,}Gs]κw>v8}2dUp̀缓5-Gܷ.7Y/, tWaWރIqeNI{Uz՚g{'ʒ8K3/EE[дycYԺ&%XH#Y]ct7bԹc/v@GK+$d̙%!KpzrٲAI?_U?57 #9huָrQвqىm.3"洑܁%pu{GJuA/٫|+m= JY-,Ǵkď>7حcv-mi%9e$|2Ӭ>uk.@O$: eko|Ws#,xw*}Y"3f=W򒨾?q$CS8& D/^\TWz->?c1*G*g x}20'9/lpOhyIz}>׳$}YסW՟ T6]$I*I$RI$I%)$$$2j4魒\|2ֽ BJJrZSLck!%6@7Z9.'M5QKJJdZI|e 5)aed@0~E%6dWvC8@s\A"d$$I)I$JY:I$$I)I&I%9VLOVWկTI%)$IJI$RI$ 㦊I$qjeFC=t  'ǔd)v6X$w EMsL"F4hZ Ky I) ikZd[&Le529$RIMzhe%9˜IwNJRI$I$$I)I$JRI$dSkC+I۩fY1? D߰[f81LHOhj3pk:ZNw\gZ9.ڋ::H?7 |>u(_WY='s6d4qSշt]-K5ƎsbZ]B\5v~C1 }Nq:q*xV !perpL5Ty#">fU}M t8K{#P{xT,8uV#l&kk1 F5Vy/Sh1G1RS@p/1򙇑ʲR#$9 SB>+֟d1$GmuYd7;FkI"|8.3j5q H!򒞺_[-pQ΃J*ܧ2U_X^k-4 I[;k\ﰳGIrIzںN0` mh4 Ƌ x½+sݸg2,0Y!Oz2$9[؈R3 t۱3kd@t=־eW >3%ծ _-l:G:W'1p5=)!s:L͸0X-bq77W<@'fgef^ oT/yv45 j^ƌ{8A{2FCrC~sGmz|Ƣ!*VF߯UY)k3c$@#ToUt[\Z T:mYeN%u W 9)_ȯ'ha$$[TGg[,枣cv? i&5=C1q,$Dn$ ;clǢ@6Re6y\'guw;9kV5Bz#}>sۣ[XtuΗ^NS)ʸ]O0tt}Ln;ENᤉ4/Ry?Z.}Hpc+q\S0ͽb4c\\vPԳ>Tں{lch;8XײKpt$qMӏ]ͳ =k=cR}n>bщEU8phӿ3+I%S^ o㨕c\kI7ֈä.4$ ;d\̌kn-as:9Gt mjI$ΫOSӝUv9\@ /a?TsK,`% ү&I4Y-=>M \Kpc?G/վ~C,mۋA e?Fik^G2Jlp-76Y;gn5*% *sA_W?YVEKgu12+F{lexm-ub ˧MWA Sֱq*{ q=>}7}uK\<0Cʛ c|y-N^~oM=G9fbX6cZuAyWr:TkwX%x<α҄~94 j}ۜ"Y_լ/=?kNoTO.u2J?`YӺf6 Sj6E2tI%9_V MхL!Z οN~Ht!+?=7imqA16-[YcCK:DZ3Sh;FcvaSm:n1lNËsxJťz{Ξj5ki@4UV)ܻv($V`RU'3%?=˾|ĘEO&4KtcUQ.v:W"ցq.$6$@H9Qr@n-:3Yoiu4#6̪v"GXC0&|{I)LI$RI$I%9_V>stream h?qL `0`mb endstream endobj 46 0 obj <>stream ht CwNE=4D),U df\ gʞ;KsI endstream endobj 47 0 obj <> endobj 1 0 obj <> endobj 2 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj <>stream hޤoo6S T^ĺ ޶mfq1X VbRFf_hڢ;hl?"}HDU7UTʣX* BG߼0j;_~DMM\Ls]N-n0ՆyF*2Suw8on6Jmo(.^n+{Za4MZa06jOUDLOsH6Z4uL}+n~7zfwFmZ(ea+#mp?:*hՇȏ(v*a(O.k8Sf1|75S욧v;7;faZLy$Gv V+f՚tLO.EMS[z\74 hZvzFϡgQkOM8%7 ^WUyI>}*]m֬d_kY7ݿ =Z/mf\JO]m.Im0Mn9C?iipP#c;5-K;qϴ_qGucv2/=p ܪ~+/2B]{z{ݵ~o뮻Waa;V[cmu#FE 4m?efڷP}`'yvz՜0r7kY,ޕRBhӛO8 {-o+;^;L4<4ۚM܌@}odyʓCWfN,72-OxIqZ^4|Xvor4=ԏ}boz_iU nT%LOBW3~pi }ADY/;[L't%ј*uV8)Or$,"9ˍEϑɹDB$kJOhw5u3ֆ~׷zn޲GSM֋n&ڎr Yۘ{|ٙ2pmkt59]}G˫yX^;6vM;ʜ7l9M^+?,t;`5NGXJ/;٣Tgw* (q`RΔtxN/ܛ8e|ܵ)rM-t9,7c =|ΪS>kf#=\fV:C;o)D0/2Aw@sx, xj8giJ)ݶ"?Mɢ8@D7Niy_S<a'^/q7ݪF)USlG?0 H)^<0^qXy|!:*/ m}lAMD"ix|e4N8Q-fytổ>|E]K9U^8*=oyu1IWaSBYnlG+AJvG4O2)%-~ *FG泥 o2-rdj{wm['qXiyl/wyǧܜinz;rN'V΀~=rFw^Ь3 {FNEJfl%?mEY2?ywm:1p%q*W^&ڵ; ۽:{~0gK-9qGpyr8썴^0Ӗ$}_~LwD\}ѫI%2\ SS.~U[umrIt -!$9R [IS,)>uaő{I(GO:5AU]NLF*˾(ggf<Ӥ0`hkΊN}9qbyj8,WӀc:`o{½M$" MUfyg]x1͵}w7~vPْfsOyf?e._54sC^_η܌敟?$/^BJr(%Pg_jT4%:'w֟^cN>ק>ks>%sR \ Zҝ#MX*"f\F9 TyV_ER,W!GK:IٙRu)e܃ *}1;ǰ8ov 1 fǀ8 pu 1 fǀ8cqc@̎:ǀ8c@̎ǀuΎ);c@̎ǀ==c@̎1;@ǀ-1;c@8y8sq 1 6i1P'bbY_cl1 .}Eة/1 }y: \fǀ4WN}q1 .}:ıS_c@\xXa'b©.o;Nq/1 C_ԩ/1 |y:8lyu 1 }y::cdtUQB8k8ѷcoc`lc@c81 e8;1`k8106g881061;1`gv c`lckǀb8cǀ8v c106v Ls_ǀc`8Ųc`8ymv Lc<,gǀc`8ƕS_v e~10.}Eة/o;ƅUN~10N|E©.o:N~10.}E85Nc`\8;ny8Ǿ<,NylN)jNK7nfS?ZϹRW=mN^/i3^A IջjM'@S϶DZ_U/LOЯ?SѼz6~1:ږ4Li`R+vPNŢr*RZ\|ծ*[U?hVaj6+'՚N c=eO]dP"ZdPG'cj9]2`ߍn%wy|Ÿ#.MP3곧aWԌV?+3n|/G^dU0^hWQSu-Z-稲 &d<$xjxi{{ ? ZZePj'LݷXutlg%W<Ǭ~[=QNM|xjSRS9T.m3mbl-o==f94G+ӃY+ϺO\P:wIvKc|svךT,ig--*~}w)O_M(؞)D>n,R~Ftl,Js2qftY3sبgL=5sZ/s-m"P:;Bz9\d(ս0/v`}tXp\ڤ}LK|S@yv>]6ꧦ^mCTdo뮣䬶::{DzJax5t-"}Zӳcw%*|娳9ĒRX#3M4܌LGoO'2'3.bsKm-^f=oߖxy/3K8:~OQl~FD}8L}(IыJ/ E ,_\zMç4+X'J'׷㉳҉Ɣ}VT v'0 endstream endobj 4 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <>stream Acrobat Distiller 8.1.0 (Windows) PScript5.dll Version 5.2 2008-04-16T16:51:47-05:00 2008-04-16T16:51:47-05:00 application/pdf http://www.star-telegram.com/books/story/579116.html jjenkins uuid:8198cfcd-ed37-4c56-99a2-77b1300d64c0 uuid:e140536f-7ed1-45cb-95eb-c730b949d6f6 endstream endobj 8 0 obj <> endobj xref 0 9 0000000000 65535 f 0000046773 00000 n 0000046899 00000 n 0000047054 00000 n 0000053428 00000 n 0000053462 00000 n 0000053486 00000 n 0000053544 00000 n 0000057237 00000 n trailer <> startxref 116 %%EOF wp/books/Willie-ST-1.pdf0000644000106600010660000020577111075151302012152 0ustar %PDF-1.4 % 14 0 obj <> endobj xref 14 41 0000000016 00000 n 0000001408 00000 n 0000001488 00000 n 0000001668 00000 n 0000001950 00000 n 0000002491 00000 n 0000002969 00000 n 0000003390 00000 n 0000003425 00000 n 0000003470 00000 n 0000003515 00000 n 0000003560 00000 n 0000003782 00000 n 0000004016 00000 n 0000004093 00000 n 0000004321 00000 n 0000006597 00000 n 0000006931 00000 n 0000007054 00000 n 0000009148 00000 n 0000010209 00000 n 0000011164 00000 n 0000012119 00000 n 0000012991 00000 n 0000013415 00000 n 0000013658 00000 n 0000014863 00000 n 0000016283 00000 n 0000018976 00000 n 0000022273 00000 n 0000022513 00000 n 0000022728 00000 n 0000023254 00000 n 0000023585 00000 n 0000024119 00000 n 0000024780 00000 n 0000047281 00000 n 0000049727 00000 n 0000049826 00000 n 0000050036 00000 n 0000001116 00000 n trailer <]>> startxref 0 %%EOF 54 0 obj <>stream xb```f``Y h  @QBfG0VS_.#2ᴆ3H8XFGL ?tE_`4A  % b2,2$:dL⺤ّXCՁ)YsxG0>wXw'~ 6@r1, endstream endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj [/ICCBased 41 0 R] endobj 22 0 obj [/Indexed 21 0 R 255 45 0 R] endobj 23 0 obj [/Indexed 21 0 R 255 47 0 R] endobj 24 0 obj [/Indexed 21 0 R 255 51 0 R] endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <>stream HtWߓ۸ ~_ٗ[gdOͥxf2@[Ŭ,(j]7s{lwI@I",DNEb^x] &Ϣb׉u;/8tp$^k珍_=M '7:^b~P$q"_jAxH M029OFi/J2.(cN@&9 $(F'!w}x(=%TܙYIG+q@6mGX|jիv"UJ,OHt㤣eNO;†+V% I9$^ 1-E\QQ(Ƣ E ,FCtCL (-Ŏe{r/ur8]GoF! 0_Ep}U]R(>M- .MaS`L@Ѣd`= & lbG& ^_h(5+@PZzkK׍ŏ{ߥG2j*w@[Z\^źLozT@CBmAM:0jbG}3u!os )`_NU4֘}c;Z'D3bIݩֽ] U49&o%2Evpc_<9 mwZ<ɮՅ6-ԻGJ[Y*яP_&5`bSD1/ H=СZZK85c֟$cTH~r*\cju*!{<55*EN4lC;ُmN hyQ7 Ƅe]1B]|Q-%1XNaEPemԦW3"ahVPv&JGA*~qxs@:Sз2}~E0dMUp m1&sE7TWr_W768)gAXu tnC^u5HgA V k*ehO\49TE{iT'% ."'wViqP}\:O` ]i)j W\_> endobj 31 0 obj <> endobj 32 0 obj <>stream HWk۶_AtaDM6iW@P,smumɑ{CzlLq<w?3*EE0qW_2J_$^>M]mh]وd?݉U{l xH0C׭DwzmV˪Ƈf^D\`XZ?v'?Æ>XkK32cAvdl|H6uÆHQltX]-Ohpkf>*M(YV/{Y+ژz/m7Jۗ4:SƗw,_7bӲ\j<c]ۺa׬ŦϟvkEoImEqɽמ5=6 l󥝯2l"F#V WyKvֺț6'C߳جı6DK{ؚap;`0۞@*۲zf4k*P.y Dz_4lJXDNt]DbԦ/H @8d*TJI`Dr $'K19ٷ]*=YV5ЬlƼ qG4R>\WgvSBiOA``dy MTBCu1-˚Ŷnk(._R {3ec֦"EQbuVc$vexħ\Ҝzt  4lA1tETa3 e|O(2;f C Zq"r5 ʺ &F -:䡘 jf>#i(B3Y.Į2-voogae28jiK/Ӑ=Me(*">H]-j nIi?1F]-)$:i {R=օX @/X~)Q֠'DJ&{0~ |թSRi^_Px֧AueތmV2lV+9fiy۫XlX FL较ȬX ϥl{®t\W,3ٲ˽UP4 x*ing@r F׿g(ʼnzm,e'X8yq⻷ipTJAbXDxȯ>pA#Y|â>MZquɘn8*#T 'r|歭;{E\?=E}/3 h(uXHbBLsqQ ^_k砗ΈP'~,/;v4_G/m?Ta.+m2{M۰V_=ڗ`xE9nכa{@iOߘ v lmį2ZoksP#M^iiЌZ f)_)XSL Ts1]lZ PCG@,lV%,DGgUZ-TZuWAEXrS3mSV[d7" erʱO&]V x)rBK-YzbɫڽgV1{=[=~i쪨K lhS:jKlGQNrτ,StLgQ]@6ɔ 7ǔYNmY;a\paef43 +.E&d YJ?!}?!-L.9I)n)3@Sfr4efXj-˨mfn\OBjn09%J-=ݖ'd㩈H xhJXd`I uLN ,>ϑ)3Lrj5oR^&D0_I endstream endobj 33 0 obj <>stream HtMo6:J}k^ [I&5K%0ҏI % e9qQ2Kv:4V/Yq1DŽI %ɔLfb c^,Yx&f UIDf0V cxDf0Il`#25Bd?;ld:;lax&eILLo2)>%;I\bg2d' A 2U,ۘ|IBD,U*Aɉa+qLfJ}LXdf#N ̙_ȕ_(vpa Kd2KKdV3uP~2ئ_i Nn?&O=Ob6}Zn%[n_}8v.Oڼp{緧_{@1k }q~~y^1ާ~ضy{j} po_ߠ-tK_:Z~-nk\ڠ,_K˪ezism?9fZ-LGڛ)fU)d3DO۵/%Ʋf2^j&C>stream HWMoF WQj| AbNEE 80$c= Hq:B4 Ds6χsV.uuizIG#F&d% dp:e {CHYzB:uC,T4):H: N9!N9Q zR@d\FeV=8ru0CP)3ZHjd2ccR)Eh^lNن͵)Z%[oXSb*֨ eeǕqV V `*6(7YU\+뚰nP0 acm4CV@ e)P+M HʵUlPVl넒kX'[X[X[rZYWQ^:fSP('KpЌk1_%/Rr缠4i |%,0xb~p i^\ӣ㺜o]l)tƻ9 <]'=DXiTOߙP>/^}"J1RFqȾ\j[UVoIݾ$%|~?/]dÒy){R;G8,q;9eNF(lyEӂL/7ӰOr^y">/g3?./18HZ)Nz4)$ͭ T[k#4>TQPFQ,ͭ B93zZCl U1T9zڠ1܎z;ގWph2 endstream endobj 35 0 obj <>stream Hn1>&8 p8%4 ^d7hVf~d#ll"ɖRfVZJ}`IuPitZ 鑽V<>:Ȅ ꑉ )騀zC 8(*P_H1NT !ꑓ=rJ`uL>r[97FNŁ#FvuyZē+4M'$DQaJ(D[uSl}֣G4`F>D09j>9>V{ؗؗԸ'E|F[ cedQq1Y׺G4](j>[zf)0KUnY$As'.!uXDYsȵ.i>fX_Zu6XD^3(&^Q.(k.^z]9Њuq泥JV VBsC+"lie!O_,mmCk Zozk=oOz1@D_Z/M۲Vz1vspw.߉kLo/et)'qvMbĜ"L>7qkNf}Sf:w2w֕ffi.z-Wyy.{:~>C.kLLLL)% endstream endobj 36 0 obj <>stream Htq9ﲂT`)l Ӎ%仈"3O_yXK?U۟rH 6@Bjj)1Ekdb`@ݢ؃%1sFn.zP!hAHF(bY ͊ *5y6xjx`$+b`5yퟧR,H1S*aM цX"O,y^W14kb^6Ԥ|o}>_|E][P.L=䷋)ygbvp}vLeTz.}-Dc2B_wnYE}Mw";8݉(OwX;}:0}D7|QDԧ;i`ӝ>}$mzј$qQ^ߧi%L#JV"Zhv, hu,;XDc EoQ"ZKE:X$Ut, (+E.S:(>Eԕw"IcUӱ4pw,=:IQ.>h.EϨcuӱbXDF=Kv"ħcбDv"gԱrXDC~:P>;KwSEt,ݱXݱ/C*Yd;e͖=b٪Y>r,ݳV2Eh%-> endobj 38 0 obj <> endobj 39 0 obj <>stream HMo6\˷Wj^|RsYgWܟ%%KUjPKjAnخlWb]eftE^Vu;Һgms}%oɊBP,M?_.=Ȉ | sp{]mx9Q, 25,15>stream HWMo6W(EQmâ5;#rEch2VsX\&1{arso(XG|e:!zA+N 2<璐Gar[` $Fu1Y^r1Yu(⳪ϪC )X A0@ A A1A0:N!:A-D=`PuZ@ih# Rs%` (B"$*ʼn +ArRwA-x0x$j%x:{V!#=F46^"Y%A* zp2CC;Y4~5uc:;uD~V. ՄA!upB(?`Б eg%)/R^ϼD"gFHόйgpPHAx*2x]gF JR^l&(KyQ>m2?+kY ʋr/.!C1jLgeg%)'^:s'.!cHc֡@y!ũA&-}lJ}l{c,K[R[gK[#fl"l]|wip#n~ŝై+6wu^}/D0?l4& 0rPaOD▃ !< ([ټώctb}AӰ֥9 e|.pz>Z: l:&hڍC?l~{; hȂU|iۼ4+Z89ouP.RpIi7It1\5#kYj7CN?-aO&ؼTn[JfI Zhጻۯֿ5p\}hR,42Śkl@Ԭh)ԦPqkӵ (k):4Mpܢa)Uz>d)"}[g;h|oez}`=(d_M%Iqs`^n3< cw;7f-ZA/qbk3ePyN{93" 9<=gxa| HLp%E=,ܩxբX[MQ۷*X1;Y6g p-\&o䰄ML,Cg~v^g~T˷PjDHQ0pst7AuZ(xńHo8<`/e4Kq4wfA6>ЂO-5q7¼K:q*gY> xMe(GY0 endstream endobj 41 0 obj <>stream hޜwTTϽwz0z.0. Qf Ml@DEHb!(`HPb0dFJ|yyǽgs{.$O./ 'z8WGбx0Y驾A@$/7z HeOOҬT_lN:K"N3"$F/JPrb[䥟}Qd[Sl1x{#bG\NoX3I[ql2$ 8xtrp/8 pCfq.Knjm͠{r28?.)ɩL^6g,qm"[Z[Z~Q7%" 3R`̊j[~: w!$E}kyhyRm333: }=#vʉe tqX)I)B>== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz endstream endobj 42 0 obj <>stream hX p[Օ>_Nq#J"즱埄48n6Nll?D\ 4c麋Kl!%4 1}u6Mm@4,t[wP).Ӹ}Ovvfggwfs9{Oz21"J~l[S SIXϔ?Nrm]{Hm$wF ,螎h8mDO9?G:]W|헉Cxk8g&g(c\KE]7F~eѢwŮDkw?hmh7ӮgC`.?K,SD2҅MAQؓT3^?Sie~?G%a>n*VOo*}݇{ ;FkY6R ->̬l/,&qev=Cs ]yF=2~y#L<{=JrXK[sGGyE+,,B).7 RPP&luCF> lCM>=Ֆfmgͬ=F0l.MXu!_BrKeȤz"B*-! FT1AXr/>gty.V'"Zֱ $Wae6Ξ^dږgy?O|ߑHrH[:*^^#kk SLkvu29=Ǵ%uzډP}t֮ANӳIzKIU"dafHb!u*z=ŎӨȏ%oWזUNjkM|'__ODu8/4)[ʕR-YU[: J/Hi[|\!,ߎ/S/\eҡS+8ʴnJHݠT\-O[)ʵ&-j')MH87yz6]-%Nç DZ&;n"io1-Ϟj$zY)$MKGuQ֧71wU*߄':oeF+=DX/4d Kـ<"A2)=H)i9-YW(G|֬]s㪕e%_‚%33?zlx&'n,;|F|x,3^鱅)%}JtgiV0٥fbF:h50k-k+ȰXP2s c$/gpʢd^&2w͢"s qRjl-fVaW{{OWa6`ɨ1NXr[Z0A-S+- <$m-}3:/ +WADR.)KZԐițUMu6miMU6liMlRmmlbm׀KO'c׀#c phv[9nMOtԦ'mzܦ*mɦ6i6)6q L.oq`{lYq`:m mam6׆bP6ՆnӆviCAm(ݠ/ z:}9z/u.\5I 5Z0`LSjh71f܃.qy+ ?w5j\[MX`C:dY٩FZ}>bENUliNrUy]Vq]˄iM@J7p-y)W nXʕ s+&^B_2_f_%gHΰ_^ΜMƽlU;w2_kI]:JV|HĸGiAQydXy?d}XraW:=2E%GeR }$k&I;).tN ٬]26e*)];kWKtwǍuVzq[mllMĻm=FuJP'SqKV7m+bZn͊PbvZQpQG?P67B9l͘I jB݉!C1uZ'i3q/އH'FasfT&VÎ`%Ak E; >(M҇[5%S3Nt)ʄ+Svglt<:c/j/]it[x ` endstream endobj 43 0 obj <> endobj 44 0 obj <>/DW 1000/Type/Font>> endobj 45 0 obj <>stream h޺ݳf_:ߏ{]b_5)7$G=ο.,SMnO/zkϱ#]O~ϳz;횮ǽ^eIO/LQ{ݏ9v?~y5wZOԯy1@y O.|fo}U%]e{5إEC -fYޯ_/sՇV;9U{&{>曑J}Z⒧~Q0^rO81A6oCFVD>]ZYKZo~~[>-qs6'NZt.xn̓"O-J:ofJ; Jce?(10 0 endstream endobj 46 0 obj <>stream cm %A|d1q{tu j$2X`r WanMh;SzPl+&J~yQ[.)#'7] :vO^fFTo30RD endstream endobj 47 0 obj <>stream hb`s3g9s&--omKZڙA[>?Wn?{{W5lԒƺpZZKK ҥK3>}՛? ϜaP[Ss%yURG|cUI -S?_[pCtIHHUWlݺ܊C~޽щ\Ǧw_QW_f"|jaP\Yzߚu{~kV.ݧ腬mV ‚?FWZyo}Vٍ?ZF#bU;r{Xv1Ho?NwRwzۑw=c^kuZy "[2(e6>stream hޤo@RfY7jEg})@V-ƢkSVсBΉ~:tf}6|(!z5¨cP ωNWtKBz 燾>stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;P"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?xח $RLI$I2XA AY$].=y;?ĝHT? Ce_ց@O-NuA?ܵ>cUv8L4Kdtf5B?,V H#y^$HY_sM- 'Qɱ乄 u>RgX֘x  @R{Y`ăE+^9x H&cY0Qą,4dT1:$<1uǐ4Uw$h@NB*2,2`Ai0fH#RcN"qy: ܓ(V `ioM=We9aGt): Ji|dӹ)q$x^ ' m9bkQ[`#S&7d;7d`pd:@"NACTDAHw :ATv8j κMA晬L5(P _v@О?D?` 'OLQ{ |dhZGT  :‹tA$L.~01]84:7.:1 V~X2`8B">`۸JrgZTH'^ $hƈ'B CtTˈ;$9:cW>lRf9&7XI$B.Vu#V}eaߐrlZ ͇# Uw\x:;ïcV\1N&_W?=n}M#*Ted ^lFyYAV?Vh q::@eu++-;|'UgXѩ8v< G%CχfmVw1X |fDjEb2 [g@5>j:ʮ}{udDA+$Γ'\  -:8tPxĄڝgRt'RF+ I#SJ 8|S0`h  Jf6D)eoȪ1$I:sǝ r?HޭNTN 9H  |y0?]kWe58 ;Djt>noSQY k.50@-gx9K-5axa-@2aY~N4՗4L{dH+4DGmXkd+eXy=7݄:Ҵ>z}z b@@iLrcSȉ:+Kܕ;u !-s=2dFhb`Ď 4J$IIhH9X#$)A4I SZC~NcTI8kL#H) $$ Rd<8%ZXAbIX#򧆻$ cĂ`494ȡО\$ݧ=k 0Ѡ( jpk{@L #ϔI4 KE;[4О!Wx߫ Ctq']DpGCkk{&@HSf 0#BRggx Z1.Z LeiqxGi_SWہ$6AO:tNb6$dBpNNY}xss$$Ƥɟ* ;f6Z@ Y՝`!Ds9L.~#Tv^_C` 䥌Tw|zlAʳnla$8%rq ܌ʸXE 0|5O1ws]M@``ZA $Π=T&ʩs/q,-i$8OqvRc"8e8};w\`@Y%cYX$Lѝӭ4zN {>. g?7!ð'Ey. WXP/kn^x<1z9Mo:`V5`[hk$4G^/s[ tDs\#UC~VA0y$4v~4ukx3k-c$DD |Tiyx$#S9(_)b?9 lv4~$C9>Ȩ=[үO~E]׎GN-i|2P5>!vީӟp*k4׺Wlev9pl5R>nQRW^*ϋn n!. 8d ;C5-iղ*Wz}h-d;  ~2lkiݐ@O;nV쯬^V+*@/h ;i®Ι]YAc9s8D:fAlry6QGZ *0  IOγS,.ͬ.:˄8s"{DAJu)|HqB}Hc jEGvip׺ZF;R#A~Wߣ {ze/n=o#7#O8ΪP1v8"[&O^wY  c֝kN}mߎ pVptj4 K`Տԯ>( dyq33̓T5ks\>#AcI"CC'S$%jNX}+k*LecnF΀|byDc_c p.Lf2ч #6zK: ; Z9clj(=3ƃ2݁KOL"[mdau$ɝu3ʖFKek HKgtU@=R@2Dz^%xmi @y\ZWخ&&Ih.Ur3}A/L+{~nƧH?Mr98ֽZѷ ~t "0gMA{76`fA5 u><#Νh%p7 $ beebe9~>}FJPR~]k,|{Z )x,?•Ms:_ݎ^0z{2FNkCi.=;Jaղ XKƆ ;μn cT'$ ԰KE 0 H)vLǙS=q I`1F2)L :vPMZnkC!<%d\d>2hKVO8ӺMcیdjtoaQF^.H܈y86MA&IV;dQSaxkl&䁾!cǗN 223}xstt <INm,y$ɟ{oY,[Lm&W^=FPN=V45{A;d(eg?be9 <Wa.w#0GEvIбc1r"=EF?XCzX.%>Nt#*)fŃ')g2Qc@A.?(jm-.q.0Y DL u:*3>^YKak⣉e϶A祈yH:ĝm7;/?׽ ~Ʈ]%Pc+"ǻiy F"Z#X?Ur۰8$9ڀ{GR{|@ .rXHOʍ,8pi{H|PF%$ iܹڟ sAi&"%]}g ye-9\AI"uP$ q>0$+&(.v$4`EFC {cA.%Ni pK: fx+Kv'\ k$8űkPE\~*9eA!>a$5Lp$xk$hXK321:O"Qa)~+:H'ˀcYpwӇheǡ~?Z }a|#q啎ca{Z, 2[~+y}##%QY憝F_~>Qzv9$6A$/o$EǩU[Kr/, 4MT1A#Nf{_XO[zk22FV>;]aΥ.-d*VXɹ8Li "Hqysㅊb "<+2\[KqO`9E9Sj!4 .E/i=tH`kZ5疷ɾܛ]tAwb8@r6#明(egچudRi 5d w8h%h> p&ƽZ"Jhhtl9ׁ 33 ƒ0 > {zXZ;:t1$+41Yaŭ3t92L+ȸճ0DG'&i$ A5!'" NדGfs<>nF4HVGiyH3U$<ܛa.wDH'&ފU!1,Z%B@ 8 i/ wO(gLE˂2Dĸ\}Vc^\ \AƋ'khytv0U0oah;$ x$Ǐe-w::CB-s3v5)䏔D"+tqLxQ˟c N=84Ox*YdZ|p7[vddDk{h1),a:tA%`K`%ۉ"C$DV1[WS \7[ ԃS*^g^-]|Ō'Ǔ^wWQ&̢]9c]'Cb#B멛 t 3ēkbⲪ oώCZ&K[H€DssN8 'ͰK<  IZV It5@㒯{$<qi h 䝎VާpIcc.,22/^[)>gO{tsLHq3!*@&CLkO>׍f&kͳPc}O.\L\ ~t)lt9i$cfB_Y~9/0kC%Hxwh}i cQkrPsH- 2+d/ZL:3h̤v KlÁStطOYg4dCF֗4lh KeEƲ宝v!3c}n~f+sa-kpcO}ltY9:Yk]Y%h-?tPrMYeǀ,Z ܃NT`:Y1NT$3:*{5L}0u䓡OiE|o>a]euMFI=O`?Fah!1kIS Seʤ\H%Z3Nm{.>ѢF&Y(WF./W!0;" G+6^@%$v> jNdO *Enk-.8׃Q5Ķko"_4>:hV3_c95:v 4ˆz!Ð`>ʽ!8ZX=C {ȤQAwol Dj8!Ceg<_^@p@x[Yh̹8c\ALgϳ3X2N0RQǫ 0lRAܝ{&L;RE2}>8thCH APGRɖ) $ b>mmM8"6:LJ`ckQ$B@ΓO> 84Omx0Hc2!ԲKɺGh\=b HӐyf͂ n:5cw1p~Få텄YiNc|g@i$X8W[wq馌LW9عU=@꾄LQUL8n׆onw;dj$bu"ѷ, "6${tHy%S@qt{Zmmu瘓 &'Ri!; xi#vnБ,ّkuC;#f>_2*HfMou^N'K,ZA%#*rmګ.kxL|uF!X%:C@ Jp}Gt-~ޠ߫\֌vٵgp#wATxLUv+zN5cɱG-1g 0W[P HN[1JlD;LS2`%,r1}[)ȭEMFӴ\`y }ʥͰzTC.>; uMtIy2 e Kq㴑0S39FO 4wZ.v:+[;Ƽ{8h$ '^'cx.'I 5⴪ưKx$0 tLxSK$ 3?fmŵ&Ya-h<4J:oT]7O'=MIs[&d{ @JoMv6wA {{|у1D l6:nF:5s]ò-8V̹ώA3Ztʲ|ڬAqFk v?lťkum4 dI0L)|Ӝ,,r:=^}G"6ƲZcYDs~]=XIX ~B>*w㸆V.ay2};9ˋ"@[ִ,tLn?[iaqc61S\+nUk@&.1?r h8ceO '@Ð zԺG;! 񑉃F%WM6 kt 1Qi馤ꦎr 'u:W]g[kۏehzѤ[Y~t^ҮŽ϶؂Io@ C,ir  A tuN bH5h;xugtAz;nEjI㶪Pm k`Ă\Y'ituvţK`:4{ cI50G~fR_"|@.#$Pn,dZֿWsټl!kyWm+f6V9徙2`W>yy`$ę՜lVbu[/}MDIjTK@r ռ>EYt`p: j^}KH">++ Q)!c[[y6JF \ uDpQO=wj7{ΙfV_Av7Y iw3q3[\,ǿ&|"|x]-8T ` sD(/wB8~_We-@֎pkkmKr,pp$麎 e~9-&HkXDOmN9"/˲ -n Iݯ0dh#xٽWgߌZ@984=k9-{I9tl$.2?5bz_Yaá|FcȮ"kl{Z NN-~c0ӿz]95?D+lspƈ$yp'-:ƒH 2}|Y"Ǻ `~ 1cR^'po$+ k߹slX<8/3dṏ4WUan72>71D/ϛ0>^2xͿԳk/.61@gTTV4nto0892srl$kI:|3=Z⺈X $?ډ"G]`ǔCNݵS4Gy:vQ1,׀x+^ߪb}H%Š؈XzCZT-֒ *9Hj GcaI8﨏p4%u3W xVgF6 mCw0uAΚe],nHˋFܠcŖGB>ZaX) hI.7YU) {AdDŽ%Zv=>!@ g..*7HBYVp'@jmzv" ?xWlƽ]]Oh6<}AxOrۘ= :5\@:d^BzxW5)Ŏ< ZD5+& y> @ CutXv =V=:.$FWq:[qqy;#h#0!F"H&gG fSŷAi˞#xi"Hh.$ ð+kX}0,kLmkd @tf9.l1!Oҍ{9(l!#ѳӛo6m' c< ^X6v'p*տั@pےn渇@?>0#û+틳E>c!KAk6τ-n6tڲm]8-AWAўL'Y9$&F#o>uYdA/qxкRuC!IkA` mps,: $OuWᲷ/-(a2HⶾK#3u7Xl KA0Z> Ȓ:ƫ_*ۓo٬u Ih'P?c"K@$I*@D#H%=5ߜvuF*ctLyhp 1ZtH$ߵ4u(#gubn bUh1. Hഓ5N"1' AE"?8:] l#D>Ӈ]WO=?SU4͒D'qtD HM)'#eyhm^Pq%+eB a hWzN8d1*sD0H3Yt/O 95]]ZXIukGH$ Y2k!`6YK+I+w}iVcd724YZ5;[i\'͝2 $H55McAc&D'tK " k};Qח[x׶`{(xk'@mm%x 1~+j9xQ}8ZHw AX.Y=BF:iװn크ϊx hG :u,V6DiX}$!X(: [$>o]Ӭ7mK[ "4$Ʊ:+'1k0!k `h$Hq 5xz+1͎qi%Ƌ%W6<5иL`s NyWS_U۬q{!$Dj3=g4Mnn.wt_[khoCcT2{=WH/$WLSZƾ׍PͥnnD>d!]N^mub ͯ/c\ 31$R lÃ(~n4t|*meu&\\xpGX2.j_n5~@mF$5&x_[ 7V :6CZl$q-q1HkG,'<'V+a23EE .~t q ~Uyth ZxeIӰhľ `{D̐Z$,>qq01Zӑm;kŀ w& #ǖѧ-%,v@ȹM574Įëu;)XoXѶ$ni](gS~ionex{;d;* ~mh$cHhJ:G+e,!pI-> P3mCARL bE5^,n`ahk~5FQ"f2(H}]Gҥƃ{ꭱ.,h4972V$*y Tz-.qm}%&ƒF02MsMdKHp2+]O < k΍짇mli"jwK/ 2I, 1˿Cߎ=M*s gbRK_S'Z ;cCǺSHXzeZOzv;X*q4|C-i#A懗nêݠnXtpJã+-i6<9VҀ$3%L$p̌q%c^%Z &iF-b?xҝfu+XYk ; B}tq2\^H#S*3Lla>2@wDD@Q̪ Ŗ̒ {&,p!>ǥů+/懼[憖0{7@Us2&K.5Xa\/X/pu=e4 ˉ"qQd\ZT | I(A>Ξs/җrK]S^-]="& p><уGI#<:b|gú9WLJ59hĀ㢣n?P7b1ϡCI$ƠBh ^`v#X4V\ "9ŠH$rjSLjڈ&(֒\m4-N8YC$gD/TF5jH Ή=;EKxv#Q%.VLDBUNeL~TlI:hJ_i$ :tIDmx;ʀiN@;YNfᵽ&E->! 㬭伿kķ`p9K:͕ҵsm-{!4v̞8Y4?H(yƷ#kr%դȐ4oO,tSkX񯬋1KYzN I.a~u&][H.t*%h_PkKM tAY\lg4\Cٙ[h$cd}iC/>Zƹ,$;@Tz]qYZ1Z-$<^H$OWq0o˼<9/"6Ə8e`WOIp9̭[ 5}Kk΋N{-ym`d[3ķU@NםVWESup[`>J Lv>Y}dTA%ţ{Ok9:C @ iżT>ckY!A-I j8%:2:XяNWv5u\^Qޣ`nq$y%r} sg!4Į'*v]{Al@cCv.7C\Ze;KXK@$w:#gSt:/BRGnE\ڱi56|#hy=TuL_[` ;Áxh#N+-WTIC9,,Q\Eyu8Ik<@IyH `x0P2lF;E :LK|bVOxKO1"`{auO]2lp# mpԟ? shuAV]30cN`PrxČbwP]u=-i%<HHOi *qrai `Y)p Aǘ4r:-?{c(q@O)NaC׌r %$ :Bv_I{@Ę @O.a7@+Kh}՞]e.x4d=Aw's7K¯@Ŀs A~7@'s_[O&%y MypfSȰh ЈoBX1Ó$IMͳRXRC-\K`@Fz%89vCXg{jpOPHeİ u\H#Ժٰ K$ 1FI)N#19IuWG[˯cqi%Ѥ4\لmOCC h 4v@|{;_\q-&AFP uv{L4n%Zf$O21.N, m *zsWT\%ĸhn|,ϮXJ̪mَ,shiaY.:41efeC/,bmtŏ$508y־D9r`pÃN|u^OKmmkֆkI DƐ~6-88@;\juLVCĹg̍R uŎdH>m^j(c7WF^u;%4\, -0cx}/J-k[`8-pykß]jy1:OЪpȋf*mmd@x5cP34/ljVv{N&u;G*Xaw&ӃC=,ǬmkltIB|$V_qKA}[5ՇbQ HcbD:j}o_8Xh hK|<n3VN`m圼p ;M`BH:?X"0k=v9 =caJ߇ҼݯG2-˥V@ǗuPǶښ9YiC+}T]ԲVI$msC=R-2ʱsHh!i1 c^.W׾!9lq  ??O#I-7LI$0Iy>1v-Zc~||QtH~\TOYj$'Ў<n߅m/Po ILG?CW.{\F;#a3B303YeO=:X 馮t?K)RWc][pih"F,Eƀkd8ZCc}Ցt?RηY̢gژ hw?zٻt"@ݣ@@cRgF}ζ88oi?r ԑ$q_Ժ1mH'q&IL ݺ:5<]6]w34Qf86$@ώHb[n Ub5:k׮YIA2?nڴ\bƓ5IӍS/Nx<RcZ #@`ɘ&ζ[-s\2$A'cdWJqݑl[¯#*}ByWuNqD馈$i~!9/s2G$hGeYϵ1夞Oph7 ;|$DN,xCe5 ~xO^uLbG؉_r {` 6Ԑ3uv:U;ö;] }ɫc` x' !\A cjxk)#m,J uo2@#4Gĺ}.4{-fWA[I<̂cB8U31cXd IP _Ϩ[Mo郮K>:hvkA&yuӱՏ5-V{ut8kr<'_D翥5CDwPg}7#t"虁ɩ ~[U~;I%gLCt:|a!HK[vAeR79Aje1t-zx%IH#EN? puy^X@-0c;q*xw`ӕeWW` X@ 1"#A%7Y:@ FbA$&|(.SrKOZKKcH(FX}{VƉ 'ׅ8&|e> u4ll1ԇU7<]`hicecopa2cqHȒ !uI><;,leD<_VK܋ '^j:[j,e`:\P =L~jĆm#ftZ c>r4^oT"Zѭ{w<;%8";x>ڜ 2 ~?c "H=墟ա]XjZ]2GⲲos KwKLʹu"d|UݶͦybԌZƠNDivv@ hDKO1ƾHC\A U /GGI <[yHXCi2Irrj"KNH?{9@5:[qޑqЉd6u?#@C =X^2 2@hXj#4c@gp}LߑҐ?z4 ~N4d{~J qD%]GRkwՠ.ơy"*;ORee.i"L]YMCHU]Mc^Lu"@1 $5 pG=FzC2:FIcHS fN$}3mRk:zsQX? ᛋgM? ?*oљH/j%Znz;uGV:mՔ[^*P8p ACG e "ptYuAvAPL 9MQlɬ1G.[.Y`1|e# }s2\KXXZCOX"t8-$jVYiH#}[ЍH#!2B^Ȏr{"G$jo?(kb\=Ðm:%ke`|혿KNCӵbDjDw#p`h$">4#i΃:~(E҇װ QRƸ {3U?Q0H$ג|;OG)-&CQ(Q=c]|eqk`$N;HO5%x A#:zMO&fYKZ(qa:TX 'C3%Zȋ5R+'^Yeu'I>_Z~ zDzVUexkrAk NA$iw 4Ј!R7sI&l{XR5tOu2+ 9-}ޝlchx2cPDa6[Zb%B;~K0Nc醵s@y yq#i<"oOTD=I5w"i#b p{-Ne9&jٙyѬC `09:i[ I=1_I4n„H_57j$k:4`e c`xx): :O&uI@<+pi HF@И%6=)c\<#m\|>HI1Ьqu>#OM> 5\/-We:$Le!#X<*`Fx(fP FhgUt=Z) AӼ,X `|DKI<H!t xep]t'紘#C fD8z32`#Oz30OkKNS7De`&~Hhi"^ A#HL'99y^Z9ë%OL%ߐj{fH-'> 1F9VXIǵ5>xhvt !K^#BGs#Bl =Ur] ;H$mw 3Z{IOkx&st3#-2d FhJ]Y#s@ fG?%'ÐPqFZ~# ybO > $Hh@Av;w 0 xV4I?D F$r%lZ?Ͻck[9[Z&5uz@BHUIHz}sFAvX)"t> $4x wa&OͿD$3صܶ[]a/;kiĐ7Gdlw3k}B ^=@[i04%F|4|KuLC}z3qә>-$">nˍI4W"8ˇI>/4ٻP"@N$z̈́y/?I#W!/Ch5fqeyH~MSKA!xNƼй3:N4kZZG6ǻ༽$ӻ| :d4@\NF~vz|P^.wr?; ~>RqaЈ:Qugў=Bđ}T,'p_sypI'H endstream endobj 50 0 obj <>stream Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;d@"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?FHIZFGXؼ-l|u4GdˮֺpnOS[O 'ϴ ԩŽ):xgSQ"c $pvHy :ed\\(A˟٠+3bu79V$48^ *OW{:+MzVAwDȘZ$^o3,I.Vy<5Թ0~ױsF4h%[,`w7I!kj2\kn2Q-I[װMuty>$IUnڽm/"~K8SN@,i$s2Vu6Z絍,tjk $.OT^^ oݮB<}V-swC h5w]=\+Ya 'Fp XUYfKɵ נk\s$F[:]Y,$|Nof fi}:XYZ!{A$H.+YH-˫I uLe>a kI-$h|J64ny 5F7z@=oXUt^өqXL k1m- ~ )z, a'|W8ۃ` g%It~Dj?: J.{oý8$p޷1~e pX~kʷ _gO0Uky/M>8$kJv&P49Ӽ RfG7;n3Mp 0Xt#OI!(I S}Z-f= e-<4u,d̈́v*2M?cӵO"cdƴxuX7=$ 6[ľ{Fǹ=dw=:-FHIDVL:4~:¿ѽś^Gﮨ}@Vݬ긄Tt4ku-H$[<:-eVI?'i^\6"#BʫfUEYp<*{?\,uma+c@ @~q@N4z?Ք9$wx^?ܒ|]:'BWSC\}-6>$ܮ_AAr}c uA :k64 'P.` uHD7i8KW KKm% }M8y@c2=3]"\'7C9 cmϤ [C0|O~O*6V$2$G鏌$ gQvI5c@DAWlj7z{KS"L\S8=ꦫimm iDa<9n $Lݽ.x$G86]t-#Ddz*V4M-kƾa7:{a ^#6A“]{Z./ɐO$!9m-4 `̂4#P:׃]^gٹlw`̉6= 7O]Sd _Wl!o\`nd\5$p7V13ׇ-x$8CLxkἇM$f5&AAz*quuRA<RFԄ^dSJKdSJKdSJuI) endstream endobj 51 0 obj <>stream h?qL `0`mb endstream endobj 52 0 obj <>stream ht CwNE=4D),U df\ gʞ;KsI endstream endobj 53 0 obj <> endobj 1 0 obj <> endobj 2 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj <>stream hޜ{iȒw1-dc01W$Kz$uUz'V.MVM DF7)̛SDgVq:ilSy̦5.i7pϮٷR^ڽo?>M℞YK(0Ckr56oVˏK %#%gM)[n&;€k |op^bK_i[wceN'm}OeyDE s3 AjvuƓ2bBY'yY4 TeTWWː6Mꤋִ]t pa]ށ_:qlsZOy s{fco2eOk'0*FMo1|[dֲ/:fӇV^Ϫ-ԋ`eѱqQ!c<*_Kƿ6QڔyV^5:pQ=:Մ6(\]n~6!,!vQE:ѡmƟNLCFG)S[?Āy's1ou;h^-њ_e+Iz+ϵA35au81zրam.`?nEm:bFѐn-^V-{Bs,ݚLJ߼Dv$]}fh3jg+_#rC&v :!2tY %U뮞̒X,6<۶fW7ǯ~y|0Q5o% d!ɶE-{Nɟxƶv`ͶQ+ĭQ3G8ZdF0,_?&67Сn僸>٠wȄt6Wsmm5^N୻ ]3'J _T|a%sɚP]nF:Tfm4b \f :@5me1㥀 7\ry}.\| {o22~{;[GһG_v$lfV Ǿ';UݱT/UUɹ7W~ΕXUpMlF.t֩ڍ3oQ;=Ly 4,P2?_uRxNɍ%ar"Pb& Ta%$o0ZMlg˨\jNS )S;o_{h $px׍\ ٕˤudLYWPM&@nęYvu0Q`5l~p6X~K1ʆ-.:6퇂˂+?dpN O.S?l? Mѱ-M) -JDnXBd/# >q uòw̏bb >򉺟h 0= ]lxC'l]5=pY$:+>xn*(^06sDPB?Y_iP"w7 .8PCֽSQ "T3ѭҪ mBO49نYɃ|""ְoH&ɘY1QpL y!〯C!R-<< uYmwj- SuJ6O5xrtCQ}t!np}F$%"JFT(;S Ni9s*P$3ˣ433UЉP.̴Ցf%l r7 pH!k#ۃl)b/CF0_, :嘯_r sܧ/"ϾRDDu_ډ"#|8v1^)blਁhZ}r`*/8P$Q|W96pyiv@S`KĭǡPh&P/Lh$hXج%]m1jiznNnm|Y{ G) wxd\/4$d-LD]K͠mfm8jʐhçDA2 }Ay/*sp YEEo剆ok[z 9 l}T2,ka' ~h+5徆9`kv~kROcSs1D*HF߿Ga>w,T]ap}2o^K Wdz:AZ%BoўV-ndM!ט|`ZO|C"2]/J^(L˹tȿ>ҏ|7pxx+aXPXJ5P-Z7yJ]Ktԉ{k)D0XK wQ-A ʻT6$> b4sϧc',5GO~>æ7q .Io &qR(b/K6;)2&T6.{,9°?P2b8utX^)08(!x۠RMnjcZ&vT+(p1V4=4jE>s4O`=  H#Eߨ%5 # 8tV$g~H"F*,d>_ɣpwH/ ܻNQM' yb'g|2|]z|)پ#նkmġc?bgynq T'uJ,.ŗ-:)O֬&P+WH1F8Aގkw  .z4BO>W` 𘹈B‘%7e 3VZŻm%:cʃTRD̀+ 9}Jyz0ݦ2W9,"$${0~n[-U(0ͨF|'n(g$Cc`\샷dbG%m|07F՘EgDZ+Q<=?p$Kjߕ5ICfBT-fr[vB䎆Qsj2Fp'Ǿt0=HxwB M2wUmi٪kjIL':5Wq_I`!c比sVhp<eHvTU8٩~Y"01S ikm# N' JK Q)7 ј݅! NZjLj-ô@Ibߗj=D%Xt`hEF+qqԧc/*NތJ-neZ!G5!zRlj;omDY]|nd q0Pa:I54;=`EEW 3*ܕ6M&a?wE 4|ʌo ÁA$ CR J3.Z$-R#2!NN ,xgmA1DM }j'6G.a0 ny wR rv[3*N8v4p!nZ;mڤA0CHg)yךS#4?hdiT)3 fF~u)E[0O` d&'`<qJF zWpĈ" U*Qq<0#h }˺$F:۪3uj̇dʖXCqE7 8ꇡ@% Ji9* ӼE|h9l}OCrARidu >;B~m۩G_mxTK#7Op—b|m9!վ5拊Dݞj4!Vܿ_~HUQjUWO0 -`kM?]LLxF Lq}FuES5 *vY_IRs%DMeՔBQ^$'DIxŊ$&;ꦘDCRk>jJjB'L6pdIS]b<l3-]M=qC?lG&y[ugm{*17ap\O3Bv)l=(6xT[0jY-g#,IDקZN ~wBk뼔S$,F]xn5tCذFyִCu;IZqsD7sX'.HHJKxGgIau@S1)%q3 yt9E~əٝrTo|;P ޥlڎ@HB I| ӹ`R~=e~}PFC/Ϙ#{ v&]E2&s r(Q9aU !2t$?=v~dTlؗt[=i_g㇩wS.(K&\ar{U(=/HyI{QCgy\iJe0 !v;I?$}#?ꋛ33#ΗJÑ:^j5yv$V=cX}ɇ# a8DVn}1J ˒4s|zFG)e@ԍ싖m$-lmcƙI {IRRb4yej3K'W h.)ɡs9> \\{}6Z.tߗJ7⪦?5ٓdZy5Y,_ZXǡI@($IdJoyOMSFo鶣b,d^9 \P$n!C (u *R1 0'``I;7lbp+ n,򧳄vWCմ@2Ģvަ7tऊpBwд JU&O[IT0i#<:Iށ/*D:r9݉gDŤQG/MvC`J %~_|;c2yN[Zihу^ͳn  (tS4;Bf]YzЁGؗ]I 0NLYN`1X!q0^ov vq급]h]e\}*>͈cL۩t<] {w)X)X;1`Μě KfX<;#{ipkgXmN̈ qog:8pm3N̈='8P0wF nނLi;Lǃp2gZ`gĞt; +LŊN:"Yt<:(bc׉gv<&vN?7o ffќdbo;;|'sOsv8Xsv8X;|`M8/`97/wg:';|qϝ/fK8nƿ^wŒ: wC#JCo>S+Ó\X=eojӬj'Mw*i <\ lqFﳊep\kj 3*_8s7 tq,krc;/`{˕rš,#M)Be:Y?:*^i_іף˴UqIbՁvL?>^E:;ÿãz( d70!Y)ޢ:j.Ouu~cDtz=$v޸8]]=tR^ K endstream endobj 4 0 obj <> endobj 5 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 6 0 obj <>stream hޜZmFb*uUFW+V ߼k;rx/[} y@VA/{uR20K->]EBXQ,Yy&z]u+"׮aض$9sˆU9W7 XyZI,fn("auAlj wD~ OIj;hKz66޿ʦ1,sdMf{ܗJr2MeIVuki >+{GENeKDYπ>b#; ࣡mC(OQ面: ,w 2W@,-xj%k"iIBR(Rv8Iax쎸Or/>Ժ+ygCNtfK1gi{5Etڏv[$3 opn;ɖ R| XY# P58:om4L`VZ[~Xi4~X%Ra"kvfU({Q}~WlWni/qm͓Z= (LӸ?$ztH(z:n97JgZ PZTj攗yʔH*֒i>Pm݃m/-nU$Ǣ! /|p)# q؊hdGj՝ (#HRWj𽕼MA?VJ'ڎ:ʯM TT]+̱C6U!ZҤvd{3hI 8&l8F^|{[J>lqK7xOgA=;Hmwb:5ǒ&ܑ8@ҪpZ}< b,z?IȮדG޳ =FJ{ d չ%ĞX#%YpB=SuT(}Y~}̓ bt{WJ,P  ܥ/\HQ1G Hqb׸ t8dV :ofh7(u@4~юm(1R70cET#7 Br|;U_jH]3?v_ \̖ĄAyX+/#37%'Z,t>8{6 c p(jjהyztͧk{@PdsM ?ۊ6HOv/* ޛ#@O=.vg^)r'X#kjR~S]7N"eJHسDy\B^=fuא"<覔+F\w:m@HR~ kQ xT\ }̝v AY?0,"=u !4ȋV@oڕ凶cÅ񽡛hIߦ]!v>ei}Q~o*Zv` mI.y 8pGo1v{*-l""#8j3g2d W5%V*f&>э"| uQtUO/R2\yz]`PT8T}|;Nۋ~C(+ mz<ݻu&yweH/h.X_i8ˀoGϚiF@>xhS7o#JtV}ڕ{K& sՇu)tG}(@d,aԹ[s8.?kL`}ljnŚdYn )GR( As+6N^d^tu Luahy8#ag^رN$; C`4p?z^Tu_q44ŭZ`L j,3}S/y@+">|*VsIi.Dó> RK>.κ_syu3]hw˭[!@Rr&Q 8|-$c'"<_;>x.6w 0^}" nwJl󜪲TD쉻xYQU}H"6S8 2*EC;7Vd.XDIG8Rpٹі,^s= .܎>CPa &v8d7npm[4ǑBD*X-4ǜ(=v•x{ak1.ߪj}(y{,rڽZӅW6Tom,\fԃtX7PpA 1Iwo1q:Hkq:^E 7U5%+=6캡)[Y-$tR_kr"Sɐb͚\w#n1]L{[jshn߭*b`r=cQy2HuNhš{;ѲoN_qL`"\_eޗ3-3x --cl6 <v]ޘ2ч{,êB1 "Li}Q4S+`4[g%ph %,)3 a/üo?iBv-(e#TI`->~Ţ;C#eDx$c<nW-p-qW;Ck(crG%e `'v%3rv6%5?+!ա@aHyūTm3Y*m/&Ȳe.E/}"EpIfs2"[F8>%dMUb!Q<L!SŃ~$:/ ' @@a MAOs30 S{(V!b7]Պ =:/Cħv Wj eق OmP* Qp88ӭK6RHfy/E"w4uH GcRPv#emz)Ol ǰ"WU]D X|rg،Ix#4$hvl7 q~`A cšZ P޴.up/#~:qn$Y>[a/h endstream endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <>stream Acrobat Distiller 8.1.0 (Windows) PScript5.dll Version 5.2 2008-04-16T16:46:59-05:00 2008-04-16T16:46:59-05:00 application/pdf http://www.star-telegram.com/entertainment/story/579082.html jjenkins uuid:aeef4fee-3740-4860-9547-236a6f5ad088 uuid:8462c84c-a804-4ae3-90b3-511e07441ffa endstream endobj 13 0 obj <> endobj xref 0 14 0000000000 65535 f 0000050260 00000 n 0000050387 00000 n 0000050531 00000 n 0000059419 00000 n 0000059546 00000 n 0000059701 00000 n 0000063586 00000 n 0000063824 00000 n 0000064179 00000 n 0000064214 00000 n 0000064239 00000 n 0000064304 00000 n 0000068006 00000 n trailer <> startxref 116 %%EOF wp/books/selena.html0000644000106600010660000004604711075151301011703 0ustar Selena: Como La Flor - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Selena: Como La Flor | Reviews

Selena: Como La Flor
Selena: Como La Flor - book coverSelena: less school, more fame
Houston Chronicle
Read excerpts from
Selena: Como la Flor
Look inside this book.

Amazon.com: Books: Selena
Still the Best Biography on Selena in Print!
July 31, 2003 Reviewer: Westoakland from Oakland, CA United States
"Although it's an unauthorized biography, Selena: Como La Flor remains the definitive book about the life and death of Selena. Patoski does a good job of explaining the history and development of Tejano, or Tex-Mex, music prior to Selena y los Dinos' arrival on the scene. Patoski also covers in detail, much of what the 1997 film bio skipped over: primarily the decade between Selena's beginnings as a regional performer, and her signing with EMI Latin/Capitol Records..." read more

Selena's Crossover Dream
Amor Prohibido by Sarah Wimer, Austin Chronicle
Selena had "it," whatever you call that indefinable but tangible star power -- charisma is the best word we have. Her innocent seductress image combined with an amazing voice, sexy dancing, and an obvious and exuberant joy tantalize. This book is a beautiful tribute that goes a long way towards explaining the phenomenon that was Selena and the South Texas Mexicano world from which she came... read more

In Search of Selena
by Abel Salas, Austin Chronicle Vol 15 No 43
You never knew her. Saw her a couple of times. Once at the corner of Riverside and Congress, in a club that changes names every season. She played to a packed house. Yet there was the wholesome girl-next-door as well. You caught a second glimpse when you were a fly, invisible, a less-than-minor presence at the Tejano Music awards in San Antonio. Starry-eyed, you roamed the floor at the Henry B. Gonzalez Convention Center... read more

La Onda Network
A regular visitor and contributor to the Tejano Home Page said:
"Mr. Patoski has written a brilliant book, the first one worthy of Selena. All the background material about Tejano music and prejudices that Mexican-Americans have endured really sets the stage for Selena's life very well. The author has done a meticulous job of collecting and arranging the mountains of detail, and has done so with a minimum of errors. This book is a keeper. I'll probably read it through a second time with greater care." read more

In the Spirit of Selena
by the Houston Chronicle Staff
Selena: Como la Flor, an unauthorized biography by Texas journalist Joe Nick Patoski, hits bookstores today. A year after her death, the spirit of Selena Quintanilla Perez still pervades Tejano music, and her admirers still mourn her loss. On March 31, 1995, Selena Quintanilla Perez, Tejano music's la reina del pueblo, was shot and killed in Corpus Christi. Fans first reacted with disbelief, then with a massive display of adoration... read more | read Selena's Legacy

Southwestern Writers Collection
Texas State University-San Marcos
ALBERT B. ALKEK LIBRARY - SPECIAL COLLECTIONS
The Selena materials are part of what is quickly becoming an important collection of Mexican American music at the Southwestern Writers Collection. This collection was created and maintained by Joe Nick in the process of writing the biography of Selena Quintanilla Perez. It is compiled of news clippings, manuscripts, interviews, photographs, court documents, notes, publicity materials, computer disks and ephemera. Dates range from 1961 to 1997. Joe Nick's research and writing processes, which began the day after Selena's death on March 31, 1995 and continued until January 1996, are reflected in this collection. read more

From tracking down the building permit for Selena's father's restaurant (where she debuted as a nine year old) to visiting the shooting range where Yolanda Saldivar purchased her gun. Patoski's detailed research built the foundation on which his biography stands.

An Exhibit of the Southwestern Writers Collection
Selena: Como La Flor
Dates: May 15, 1997 - July 31, 1997
Slain Tejano superstar Selena was the focus of an exhibit mounted by the Southwestern Writers Collection at Texas State University-San Marcos. The exhibit showcased items donated to the Writers Collection by Texas Monthly Senior Editor Joe Nick Patoski. Patoski's biography of Selena, titled Selena: Como La Flor is widely regarded as the most insightful portrayal of the beloved pop star. The Patoski archive includes early drafts of the book, extensive research into Selena's life, interviews with dozens of musicians and others who knew Selena, correspondence, hundreds of Selena-related clippings and other publications, documents from the Yolanda Saldivar trial, and an extensive record of Patoski's relationship with his publisher. read more

Articles about Selena:


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

 
wp/books.html0000644000106600010660000006466211230234200010430 0ustar Books - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Books | Joe Nick Patoski

An Epic Life Willie Nelson

.

Celebrate Willie Nelson's 75th birthday with Joe Nick Patoski
WILLIE NELSON: AN EPIC LIFE
In stores April 21st, 2008

The realization Texans are different from everybody else hit me about an hour after I'd first set foot on Texas soil. I was only two years old but I distinctly remember my father picking up my mother, my sister and me at the Greater Fort Worth International Airport and driving us to our new home in Fort Worth, stopping along the way at the Big Apple Barbecue on Highway 183. The waitresses talked funny and the smoked beef brisket covered in barbecue sauce we were served tasted like nothing I'd experienced, vaguely familiar and strange and exotic all once. Even as the hot spices set fire to my lips and the inside of my mouth, I immediately wanted more.

Read my MVP Q&A with Mickey Raphael, which ran in the next to last issue of No Depression. Order Willie Nelson: An Epic Life from Amazon here.


Big Bend National Park

Big Bend National Park is one of the few places left in America where a person can literally get away from it all. This book is the first and only comprehensive photographic and word portrait of Big Bend National Park. Joe Nick Patoski complements Laurence Parent's photography with a masterfully crafted word portrait of Big Bend National Park. Patoski describes the powerful geologic and volcanic forces that created the awe-inspiring landscape of the Big Bend. He reviews the park's natural history and also its human history. Patoski also summarizes recent conservation efforts that have led to the protection of 2.1 million acres. Although no single book could ever hope to contain the vastness of Big Bend National Park between two covers, this one beautifully captures its essence.

Buy Now University of Texas Press
Hardcover: 112 pp., 82 color photos, 1 map
ISBN-10: 0-292-71441-6; ISBN-13: 978-0-292-71441-0


 

Texas Coast

This beautiful book combines Laurence Parent's magnificent photographs with Joe Nick Patoski's entertaining text to create a one-of-a-kind portrait of the Texas coast. Joe Nick takes you on a verbal tour of the Texas coast. He describes the irresistible allure of this undramatic yet somehow unforgettable chain of barrier islands and bays. He also acknowledges the human activity that has always been a part of the coastal story-the arrival of immigrants to settle Texas; Civil War battles; towns that flourished and then suddenly folded after devastating hurricanes; the building of a huge petrochemical industry; and the successful effort to create wildlife refuges.

Buy Now University of Texas Press
Hardcover: 108 pages, 68 color phots ISBN: 029270299X
Read an excerpt | View photos


Conjunto

By John Dyer. Introduction by Joe Nick Patoski, who describes the origins of the music and its place in contemporary life, and Juan Tejeda, who pays tribute to the importance of conjunto and of musicians such as Valerio Longoria and Tony de la Rosa. Together, the photographs and essays clearly proclaim that conjunto is a true American roots music.

published by University of Texas Press
Hardcover: 128 pages ISBN: 0292709315
Read a review of Conjunto in Rumbo; Joe Nick on Conjunto


Texas Mountains

In this book, Laurence Parent and Joe Nick Patoski join forces to offer breathtaking views of the Texas mountains. With magnificent images and words, they take us on a journey not only through the familiar Guadalupe, Davis, and Chisos mountains, but also through lesser-known ranges with evocative names such as Sierra Diablo, Eagle, Chinati, Beach, and Christmas.

Buy Now University of Texas Press
Hardcover: 156 pages, 120 color photos ISBN: 0292765924


The Tex-Mex Cookbook

Joe Nick Patoski wrote the chapter on The Story of Tex-Mex music for Robb Walsh's Tex-Mex Cookbook. Go on a grand tour complete with larger-than-life characters, colorful yarns, rare archival photographs -- and a savory assortment of crispy, crunchy Tex-Mex foods.

published by Broadway Books
Paperback: 268 pages ISBN: 0767914880

 
BLOG!
  The Tex and the Mex


My Soul Looks Back in Wonder

This new book collects the stories of ordinary Americans who were involved in the civil rights movements. Joe Nick Patoski contributes oral histories of B.B. King, Jim Dickinson, Ruben Bonilla, Jr., Diane Wilson, Raylawni Branch, Ron Kirk, Sputnik Monroe, Eddie Wilson, Reverend Kenneth Lyons, and Quentin Mease. Hardcover: 240 pages, Published May 2004, ISBN: 1402714157

The Voices of Civil Rights Bus Tour
Joe Nick is joined up from September 17th - October 8th, 2004 for the 70-day journey to collect personal civil rights stories. [Civil Rights blogs]


Selena: Como La Flor

Joe Nick Patoski's biography of Selena is widely regarded as the most insightful portrayal of the beloved pop star. "If you're going to buy one Selena biography, this one is it," Cristina Saralegui, the Cristina Show, Univision; excerpted for VH1's "Behind The Music".


Stevie Ray Vaughan - Caught in the Crossfire

Stevie Ray Vaughan: Caught in the Crossfire

Joe Nick Patoski and Bill Crawford put together the first biography of the meteoric guitarist. Stevie Ray Vaughan fused blazing technique with deep soul in a manner unrivaled since the days of Jimi Hendrix, and the genuineness and passion of his music moved millions.


Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/contact.html0000644000106600010660000002252311075151276010756 0ustar Contact - Joe Nick Patoski
Joe Nick Patoski - joenickp.com
Google
 

Joe Nick Patoski

Joe Nick Patoski

Wimberley, Texas

 

Home - Contact - News/Appearances - Notes & Musings - Bio
Bibliography - Books - Music - Texas - Travel
Water - Misc - Photos - Links -

Copyright 2008 © Joe Nick Patoski, All Rights Reserved. - Website design: Jodi Jenkins

wp/dev/0000755000106600010660000000000011075151256007205 5ustar wp/dev/wp-admin/0000755000106600010660000000000011063620261010713 5ustar wp/dev/wp-admin/install.php0000644000106600010660000001026011035437745013105 0ustar > <?php _e('WordPress › Installation'); ?>

WordPress

'.__('Already Installed').'

'.__('You appear to have already installed WordPress. To reinstall please clear your old database tables first.').'

');} switch($step) { case 0: case 1: // in case people are directly linking to this display_header(); ?>

ReadMe documentation at your leisure. Otherwise, just fill in the information below and you\'ll be on your way to using the most extendable and powerful personal publishing platform in the world.'), '../readme.html'); ?>


error) ) wp_die($wpdb->error->get_error_message()); display_header(); // Fill in the data we gathered $weblog_title = stripslashes($_POST['weblog_title']); $admin_email = stripslashes($_POST['admin_email']); $public = (int) $_POST['blog_public']; // check e-mail address if (empty($admin_email)) { // TODO: poka-yoke die('

'.__("ERROR: you must provide an e-mail address.").'

'); } else if (!is_email($admin_email)) { // TODO: poka-yoke die('

'.__('ERROR: that isn’t a valid e-mail address. E-mail addresses look like: username@example.com').'

'); } $wpdb->show_errors(); $result = wp_install($weblog_title, 'admin', $admin_email, $public); extract($result, EXTR_SKIP); ?>

admin

'.__('Note that password carefully! It is a random password that was generated just for you.').'

'; ?>

wp/dev/wp-admin/options-discussion.php0000644000106600010660000002000611007375340015301 0ustar







__("Don’t show Avatars"), 1 => __('Show Avatars')); foreach ( $yesorno as $key => $value) { $selected = (get_option('show_avatars') == $key) ? 'checked="checked"' : ''; echo "\n\t
"; } ?>
__('G — Suitable for all audiences'), 'PG' => __('PG — Possibly offensive, usually for audiences 13 and above'), 'R' => __('R — Intended for adult audiences above 17'), 'X' => __('X — Even more mature than above')); foreach ($ratings as $key => $rating) : $selected = (get_option('avatar_rating') == $key) ? 'checked="checked"' : ''; echo "\n\t
"; endforeach; ?>

__('Mystery Man'), 'blank' => __('Blank'), 'gravatar_default' => __('Gravatar Logo'), 'identicon' => __('Identicon (Generated)'), 'wavatar' => __('Wavatar (Generated)'), 'monsterid' => __('MonsterID (Generated)') ); $avatar_defaults = apply_filters('avatar_defaults', $avatar_defaults); $default = get_option('avatar_default'); if ( empty($default) ) $default = 'mystery'; $size = 32; $avatar_list = ''; foreach ( $avatar_defaults as $default_key => $default_name ) { $selected = ($default == $default_key) ? 'checked="checked" ' : ''; $avatar_list .= "\n\t'; $avatar_list .= '
'; } echo apply_filters('default_avatar_select', $avatar_list); ?>

wp/dev/wp-admin/export.php0000644000106600010660000000266711007310722012754 0ustar

wp/dev/wp-admin/press-this.php0000644000106600010660000005036611046105152013535 0ustar $image) { // see if files exist in content - we don't want to upload non-used selected files. if( strpos($_REQUEST['content'], $image) !== false ) { $upload = media_sideload_image($image, $post_ID, $_REQUEST['photo_description'][$key]); // Replace the POSTED content with correct uploaded ones. // escape quote for matching $quoted = preg_quote2($image); if( !is_wp_error($upload) ) $content = preg_replace('/]*)src=(\"|\')'.$quoted.'(\2)([^>\/]*)\/*>/is', $upload, $content); } } break; case "video": if($_REQUEST['embed_code']) $content .= $_REQUEST['embed_code']."\n\n"; $content .= $_REQUEST['content']; break; } // set the post_content $quick['post_content'] = $content; // error handling for $post if ( is_wp_error($post_ID)) { wp_die($id); wp_delete_post($post_ID); // error handling for media_sideload } elseif ( is_wp_error($upload)) { wp_die($upload); wp_delete_post($post_ID); } else { $quick['ID'] = $post_ID; wp_update_post($quick); } return $post_ID; } // For submitted posts. if ( 'post' == $_REQUEST['action'] ) { check_admin_referer('press-this'); $post_ID = press_it(); ?> > <?php _e('Press This') ?>

| |

', $selection); $selection = '

'.str_replace('

', '', $selection).'

'; } $url = clean_url($_GET['u']); $image = $_GET['i']; if($_REQUEST['ajax'] == 'thickbox') { ?>

<?php echo attribute_escape(__('Click to insert.')); ?>

|

]*)src=(\"|\')([^<>]+?\.(png|jpeg|jpg|jpe|gif))[^<>\'\"]*(\2)([^>\/]*)\/*>/is'; preg_match_all($pattern, $content, $matches); if ( empty($matches[1]) ) return ''; $sources = array(); foreach ($matches[3] as $src) { // if no http in url if(strpos($src, 'http') === false) // if it doesn't have a relative uri if( strpos($src, '../') === false && strpos($src, './') === false && strpos($src, '/') === true) $src = 'http://'.str_replace('//','/', $host['host'].'/'.$src); else $src = 'http://'.str_replace('//','/', $host['host'].'/'.dirname($host['path']).'/'.$src); $sources[] = clean_url($src); } return "'" . implode("','", $sources) . "'"; } $url = urldecode($url); $url = str_replace(' ', '%20', $url); echo 'new Array('.get_images_from_uri($url).')'; die; } if($_REQUEST['ajax'] == 'photo_js') { ?> // gather images and load some default JS var last = null var img, img_tag, aspect, w, h, skip, i, strtoappend = ""; var my_src = eval( jQuery.ajax({ type: "GET", url: "", cache : false, async : false, data: "ajax=photo_images&u=", dataType : "script" }).responseText ); for (i = 0; i < my_src.length; i++) { img = new Image(); img.src = my_src[i]; img_attr = 'id="img' + i + '"'; skip = false; if (img.width && img.height) { if (img.width * img.height < 2500) skip = true; aspect = img.width / img.height; scale = (aspect > 1) ? (75 / img.width) : (75 / img.height); w = img.width; h = img.height; if (scale < 1) { w = parseInt(img.width * scale); h = parseInt(img.height * scale); } img_attr += ' style="width: ' + w + 'px; height: ' + h + 'px;"'; } if (!skip) strtoappend += ''; } function pick(img, desc) { if (img) { if('object' == typeof jQuery('.photolist input') && jQuery('.photolist input').length != 0) length = jQuery('.photolist input').length; if(length == 0) length = 1; jQuery('.photolist').append(''); jQuery('.photolist').append(''); append_editor("\n\n" + '

' + desc + '

'); } tinyMCE.activeEditor.resizeToContent(); return false; } function image_selector() { tb_remove(); desc = jQuery('#this_photo_description').val(); src = jQuery('#this_photo').val(); pick(src, desc); return false; } jQuery(document).ready(function() { jQuery('#extra_fields').html('
+
'); jQuery('#img_container').html(strtoappend); jQuery('#photo_add_url').attr('href', '?ajax=thickbox_url&height=200&width=500'); tb_init('a.thickbox, area.thickbox, input.thickbox'); }); > <?php _e('Press This') ?>

wp/dev/wp-admin/edit-form-advanced.php0000644000106600010660000004425711050374606015076 0ustar go back.' ), attribute_escape( stripslashes( $_GET['_wp_original_http_referer'] ) ) ); $messages[2] = __('Custom field updated.'); $messages[3] = __('Custom field deleted.'); $messages[4] = __('Post updated.'); if ( isset($_GET['revision']) ) $messages[5] = sprintf( __('Post restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ); $notice = false; $notices[1] = __( 'There is an autosave of this post that is more recent than the version below. View the autosave.' ); if ( !isset($post_ID) || 0 == $post_ID ) { $form_action = 'post'; $temp_ID = -1 * time(); // don't change this formula without looking at wp_write_post() $form_extra = ""; $autosave = false; } else { $post_ID = (int) $post_ID; $form_action = 'editpost'; $form_extra = ""; $autosave = wp_get_post_autosave( $post_id ); // Detect if there exists an autosave newer than the post and if that autosave is different than the post if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt ) > mysql2date( 'U', $post->post_modified_gmt ) ) { foreach ( _wp_post_revision_fields() as $autosave_field => $_autosave_field ) { if ( wp_text_diff( $autosave->$autosave_field, $post->$autosave_field ) ) { $notice = sprintf( $notices[1], get_edit_post_link( $autosave->ID ) ); break; } } unset($autosave_field, $_autosave_field); } } ?>

'; $form_prevstatus = ''; $saveasdraft = ''; ?> post_status ) wp_original_referer_field(true, 'previous'); ?>
post_status ) { ?>

post_status ) { // scheduled for publishing at a future date $stamp = __('Scheduled for:
%1$s at %2$s'); } else if ( 'publish' == $post->post_status ) { // already published $stamp = __('Published on:
%1$s at %2$s'); } else if ( '0000-00-00 00:00:00' == $post->post_date ) { // draft, 1 or more saves, no date specified $stamp = __('Publish immediately'); } else { // draft, 1 or more saves, date specified $stamp = __('Publish on:
%1$s at %2$s'); } $date = mysql2date(get_option('date_format'), $post->post_date); $time = mysql2date(get_option('time_format'), $post->post_date); } else { // draft (no saves, and thus no date specified) $stamp = __('Publish immediately'); $date = mysql2date(get_option('date_format'), current_time('mysql')); $time = mysql2date(get_option('time_format'), current_time('mysql')); } ?>

 

post_status, array('publish', 'future') ) || 0 == $post_ID ) { ?> post_status) ? __("You are about to delete this draft '%s'\n 'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this post '%s'\n 'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { return true;}return false;\">" . __('Delete post') . ""; ?>
display_name ), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified)); } else { printf(__('Last edited on %1$s at %2$s'), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified)); } ?>

ID); ?>
ID) && ! empty($sample_permalink_html) ) : echo $sample_permalink_html; endif; ?>

post_content); ?>

0, 'name' => 'newcat_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('Parent category'), 'tab_index' => 3 ) ); ?>

    ID, false, false, $popular_ids) ?>

use them in your template'); ?>

to_ping) ) .'" />'; if ('' != $post->pinged) { $pings = '

'. __('Already pinged:') . '

    '; $already_pinged = explode("\n", trim($post->pinged)); foreach ($already_pinged as $pinged_url) { $pings .= "\n\t
  • " . wp_specialchars($pinged_url) . "
  • "; } $pings .= '
'; } ?>


()

pingbacks, no other action necessary.'); ?>

ID); list_meta($metadata); ?>

use in your theme.'); ?>

trackbacks and pingbacks.'); ?>

id ); // TODO: ROLE SYSTEM if ( $post->post_author && !in_array($post->post_author, $authors) ) $authors[] = $post->post_author; if ( $authors && count( $authors ) > 1 ) : function post_author_meta_box($post) { global $current_user, $user_ID; $authors = get_editable_user_ids( $current_user->id ); // TODO: ROLE SYSTEM if ( $post->post_author && !in_array($post->post_author, $authors) ) $authors[] = $post->post_author; ?> $authors, 'name' => 'post_author_override', 'selected' => empty($post->ID) ? $user_ID : $post->post_author) ); ?>
post_title) && '' == $post->post_title) || (isset($_GET['message']) && 2 > $_GET['message'])) : ?> wp/dev/wp-admin/admin.php0000644000106600010660000000577011035740603012527 0ustar wp/dev/wp-admin/edit-post-rows.php0000644000106600010660000001363011003453751014331 0ustar $column_display_name) { if ( 'cb' === $post_column_key ) $class = ' class="check-column"'; elseif ( 'comments' === $post_column_key ) $class = ' class="num"'; else $class = ''; ?> posts as $a_post ) $post_ids[] = $a_post->ID; $comment_pending_count = get_pending_comments_num($post_ids); while (have_posts()) : the_post(); $class = 'alternate' == $class ? '' : 'alternate'; global $current_user; $post_owner = ( $current_user->ID == $post->post_author ? 'self' : 'other' ); $title = get_the_title(); if ( empty($title) ) $title = __('(no title)'); ?> post_status ); ?>' valign="top"> $column_display_name) { switch($column_name) { case 'cb': ?> post_date && 'date' == $column_name ) { $t_time = $h_time = __('Unpublished'); } else { if ( 'modified' == $column_name ) { $t_time = get_the_modified_time(__('Y/m/d g:i:s A')); $m_time = $post->post_modified; $time = get_post_modified_time('G', true); } else { $t_time = get_the_time(__('Y/m/d g:i:s A')); $m_time = $post->post_date; $time = get_post_time('G', true); } if ( ( abs(time() - $time) ) < 86400 ) { if ( ( 'future' == $post->post_status) ) $h_time = sprintf( __('%s from now'), human_time_diff( $time ) ); else $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); } else { $h_time = mysql2date(__('Y/m/d'), $m_time); } } ?>
>
ID ) ) { ?> ID ) ) { ?>"> post_password) ) { _e(' — Protected'); } elseif ('private' == $post->post_status) { _e(' — Private'); } ?> slug'> " . wp_specialchars(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . ""; echo join( ', ', $out ); } else { _e('Uncategorized'); } ?> slug'> " . wp_specialchars(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . ""; echo join( ', ', $out ); } else { _e('No Tags'); } ?>
ID] : 0; $pending_phrase = sprintf( __('%s pending'), number_format( $left ) ); if ( $left ) echo ''; comments_number("" . __('0') . '', "" . __('1') . '', "" . __('%') . ''); if ( $left ) echo ''; ?>
" rel="permalink"> post_status ) { case 'publish' : case 'private' : _e('Published'); break; case 'future' : _e('Scheduled'); break; case 'pending' : _e('Pending Review'); break; case 'draft' : _e('Unpublished'); break; } ?> ID) ) { echo "" . __('Edit') . ""; } ?> ID) ) { echo "ID) . "' class='delete'>" . __('Delete') . ""; } ?>
wp/dev/wp-admin/moderation.php0000644000106600010660000000014411014735077013574 0ustar wp/dev/wp-admin/install-helper.php0000644000106600010660000001007011047673251014356 0ustar get_col("SHOW TABLES",0) as $table ) { if ($table == $table_name) { return true; } } //didn't find it try to create it. $wpdb->query($create_ddl); // we cannot directly tell that whether this succeeded! foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) { if ($table == $table_name) { return true; } } return false; } endif; /** ** maybe_add_column() ** Add column to db table if it doesn't exist. ** Returns: true if already exists or on successful completion ** false on error */ if ( ! function_exists('maybe_add_column') ) : function maybe_add_column($table_name, $column_name, $create_ddl) { global $wpdb, $debug; foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { if ($debug) echo("checking $column == $column_name
"); if ($column == $column_name) { return true; } } //didn't find it try to create it. $wpdb->query($create_ddl); // we cannot directly tell that whether this succeeded! foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { if ($column == $column_name) { return true; } } return false; } endif; /** ** maybe_drop_column() ** Drop column from db table if it exists. ** Returns: true if it doesn't already exist or on successful drop ** false on error */ function maybe_drop_column($table_name, $column_name, $drop_ddl) { global $wpdb; foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { if ($column == $column_name) { //found it try to drop it. $wpdb->query($drop_ddl); // we cannot directly tell that whether this succeeded! foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { if ($column == $column_name) { return false; } } } } // else didn't find it return true; } /** ** check_column() ** Check column matches passed in criteria. ** Pass in null to skip checking that criteria ** Returns: true if it matches ** false otherwise ** (case sensitive) Column names returned from DESC table are: ** Field ** Type ** Null ** Key ** Default ** Extra */ function check_column($table_name, $col_name, $col_type, $is_null = null, $key = null, $default = null, $extra = null) { global $wpdb, $debug; $diffs = 0; $results = $wpdb->get_results("DESC $table_name"); foreach ($results as $row ) { if ($debug > 1) print_r($row); if ($row->Field == $col_name) { // got our column, check the params if ($debug) echo ("checking $row->Type against $col_type\n"); if (($col_type != null) && ($row->Type != $col_type)) { ++$diffs; } if (($is_null != null) && ($row->Null != $is_null)) { ++$diffs; } if (($key != null) && ($row->Key != $key)) { ++$diffs; } if (($default != null) && ($row->Default != $default)) { ++$diffs; } if (($extra != null) && ($row->Extra != $extra)) { ++$diffs; } if ($diffs > 0) { if ($debug) echo ("diffs = $diffs returning false\n"); return false; } return true; } // end if found our column } return false; } /* echo "

testing

"; echo "
";

//check_column('wp_links', 'link_description', 'mediumtext');
//if (check_column($wpdb->comments, 'comment_author', 'tinytext'))
//    echo "ok\n";
$error_count = 0;
$tablename = $wpdb->links;
// check the column
if (!check_column($wpdb->links, 'link_description', 'varchar(255)'))
{
	$ddl = "ALTER TABLE $wpdb->links MODIFY COLUMN link_description varchar(255) NOT NULL DEFAULT '' ";
	$q = $wpdb->query($ddl);
}
if (check_column($wpdb->links, 'link_description', 'varchar(255)')) {
	$res .= $tablename . ' - ok 
'; } else { $res .= 'There was a problem with ' . $tablename . '
'; ++$error_count; } echo "
"; */ ?> wp/dev/wp-admin/categories.php0000644000106600010660000001254111024604047013555 0ustar %s category: this is the default one"), $cat_name)); wp_delete_category($cat_ID); wp_redirect('categories.php?message=2'); exit; break; case 'bulk-delete': check_admin_referer('bulk-categories'); if ( !current_user_can('manage_categories') ) wp_die( __('You are not allowed to delete categories.') ); foreach ( (array) $_GET['delete'] as $cat_ID ) { $cat_name = get_catname($cat_ID); // Don't delete the default cats. if ( $cat_ID == get_option('default_category') ) wp_die(sprintf(__("Can’t delete the %s category: this is the default one"), $cat_name)); wp_delete_category($cat_ID); } $sendback = wp_get_referer(); $sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback); wp_redirect($sendback); exit(); break; case 'edit': require_once ('admin-header.php'); $cat_ID = (int) $_GET['cat_ID']; $category = get_category_to_edit($cat_ID); include('edit-category-form.php'); break; case 'editedcat': $cat_ID = (int) $_POST['cat_ID']; check_admin_referer('update-category_' . $cat_ID); if ( !current_user_can('manage_categories') ) wp_die(__('Cheatin’ uh?')); if ( wp_update_category($_POST) ) wp_redirect('categories.php?message=3'); else wp_redirect('categories.php?message=5'); exit; break; default: if ( !empty($_GET['_wp_http_referer']) ) { wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI']))); exit; } wp_enqueue_script( 'admin-categories' ); wp_enqueue_script('admin-forms'); require_once ('admin-header.php'); $messages[1] = __('Category added.'); $messages[2] = __('Category deleted.'); $messages[3] = __('Category updated.'); $messages[4] = __('Category not added.'); $messages[5] = __('Category not updated.'); ?>

add new)'), '#addcat') ?>


add_query_arg( 'pagenum', '%#%' ), 'format' => '', 'total' => ceil(wp_count_terms('category') / $catsperpage), 'current' => $pagenum )); if ( $page_links ) echo "
$page_links
"; ?>


$page_links
"; ?>

Note:
Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the category %s.'), apply_filters('the_category', get_catname(get_option('default_category')))) ?>

category to tag converter.'), 'admin.php?import=wp-cat2tag') ?>

wp/dev/wp-admin/rtl.css0000644000106600010660000001650311050411575012235 0ustar a:link, a:visited { text-decoration:none; } a:hover { text-decoration:underline; } .plugins .togl { border-right-width: 0; border-left-width: 1px; border-left-style: solid; } form#upload th { text-align:left; } td.available-theme { text-align:right; } #current-theme img { float: right; margin-right:0; margin-left: 1em; } .quicktags, .search { font-family: Tahoma; } /* 201 - 403 =================================== */ .side-info ul { padding-left:0; padding-right:18px; } .submit input, .button, .button-secondary, .button-highlighted { font-family: Tahoma; } #wpcontent select { font-family: Tahoma; } /* #postdiv, #titlediv, #guiddiv, #poststuff .stuffbox { margin:0 0 0 8px; } */ #quicktags #ed_code { font-family: Tahoma; } #searchform fieldset { float:right; margin: 0 0 1em 1.5ex; } #searchform fieldset legend { padding: 0 1px .2em 0; } #searchform #post-query-submit { float:right; } /* 404 - 804 =================================== */ #template div { margin-right:0; margin-left: 190px; } * html #template div { margin-left: 0; } #your-profile legend { font-family:arial; } #ajax-response.alignleft { margin-left:0; margin-right: 2em; } .page-numbers { margin-right:0; margin-left:3px; } .comment-column { margin-left:0; margin-right: 5px; } .tablenav a.button-secondary { margin: 1px 0 0 8px; } #update-nag, .plugin-update { clear:both; } /* .tablenav .tablenav-pages { float:left; } */ #user_info { right:auto; left:15px; } #wphead #viewsite { margin-left:0; margin-right:10px; } #wphead #viewsite a { font-family: Tahoma; } #wphead h1 { font-family:arial; margin-right:0; margin-left:15%; padding: 11px 12px 16px 170px; } #dashmenu { right:0; left:auto; padding-left:0; padding-right: 9px; } #dashmenu a { margin-right:0; margin-left:8px; } #adminmenu { padding-left:0; padding-right:11px; } #adminmenu a { font-family:arial; font-weight:bold; padding:6px 7px; } #adminmenu a.current, #sidemenu a.current { font-weight:bold; } #sidemenu { margin: -30px 0 0 15px; float: left; padding-left:0; padding-right: 10px; height: 1%; /* Peek-a-boo in IE6 */ } #sidemenu a { float:right; } #submenu li { padding: 0 17px 8px 0; font-size:13px; } #adminmenu li a #awaiting-mod span, #sidemenu li a #update-plugins span { right:auto; left:0; } #adminmenu li a:hover #awaiting-mod, #sidemenu li a:hover #update-plugins { background-position: -160px top; } /* 804 - 1004 =================================== */ #footer { padding: 10px 60px 0 0; } .form-table th { text-align:right; } .form-table input.tog { margin-right:0; margin-left: 2px; float: right; } .form-table table.color-palette { float:right; } #pass-strength-result { float:right; margin-right:0; margin-left: 5px; } #profile-page .form-table #rich_editing { margin-right:0; margin-left: 5px; } #tagsdiv #newtag { margin-right:0; margin-left: 5px; } #tagchecklist { margin-left:0; margin-right: 10px; } #tagchecklist strong { margin-left:0; margin-right: -8px; } #tagchecklist span { margin-right:0; margin-left: 25px; float: right; } #tagchecklist span a { margin: 6px -9px 0 0; float: right; } /* 1005 - 1304 =================================== */ .ac_results li { text-align:right; } #poststuff h2 { clear:right; } #poststuff .postbox, #poststuff .stuffbox, #titlediv, #poststuff .postarea { margin-left: 8px; margin-right: 20px; } #edit-slug-buttons a.save { margin-right:0; margin-left:4px; } #poststuff #edButtonPreview, #poststuff #edButtonHTML { margin: 5px 0 0 8px; float: left; } #poststuff #media-buttons { float: left; margin-right:0; margin-left: 20px; } #poststuff #media-buttons a { padding: 0 2px 2px 5px; } #poststuff .togbox { margin-left:0; margin-right: -21px; -moz-border-radius-topleft:0; -khtml-border-top-left-radius:0; -webkit-border-top-left-radius:0; border-top-left-radius:0; -moz-border-radius-topright: 3px; -khtml-border-top-right-radius: 3px; -webkit-border-top-right-radius: 3px; border-top-right-radius: 3px; -moz-border-radius-bottomleft: 0; -khtml-border-bottom-left-radius:0; -webkit-border-bottom-left-radius:0; border-bottom-left-radius:0; -moz-border-radius-bottomright: 3px; -khtml-border-bottom-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; border-bottom-right-radius: 3px; } .submitbox .submitdelete { margin-left:0; margin-right:8px; } .submitbox .submit { text-align:right; } .submitbox .submit input { margin-right:0; margin-left:3px; } #categorydiv #category-adder { margin-left:0; margin-right: 120px; } #categorydiv ul#category-tabs { float: right; text-align: left; margin: 0 0 0 -120px; } ul#category-tabs li.ui-tabs-selected { -moz-border-radius-topleft:0; -khtml-border-top-left-radius:0; -webkit-border-top-left-radius:0; border-top-left-radius:0; -moz-border-radius-bottomleft:0; -khtml-border-bottom-left-radius:0; -webkit-border-bottom-left-radius:0; border-bottom-left-radius:0; -moz-border-radius-topright: 3px; -khtml-border-top-right-radius: 3px; -webkit-border-top-right-radius: 3px; border-top-right-radius: 3px; -moz-border-radius-bottomright: 3px; -khtml-border-bottom-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; border-bottom-right-radius: 3px; } div.ui-tabs-panel { margin: 0 120px 0 5px; } /* 1305 - elakh! :-) =================================== */ #categorydiv ul.categorychecklist ul { margin-left:0; margin-right: 18px; } #linkcategorydiv #category-adder { margin-left:0; margin-right: 120px; } #linkcategorydiv ul#category-tabs { float: right; text-align: left; margin: 0 0 0 -120px; } #linkcategorydiv ul.categorychecklist ul { margin-left:0; margin-right: 18px; } p#tag-search, p#post-search { right:auto; left:0; } #posts-filter fieldset { float: right; margin: 0 0 1em 1.5ex; } #posts-filter fieldset legend { padding: 0 1px .2em 0; } ul.view-switch { float: left; margin: -23px 0 -2px 5px; } ul.view-switch li { float: right; } #the-comment-list td.comment p.comment-author { margin-right: 0 ; } #the-comment-list p.comment-author img { float: right; margin-right:0; margin-left: 8px; } #the-comment-list td.comment p { margin-left:0; margin-right: 8px; } .curtime { background-position: right 2px; padding-left:0; padding-right: 18px; } .tablenav .delete { margin-right:0; margin-left: 20px; } #tTips { } td.action-links, th.action-links { text-align:left; } .info-box { left:auto; right: 50%; margin-left: 0; margin-right: -225px; } .info-box .gears-img { float: left; } /* LTR =================================== */ #edit-slug-box, #trackback, #metakeyinput, #post_password, #link_url, #link_image, #rss_uri, #category_nicename, #slug, #dbuser, #dbpass, #dbname, #dbprefix, #dccharset, #gmpath, #archivespath, #lastentry, #dbhost, #pages-exclude, #newcontent, #email, #newcomment_author_url, #siteurl, #home, #admin_email, #date_format, #time_format, #gmt_offset, #mailserver_url, #mailserver_port, #mailserver_login, #mailserver_pass, #ping_sites, #posts_per_page, #posts_per_rss, #blog_charset, #moderation_keys, #blacklist_keys, #comment_max_links, #permalink_structure, #category_base, #tag_base, #upload_path, #upload_url_path, #thumbnail_size_w, #thumbnail_size_h, #medium_size_w, #medium_size_h, #user_login, #url, #pass1, #pass2, #aim, #yim, #jabber, #key, #src, #hostname, #username, #password, #rules { direction:ltr; } /* TinyMCE =================================== */ .clearlooks2 .mceTop .mceLeft { width:100% !important; } wp/dev/wp-admin/plugin-editor.php0000644000106600010660000001225111017045414014207 0ustar '.__('You do not have sufficient permissions to edit templates for this blog.').'

'); $newcontent = stripslashes($_POST['newcontent']); if ( is_writeable($real_file) ) { $f = fopen($real_file, 'w+'); fwrite($f, $newcontent); fclose($f); // Deactivate so we can test it. if ( is_plugin_active($file) || isset($_POST['phperror']) ) { if ( is_plugin_active($file) ) deactivate_plugins($file, true); wp_redirect(add_query_arg('_wpnonce', wp_create_nonce('edit-plugin-test_' . $file), "plugin-editor.php?file=$file&liveupdate=1")); exit; } wp_redirect("plugin-editor.php?file=$file&a=te"); } else { wp_redirect("plugin-editor.php?file=$file"); } exit; break; default: if ( !current_user_can('edit_plugins') ) wp_die('

'.__('You do not have sufficient permissions to edit plugins for this blog.').'

'); if ( isset($_GET['liveupdate']) ) { check_admin_referer('edit-plugin-test_' . $file); $error = validate_plugin($file); if( is_wp_error($error) ) wp_die( $error ); if ( ! is_plugin_active($file) ) activate_plugin($file, "plugin-editor.php?file=$file&phperror=1");// we'll override this later if the plugin can be included without fatal error wp_redirect("plugin-editor.php?file=$file&a=te"); exit; } require_once('admin-header.php'); update_recently_edited(WP_PLUGIN_DIR . '/' . $file); if ( ! is_file($real_file) ) $error = 1; if ( ! $error ) $content = htmlspecialchars(file_get_contents($real_file)); ?>

fatal error.') ?>

%s (active)'), $file); else echo sprintf(__('Browsing %s (active)'), $file); } else { if ( is_writeable($real_file) ) echo sprintf(__('Editing %s (inactive)'), $file); else echo sprintf(__('Browsing %s (inactive)'), $file); } ?>


Warning: Making changes to active plugins is not recommended. If your changes cause a fatal error, the plugin will be automatically deactivated.'); ?>

"; else echo ""; ?>

the Codex for more information.'); ?>

' . __('Oops, no such file exists! Double check the name and try again, merci.') . '

'; } ?>
 
wp/dev/wp-admin/edit-page-form.php0000644000106600010660000003466711050374606014251 0ustar go back.' ), attribute_escape( stripslashes( $_GET['_wp_original_http_referer'] ) ) ); $messages[2] = __('Custom field updated.'); $messages[3] = __('Custom field deleted.'); $messages[4] = __('Page updated.'); if ( isset($_GET['revision']) ) $messages[5] = sprintf( __('Page restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ); $notice = false; $notices[1] = __( 'There is an autosave of this page that is more recent than the version below. View the autosave.' ); if (!isset($post_ID) || 0 == $post_ID) { $form_action = 'post'; $nonce_action = 'add-page'; $temp_ID = -1 * time(); // don't change this formula without looking at wp_write_post() $form_extra = ""; } else { $post_ID = (int) $post_ID; $form_action = 'editpost'; $nonce_action = 'update-page_' . $post_ID; $form_extra = ""; $autosave = wp_get_post_autosave( $post_id ); if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt ) > mysql2date( 'U', $post->post_modified_gmt ) ) $notice = sprintf( $notices[1], get_edit_post_link( $autosave->ID ) ); } $temp_ID = (int) $temp_ID; $user_ID = (int) $user_ID; ?>

'; ?> post_status ) wp_original_referer_field(true, 'previous'); ?>
post_status ) { ?>

post_status ) { // scheduled for publishing at a future date $stamp = __('Scheduled for:
%1$s at %2$s'); } else if ( 'publish' == $post->post_status ) { // already published $stamp = __('Published on:
%1$s at %2$s'); } else if ( '0000-00-00 00:00:00' == $post->post_date ) { // draft, 1 or more saves, no date specified $stamp = __('Publish immediately'); } else { // draft, 1 or more saves, date specified $stamp = __('Publish on:
%1$s at %2$s'); } $date = mysql2date(get_option('date_format'), $post->post_date); $time = mysql2date(get_option('time_format'), $post->post_date); } else { // draft (no saves, and thus no date specified) $stamp = __('Publish immediately'); $date = mysql2date(get_option('date_format'), current_time('mysql')); $time = mysql2date(get_option('time_format'), current_time('mysql')); } ?>

 

post_status, array('publish', 'future') ) || 0 == $post_ID ) { ?> post_status) ? __("You are about to delete this draft '%s'\n 'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this page '%s'\n 'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { return true;}return false;\">" . __('Delete page') . ""; ?>
display_name ), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified)); } else { printf(__('Last edited on %1$s at %2$s'), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified)); } ?>

ID); ?>
ID) && ! empty($sample_permalink_html) ) : echo $sample_permalink_html; endif; ?>

post_content); ?>

ID); list_meta($metadata); ?>

use in your theme.'); ?>

trackbacks and pingbacks.'); ?>

id ); // TODO: ROLE SYSTEM if ( $post->post_author && !in_array($post->post_author, $authors) ) $authors[] = $post->post_author; if ( $authors && count( $authors ) > 1 ) { function page_author_meta_box($post){ global $current_user, $user_ID; $authors = get_editable_user_ids( $current_user->id ); // TODO: ROLE SYSTEM if ( $post->post_author && !in_array($post->post_author, $authors) ) $authors[] = $post->post_author; ?> $authors, 'name' => 'post_author_override', 'selected' => empty($post->ID) ? $user_ID : $post->post_author) ); ?>
wp/dev/wp-admin/revision.php0000644000106600010660000001404211043456466013277 0ustar post_parent ) ) break; if ( !$post = get_post( $revision->post_parent ) ) break; if ( !constant('WP_POST_REVISIONS') && !wp_is_post_autosave( $revision ) ) // Revisions disabled and we're not looking at an autosave break; check_admin_referer( "restore-post_$post->ID|$revision->ID" ); wp_restore_post_revision( $revision->ID ); $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) ); break; case 'diff' : if ( !$left_revision = get_post( $left ) ) break; if ( !$right_revision = get_post( $right ) ) break; if ( !current_user_can( 'read_post', $left_revision->ID ) || !current_user_can( 'read_post', $right_revision->ID ) ) break; // If we're comparing a revision to itself, redirect to the 'view' page for that revision or the edit page for that post if ( $left_revision->ID == $right_revision->ID ) { $redirect = get_edit_post_link( $left_revision->ID ); include( 'js/revisions-js.php' ); break; } // Don't allow reverse diffs? if ( strtotime($right_revision->post_modified_gmt) < strtotime($left_revision->post_modified_gmt) ) { $redirect = add_query_arg( array( 'left' => $right, 'right' => $left ) ); break; } if ( $left_revision->ID == $right_revision->post_parent ) // right is a revision of left $post =& $left_revision; elseif ( $left_revision->post_parent == $right_revision->ID ) // left is a revision of right $post =& $right_revision; elseif ( $left_revision->post_parent == $right_revision->post_parent ) // both are revisions of common parent $post = get_post( $left_revision->post_parent ); else break; // Don't diff two unrelated revisions if ( !constant('WP_POST_REVISIONS') ) { // Revisions disabled if ( // we're not looking at an autosave ( !wp_is_post_autosave( $left_revision ) && !wp_is_post_autosave( $right_revision ) ) || // we're not comparing an autosave to the current post ( $post->ID !== $left_revision->ID && $post->ID !== $right_revision->ID ) ) break; } if ( // They're the same $left_revision->ID == $right_revision->ID || // Neither is a revision ( !wp_get_post_revision( $left_revision->ID ) && !wp_get_post_revision( $right_revision->ID ) ) ) break; $post_title = '' . get_the_title() . ''; $h2 = sprintf( __( 'Compare Revisions of “%1$s”' ), $post_title ); $left = $left_revision->ID; $right = $right_revision->ID; $redirect = false; break; case 'view' : default : if ( !$revision = wp_get_post_revision( $revision_id ) ) break; if ( !$post = get_post( $revision->post_parent ) ) break; if ( !current_user_can( 'read_post', $revision->ID ) || !current_user_can( 'read_post', $post->ID ) ) break; if ( !constant('WP_POST_REVISIONS') && !wp_is_post_autosave( $revision ) ) // Revisions disabled and we're not looking at an autosave break; $post_title = '' . get_the_title() . ''; $revision_title = wp_post_revision_title( $revision, false ); $h2 = sprintf( __( 'Post Revision for “%1$s” created on %2$s' ), $post_title, $revision_title ); // Sets up the diff radio buttons $left = $revision->ID; $right = $post->ID; $redirect = false; break; endswitch; if ( !$redirect && !in_array( $post->post_type, array( 'post', 'page' ) ) ) $redirect = 'edit.php'; if ( $redirect ) { wp_redirect( $redirect ); exit; } if ( 'page' == $post->post_type ) { $submenu_file = 'edit-pages.php'; $title = __( 'Page Revisions' ); } else { $submenu_file = 'edit.php'; $title = __( 'Post Revisions' ); } require_once( 'admin-header.php' ); ?>

$field_title ) : if ( 'diff' == $action ) { $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field ); $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field ); if ( !$content = wp_text_diff( $left_content, $right_content ) ) continue; // There is no difference between left and right $identical = false; } else { add_filter( "_wp_post_revision_field_$field", 'htmlspecialchars' ); $content = apply_filters( "_wp_post_revision_field_$field", $revision->$field, $field ); } ?>


'form-table', 'parent' => true, 'right' => $right, 'left' => $left ); if ( !constant( 'WP_POST_REVISIONS' ) ) $args['type'] = 'autosave'; wp_list_post_revisions( $post, $args ); ?>
get_var( $wpdb->prepare("SELECT count(*) FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID) ); } } if(!function_exists('link_exists')) { function link_exists($linkname) { global $wpdb; return $wpdb->get_var( $wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_name = %s", $linkname) ); } } /* Identify UTF-8 text Taken from http://www.php.net/manual/fr/function.mb-detect-encoding.php#50087 */ // // utf8 encoding validation developed based on Wikipedia entry at: // http://en.wikipedia.org/wiki/UTF-8 // // Implemented as a recursive descent parser based on a simple state machine // copyright 2005 Maarten Meijer // // This cries out for a C-implementation to be included in PHP core // function valid_1byte($char) { if(!is_int($char)) return false; return ($char & 0x80) == 0x00; } function valid_2byte($char) { if(!is_int($char)) return false; return ($char & 0xE0) == 0xC0; } function valid_3byte($char) { if(!is_int($char)) return false; return ($char & 0xF0) == 0xE0; } function valid_4byte($char) { if(!is_int($char)) return false; return ($char & 0xF8) == 0xF0; } function valid_nextbyte($char) { if(!is_int($char)) return false; return ($char & 0xC0) == 0x80; } function valid_utf8($string) { $len = strlen($string); $i = 0; while( $i < $len ) { $char = ord(substr($string, $i++, 1)); if(valid_1byte($char)) { // continue continue; } else if(valid_2byte($char)) { // check 1 byte if(!valid_nextbyte(ord(substr($string, $i++, 1)))) return false; } else if(valid_3byte($char)) { // check 2 bytes if(!valid_nextbyte(ord(substr($string, $i++, 1)))) return false; if(!valid_nextbyte(ord(substr($string, $i++, 1)))) return false; } else if(valid_4byte($char)) { // check 3 bytes if(!valid_nextbyte(ord(substr($string, $i++, 1)))) return false; if(!valid_nextbyte(ord(substr($string, $i++, 1)))) return false; if(!valid_nextbyte(ord(substr($string, $i++, 1)))) return false; } // goto next char } return true; // done } function csc ($s) { if (valid_utf8 ($s)) { return $s; } else { return iconv(get_option ("dccharset"),"UTF-8",$s); } } function textconv ($s) { return csc (preg_replace ('|(?)\s*\n|', ' ', $s)); } /** The Main Importer Class **/ class Dotclear_Import { function header() { echo '
'; echo '

'.__('Import DotClear').'

'; echo '

'.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'

'; } function footer() { echo '
'; } function greet() { echo '

'.__('Howdy! This importer allows you to extract posts from a DotClear database into your blog. Mileage may vary.').'

'; echo '

'.__('Your DotClear Configuration settings are as follows:').'

'; echo '
'; wp_nonce_field('import-dotclear'); $this->db_form(); echo '

'; echo '
'; } function get_dc_cats() { global $wpdb; // General Housekeeping $dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost')); set_magic_quotes_runtime(0); $dbprefix = get_option('dcdbprefix'); // Get Categories return $dcdb->get_results('SELECT * FROM '.$dbprefix.'categorie', ARRAY_A); } function get_dc_users() { global $wpdb; // General Housekeeping $dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost')); set_magic_quotes_runtime(0); $dbprefix = get_option('dcdbprefix'); // Get Users return $dcdb->get_results('SELECT * FROM '.$dbprefix.'user', ARRAY_A); } function get_dc_posts() { // General Housekeeping $dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost')); set_magic_quotes_runtime(0); $dbprefix = get_option('dcdbprefix'); // Get Posts return $dcdb->get_results('SELECT '.$dbprefix.'post.*, '.$dbprefix.'categorie.cat_libelle_url AS post_cat_name FROM '.$dbprefix.'post INNER JOIN '.$dbprefix.'categorie ON '.$dbprefix.'post.cat_id = '.$dbprefix.'categorie.cat_id', ARRAY_A); } function get_dc_comments() { global $wpdb; // General Housekeeping $dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost')); set_magic_quotes_runtime(0); $dbprefix = get_option('dcdbprefix'); // Get Comments return $dcdb->get_results('SELECT * FROM '.$dbprefix.'comment', ARRAY_A); } function get_dc_links() { //General Housekeeping $dcdb = new wpdb(get_option('dcuser'), get_option('dcpass'), get_option('dcname'), get_option('dchost')); set_magic_quotes_runtime(0); $dbprefix = get_option('dcdbprefix'); return $dcdb->get_results('SELECT * FROM '.$dbprefix.'link ORDER BY position', ARRAY_A); } function cat2wp($categories='') { // General Housekeeping global $wpdb; $count = 0; $dccat2wpcat = array(); // Do the Magic if(is_array($categories)) { echo '

'.__('Importing Categories...').'

'; foreach ($categories as $category) { $count++; extract($category); // Make Nice Variables $name = $wpdb->escape($cat_libelle_url); $title = $wpdb->escape(csc ($cat_libelle)); $desc = $wpdb->escape(csc ($cat_desc)); if($cinfo = category_exists($name)) { $ret_id = wp_insert_category(array('cat_ID' => $cinfo, 'category_nicename' => $name, 'cat_name' => $title, 'category_description' => $desc)); } else { $ret_id = wp_insert_category(array('category_nicename' => $name, 'cat_name' => $title, 'category_description' => $desc)); } $dccat2wpcat[$id] = $ret_id; } // Store category translation for future use add_option('dccat2wpcat',$dccat2wpcat); echo '

'.sprintf(__ngettext('Done! %1$s category imported.', 'Done! %1$s categories imported.', $count), $count).'

'; return true; } echo __('No Categories to Import!'); return false; } function users2wp($users='') { // General Housekeeping global $wpdb; $count = 0; $dcid2wpid = array(); // Midnight Mojo if(is_array($users)) { echo '

'.__('Importing Users...').'

'; foreach($users as $user) { $count++; extract($user); // Make Nice Variables $name = $wpdb->escape(csc ($name)); $RealName = $wpdb->escape(csc ($user_pseudo)); if($uinfo = get_userdatabylogin($name)) { $ret_id = wp_insert_user(array( 'ID' => $uinfo->ID, 'user_login' => $user_id, 'user_nicename' => $Realname, 'user_email' => $user_email, 'user_url' => 'http://', 'display_name' => $Realname) ); } else { $ret_id = wp_insert_user(array( 'user_login' => $user_id, 'user_nicename' => csc ($user_pseudo), 'user_email' => $user_email, 'user_url' => 'http://', 'display_name' => $Realname) ); } $dcid2wpid[$user_id] = $ret_id; // Set DotClear-to-WordPress permissions translation // Update Usermeta Data $user = new WP_User($ret_id); $wp_perms = $user_level + 1; if(10 == $wp_perms) { $user->set_role('administrator'); } else if(9 == $wp_perms) { $user->set_role('editor'); } else if(5 <= $wp_perms) { $user->set_role('editor'); } else if(4 <= $wp_perms) { $user->set_role('author'); } else if(3 <= $wp_perms) { $user->set_role('contributor'); } else if(2 <= $wp_perms) { $user->set_role('contributor'); } else { $user->set_role('subscriber'); } update_usermeta( $ret_id, 'wp_user_level', $wp_perms); update_usermeta( $ret_id, 'rich_editing', 'false'); update_usermeta( $ret_id, 'first_name', csc ($user_prenom)); update_usermeta( $ret_id, 'last_name', csc ($user_nom)); }// End foreach($users as $user) // Store id translation array for future use add_option('dcid2wpid',$dcid2wpid); echo '

'.sprintf(__('Done! %1$s users imported.'), $count).'

'; return true; }// End if(is_array($users) echo __('No Users to Import!'); return false; }// End function user2wp() function posts2wp($posts='') { // General Housekeeping global $wpdb; $count = 0; $dcposts2wpposts = array(); $cats = array(); // Do the Magic if(is_array($posts)) { echo '

'.__('Importing Posts...').'

'; foreach($posts as $post) { $count++; extract($post); // Set DotClear-to-WordPress status translation $stattrans = array(0 => 'draft', 1 => 'publish'); $comment_status_map = array (0 => 'closed', 1 => 'open'); //Can we do this more efficiently? $uinfo = ( get_userdatabylogin( $user_id ) ) ? get_userdatabylogin( $user_id ) : 1; $authorid = ( is_object( $uinfo ) ) ? $uinfo->ID : $uinfo ; $Title = $wpdb->escape(csc ($post_titre)); $post_content = textconv ($post_content); $post_excerpt = ""; if ($post_chapo != "") { $post_excerpt = textconv ($post_chapo); $post_content = $post_excerpt ."\n\n".$post_content; } $post_excerpt = $wpdb->escape ($post_excerpt); $post_content = $wpdb->escape ($post_content); $post_status = $stattrans[$post_pub]; // Import Post data into WordPress if($pinfo = post_exists($Title,$post_content)) { $ret_id = wp_insert_post(array( 'ID' => $pinfo, 'post_author' => $authorid, 'post_date' => $post_dt, 'post_date_gmt' => $post_dt, 'post_modified' => $post_upddt, 'post_modified_gmt' => $post_upddt, 'post_title' => $Title, 'post_content' => $post_content, 'post_excerpt' => $post_excerpt, 'post_status' => $post_status, 'post_name' => $post_titre_url, 'comment_status' => $comment_status_map[$post_open_comment], 'ping_status' => $comment_status_map[$post_open_tb], 'comment_count' => $post_nb_comment + $post_nb_trackback) ); if ( is_wp_error( $ret_id ) ) return $ret_id; } else { $ret_id = wp_insert_post(array( 'post_author' => $authorid, 'post_date' => $post_dt, 'post_date_gmt' => $post_dt, 'post_modified' => $post_modified_gmt, 'post_modified_gmt' => $post_modified_gmt, 'post_title' => $Title, 'post_content' => $post_content, 'post_excerpt' => $post_excerpt, 'post_status' => $post_status, 'post_name' => $post_titre_url, 'comment_status' => $comment_status_map[$post_open_comment], 'ping_status' => $comment_status_map[$post_open_tb], 'comment_count' => $post_nb_comment + $post_nb_trackback) ); if ( is_wp_error( $ret_id ) ) return $ret_id; } $dcposts2wpposts[$post_id] = $ret_id; // Make Post-to-Category associations $cats = array(); $category1 = get_category_by_slug($post_cat_name); $category1 = $category1->term_id; if($cat1 = $category1) { $cats[1] = $cat1; } if(!empty($cats)) { wp_set_post_categories($ret_id, $cats); } } } // Store ID translation for later use add_option('dcposts2wpposts',$dcposts2wpposts); echo '

'.sprintf(__('Done! %1$s posts imported.'), $count).'

'; return true; } function comments2wp($comments='') { // General Housekeeping global $wpdb; $count = 0; $dccm2wpcm = array(); $postarr = get_option('dcposts2wpposts'); // Magic Mojo if(is_array($comments)) { echo '

'.__('Importing Comments...').'

'; foreach($comments as $comment) { $count++; extract($comment); // WordPressify Data $comment_ID = (int) ltrim($comment_id, '0'); $comment_post_ID = (int) $postarr[$post_id]; $comment_approved = "$comment_pub"; $name = $wpdb->escape(csc ($comment_auteur)); $email = $wpdb->escape($comment_email); $web = "http://".$wpdb->escape($comment_site); $message = $wpdb->escape(textconv ($comment_content)); if($cinfo = comment_exists($name, $comment_dt)) { // Update comments $ret_id = wp_update_comment(array( 'comment_ID' => $cinfo, 'comment_post_ID' => $comment_post_ID, 'comment_author' => $name, 'comment_author_email' => $email, 'comment_author_url' => $web, 'comment_author_IP' => $comment_ip, 'comment_date' => $comment_dt, 'comment_date_gmt' => $comment_dt, 'comment_content' => $message, 'comment_approved' => $comment_approved) ); } else { // Insert comments $ret_id = wp_insert_comment(array( 'comment_post_ID' => $comment_post_ID, 'comment_author' => $name, 'comment_author_email' => $email, 'comment_author_url' => $web, 'comment_author_IP' => $comment_ip, 'comment_date' => $comment_dt, 'comment_date_gmt' => $comment_dt, 'comment_content' => $message, 'comment_approved' => $comment_approved) ); } $dccm2wpcm[$comment_ID] = $ret_id; } // Store Comment ID translation for future use add_option('dccm2wpcm', $dccm2wpcm); // Associate newly formed categories with posts get_comment_count($ret_id); echo '

'.sprintf(__('Done! %1$s comments imported.'), $count).'

'; return true; } echo __('No Comments to Import!'); return false; } function links2wp($links='') { // General Housekeeping global $wpdb; $count = 0; // Deal with the links if(is_array($links)) { echo '

'.__('Importing Links...').'

'; foreach($links as $link) { $count++; extract($link); if ($title != "") { if ($cinfo = is_term(csc ($title), 'link_category')) { $category = $cinfo['term_id']; } else { $category = wp_insert_term($wpdb->escape (csc ($title)), 'link_category'); $category = $category['term_id']; } } else { $linkname = $wpdb->escape(csc ($label)); $description = $wpdb->escape(csc ($title)); if($linfo = link_exists($linkname)) { $ret_id = wp_insert_link(array( 'link_id' => $linfo, 'link_url' => $href, 'link_name' => $linkname, 'link_category' => $category, 'link_description' => $description) ); } else { $ret_id = wp_insert_link(array( 'link_url' => $url, 'link_name' => $linkname, 'link_category' => $category, 'link_description' => $description) ); } $dclinks2wplinks[$link_id] = $ret_id; } } add_option('dclinks2wplinks',$dclinks2wplinks); echo '

'; printf(__ngettext('Done! %s link or link category imported.', 'Done! %s links or link categories imported.', $count), $count); echo '

'; return true; } echo __('No Links to Import!'); return false; } function import_categories() { // Category Import $cats = $this->get_dc_cats(); $this->cat2wp($cats); add_option('dc_cats', $cats); echo '
'; wp_nonce_field('import-dotclear'); printf('', attribute_escape(__('Import Users'))); echo '
'; } function import_users() { // User Import $users = $this->get_dc_users(); $this->users2wp($users); echo '
'; wp_nonce_field('import-dotclear'); printf('', attribute_escape(__('Import Posts'))); echo '
'; } function import_posts() { // Post Import $posts = $this->get_dc_posts(); $result = $this->posts2wp($posts); if ( is_wp_error( $result ) ) return $result; echo '
'; wp_nonce_field('import-dotclear'); printf('', attribute_escape(__('Import Comments'))); echo '
'; } function import_comments() { // Comment Import $comments = $this->get_dc_comments(); $this->comments2wp($comments); echo '
'; wp_nonce_field('import-dotclear'); printf('', attribute_escape(__('Import Links'))); echo '
'; } function import_links() { //Link Import $links = $this->get_dc_links(); $this->links2wp($links); add_option('dc_links', $links); echo '
'; wp_nonce_field('import-dotclear'); printf('', attribute_escape(__('Finish'))); echo '
'; } function cleanup_dcimport() { delete_option('dcdbprefix'); delete_option('dc_cats'); delete_option('dcid2wpid'); delete_option('dccat2wpcat'); delete_option('dcposts2wpposts'); delete_option('dccm2wpcm'); delete_option('dclinks2wplinks'); delete_option('dcuser'); delete_option('dcpass'); delete_option('dcname'); delete_option('dchost'); delete_option('dccharset'); do_action('import_done', 'dotclear'); $this->tips(); } function tips() { echo '

'.__('Welcome to WordPress. We hope (and expect!) that you will find this platform incredibly rewarding! As a new WordPress user coming from DotClear, there are some things that we would like to point out. Hopefully, they will help your transition go as smoothly as possible.').'

'; echo '

'.__('Users').'

'; echo '

'.sprintf(__('You have already setup WordPress and have been assigned an administrative login and password. Forget it. You didn\'t have that login in DotClear, why should you have it here? Instead we have taken care to import all of your users into our system. Unfortunately there is one downside. Because both WordPress and DotClear uses a strong encryption hash with passwords, it is impossible to decrypt it and we are forced to assign temporary passwords to all your users. Every user has the same username, but their passwords are reset to password123. So Login and change it.'), '/wp-login.php').'

'; echo '

'.__('Preserving Authors').'

'; echo '

'.__('Secondly, we have attempted to preserve post authors. If you are the only author or contributor to your blog, then you are safe. In most cases, we are successful in this preservation endeavor. However, if we cannot ascertain the name of the writer due to discrepancies between database tables, we assign it to you, the administrative user.').'

'; echo '

'.__('Textile').'

'; echo '

'.__('Also, since you\'re coming from DotClear, you probably have been using Textile to format your comments and posts. If this is the case, we recommend downloading and installing Textile for WordPress. Trust me... You\'ll want it.').'

'; echo '

'.__('WordPress Resources').'

'; echo '

'.__('Finally, there are numerous WordPress resources around the internet. Some of them are:').'

'; echo ''; echo '

'.sprintf(__('That\'s it! What are you waiting for? Go login!'), '../wp-login.php').'

'; } function db_form() { echo ''; printf('', __('DotClear Database User:')); printf('', __('DotClear Database Password:')); printf('', __('DotClear Database Name:')); printf('', __('DotClear Database Host:')); printf('', __('DotClear Table prefix:')); printf('', __('Originating character set:')); echo '
'; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; $this->header(); if ( $step > 0 ) { check_admin_referer('import-dotclear'); if($_POST['dbuser']) { if(get_option('dcuser')) delete_option('dcuser'); add_option('dcuser', sanitize_user($_POST['dbuser'], true)); } if($_POST['dbpass']) { if(get_option('dcpass')) delete_option('dcpass'); add_option('dcpass', sanitize_user($_POST['dbpass'], true)); } if($_POST['dbname']) { if(get_option('dcname')) delete_option('dcname'); add_option('dcname', sanitize_user($_POST['dbname'], true)); } if($_POST['dbhost']) { if(get_option('dchost')) delete_option('dchost'); add_option('dchost', sanitize_user($_POST['dbhost'], true)); } if($_POST['dccharset']) { if(get_option('dccharset')) delete_option('dccharset'); add_option('dccharset', sanitize_user($_POST['dccharset'], true)); } if($_POST['dbprefix']) { if(get_option('dcdbprefix')) delete_option('dcdbprefix'); add_option('dcdbprefix', sanitize_user($_POST['dbprefix'], true)); } } switch ($step) { default: case 0 : $this->greet(); break; case 1 : $this->import_categories(); break; case 2 : $this->import_users(); break; case 3 : $result = $this->import_posts(); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; case 4 : $this->import_comments(); break; case 5 : $this->import_links(); break; case 6 : $this->cleanup_dcimport(); break; } $this->footer(); } function Dotclear_Import() { // Nothing. } } $dc_import = new Dotclear_Import(); register_importer('dotclear', __('DotClear'), __('Import categories, users, posts, comments, and links from a DotClear blog.'), array ($dc_import, 'dispatch')); ?> wp/dev/wp-admin/import/blogger.php0000644000106600010660000011014311001503477014360 0ustar

$title

$welcome

$prereqs

$stepone

\n"; } function uh_oh($title, $message, $info) { echo "

$title

$message

$info
"; } function auth() { // We have a single-use token that must be upgraded to a session token. $token = preg_replace( '/[^-_0-9a-zA-Z]/', '', $_GET['token'] ); $headers = array( "GET /accounts/AuthSubSessionToken HTTP/1.0", "Authorization: AuthSub token=\"$token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_auth_sock( ); if ( ! $sock ) return false; $response = $this->_txrx( $sock, $request ); preg_match( '/token=([-_0-9a-z]+)/i', $response, $matches ); if ( empty( $matches[1] ) ) { $this->uh_oh( __( 'Authorization failed' ), __( 'Something went wrong. If the problem persists, send this info to support:' ), htmlspecialchars($response) ); return false; } $this->token = $matches[1]; wp_redirect( remove_query_arg( array( 'token', 'noheader' ) ) ); } function get_token_info() { $headers = array( "GET /accounts/AuthSubTokenInfo HTTP/1.0", "Authorization: AuthSub token=\"$this->token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_auth_sock( ); if ( ! $sock ) return; $response = $this->_txrx( $sock, $request ); return $this->parse_response($response); } function token_is_valid() { $info = $this->get_token_info(); if ( $info['code'] == 200 ) return true; return false; } function show_blogs($iter = 0) { if ( empty($this->blogs) ) { $headers = array( "GET /feeds/default/blogs HTTP/1.0", "Host: www.blogger.com", "Authorization: AuthSub token=\"$this->token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_blogger_sock( ); if ( ! $sock ) return; $response = $this->_txrx( $sock, $request ); // Quick and dirty XML mining. list( $headers, $xml ) = explode( "\r\n\r\n", $response ); $p = xml_parser_create(); xml_parse_into_struct($p, $xml, $vals, $index); xml_parser_free($p); $this->title = $vals[$index['TITLE'][0]]['value']; // Give it a few retries... this step often flakes out the first time. if ( empty( $index['ENTRY'] ) ) { if ( $iter < 3 ) { return $this->show_blogs($iter + 1); } else { $this->uh_oh( __('Trouble signing in'), __('We were not able to gain access to your account. Try starting over.'), '' ); return false; } } foreach ( $index['ENTRY'] as $i ) { $blog = array(); while ( ( $tag = $vals[$i] ) && ! ( $tag['tag'] == 'ENTRY' && $tag['type'] == 'close' ) ) { if ( $tag['tag'] == 'TITLE' ) { $blog['title'] = $tag['value']; } elseif ( $tag['tag'] == 'SUMMARY' ) { $blog['summary'] == $tag['value']; } elseif ( $tag['tag'] == 'LINK' ) { if ( $tag['attributes']['REL'] == 'alternate' && $tag['attributes']['TYPE'] == 'text/html' ) { $parts = parse_url( $tag['attributes']['HREF'] ); $blog['host'] = $parts['host']; } elseif ( $tag['attributes']['REL'] == 'edit' ) $blog['gateway'] = $tag['attributes']['HREF']; } ++$i; } if ( ! empty ( $blog ) ) { $blog['total_posts'] = $this->get_total_results('posts', $blog['host']); $blog['total_comments'] = $this->get_total_results('comments', $blog['host']); $blog['mode'] = 'init'; $this->blogs[] = $blog; } } if ( empty( $this->blogs ) ) { $this->uh_oh( __('No blogs found'), __('We were able to log in but there were no blogs. Try a different account next time.'), '' ); return false; } } //echo '
'.print_r($this,1).'
'; $start = js_escape( __('Import') ); $continue = js_escape( __('Continue') ); $stop = js_escape( __('Importing...') ); $authors = js_escape( __('Set Authors') ); $loadauth = js_escape( __('Preparing author mapping form...') ); $authhead = js_escape( __('Final Step: Author Mapping') ); $nothing = js_escape( __('Nothing was imported. Had you already imported this blog?') ); $title = __('Blogger Blogs'); $name = __('Blog Name'); $url = __('Blog URL'); $action = __('The Magic Button'); $posts = __('Posts'); $comments = __('Comments'); $noscript = __('This feature requires Javascript but it seems to be disabled. Please enable Javascript and then reload this page. Don\'t worry, you can turn it back off when you\'re done.'); $interval = STATUS_INTERVAL * 1000; foreach ( $this->blogs as $i => $blog ) { if ( $blog['mode'] == 'init' ) $value = $start; elseif ( $blog['mode'] == 'posts' || $blog['mode'] == 'comments' ) $value = $continue; else $value = $authors; $blogtitle = js_escape( $blog['title'] ); $pdone = isset($blog['posts_done']) ? (int) $blog['posts_done'] : 0; $cdone = isset($blog['comments_done']) ? (int) $blog['comments_done'] : 0; $init .= "blogs[$i]=new blog($i,'$blogtitle','{$blog['mode']}'," . $this->get_js_status($i) . ');'; $pstat = "
 
$pdone/{$blog['total_posts']}
"; $cstat = "
 
$cdone/{$blog['total_comments']}
"; $rows .= "$blogtitle{$blog['host']}$pstat$cstat\n"; } echo "

$title

\n$rows
$name$url$posts$comments$action
"; echo " \n"; } // Handy function for stopping the script after a number of seconds. function have_time() { global $importer_started; if ( time() - $importer_started > MAX_EXECUTION_TIME ) die('continue'); return true; } function get_total_results($type, $host) { $headers = array( "GET /feeds/$type/default?max-results=1&start-index=2 HTTP/1.0", "Host: $host", "Authorization: AuthSub token=\"$this->token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_blogger_sock( $host ); if ( ! $sock ) return; $response = $this->_txrx( $sock, $request ); $response = $this->parse_response( $response ); $parser = xml_parser_create(); xml_parse_into_struct($parser, $response['body'], $struct, $index); xml_parser_free($parser); $total_results = $struct[$index['OPENSEARCH:TOTALRESULTS'][0]]['value']; return (int) $total_results; } function import_blog($blogID) { global $importing_blog; $importing_blog = $blogID; if ( isset($_GET['authors']) ) return print($this->get_author_form()); header('Content-Type: text/plain'); if ( isset($_GET['status']) ) die($this->get_js_status()); if ( isset($_GET['saveauthors']) ) die($this->save_authors()); $blog = $this->blogs[$blogID]; $total_results = $this->get_total_results('posts', $blog['host']); $this->blogs[$importing_blog]['total_posts'] = $total_results; $start_index = $total_results - MAX_RESULTS + 1; if ( isset( $this->blogs[$importing_blog]['posts_start_index'] ) ) $start_index = (int) $this->blogs[$importing_blog]['posts_start_index']; elseif ( $total_results > MAX_RESULTS ) $start_index = $total_results - MAX_RESULTS + 1; else $start_index = 1; // This will be positive until we have finished importing posts if ( $start_index > 0 ) { // Grab all the posts $this->blogs[$importing_blog]['mode'] = 'posts'; $query = "start-index=$start_index&max-results=" . MAX_RESULTS; do { $index = $struct = $entries = array(); $headers = array( "GET /feeds/posts/default?$query HTTP/1.0", "Host: {$blog['host']}", "Authorization: AuthSub token=\"$this->token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_blogger_sock( $blog['host'] ); if ( ! $sock ) return; // TODO: Error handling $response = $this->_txrx( $sock, $request ); $response = $this->parse_response( $response ); // Extract the entries and send for insertion preg_match_all( '/]*>.*?<\/entry>/s', $response['body'], $matches ); if ( count( $matches[0] ) ) { $entries = array_reverse($matches[0]); foreach ( $entries as $entry ) { $entry = "$entry"; $AtomParser = new AtomParser(); $AtomParser->parse( $entry ); $result = $this->import_post($AtomParser->entry); if ( is_wp_error( $result ) ) return $result; unset($AtomParser); } } else break; // Get the 'previous' query string which we'll use on the next iteration $query = ''; $links = preg_match_all('/]*)>/', $response['body'], $matches); if ( count( $matches[1] ) ) foreach ( $matches[1] as $match ) if ( preg_match('/rel=.previous./', $match) ) $query = html_entity_decode( preg_replace('/^.*href=[\'"].*\?(.+)[\'"].*$/', '$1', $match) ); if ( $query ) { parse_str($query, $q); $this->blogs[$importing_blog]['posts_start_index'] = (int) $q['start-index']; } else $this->blogs[$importing_blog]['posts_start_index'] = 0; $this->save_vars(); } while ( !empty( $query ) && $this->have_time() ); } $total_results = $this->get_total_results( 'comments', $blog['host'] ); $this->blogs[$importing_blog]['total_comments'] = $total_results; if ( isset( $this->blogs[$importing_blog]['comments_start_index'] ) ) $start_index = (int) $this->blogs[$importing_blog]['comments_start_index']; elseif ( $total_results > MAX_RESULTS ) $start_index = $total_results - MAX_RESULTS + 1; else $start_index = 1; if ( $start_index > 0 ) { // Grab all the comments $this->blogs[$importing_blog]['mode'] = 'comments'; $query = "start-index=$start_index&max-results=" . MAX_RESULTS; do { $index = $struct = $entries = array(); $headers = array( "GET /feeds/comments/default?$query HTTP/1.0", "Host: {$blog['host']}", "Authorization: AuthSub token=\"$this->token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_blogger_sock( $blog['host'] ); if ( ! $sock ) return; // TODO: Error handling $response = $this->_txrx( $sock, $request ); $response = $this->parse_response( $response ); // Extract the comments and send for insertion preg_match_all( '/]*>.*?<\/entry>/s', $response['body'], $matches ); if ( count( $matches[0] ) ) { $entries = array_reverse( $matches[0] ); foreach ( $entries as $entry ) { $entry = "$entry"; $AtomParser = new AtomParser(); $AtomParser->parse( $entry ); $this->import_comment($AtomParser->entry); unset($AtomParser); } } // Get the 'previous' query string which we'll use on the next iteration $query = ''; $links = preg_match_all('/]*)>/', $response['body'], $matches); if ( count( $matches[1] ) ) foreach ( $matches[1] as $match ) if ( preg_match('/rel=.previous./', $match) ) $query = html_entity_decode( preg_replace('/^.*href=[\'"].*\?(.+)[\'"].*$/', '$1', $match) ); parse_str($query, $q); $this->blogs[$importing_blog]['comments_start_index'] = (int) $q['start-index']; $this->save_vars(); } while ( !empty( $query ) && $this->have_time() ); } $this->blogs[$importing_blog]['mode'] = 'authors'; $this->save_vars(); if ( !$this->blogs[$importing_blog]['posts_done'] && !$this->blogs[$importing_blog]['comments_done'] ) die('nothing'); do_action('import_done', 'blogger'); die('done'); } function convert_date( $date ) { preg_match('#([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:\.[0-9]+)?(Z|[\+|\-][0-9]{2,4}){0,1}#', $date, $date_bits); $offset = iso8601_timezone_to_offset( $date_bits[7] ); $timestamp = gmmktime($date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1]); $timestamp -= $offset; // Convert from Blogger local time to GMT $timestamp += get_option('gmt_offset') * 3600; // Convert from GMT to WP local time return gmdate('Y-m-d H:i:s', $timestamp); } function no_apos( $string ) { return str_replace( ''', "'", $string); } function min_whitespace( $string ) { return preg_replace( '|\s+|', ' ', $string ); } function import_post( $entry ) { global $wpdb, $importing_blog; // The old permalink is all Blogger gives us to link comments to their posts. if ( isset( $entry->draft ) ) $rel = 'self'; else $rel = 'alternate'; foreach ( $entry->links as $link ) { if ( $link['rel'] == $rel ) { $parts = parse_url( $link['href'] ); $entry->old_permalink = $parts['path']; break; } } $post_date = $this->convert_date( $entry->published ); $post_content = trim( addslashes( $this->no_apos( html_entity_decode( $entry->content ) ) ) ); $post_title = trim( addslashes( $this->no_apos( $this->min_whitespace( $entry->title ) ) ) ); $post_status = isset( $entry->draft ) ? 'draft' : 'publish'; // Clean up content $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content); $post_content = str_replace('
', '
', $post_content); $post_content = str_replace('
', '
', $post_content); // Checks for duplicates if ( isset( $this->blogs[$importing_blog]['posts'][$entry->old_permalink] ) ) { ++$this->blogs[$importing_blog]['posts_skipped']; } elseif ( $post_id = post_exists( $post_title, $post_content, $post_date ) ) { $this->blogs[$importing_blog]['posts'][$entry->old_permalink] = $post_id; ++$this->blogs[$importing_blog]['posts_skipped']; } else { $post = compact('post_date', 'post_content', 'post_title', 'post_status'); $post_id = wp_insert_post($post); if ( is_wp_error( $post_id ) ) return $post_id; wp_create_categories( array_map( 'addslashes', $entry->categories ), $post_id ); $author = $this->no_apos( strip_tags( $entry->author ) ); add_post_meta( $post_id, 'blogger_blog', $this->blogs[$importing_blog]['host'], true ); add_post_meta( $post_id, 'blogger_author', $author, true ); add_post_meta( $post_id, 'blogger_permalink', $entry->old_permalink, true ); $this->blogs[$importing_blog]['posts'][$entry->old_permalink] = $post_id; ++$this->blogs[$importing_blog]['posts_done']; } $this->save_vars(); return; } function import_comment( $entry ) { global $importing_blog; // Drop the #fragment and we have the comment's old post permalink. foreach ( $entry->links as $link ) { if ( $link['rel'] == 'alternate' ) { $parts = parse_url( $link['href'] ); $entry->old_permalink = $parts['fragment']; $entry->old_post_permalink = $parts['path']; break; } } $comment_post_ID = (int) $this->blogs[$importing_blog]['posts'][$entry->old_post_permalink]; preg_match('#(.+?).*(?:\(.+?))?#', $entry->author, $matches); $comment_author = addslashes( $this->no_apos( strip_tags( (string) $matches[1] ) ) ); $comment_author_url = addslashes( $this->no_apos( strip_tags( (string) $matches[2] ) ) ); $comment_date = $this->convert_date( $entry->updated ); $comment_content = addslashes( $this->no_apos( html_entity_decode( $entry->content ) ) ); // Clean up content $comment_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $comment_content); $comment_content = str_replace('
', '
', $comment_content); $comment_content = str_replace('
', '
', $comment_content); // Checks for duplicates if ( isset( $this->blogs[$importing_blog]['comments'][$entry->old_permalink] ) || comment_exists( $comment_author, $comment_date ) ) { ++$this->blogs[$importing_blog]['comments_skipped']; } else { $comment = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_date', 'comment_content'); $comment_id = wp_insert_comment($comment); $this->blogs[$importing_blog]['comments'][$entry->old_permalink] = $comment_id; ++$this->blogs[$importing_blog]['comments_done']; } $this->save_vars(); } function get_js_status($blog = false) { global $importing_blog; if ( $blog === false ) $blog = $this->blogs[$importing_blog]; else $blog = $this->blogs[$blog]; $p1 = isset( $blog['posts_done'] ) ? (int) $blog['posts_done'] : 0; $p2 = isset( $blog['total_posts'] ) ? (int) $blog['total_posts'] : 0; $c1 = isset( $blog['comments_done'] ) ? (int) $blog['comments_done'] : 0; $c2 = isset( $blog['total_comments'] ) ? (int) $blog['total_comments'] : 0; return "{p1:$p1,p2:$p2,c1:$c1,c2:$c2}"; } function get_author_form($blog = false) { global $importing_blog, $wpdb, $current_user; if ( $blog === false ) $blog = & $this->blogs[$importing_blog]; else $blog = & $this->blogs[$blog]; if ( !isset( $blog['authors'] ) ) { $post_ids = array_values($blog['posts']); $authors = (array) $wpdb->get_col("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = 'blogger_author' AND post_id IN (" . join( ',', $post_ids ) . ")"); $blog['authors'] = array_map(null, $authors, array_fill(0, count($authors), $current_user->ID)); $this->save_vars(); } $directions = __('All posts were imported with the current user as author. Use this form to move each Blogger user\'s posts to a different WordPress user. You may add users and then return to this page and complete the user mapping. This form may be used as many times as you like until you activate the "Restart" function below.'); $heading = __('Author mapping'); $blogtitle = "{$blog['title']} ({$blog['host']})"; $mapthis = __('Blogger username'); $tothis = __('WordPress login'); $submit = js_escape( __('Save Changes') ); foreach ( $blog['authors'] as $i => $author ) $rows .= ""; return "

$heading

$blogtitle

$directions

$rows
$mapthis$tothis
"; } function get_user_options($current) { global $wpdb, $importer_users; if ( ! isset( $importer_users ) ) $importer_users = (array) get_users_of_blog(); foreach ( $importer_users as $user ) { $sel = ( $user->user_id == $current ) ? " selected='selected'" : ''; $options .= ""; } return $options; } function save_authors() { global $importing_blog, $wpdb; $authors = (array) $_POST['authors']; $host = $this->blogs[$importing_blog]['host']; // Get an array of posts => authors $post_ids = (array) $wpdb->get_col( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'blogger_blog' AND meta_value = %s", $host) ); $post_ids = join( ',', $post_ids ); $results = (array) $wpdb->get_results("SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = 'blogger_author' AND post_id IN ($post_ids)"); foreach ( $results as $row ) $authors_posts[$row->post_id] = $row->meta_value; foreach ( $authors as $author => $user_id ) { $user_id = (int) $user_id; // Skip authors that haven't been changed if ( $user_id == $this->blogs[$importing_blog]['authors'][$author][1] ) continue; // Get a list of the selected author's posts $post_ids = (array) array_keys( $authors_posts, $this->blogs[$importing_blog]['authors'][$author][0] ); $post_ids = join( ',', $post_ids); $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_author = %d WHERE id IN ($post_ids)", $user_id) ); $this->blogs[$importing_blog]['authors'][$author][1] = $user_id; } $this->save_vars(); wp_redirect('edit.php'); } function _get_auth_sock() { // Connect to https://www.google.com if ( !$sock = @ fsockopen('ssl://www.google.com', 443, $errno, $errstr) ) { $this->uh_oh( __('Could not connect to https://www.google.com'), __('There was a problem opening a secure connection to Google. This is what went wrong:'), "$errstr ($errno)" ); return false; } return $sock; } function _get_blogger_sock($host = 'www2.blogger.com') { if ( !$sock = @ fsockopen($host, 80, $errno, $errstr) ) { $this->uh_oh( sprintf( __('Could not connect to %s'), $host ), __('There was a problem opening a connection to Blogger. This is what went wrong:'), "$errstr ($errno)" ); return false; } return $sock; } function _txrx( $sock, $request ) { fwrite( $sock, $request ); while ( ! feof( $sock ) ) $response .= @ fread ( $sock, 8192 ); fclose( $sock ); return $response; } function revoke($token) { $headers = array( "GET /accounts/AuthSubRevokeToken HTTP/1.0", "Authorization: AuthSub token=\"$token\"" ); $request = join( "\r\n", $headers ) . "\r\n\r\n"; $sock = $this->_get_auth_sock( ); if ( ! $sock ) return false; $this->_txrx( $sock, $request ); } function restart() { global $wpdb; $options = get_option( 'blogger_importer' ); if ( isset( $options['token'] ) ) $this->revoke( $options['token'] ); delete_option('blogger_importer'); $wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_key = 'blogger_author'"); wp_redirect('?import=blogger'); } // Returns associative array of code, header, cookies, body. Based on code from php.net. function parse_response($this_response) { // Split response into header and body sections list($response_headers, $response_body) = explode("\r\n\r\n", $this_response, 2); $response_header_lines = explode("\r\n", $response_headers); // First line of headers is the HTTP response code $http_response_line = array_shift($response_header_lines); if(preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@',$http_response_line, $matches)) { $response_code = $matches[1]; } // put the rest of the headers in an array $response_header_array = array(); foreach($response_header_lines as $header_line) { list($header,$value) = explode(': ', $header_line, 2); $response_header_array[$header] .= $value."\n"; } $cookie_array = array(); $cookies = explode("\n", $response_header_array["Set-Cookie"]); foreach($cookies as $this_cookie) { array_push($cookie_array, "Cookie: ".$this_cookie); } return array("code" => $response_code, "header" => $response_header_array, "cookies" => $cookie_array, "body" => $response_body); } // Step 9: Congratulate the user function congrats() { $blog = (int) $_GET['blog']; echo '

'.__('Congratulations!').'

'.__('Now that you have imported your Blogger blog into WordPress, what are you going to do? Here are some suggestions:').'

  • '.__('That was hard work! Take a break.').'
  • '; if ( count($this->import['blogs']) > 1 ) echo '
  • '.__('In case you haven\'t done it already, you can import the posts from your other blogs:'). $this->show_blogs() . '
  • '; if ( $n = count($this->import['blogs'][$blog]['newusers']) ) echo '
  • '.sprintf(__('Go to Authors & Users, where you can modify the new user(s) or delete them. If you want to make all of the imported posts yours, you will be given that option when you delete the new authors.'), 'users.php', '_parent').'
  • '; echo '
  • '.__('For security, click the link below to reset this importer.').'
  • '; echo '
'; } // Figures out what to do, then does it. function start() { if ( isset($_POST['restart']) ) $this->restart(); $options = get_option('blogger_importer'); if ( is_array($options) ) foreach ( $options as $key => $value ) $this->$key = $value; if ( isset( $_REQUEST['blog'] ) ) { $blog = is_array($_REQUEST['blog']) ? array_shift( $keys = array_keys( $_REQUEST['blog'] ) ) : $_REQUEST['blog']; $blog = (int) $blog; $result = $this->import_blog( $blog ); if ( is_wp_error( $result ) ) echo $result->get_error_message(); } elseif ( isset($_GET['token']) ) $this->auth(); elseif ( $this->token && $this->token_is_valid() ) $this->show_blogs(); else $this->greet(); $saved = $this->save_vars(); if ( $saved && !isset($_GET['noheader']) ) { $restart = __('Restart'); $message = __('We have saved some information about your Blogger account in your WordPress database. Clearing this information will allow you to start over. Restarting will not affect any posts you have already imported. If you attempt to re-import a blog, duplicate posts and comments will be skipped.'); $submit = __('Clear account information'); echo "

$restart

$message

"; } } function save_vars() { $vars = get_object_vars($this); update_option( 'blogger_importer', $vars ); return !empty($vars); } function admin_head() { ?> entry = new AtomEntry(); $this->map_attrs_func = create_function('$k,$v', 'return "$k=\"$v\"";'); $this->map_xmlns_func = create_function('$p,$n', '$xd = "xmlns"; if(strlen($n[0])>0) $xd .= ":{$n[0]}"; return "{$xd}=\"{$n[1]}\"";'); } function parse($xml) { global $app_logging; array_unshift($this->ns_contexts, array()); $parser = xml_parser_create_ns(); xml_set_object($parser, $this); xml_set_element_handler($parser, "start_element", "end_element"); xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0); xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0); xml_set_character_data_handler($parser, "cdata"); xml_set_default_handler($parser, "_default"); xml_set_start_namespace_decl_handler($parser, "start_ns"); xml_set_end_namespace_decl_handler($parser, "end_ns"); $contents = ""; xml_parse($parser, $xml); xml_parser_free($parser); return true; } function start_element($parser, $name, $attrs) { $tag = array_pop(split(":", $name)); array_unshift($this->ns_contexts, $this->ns_decls); $this->depth++; if(!empty($this->in_content)) { $attrs_prefix = array(); // resolve prefixes for attributes foreach($attrs as $key => $value) { $attrs_prefix[$this->ns_to_prefix($key)] = $this->xml_escape($value); } $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix))); if(strlen($attrs_str) > 0) { $attrs_str = " " . $attrs_str; } $xmlns_str = join(' ', array_map($this->map_xmlns_func, array_keys($this->ns_contexts[0]), array_values($this->ns_contexts[0]))); if(strlen($xmlns_str) > 0) { $xmlns_str = " " . $xmlns_str; } // handle self-closing tags (case: a new child found right-away, no text node) if(count($this->in_content) == 2) { array_push($this->in_content, ">"); } array_push($this->in_content, "<". $this->ns_to_prefix($name) ."{$xmlns_str}{$attrs_str}"); } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) { $this->in_content = array(); $this->is_xhtml = $attrs['type'] == 'xhtml'; array_push($this->in_content, array($tag,$this->depth)); } else if($tag == 'link') { array_push($this->entry->links, $attrs); } else if($tag == 'category') { array_push($this->entry->categories, $attrs['term']); } $this->ns_decls = array(); } function end_element($parser, $name) { $tag = array_pop(split(":", $name)); if(!empty($this->in_content)) { if($this->in_content[0][0] == $tag && $this->in_content[0][1] == $this->depth) { array_shift($this->in_content); if($this->is_xhtml) { $this->in_content = array_slice($this->in_content, 2, count($this->in_content)-3); } $this->entry->$tag = join('',$this->in_content); $this->in_content = array(); } else { $endtag = $this->ns_to_prefix($name); if (strpos($this->in_content[count($this->in_content)-1], '<' . $endtag) !== false) { array_push($this->in_content, "/>"); } else { array_push($this->in_content, ""); } } } array_shift($this->ns_contexts); #print str_repeat(" ", $this->depth * $this->indent) . "end_element('$name')" ."\n"; $this->depth--; } function start_ns($parser, $prefix, $uri) { #print str_repeat(" ", $this->depth * $this->indent) . "starting: " . $prefix . ":" . $uri . "\n"; array_push($this->ns_decls, array($prefix,$uri)); } function end_ns($parser, $prefix) { #print str_repeat(" ", $this->depth * $this->indent) . "ending: #" . $prefix . "#\n"; } function cdata($parser, $data) { #print str_repeat(" ", $this->depth * $this->indent) . "data: #" . $data . "#\n"; if(!empty($this->in_content)) { // handle self-closing tags (case: text node found, need to close element started) if (strpos($this->in_content[count($this->in_content)-1], '<') !== false) { array_push($this->in_content, ">"); } array_push($this->in_content, $this->xml_escape($data)); } } function _default($parser, $data) { # when does this gets called? } function ns_to_prefix($qname) { $components = split(":", $qname); $name = array_pop($components); if(!empty($components)) { $ns = join(":",$components); foreach($this->ns_contexts as $context) { foreach($context as $mapping) { if($mapping[1] == $ns && strlen($mapping[0]) > 0) { return "$mapping[0]:$name"; } } } } return $name; } function xml_escape($string) { return str_replace(array('&','"',"'",'<','>'), array('&','"',''','<','>'), $string ); } } ?> wp/dev/wp-admin/import/wordpress.php0000644000106600010660000005676111014647435015015 0ustar '; echo '

'.__('Import WordPress').'

'; } function footer() { echo ''; } function unhtmlentities($string) { // From php.net for < 4.3 compat $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); return strtr($string, $trans_tbl); } function greet() { echo '
'; echo '

'.__('Howdy! Upload your WordPress eXtended RSS (WXR) file and we’ll import the posts, comments, custom fields, and categories into this blog.').'

'; echo '

'.__('Choose a WordPress WXR file to upload, then click Upload file and import.').'

'; wp_import_upload_form("admin.php?import=wordpress&step=1"); echo '
'; } function get_tag( $string, $tag ) { global $wpdb; preg_match("|<$tag.*?>(.*?)|is", $string, $return); $return = preg_replace('|^$|s', '$1', $return[1]); $return = $wpdb->escape( trim( $return ) ); return $return; } function has_gzip() { return is_callable('gzopen'); } function fopen($filename, $mode='r') { if ( $this->has_gzip() ) return gzopen($filename, $mode); return fopen($filename, $mode); } function feof($fp) { if ( $this->has_gzip() ) return gzeof($fp); return feof($fp); } function fgets($fp, $len=8192) { if ( $this->has_gzip() ) return gzgets($fp, $len); return fgets($fp, $len); } function fclose($fp) { if ( $this->has_gzip() ) return gzclose($fp); return fclose($fp); } function get_entries($process_post_func=NULL) { set_magic_quotes_runtime(0); $doing_entry = false; $is_wxr_file = false; $fp = $this->fopen($this->file, 'r'); if ($fp) { while ( !$this->feof($fp) ) { $importline = rtrim($this->fgets($fp)); // this doesn't check that the file is perfectly valid but will at least confirm that it's not the wrong format altogether if ( !$is_wxr_file && preg_match('|xmlns:wp="http://wordpress[.]org/export/\d+[.]\d+/"|', $importline) ) $is_wxr_file = true; if ( false !== strpos($importline, '') ) { preg_match('|(.*?)|is', $importline, $category); $this->categories[] = $category[1]; continue; } if ( false !== strpos($importline, '') ) { preg_match('|(.*?)|is', $importline, $tag); $this->tags[] = $tag[1]; continue; } if ( false !== strpos($importline, '') ) { $this->post = ''; $doing_entry = true; continue; } if ( false !== strpos($importline, '') ) { $doing_entry = false; if ($process_post_func) call_user_func($process_post_func, $this->post); continue; } if ( $doing_entry ) { $this->post .= $importline . "\n"; } } $this->fclose($fp); } return $is_wxr_file; } function get_wp_authors() { // We need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting. $temp = $this->allauthornames; $authors[0] = array_shift($temp); $y = count($temp) + 1; for ($x = 1; $x < $y; $x ++) { $next = array_shift($temp); if (!(in_array($next, $authors))) array_push($authors, "$next"); } return $authors; } function get_authors_from_post() { global $current_user; // this will populate $this->author_ids with a list of author_names => user_ids foreach ( $_POST['author_in'] as $i => $in_author_name ) { if ( !empty($_POST['user_select'][$i]) ) { // an existing user was selected in the dropdown list $user = get_userdata( intval($_POST['user_select'][$i]) ); if ( isset($user->ID) ) $this->author_ids[$in_author_name] = $user->ID; } elseif ( $this->allow_create_users() ) { // nothing was selected in the dropdown list, so we'll use the name in the text field $new_author_name = trim($_POST['user_create'][$i]); // if the user didn't enter a name, assume they want to use the same name as in the import file if ( empty($new_author_name) ) $new_author_name = $in_author_name; $user_id = username_exists($new_author_name); if ( !$user_id ) { $user_id = wp_create_user($new_author_name, wp_generate_password()); } $this->author_ids[$in_author_name] = $user_id; } // failsafe: if the user_id was invalid, default to the current user if ( empty($this->author_ids[$in_author_name]) ) { $this->author_ids[$in_author_name] = intval($current_user->ID); } } } function wp_authors_form() { ?>

admins entries.'); ?>

allow_create_users() ) { echo '

'.__('If a new user is created by WordPress, a password will be randomly generated. Manually change the user\'s details if necessary.')."

\n"; } $authors = $this->get_wp_authors(); echo '
    '; echo '
    '; wp_nonce_field('import-wordpress'); $j = -1; foreach ($authors as $author) { ++ $j; echo '
  1. '.__('Import author:').' '.$author.'
    '; $this->users_form($j, $author); echo '
  2. '; } if ( $this->allow_fetch_attachments() ) { ?>

'.'
'; echo ''; } function users_form($n, $author) { if ( $this->allow_create_users() ) { printf('
'); } else { echo __('Map to existing').'
'; } // keep track of $n => $author name echo ''; $users = get_users_of_blog(); ?> get_entries(array(&$this, 'process_author')); if ( $is_wxr_file ) { $this->wp_authors_form(); } else { echo '

'.__('Invalid file').'

'; echo '

'.__('Please upload a valid WXR (WordPress eXtended RSS) export file.').'

'; } } // fetch the user ID for a given author name, respecting the mapping preferences function checkauthor($author) { global $current_user; if ( !empty($this->author_ids[$author]) ) return $this->author_ids[$author]; // failsafe: map to the current user return $current_user->ID; } function process_categories() { global $wpdb; $cat_names = (array) get_terms('category', 'fields=names'); while ( $c = array_shift($this->categories) ) { $cat_name = trim($this->get_tag( $c, 'wp:cat_name' )); // If the category exists we leave it alone if ( in_array($cat_name, $cat_names) ) continue; $category_nicename = $this->get_tag( $c, 'wp:category_nicename' ); $posts_private = (int) $this->get_tag( $c, 'wp:posts_private' ); $links_private = (int) $this->get_tag( $c, 'wp:links_private' ); $parent = $this->get_tag( $c, 'wp:category_parent' ); if ( empty($parent) ) $category_parent = '0'; else $category_parent = category_exists($parent); $catarr = compact('category_nicename', 'category_parent', 'posts_private', 'links_private', 'posts_private', 'cat_name'); $cat_ID = wp_insert_category($catarr); } } function process_tags() { global $wpdb; $tag_names = (array) get_terms('post_tag', 'fields=names'); while ( $c = array_shift($this->tags) ) { $tag_name = trim($this->get_tag( $c, 'wp:tag_name' )); // If the category exists we leave it alone if ( in_array($tag_name, $tag_names) ) continue; $slug = $this->get_tag( $c, 'wp:tag_slug' ); $description = $this->get_tag( $c, 'wp:tag_description' ); $tagarr = compact('slug', 'description'); $tag_ID = wp_insert_term($tag_name, 'post_tag', $tagarr); } } function process_author($post) { $author = $this->get_tag( $post, 'dc:creator' ); if ($author) $this->allauthornames[] = $author; } function process_posts() { $i = -1; echo '
    '; $this->get_entries(array(&$this, 'process_post')); echo '
'; wp_import_cleanup($this->id); do_action('import_done', 'wordpress'); echo '

'.sprintf(__('All done.').' '.__('Have fun!').'', get_option('home')).'

'; } function process_post($post) { global $wpdb; $post_ID = (int) $this->get_tag( $post, 'wp:post_id' ); if ( $post_ID && !empty($this->post_ids_processed[$post_ID]) ) // Processed already return 0; set_time_limit( 60 ); // There are only ever one of these $post_title = $this->get_tag( $post, 'title' ); $post_date = $this->get_tag( $post, 'wp:post_date' ); $post_date_gmt = $this->get_tag( $post, 'wp:post_date_gmt' ); $comment_status = $this->get_tag( $post, 'wp:comment_status' ); $ping_status = $this->get_tag( $post, 'wp:ping_status' ); $post_status = $this->get_tag( $post, 'wp:status' ); $post_name = $this->get_tag( $post, 'wp:post_name' ); $post_parent = $this->get_tag( $post, 'wp:post_parent' ); $menu_order = $this->get_tag( $post, 'wp:menu_order' ); $post_type = $this->get_tag( $post, 'wp:post_type' ); $post_password = $this->get_tag( $post, 'wp:post_password' ); $guid = $this->get_tag( $post, 'guid' ); $post_author = $this->get_tag( $post, 'dc:creator' ); $post_excerpt = $this->get_tag( $post, 'excerpt:encoded' ); $post_excerpt = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_excerpt); $post_excerpt = str_replace('
', '
', $post_excerpt); $post_excerpt = str_replace('
', '
', $post_excerpt); $post_content = $this->get_tag( $post, 'content:encoded' ); $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content); $post_content = str_replace('
', '
', $post_content); $post_content = str_replace('
', '
', $post_content); preg_match_all('|(.*?)|is', $post, $tags); $tags = $tags[1]; $tag_index = 0; foreach ($tags as $tag) { $tags[$tag_index] = $wpdb->escape($this->unhtmlentities(str_replace(array (''), '', $tag))); $tag_index++; } preg_match_all('|(.*?)|is', $post, $categories); $categories = $categories[1]; $cat_index = 0; foreach ($categories as $category) { $categories[$cat_index] = $wpdb->escape($this->unhtmlentities(str_replace(array (''), '', $category))); $cat_index++; } $post_exists = post_exists($post_title, '', $post_date); if ( $post_exists ) { echo '
  • '; printf(__('Post %s already exists.'), stripslashes($post_title)); } else { // If it has parent, process parent first. $post_parent = (int) $post_parent; if ($post_parent) { // if we already know the parent, map it to the local ID if ( $parent = $this->post_ids_processed[$post_parent] ) { $post_parent = $parent; // new ID of the parent } else { // record the parent for later $this->orphans[intval($post_ID)] = $post_parent; } } echo '
  • '; $post_author = $this->checkauthor($post_author); //just so that if a post already exists, new users are not created by checkauthor $postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_excerpt', 'post_title', 'post_status', 'post_name', 'comment_status', 'ping_status', 'guid', 'post_parent', 'menu_order', 'post_type', 'post_password'); if ($post_type == 'attachment') { $remote_url = $this->get_tag( $post, 'wp:attachment_url' ); if ( !$remote_url ) $remote_url = $guid; $comment_post_ID = $post_id = $this->process_attachment($postdata, $remote_url); if ( !$post_id or is_wp_error($post_id) ) return $post_id; } else { printf(__('Importing post %s...'), stripslashes($post_title)); $comment_post_ID = $post_id = wp_insert_post($postdata); } if ( is_wp_error( $post_id ) ) return $post_id; // Memorize old and new ID. if ( $post_id && $post_ID ) { $this->post_ids_processed[intval($post_ID)] = intval($post_id); } // Add categories. if (count($categories) > 0) { $post_cats = array(); foreach ($categories as $category) { $slug = sanitize_term_field('slug', $category, 0, 'category', 'db'); $cat = get_term_by('slug', $slug, 'category'); $cat_ID = 0; if ( ! empty($cat) ) $cat_ID = $cat->term_id; if ($cat_ID == 0) { $category = $wpdb->escape($category); $cat_ID = wp_insert_category(array('cat_name' => $category)); } $post_cats[] = $cat_ID; } wp_set_post_categories($post_id, $post_cats); } // Add tags. if (count($tags) > 0) { $post_tags = array(); foreach ($tags as $tag) { $slug = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db'); $tag_obj = get_term_by('slug', $slug, 'post_tag'); $tag_id = 0; if ( ! empty($tag_obj) ) $tag_id = $tag_obj->term_id; if ( $tag_id == 0 ) { $tag = $wpdb->escape($tag); $tag_id = wp_insert_term($tag, 'post_tag'); $tag_id = $tag_id['term_id']; } $post_tags[] = intval($tag_id); } wp_set_post_tags($post_id, $post_tags); } } // Now for comments preg_match_all('|(.*?)|is', $post, $comments); $comments = $comments[1]; $num_comments = 0; if ( $comments) { foreach ($comments as $comment) { $comment_author = $this->get_tag( $comment, 'wp:comment_author'); $comment_author_email = $this->get_tag( $comment, 'wp:comment_author_email'); $comment_author_IP = $this->get_tag( $comment, 'wp:comment_author_IP'); $comment_author_url = $this->get_tag( $comment, 'wp:comment_author_url'); $comment_date = $this->get_tag( $comment, 'wp:comment_date'); $comment_date_gmt = $this->get_tag( $comment, 'wp:comment_date_gmt'); $comment_content = $this->get_tag( $comment, 'wp:comment_content'); $comment_approved = $this->get_tag( $comment, 'wp:comment_approved'); $comment_type = $this->get_tag( $comment, 'wp:comment_type'); $comment_parent = $this->get_tag( $comment, 'wp:comment_parent'); // if this is a new post we can skip the comment_exists() check if ( !$post_exists || !comment_exists($comment_author, $comment_date) ) { $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_approved', 'comment_type', 'comment_parent'); wp_insert_comment($commentdata); $num_comments++; } } } if ( $num_comments ) printf(' '.__ngettext('(%s comment)', '(%s comments)', $num_comments), $num_comments); // Now for post meta preg_match_all('|(.*?)|is', $post, $postmeta); $postmeta = $postmeta[1]; if ( $postmeta) { foreach ($postmeta as $p) { $key = $this->get_tag( $p, 'wp:meta_key' ); $value = $this->get_tag( $p, 'wp:meta_value' ); $value = stripslashes($value); // add_post_meta() will escape. $this->process_post_meta($post_id, $key, $value); } } do_action('import_post_added', $post_id); print "
  • \n"; } function process_post_meta($post_id, $key, $value) { // the filter can return false to skip a particular metadata key $_key = apply_filters('import_post_meta_key', $key); if ( $_key ) { add_post_meta( $post_id, $_key, $value ); do_action('import_post_meta', $post_id, $_key, $value); } } function process_attachment($postdata, $remote_url) { if ($this->fetch_attachments and $remote_url) { printf( __('Importing attachment %s... '), htmlspecialchars($remote_url) ); $upload = $this->fetch_remote_file($postdata, $remote_url); if ( is_wp_error($upload) ) { printf( __('Remote file error: %s'), htmlspecialchars($upload->get_error_message()) ); return $upload; } else { print '('.size_format(filesize($upload['file'])).')'; } if ( $info = wp_check_filetype($upload['file']) ) { $postdata['post_mime_type'] = $info['type']; } else { print __('Invalid file type'); return; } $postdata['guid'] = $upload['url']; // as per wp-admin/includes/upload.php $post_id = wp_insert_attachment($postdata, $upload['file']); wp_update_attachment_metadata( $post_id, wp_generate_attachment_metadata( $post_id, $upload['file'] ) ); // remap the thumbnail url. this isn't perfect because we're just guessing the original url. if ( preg_match('@^image/@', $info['type']) && $thumb_url = wp_get_attachment_thumb_url($post_id) ) { $parts = pathinfo($remote_url); $ext = $parts['extension']; $name = basename($parts['basename'], ".{$ext}"); $this->url_remap[$parts['dirname'] . '/' . $name . '.thumbnail.' . $ext] = $thumb_url; } return $post_id; } else { printf( __('Skipping attachment %s'), htmlspecialchars($remote_url) ); } } function fetch_remote_file($post, $url) { $upload = wp_upload_dir($post['post_date']); // extract the file name and extension from the url $file_name = basename($url); // get placeholder file in the upload dir with a unique sanitized filename $upload = wp_upload_bits( $file_name, 0, '', $post['post_date']); if ( $upload['error'] ) { echo $upload['error']; return new WP_Error( 'upload_dir_error', $upload['error'] ); } // fetch the remote url and write it to the placeholder file $headers = wp_get_http($url, $upload['file']); // make sure the fetch was successful if ( $headers['response'] != '200' ) { @unlink($upload['file']); return new WP_Error( 'import_file_error', sprintf(__('Remote file returned error response %d'), intval($headers['response'])) ); } elseif ( isset($headers['content-length']) && filesize($upload['file']) != $headers['content-length'] ) { @unlink($upload['file']); return new WP_Error( 'import_file_error', __('Remote file is incorrect size') ); } $max_size = $this->max_attachment_size(); if ( !empty($max_size) and filesize($upload['file']) > $max_size ) { @unlink($upload['file']); return new WP_Error( 'import_file_error', sprintf(__('Remote file is too large, limit is %s', size_format($max_size))) ); } // keep track of the old and new urls so we can substitute them later $this->url_remap[$url] = $upload['url']; // if the remote url is redirected somewhere else, keep track of the destination too if ( $headers['x-final-location'] != $url ) $this->url_remap[$headers['x-final-location']] = $upload['url']; return $upload; } // sort by strlen, longest string first function cmpr_strlen($a, $b) { return strlen($b) - strlen($a); } // update url references in post bodies to point to the new local files function backfill_attachment_urls() { // make sure we do the longest urls first, in case one is a substring of another uksort($this->url_remap, array(&$this, 'cmpr_strlen')); global $wpdb; foreach ($this->url_remap as $from_url => $to_url) { // remap urls in post_content $wpdb->query( $wpdb->prepare("UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, '%s', '%s')", $from_url, $to_url) ); // remap enclosure urls $result = $wpdb->query( $wpdb->prepare("UPDATE {$wpdb->postmeta} SET meta_value = REPLACE(meta_value, '%s', '%s') WHERE meta_key='enclosure'", $from_url, $to_url) ); } } // update the post_parent of orphans now that we know the local id's of all parents function backfill_parents() { global $wpdb; foreach ($this->orphans as $child_id => $parent_id) { $local_child_id = $this->post_ids_processed[$child_id]; $local_parent_id = $this->post_ids_processed[$parent_id]; if ($local_child_id and $local_parent_id) { $wpdb->query( $wpdb->prepare("UPDATE {$wpdb->posts} SET post_parent = %d WHERE ID = %d", $local_parent_id, $local_child_id)); } } } function is_valid_meta_key($key) { // skip _wp_attached_file metadata since we'll regenerate it from scratch if ( $key == '_wp_attached_file' ) return false; return $key; } // give the user the option of creating new users to represent authors in the import file? function allow_create_users() { return apply_filters('import_allow_create_users', true); } // give the user the option of downloading and importing attached files function allow_fetch_attachments() { return apply_filters('import_allow_fetch_attachments', true); } function max_attachment_size() { // can be overridden with a filter - 0 means no limit return apply_filters('import_attachment_size_limit', 0); } function import_start() { wp_defer_term_counting(true); wp_defer_comment_counting(true); do_action('import_start'); } function import_end() { do_action('import_end'); // clear the caches after backfilling foreach ($this->post_ids_processed as $post_id) clean_post_cache($post_id); wp_defer_term_counting(false); wp_defer_comment_counting(false); } function import($id, $fetch_attachments = false) { $this->id = (int) $id; $this->fetch_attachments = ($this->allow_fetch_attachments() && (bool) $fetch_attachments); add_filter('import_post_meta_key', array($this, 'is_valid_meta_key')); $file = get_attached_file($this->id); $this->import_file($file); } function import_file($file) { $this->file = $file; $this->import_start(); $this->get_authors_from_post(); $this->get_entries(); $this->process_categories(); $this->process_tags(); $result = $this->process_posts(); $this->backfill_parents(); $this->backfill_attachment_urls(); $this->import_end(); if ( is_wp_error( $result ) ) return $result; } function handle_upload() { $file = wp_import_handle_upload(); if ( isset($file['error']) ) { echo '

    '.__('Sorry, there has been an error.').'

    '; echo '

    ' . $file['error'] . '

    '; return false; } $this->file = $file['file']; $this->id = (int) $file['id']; return true; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; $this->header(); switch ($step) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-upload'); if ( $this->handle_upload() ) $this->select_authors(); break; case 2: check_admin_referer('import-wordpress'); $result = $this->import( $_GET['id'], $_POST['attachments'] ); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; } $this->footer(); } function WP_Import() { // Nothing. } } $wp_import = new WP_Import(); register_importer('wordpress', 'WordPress', __('Import posts, comments, custom fields, pages, and categories from a WordPress export file.'), array ($wp_import, 'dispatch')); ?> wp/dev/wp-admin/import/greymatter.php0000644000106600010660000002522111007310722015117 0ustar '; echo '

    '.__('Import GreyMatter').'

    '; } function footer() { echo ''; } function greet() { $this->header(); ?>

    • If authors are found not to be in gm-authors.cgi, imports them at level 0.') ?>

     


    so you need to enter the number of the last GM post here.
    (if you don't know that number, just log into your FTP and look it out
    in the entries' folder)") ?>

    footer(); } function gm2autobr($string) { // transforms GM's |*| into b2's
    \n $string = str_replace("|*|","
    \n",$string); return($string); } function import() { global $wpdb; $wpvarstoreset = array('gmpath', 'archivespath', 'lastentry'); for ($i=0; $iheader(); ?>

      • escape($userdata[0]); $pass1=$wpdb->escape($userdata[1]); $user_nickname=$wpdb->escape($userdata[0]); $user_email=$wpdb->escape($userdata[2]); $user_url=$wpdb->escape($userdata[3]); $user_joindate=$wpdb->escape($user_joindate); $user_id = username_exists($user_login); if ($user_id) { printf('
      • '.__('user %s').''.__('Already exists').'
      • ', "$user_login"); $this->gmnames[$userdata[0]] = $user_id; continue; } $user_info = array("user_login"=>"$user_login", "user_pass"=>"$pass1", "user_nickname"=>"$user_nickname", "user_email"=>"$user_email", "user_url"=>"$user_url", "user_ip"=>"$user_ip", "user_domain"=>"$user_domain", "user_browser"=>"$user_browser", "dateYMDhour"=>"$user_joindate", "user_level"=>"1", "user_idmode"=>"nickname"); $user_id = wp_insert_user($user_info); $this->gmnames[$userdata[0]] = $user_id; printf('
      • '.__('user %s...').' '.__('Done').'
      • ', "$user_login"); } ?>

      • gm2autobr($entry[2]); $postmorecontent=$this->gm2autobr($entry[3]); $post_author=trim($wpdb->escape($postinfo[1])); $post_title=$this->gm2autobr($postinfo[2]); printf('
      • '.__('entry # %s : %s : by %s'), $entryfile, $post_title, $postinfo[1]); $post_title=$wpdb->escape($post_title); $postyear=$postinfo[6]; $postmonth=zeroise($postinfo[4],2); $postday=zeroise($postinfo[5],2); $posthour=zeroise($postinfo[7],2); $postminute=zeroise($postinfo[8],2); $postsecond=zeroise($postinfo[9],2); if (($postinfo[10]=="PM") && ($posthour!="12")) $posthour=$posthour+12; $post_date="$postyear-$postmonth-$postday $posthour:$postminute:$postsecond"; $post_content=$postmaincontent; if (strlen($postmorecontent)>3) $post_content .= "

        ".$postmorecontent; $post_content=$wpdb->escape($post_content); $post_karma=$postinfo[12]; $post_status = 'publish'; //in greymatter, there are no drafts $comment_status = 'open'; $ping_status = 'closed'; if ($post_ID = post_exists($post_title, '', $post_date)) { echo ' '; _e('(already exists)'); } else { //just so that if a post already exists, new users are not created by checkauthor // we'll check the author is registered, or if it's a deleted author $user_id = username_exists($post_author); if (!$user_id) { // if deleted from GM, we register the author as a level 0 user $user_ip="127.0.0.1"; $user_domain="localhost"; $user_browser="server"; $user_joindate="1979-06-06 00:41:00"; $user_login=$wpdb->escape($post_author); $pass1=$wpdb->escape("password"); $user_nickname=$wpdb->escape($post_author); $user_email=$wpdb->escape("user@deleted.com"); $user_url=$wpdb->escape(""); $user_joindate=$wpdb->escape($user_joindate); $user_info = array("user_login"=>$user_login, "user_pass"=>$pass1, "user_nickname"=>$user_nickname, "user_email"=>$user_email, "user_url"=>$user_url, "user_ip"=>$user_ip, "user_domain"=>$user_domain, "user_browser"=>$user_browser, "dateYMDhour"=>$user_joindate, "user_level"=>0, "user_idmode"=>"nickname"); $user_id = wp_insert_user($user_info); $this->gmnames[$postinfo[1]] = $user_id; echo ': '; printf(__('registered deleted user %s at level 0 '), "$user_login"); } if (array_key_exists($postinfo[1], $this->gmnames)) { $post_author = $this->gmnames[$postinfo[1]]; } else { $post_author = $user_id; } $postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_modified', 'post_modified_gmt'); $post_ID = wp_insert_post($postdata); if ( is_wp_error( $post_ID ) ) return $post_ID; } $c=count($entry); if ($c>4) { $numAddedComments = 0; $numComments = 0; for ($j=4;$j<$c;$j++) { $entry[$j]=$this->gm2autobr($entry[$j]); $commentinfo=explode("|",$entry[$j]); $comment_post_ID=$post_ID; $comment_author=$wpdb->escape($commentinfo[0]); $comment_author_email=$wpdb->escape($commentinfo[2]); $comment_author_url=$wpdb->escape($commentinfo[3]); $comment_author_IP=$wpdb->escape($commentinfo[1]); $commentyear=$commentinfo[7]; $commentmonth=zeroise($commentinfo[5],2); $commentday=zeroise($commentinfo[6],2); $commenthour=zeroise($commentinfo[8],2); $commentminute=zeroise($commentinfo[9],2); $commentsecond=zeroise($commentinfo[10],2); if (($commentinfo[11]=="PM") && ($commenthour!="12")) $commenthour=$commenthour+12; $comment_date="$commentyear-$commentmonth-$commentday $commenthour:$commentminute:$commentsecond"; $comment_content=$wpdb->escape($commentinfo[12]); if (!comment_exists($comment_author, $comment_date)) { $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_author_IP', 'comment_date', 'comment_content', 'comment_approved'); $commentdata = wp_filter_comment($commentdata); wp_insert_comment($commentdata); $numAddedComments++; } $numComments++; } if ($numAddedComments > 0) { echo ': '; printf( __ngettext('imported %s comment', 'imported %s comments', $numAddedComments) , $numAddedComments); } $preExisting = $numComments - numAddedComments; if ($preExisting > 0) { echo ' '; printf( __ngettext( 'ignored %s pre-existing comment', 'ignored %s pre-existing comments', $preExisting ) , $preExisting); } } echo '... '.__('Done').'
      • '; } } do_action('import_done', 'greymatter'); ?>

     

    footer(); return; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; switch ($step) { case 0 : $this->greet(); break; case 1: check_admin_referer('import-greymatter'); $result = $this->import(); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; } } function GM_Import() { // Nothing. } } $gm_import = new GM_Import(); register_importer('greymatter', __('GreyMatter'), __('Import users, posts, and comments from a Greymatter blog.'), array ($gm_import, 'dispatch')); ?> wp/dev/wp-admin/import/utw.php0000644000106600010660000001504210761355210013562 0ustar '; echo '

    '.__('Import Ultimate Tag Warrior').'

    '; echo '

    '.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'

    '; } function footer() { echo ''; } function greet() { echo '
    '; echo '

    '.__('Howdy! This imports tags from Ultimate Tag Warrior 3 into WordPress tags.').'

    '; echo '

    '.__('This has not been tested on any other versions of Ultimate Tag Warrior. Mileage may vary.').'

    '; echo '

    '.__('To accommodate larger databases for those tag-crazy authors out there, we have made this into an easy 5-step program to help you kick that nasty UTW habit. Just keep clicking along and we will let you know when you are in the clear!').'

    '; echo '

    '.__('Don’t be stupid - backup your database before proceeding!').'

    '; echo '
    '; echo '

    '; echo '
    '; echo '
    '; } function dispatch () { if ( empty( $_GET['step'] ) ) { $step = 0; } else { $step = (int) $_GET['step']; } if ( $step > 1 ) check_admin_referer('import-utw'); // load the header $this->header(); switch ( $step ) { case 0 : $this->greet(); break; case 1 : $this->import_tags(); break; case 2 : $this->import_posts(); break; case 3: $this->import_t2p(); break; case 4: $this->cleanup_import(); break; } // load the footer $this->footer(); } function import_tags ( ) { echo '
    '; echo '

    '.__('Reading UTW Tags…').'

    '; $tags = $this->get_utw_tags(); // if we didn't get any tags back, that's all there is folks! if ( !is_array($tags) ) { echo '

    ' . __('No Tags Found!') . '

    '; return false; } else { // if there's an existing entry, delete it if ( get_option('utwimp_tags') ) { delete_option('utwimp_tags'); } add_option('utwimp_tags', $tags); $count = count($tags); echo '

    ' . sprintf( __ngettext('Done! %s tag were read.', 'Done! %s tags were read.', $count), $count ) . '

    '; echo '

    ' . __('The following tags were found:') . '

    '; echo '
      '; foreach ( $tags as $tag_id => $tag_name ) { echo '
    • ' . $tag_name . '
    • '; } echo '
    '; echo '
    '; echo '

    ' . __('If you don’t want to import any of these tags, you should delete them from the UTW tag management page and then re-run this import.') . '

    '; } echo '
    '; wp_nonce_field('import-utw'); echo '

    '; echo '
    '; echo '
    '; } function import_posts ( ) { echo '
    '; echo '

    '.__('Reading UTW Post Tags…').'

    '; // read in all the UTW tag -> post settings $posts = $this->get_utw_posts(); // if we didn't get any tags back, that's all there is folks! if ( !is_array($posts) ) { echo '

    ' . __('No posts were found to have tags!') . '

    '; return false; } else { // if there's an existing entry, delete it if ( get_option('utwimp_posts') ) { delete_option('utwimp_posts'); } add_option('utwimp_posts', $posts); $count = count($posts); echo '

    ' . sprintf( __ngettext('Done! %s tag to post relationships were read.', 'Done! %s tags to post relationships were read.', $count), $count ) . '

    '; } echo '
    '; wp_nonce_field('import-utw'); echo '

    '; echo '
    '; echo '
    '; } function import_t2p ( ) { echo '
    '; echo '

    '.__('Adding Tags to Posts…').'

    '; // run that funky magic! $tags_added = $this->tag2post(); echo '

    ' . sprintf( __ngettext( 'Done! %s tag were added!', 'Done! %s tags were added!', $tags_added ), $tags_added ) . '

    '; echo '
    '; wp_nonce_field('import-utw'); echo '

    '; echo '
    '; echo '
    '; } function get_utw_tags ( ) { global $wpdb; // read in all the tags from the UTW tags table: should be wp_tags $tags_query = "SELECT tag_id, tag FROM " . $wpdb->prefix . "tags"; $tags = $wpdb->get_results($tags_query); // rearrange these tags into something we can actually use foreach ( $tags as $tag ) { $new_tags[$tag->tag_id] = $tag->tag; } return $new_tags; } function get_utw_posts ( ) { global $wpdb; // read in all the posts from the UTW post->tag table: should be wp_post2tag $posts_query = "SELECT tag_id, post_id FROM " . $wpdb->prefix . "post2tag"; $posts = $wpdb->get_results($posts_query); return $posts; } function tag2post ( ) { // get the tags and posts we imported in the last 2 steps $tags = get_option('utwimp_tags'); $posts = get_option('utwimp_posts'); // null out our results $tags_added = 0; // loop through each post and add its tags to the db foreach ( $posts as $this_post ) { $the_post = (int) $this_post->post_id; $the_tag = (int) $this_post->tag_id; // what's the tag name for that id? $the_tag = $tags[$the_tag]; // screw it, just try to add the tag wp_add_post_tags($the_post, $the_tag); $tags_added++; } // that's it, all posts should be linked to their tags properly, pending any errors we just spit out! return $tags_added; } function cleanup_import ( ) { delete_option('utwimp_tags'); delete_option('utwimp_posts'); $this->done(); } function done ( ) { echo '
    '; echo '

    '.__('Import Complete!').'

    '; echo '

    ' . __('OK, so we lied about this being a 5-step program! You’re done!') . '

    '; echo '

    ' . __('Now wasn’t that easy?') . '

    '; echo '
    '; } function UTW_Import ( ) { // Nothing. } } // create the import object $utw_import = new UTW_Import(); // add it to the import page! register_importer('utw', 'Ultimate Tag Warrior', __('Import Ultimate Tag Warrior tags into WordPress tags.'), array($utw_import, 'dispatch')); ?> wp/dev/wp-admin/import/wp-cat2tag.php0000644000106600010660000004110111034525602014705 0ustar '; if ( ! current_user_can('manage_categories') ) { echo '
    '; echo '

    ' . __('Cheatin’ uh?') . '

    '; echo '
    '; } else { ?>

    '; } function populate_cats() { $categories = get_categories('get=all'); foreach ( $categories as $category ) { $this->all_categories[] = $category; if ( is_term( $category->slug, 'post_tag' ) ) $this->hybrids_ids[] = $category->term_id; } } function populate_tags() { $tags = get_terms( array('post_tag'), 'get=all' ); foreach ( $tags as $tag ) { $this->all_tags[] = $tag; if ( is_term( $tag->slug, 'category' ) ) $this->hybrids_ids[] = $tag->term_id; } } function categories_tab() { $this->populate_cats(); $cat_num = count($this->all_categories); echo '
    '; if ( $cat_num > 0 ) { echo '

    ' . sprintf( __ngettext( 'Convert Category to Tag.', 'Convert Categories (%d) to Tags.', $cat_num ), $cat_num ) . '

    '; echo '
    '; echo '

    ' . __('Hey there. Here you can selectively convert existing categories to tags. To get started, check the categories you wish to be converted, then click the Convert button.') . '

    '; echo '

    ' . __('Keep in mind that if you convert a category with child categories, the children become top-level orphans.') . '

    '; $this->categories_form(); } else { echo '

    '.__('You have no categories to convert!').'

    '; } } function categories_form() { ?>

      all_categories as $category) { $category = sanitize_term( $category, 'category', 'display' ); if ( (int) $category->parent == 0 ) { ?>
    • term_id), $this->hybrids_ids ) ) echo ' * '; if ( isset($hier[$category->term_id]) ) $this->_category_children($category, $hier); ?>
    hybrids_ids) ) echo '

    ' . __('* This category is also a tag. Converting it will add that tag to all posts that are currently in the category.') . '

    '; ?>

    populate_tags(); $tags_num = count($this->all_tags); echo '
    '; if ( $tags_num > 0 ) { echo '

    ' . sprintf( __ngettext( 'Convert Tag to Category.', 'Convert Tags (%d) to Categories.', $tags_num ), $tags_num ) . '

    '; echo '
    '; echo '

    ' . __('Here you can selectively converts existing tags to categories. To get started, check the tags you wish to be converted, then click the Convert button.') . '

    '; echo '

    ' . __('The newly created categories will still be associated with the same posts.') . '

    '; $this->tags_form(); } else { echo '

    '.__('You have no tags to convert!').'

    '; } } function tags_form() { ?>

      all_tags as $tag ) { ?>
    • term_id), $this->hybrids_ids ) ) echo ' * '; ?>
    hybrids_ids) ) echo '

    ' . __('* This tag is also a category. When converted, all posts associated with the tag will also be in the category.') . '

    '; ?>

      term_id] as $child_id) { $child =& get_category($child_id); ?>
    • term_id), $this->hybrids_ids ) ) echo ' * '; if ( isset($hier[$child->term_id]) ) $this->_category_children($child, $hier); ?>
    categories_to_convert)) { ?>

    try again.'), 'admin.php?import=wp-cat2tag'); ?>

    categories_to_convert) ) $this->categories_to_convert = $_POST['cats_to_convert']; $hier = _get_term_hierarchy('category'); $hybrid_cats = $clear_parents = $parents = false; $clean_term_cache = $clean_cat_cache = array(); $default_cat = get_option('default_category'); echo '
      '; foreach ( (array) $this->categories_to_convert as $cat_id) { $cat_id = (int) $cat_id; if ( ! $this->_category_exists($cat_id) ) { echo '
    • ' . sprintf( __('Category %s doesn\'t exist!'), $cat_id ) . "
    • \n"; } else { $category =& get_category($cat_id); echo '
    • ' . sprintf(__('Converting category %s ... '), $category->name); // If the category is the default, leave category in place and create tag. if ( $default_cat == $category->term_id ) { if ( ! ($id = is_term( $category->slug, 'post_tag' ) ) ) $id = wp_insert_term($category->name, 'post_tag', array('slug' => $category->slug)); $id = $id['term_taxonomy_id']; $posts = get_objects_in_term($category->term_id, 'category'); $term_order = 0; foreach ( $posts as $post ) { $values[] = $wpdb->prepare( "(%d, %d, %d)", $post, $id, $term_order); clean_post_cache($post); } if ( $values ) { $wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join(',', $values) . " ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)"); $wpdb->query( $wpdb->prepare("UPDATE $wpdb->term_taxonomy SET count = %d WHERE term_id = %d AND taxonomy = 'post_tag'", $category->count, $category->term_id) ); } echo __('Converted successfully.') . "
    • \n"; continue; } // if tag already exists, add it to all posts in the category if ( $tag_ttid = $wpdb->get_var( $wpdb->prepare("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'post_tag'", $category->term_id) ) ) { $objects_ids = get_objects_in_term($category->term_id, 'category'); $tag_ttid = (int) $tag_ttid; $term_order = 0; foreach ( $objects_ids as $object_id ) $values[] = $wpdb->prepare( "(%d, %d, %d)", $object_id, $tag_ttid, $term_order); if ( $values ) { $wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join(',', $values) . " ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)"); $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tag_ttid) ); $wpdb->query( $wpdb->prepare("UPDATE $wpdb->term_taxonomy SET count = %d WHERE term_id = %d AND taxonomy = 'post_tag'", $count, $category->term_id) ); } echo __('Tag added to all posts in this category.') . " *\n"; $hybrid_cats = true; $clean_term_cache[] = $category->term_id; $clean_cat_cache[] = $category->term_id; continue; } $tt_ids = $wpdb->get_col( $wpdb->prepare("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'category'", $category->term_id) ); if ( $tt_ids ) { $posts = $wpdb->get_col("SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN (" . join(',', $tt_ids) . ") GROUP BY object_id"); foreach ( (array) $posts as $post ) clean_post_cache($post); } // Change the category to a tag. $wpdb->query( $wpdb->prepare("UPDATE $wpdb->term_taxonomy SET taxonomy = 'post_tag' WHERE term_id = %d AND taxonomy = 'category'", $category->term_id) ); // Set all parents to 0 (root-level) if their parent was the converted tag $parents = $wpdb->query( $wpdb->prepare("UPDATE $wpdb->term_taxonomy SET parent = 0 WHERE parent = %d AND taxonomy = 'category'", $category->term_id) ); if ( $parents ) $clear_parents = true; $clean_cat_cache[] = $category->term_id; echo __('Converted successfully.') . "\n"; } } echo '
    '; if ( ! empty($clean_term_cache) ) { $clean_term_cache = array_unique(array_values($clean_term_cache)); foreach ( $clean_term_cache as $id ) wp_cache_delete($id, 'post_tag'); } if ( ! empty($clean_cat_cache) ) { $clean_cat_cache = array_unique(array_values($clean_cat_cache)); foreach ( $clean_cat_cache as $id ) wp_cache_delete($id, 'category'); } if ( $clear_parents ) delete_option('category_children'); if ( $hybrid_cats ) echo '

    ' . sprintf( __('* This category is also a tag. The converter has added that tag to all posts currently in the category. If you want to remove it, please confirm that all tags were added successfully, then delete it from the Manage Categories page.'), 'categories.php') . '

    '; echo '

    ' . sprintf( __('We’re all done here, but you can always convert more.'), 'admin.php?import=wp-cat2tag' ) . '

    '; } function convert_tags() { global $wpdb; if ( (!isset($_POST['tags_to_convert']) || !is_array($_POST['tags_to_convert'])) && empty($this->tags_to_convert)) { echo '
    '; echo '

    ' . sprintf(__('Uh, oh. Something didn’t work. Please try again.'), 'admin.php?import=wp-cat2tag&step=3') . '

    '; echo '
    '; return; } if ( empty($this->tags_to_convert) ) $this->tags_to_convert = $_POST['tags_to_convert']; $hybrid_tags = $clear_parents = false; $clean_cat_cache = $clean_term_cache = array(); $default_cat = get_option('default_category'); echo '
      '; foreach ( (array) $this->tags_to_convert as $tag_id) { $tag_id = (int) $tag_id; if ( $tag = get_term( $tag_id, 'post_tag' ) ) { printf('
    • ' . __('Converting tag %s ... '), $tag->name); if ( $cat_ttid = $wpdb->get_var( $wpdb->prepare("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'category'", $tag->term_id) ) ) { $objects_ids = get_objects_in_term($tag->term_id, 'post_tag'); $cat_ttid = (int) $cat_ttid; $term_order = 0; foreach ( $objects_ids as $object_id ) { $values[] = $wpdb->prepare( "(%d, %d, %d)", $object_id, $cat_ttid, $term_order); clean_post_cache($object_id); } if ( $values ) { $wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join(',', $values) . " ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)"); if ( $default_cat != $tag->term_id ) { $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tag->term_id) ); $wpdb->query( $wpdb->prepare("UPDATE $wpdb->term_taxonomy SET count = %d WHERE term_id = %d AND taxonomy = 'category'", $count, $tag->term_id) ); } } $hybrid_tags = true; $clean_term_cache[] = $tag->term_id; $clean_cat_cache[] = $tag->term_id; echo __('All posts were added to the category with the same name.') . " *
    • \n"; continue; } // Change the tag to a category. $parent = $wpdb->get_var( $wpdb->prepare("SELECT parent FROM $wpdb->term_taxonomy WHERE term_id = %d AND taxonomy = 'post_tag'", $tag->term_id) ); if ( 0 == $parent || (0 < (int) $parent && $this->_category_exists($parent)) ) { $reset_parent = ''; $clear_parents = true; } else $reset_parent = ", parent = '0'"; $wpdb->query( $wpdb->prepare("UPDATE $wpdb->term_taxonomy SET taxonomy = 'category' $reset_parent WHERE term_id = %d AND taxonomy = 'post_tag'", $tag->term_id) ); $clean_term_cache[] = $tag->term_id; $clean_cat_cache[] = $cat['term_id']; echo __('Converted successfully.') . "\n"; } else { printf( '
    • ' . __('Tag #%s doesn\'t exist!') . "
    • \n", $tag_id ); } } if ( ! empty($clean_term_cache) ) { $clean_term_cache = array_unique(array_values($clean_term_cache)); foreach ( $clean_term_cache as $id ) wp_cache_delete($id, 'post_tag'); } if ( ! empty($clean_cat_cache) ) { $clean_cat_cache = array_unique(array_values($clean_cat_cache)); foreach ( $clean_cat_cache as $id ) wp_cache_delete($id, 'category'); } if ( $clear_parents ) delete_option('category_children'); echo '
    '; if ( $hybrid_tags ) echo '

    ' . sprintf( __('* This tag is also a category. The converter has added all posts from it to the category. If you want to remove it, please confirm that all posts were added successfully, then delete it from the Manage Tags page.'), 'edit-tags.php') . '

    '; echo '

    ' . sprintf( __('We’re all done here, but you can always convert more.'), 'admin.php?import=wp-cat2tag&step=3' ) . '

    '; } function init() { $step = (isset($_GET['step'])) ? (int) $_GET['step'] : 1; $this->header(); if ( current_user_can('manage_categories') ) { switch ($step) { case 1 : $this->categories_tab(); break; case 2 : check_admin_referer('import-cat2tag'); $this->convert_categories(); break; case 3 : $this->tags_tab(); break; case 4 : check_admin_referer('import-cat2tag'); $this->convert_tags(); break; } } $this->footer(); } function WP_Categories_to_Tags() { // Do nothing. } } $wp_cat2tag_importer = new WP_Categories_to_Tags(); register_importer('wp-cat2tag', __('Categories and Tags Converter'), __('Convert existing categories to tags or tags to categories, selectively.'), array(&$wp_cat2tag_importer, 'init')); ?> wp/dev/wp-admin/import/blogware.php0000644000106600010660000001417010762036130014544 0ustar '; echo '

    '.__('Import Blogware').'

    '; } function footer() { echo ''; } function unhtmlentities($string) { // From php.net for < 4.3 compat $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); return strtr($string, $trans_tbl); } function greet() { echo '
    '; echo '

    '.__('Howdy! This importer allows you to extract posts from Blogware XML export file into your blog. Pick a Blogware file to upload and click Import.').'

    '; wp_import_upload_form("admin.php?import=blogware&step=1"); echo '
    '; } function import_posts() { global $wpdb, $current_user; set_magic_quotes_runtime(0); $importdata = file($this->file); // Read the file into an array $importdata = implode('', $importdata); // squish it $importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata); preg_match_all('|(]+>(.*?))|is', $importdata, $posts); $posts = $posts[1]; unset($importdata); echo '
      '; foreach ($posts as $post) { flush(); preg_match('||is', $post, $post_type); $post_type = $post_type[1]; if($post_type == "photo") { preg_match('|(.*?)|is', $post, $post_title); } else { preg_match('|(.*?)|is', $post, $post_title); } $post_title = $wpdb->escape(trim($post_title[1])); preg_match('|(.*?)|is', $post, $post_date); $post_date = strtotime($post_date[1]); $post_date = gmdate('Y-m-d H:i:s', $post_date); preg_match_all('|(.*?)|is', $post, $categories); $categories = $categories[1]; $cat_index = 0; foreach ($categories as $category) { $categories[$cat_index] = $wpdb->escape($this->unhtmlentities($category)); $cat_index++; } if(strcasecmp($post_type, "photo") === 0) { preg_match('|(.*?)|is', $post, $post_content); $post_content = ''; $post_content = $this->unhtmlentities($post_content); } else { preg_match('|(.*?)|is', $post, $post_content); $post_content = str_replace(array (''), '', trim($post_content[1])); $post_content = $this->unhtmlentities($post_content); } // Clean up content $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content); $post_content = str_replace('
      ', '
      ', $post_content); $post_content = str_replace('
      ', '
      ', $post_content); $post_content = $wpdb->escape($post_content); $post_author = $current_user->ID; preg_match('|(.*?)|is', $post, $post_status); $post_status = trim($post_status[1]); echo '
    1. '; if ($post_id = post_exists($post_title, $post_content, $post_date)) { printf(__('Post %s already exists.'), stripslashes($post_title)); } else { printf(__('Importing post %s...'), stripslashes($post_title)); $postdata = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status'); $post_id = wp_insert_post($postdata); if ( is_wp_error( $post_id ) ) { return $post_id; } if (!$post_id) { _e("Couldn't get post ID"); echo '
    2. '; break; } if(0 != count($categories)) wp_create_categories($categories, $post_id); } preg_match_all('|(.*?)|is', $post, $comments); $comments = $comments[1]; if ( $comments ) { $comment_post_ID = (int) $post_id; $num_comments = 0; foreach ($comments as $comment) { preg_match('|(.*?)|is', $comment, $comment_content); $comment_content = str_replace(array (''), '', trim($comment_content[1])); $comment_content = $this->unhtmlentities($comment_content); // Clean up content $comment_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $comment_content); $comment_content = str_replace('
      ', '
      ', $comment_content); $comment_content = str_replace('
      ', '
      ', $comment_content); $comment_content = $wpdb->escape($comment_content); preg_match('|(.*?)|is', $comment, $comment_date); $comment_date = trim($comment_date[1]); $comment_date = date('Y-m-d H:i:s', strtotime($comment_date)); preg_match('|(.*?)|is', $comment, $comment_author); $comment_author = $wpdb->escape(trim($comment_author[1])); $comment_author_email = NULL; $comment_approved = 1; // Check if it's already there if (!comment_exists($comment_author, $comment_date)) { $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_date', 'comment_content', 'comment_approved'); $commentdata = wp_filter_comment($commentdata); wp_insert_comment($commentdata); $num_comments++; } } } if ( $num_comments ) { echo ' '; printf( __ngettext('%s comment', '%s comments', $num_comments), $num_comments ); } echo ''; flush(); ob_flush(); } echo '
    '; } function import() { $file = wp_import_handle_upload(); if ( isset($file['error']) ) { echo $file['error']; return; } $this->file = $file['file']; $result = $this->import_posts(); if ( is_wp_error( $result ) ) return $result; wp_import_cleanup($file['id']); do_action('import_done', 'blogware'); echo '

    '; printf(__('All done. Have fun!'), get_option('home')); echo '

    '; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; $this->header(); switch ($step) { case 0 : $this->greet(); break; case 1 : $result = $this->import(); if ( is_wp_error( $result ) ) $result->get_error_message(); break; } $this->footer(); } function BW_Import() { // Nothing. } } $blogware_import = new BW_Import(); register_importer('blogware', __('Blogware'), __('Import posts from Blogware.'), array ($blogware_import, 'dispatch')); ?> wp/dev/wp-admin/import/stp.php0000644000106600010660000001136210762341150013551 0ustar '; echo '

    '.__('Import Simple Tagging').'

    '; echo '

    '.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'

    '; } function footer() { echo ''; } function greet() { echo '
    '; echo '

    '.__('Howdy! This imports tags from Simple Tagging 1.6.2 into WordPress tags.').'

    '; echo '

    '.__('This has not been tested on any other versions of Simple Tagging. Mileage may vary.').'

    '; echo '

    '.__('To accommodate larger databases for those tag-crazy authors out there, we have made this into an easy 4-step program to help you kick that nasty Simple Tagging habit. Just keep clicking along and we will let you know when you are in the clear!').'

    '; echo '

    '.__('Don’t be stupid - backup your database before proceeding!').'

    '; echo '
    '; wp_nonce_field('import-stp'); echo '

    '; echo '
    '; echo '
    '; } function dispatch () { if ( empty( $_GET['step'] ) ) { $step = 0; } else { $step = (int) $_GET['step']; } // load the header $this->header(); switch ( $step ) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-stp'); $this->import_posts(); break; case 2: check_admin_referer('import-stp'); $this->import_t2p(); break; case 3: check_admin_referer('import-stp'); $this->cleanup_import(); break; } // load the footer $this->footer(); } function import_posts ( ) { echo '
    '; echo '

    '.__('Reading STP Post Tags…').'

    '; // read in all the STP tag -> post settings $posts = $this->get_stp_posts(); // if we didn't get any tags back, that's all there is folks! if ( !is_array($posts) ) { echo '

    ' . __('No posts were found to have tags!') . '

    '; return false; } else { // if there's an existing entry, delete it if ( get_option('stpimp_posts') ) { delete_option('stpimp_posts'); } add_option('stpimp_posts', $posts); $count = count($posts); echo '

    ' . sprintf( __ngettext('Done! %s tag to post relationships were read.', 'Done! %s tags to post relationships were read.', $count), $count ) . '

    '; } echo '
    '; wp_nonce_field('import-stp'); echo '

    '; echo '
    '; echo '
    '; } function import_t2p ( ) { echo '
    '; echo '

    '.__('Adding Tags to Posts…').'

    '; // run that funky magic! $tags_added = $this->tag2post(); echo '

    ' . sprintf( __ngettext('Done! %s tag was added!', 'Done! %s tags were added!', $tags_added), $tags_added ) . '

    '; echo '
    '; wp_nonce_field('import-stp'); echo '

    '; echo '
    '; echo '
    '; } function get_stp_posts ( ) { global $wpdb; // read in all the posts from the STP post->tag table: should be wp_post2tag $posts_query = "SELECT post_id, tag_name FROM " . $wpdb->prefix . "stp_tags"; $posts = $wpdb->get_results($posts_query); return $posts; } function tag2post ( ) { global $wpdb; // get the tags and posts we imported in the last 2 steps $posts = get_option('stpimp_posts'); // null out our results $tags_added = 0; // loop through each post and add its tags to the db foreach ( $posts as $this_post ) { $the_post = (int) $this_post->post_id; $the_tag = $wpdb->escape($this_post->tag_name); // try to add the tag wp_add_post_tags($the_post, $the_tag); $tags_added++; } // that's it, all posts should be linked to their tags properly, pending any errors we just spit out! return $tags_added; } function cleanup_import ( ) { delete_option('stpimp_posts'); $this->done(); } function done ( ) { echo '
    '; echo '

    '.__('Import Complete!').'

    '; echo '

    ' . __('OK, so we lied about this being a 4-step program! You’re done!') . '

    '; echo '

    ' . __('Now wasn’t that easy?') . '

    '; echo '
    '; } function STP_Import ( ) { // Nothing. } } // create the import object $stp_import = new STP_Import(); // add it to the import page! register_importer('stp', 'Simple Tagging', __('Import Simple Tagging tags into WordPress tags.'), array($stp_import, 'dispatch')); ?> wp/dev/wp-admin/import/mt.php0000644000106600010660000003544411017045414013370 0ustar '; echo '

    '.__('Import Movable Type or TypePad').'

    '; } function footer() { echo ''; } function greet() { $this->header(); ?>

    mt-export.txt in your /wp-content/ directory and then click "Import mt-export.txt"'); ?>

    mt-export.txt in your /wp-content/ directory'); ?>

    out of memory error try splitting up the import file into pieces.'); ?>

    footer(); } function users_form($n) { global $wpdb, $testing; $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY ID"); ?> mtnames))) { //a new mt author name is found ++ $this->j; $this->mtnames[$this->j] = $author; //add that new mt author name to an array $user_id = username_exists($this->newauthornames[$this->j]); //check if the new author name defined by the user is a pre-existing wp user if (!$user_id) { //banging my head against the desk now. if ($newauthornames[$this->j] == 'left_blank') { //check if the user does not want to change the authorname $user_id = wp_create_user($author, $pass); $this->newauthornames[$this->j] = $author; //now we have a name, in the place of left_blank. } else { $user_id = wp_create_user($this->newauthornames[$this->j], $pass); } } else { return $user_id; // return pre-existing wp username if it exists } } else { $key = array_search($author, $this->mtnames); //find the array key for $author in the $mtnames array $user_id = username_exists($this->newauthornames[$key]); //use that key to get the value of the author's name from $newauthornames } return $user_id; } function get_mt_authors() { $temp = array(); $authors = array(); $handle = fopen($this->file, 'r'); if ( $handle == null ) return false; $in_comment = false; while ( $line = fgets($handle) ) { $line = trim($line); if ( 'COMMENT:' == $line ) $in_comment = true; else if ( '-----' == $line ) $in_comment = false; if ( $in_comment || 0 !== strpos($line,"AUTHOR:") ) continue; $temp[] = trim( substr($line, strlen("AUTHOR:")) ); } //we need to find unique values of author names, while preserving the order, so this function emulates the unique_value(); php function, without the sorting. $authors[0] = array_shift($temp); $y = count($temp) + 1; for ($x = 1; $x < $y; $x ++) { $next = array_shift($temp); if (!(in_array($next, $authors))) array_push($authors, "$next"); } fclose($handle); return $authors; } function get_authors_from_post() { $formnames = array (); $selectnames = array (); foreach ($_POST['user'] as $key => $line) { $newname = trim(stripslashes($line)); if ($newname == '') $newname = 'left_blank'; //passing author names from step 1 to step 2 is accomplished by using POST. left_blank denotes an empty entry in the form. array_push($formnames, "$newname"); } // $formnames is the array with the form entered names foreach ($_POST['userselect'] as $user => $key) { $selected = trim(stripslashes($key)); array_push($selectnames, "$selected"); } $count = count($formnames); for ($i = 0; $i < $count; $i ++) { if ($selectnames[$i] != '#NONE#') { //if no name was selected from the select menu, use the name entered in the form array_push($this->newauthornames, "$selectnames[$i]"); } else { array_push($this->newauthornames, "$formnames[$i]"); } } } function mt_authors_form() { ?>

    italics. For each of these names, you can either pick an author in your WordPress installation from the menu, or enter a name for the author in the textbox.'); ?>

    get_mt_authors(); echo '
      '; echo '
      '; wp_nonce_field('import-mt'); $j = -1; foreach ($authors as $author) { ++ $j; echo '
    1. '; } echo ''.'
      '; echo '
      '; echo '
    '; } function select_authors() { if ( $_POST['upload_type'] === 'ftp' ) { $file['file'] = WP_CONTENT_DIR . '/mt-export.txt'; if ( !file_exists($file['file']) ) $file['error'] = __('mt-export.txt does not exist'); } else { $file = wp_import_handle_upload(); } if ( isset($file['error']) ) { $this->header(); echo '

    '.__('Sorry, there has been an error').'.

    '; echo '

    ' . $file['error'] . '

    '; $this->footer(); return; } $this->file = $file['file']; $this->id = (int) $file['id']; $this->mt_authors_form(); } function save_post(&$post, &$comments, &$pings) { // Reset the counter set_time_limit(30); $post = get_object_vars($post); $post = add_magic_quotes($post); $post = (object) $post; if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) { echo '
  • '; printf(__('Post %s already exists.'), stripslashes($post->post_title)); } else { echo '
  • '; printf(__('Importing post %s...'), stripslashes($post->post_title)); if ( '' != trim( $post->extended ) ) $post->post_content .= "\n\n$post->extended"; $post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor $post_id = wp_insert_post($post); if ( is_wp_error( $post_id ) ) return $post_id; // Add categories. if ( 0 != count($post->categories) ) { wp_create_categories($post->categories, $post_id); } // Add tags or keywords if ( 1 < strlen($post->post_keywords) ) { // Keywords exist. printf(__('
    Adding tags %s...'), stripslashes($post->post_keywords)); wp_add_post_tags($post_id, $post->post_keywords); } } $num_comments = 0; foreach ( $comments as $comment ) { $comment = get_object_vars($comment); $comment = add_magic_quotes($comment); if ( !comment_exists($comment['comment_author'], $comment['comment_date'])) { $comment['comment_post_ID'] = $post_id; $comment = wp_filter_comment($comment); wp_insert_comment($comment); $num_comments++; } } if ( $num_comments ) printf(' '.__ngettext('(%s comment)', '(%s comments)', $num_comments), $num_comments); $num_pings = 0; foreach ( $pings as $ping ) { $ping = get_object_vars($ping); $ping = add_magic_quotes($ping); if ( !comment_exists($ping['comment_author'], $ping['comment_date'])) { $ping['comment_content'] = "{$ping['title']}\n\n{$ping['comment_content']}"; $ping['comment_post_ID'] = $post_id; $ping = wp_filter_comment($ping); wp_insert_comment($ping); $num_pings++; } } if ( $num_pings ) printf(' '.__ngettext('(%s ping)', '(%s pings)', $num_pings), $num_pings); echo "
  • "; //ob_flush();flush(); } function process_posts() { global $wpdb; $handle = fopen($this->file, 'r'); if ( $handle == null ) return false; $context = ''; $post = new StdClass(); $comment = new StdClass(); $comments = array(); $ping = new StdClass(); $pings = array(); echo "
      "; while ( $line = fgets($handle) ) { $line = trim($line); if ( '-----' == $line ) { // Finishing a multi-line field if ( 'comment' == $context ) { $comments[] = $comment; $comment = new StdClass(); } else if ( 'ping' == $context ) { $pings[] = $ping; $ping = new StdClass(); } $context = ''; } else if ( '--------' == $line ) { // Finishing a post. $context = ''; $result = $this->save_post($post, $comments, $pings); if ( is_wp_error( $result ) ) return $result; $post = new StdClass; $comment = new StdClass(); $ping = new StdClass(); $comments = array(); $pings = array(); } else if ( 'BODY:' == $line ) { $context = 'body'; } else if ( 'EXTENDED BODY:' == $line ) { $context = 'extended'; } else if ( 'EXCERPT:' == $line ) { $context = 'excerpt'; } else if ( 'KEYWORDS:' == $line ) { $context = 'keywords'; } else if ( 'COMMENT:' == $line ) { $context = 'comment'; } else if ( 'PING:' == $line ) { $context = 'ping'; } else if ( 0 === strpos($line, "AUTHOR:") ) { $author = trim( substr($line, strlen("AUTHOR:")) ); if ( '' == $context ) $post->post_author = $author; else if ( 'comment' == $context ) $comment->comment_author = $author; } else if ( 0 === strpos($line, "TITLE:") ) { $title = trim( substr($line, strlen("TITLE:")) ); if ( '' == $context ) $post->post_title = $title; else if ( 'ping' == $context ) $ping->title = $title; } else if ( 0 === strpos($line, "STATUS:") ) { $status = trim( strtolower( substr($line, strlen("STATUS:")) ) ); if ( empty($status) ) $status = 'publish'; $post->post_status = $status; } else if ( 0 === strpos($line, "ALLOW COMMENTS:") ) { $allow = trim( substr($line, strlen("ALLOW COMMENTS:")) ); if ( $allow == 1 ) $post->comment_status = 'open'; else $post->comment_status = 'closed'; } else if ( 0 === strpos($line, "ALLOW PINGS:") ) { $allow = trim( substr($line, strlen("ALLOW PINGS:")) ); if ( $allow == 1 ) $post->ping_status = 'open'; else $post->ping_status = 'closed'; } else if ( 0 === strpos($line, "CATEGORY:") ) { $category = trim( substr($line, strlen("CATEGORY:")) ); if ( '' != $category ) $post->categories[] = $category; } else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) { $category = trim( substr($line, strlen("PRIMARY CATEGORY:")) ); if ( '' != $category ) $post->categories[] = $category; } else if ( 0 === strpos($line, "DATE:") ) { $date = trim( substr($line, strlen("DATE:")) ); $date = strtotime($date); $date = date('Y-m-d H:i:s', $date); $date_gmt = get_gmt_from_date($date); if ( '' == $context ) { $post->post_modified = $date; $post->post_modified_gmt = $date_gmt; $post->post_date = $date; $post->post_date_gmt = $date_gmt; } else if ( 'comment' == $context ) { $comment->comment_date = $date; } else if ( 'ping' == $context ) { $ping->comment_date = $date; } } else if ( 0 === strpos($line, "EMAIL:") ) { $email = trim( substr($line, strlen("EMAIL:")) ); if ( 'comment' == $context ) $comment->comment_author_email = $email; else $ping->comment_author_email = ''; } else if ( 0 === strpos($line, "IP:") ) { $ip = trim( substr($line, strlen("IP:")) ); if ( 'comment' == $context ) $comment->comment_author_IP = $ip; else $ping->comment_author_IP = $ip; } else if ( 0 === strpos($line, "URL:") ) { $url = trim( substr($line, strlen("URL:")) ); if ( 'comment' == $context ) $comment->comment_author_url = $url; else $ping->comment_author_url = $url; } else if ( 0 === strpos($line, "BLOG NAME:") ) { $blog = trim( substr($line, strlen("BLOG NAME:")) ); $ping->comment_author = $blog; } else { // Processing multi-line field, check context. $line .= "\n"; if ( 'body' == $context ) { $post->post_content .= $line; } else if ( 'extended' == $context ) { $post->extended .= $line; } else if ( 'excerpt' == $context ) { $post->post_excerpt .= $line; } else if ( 'keywords' == $context ) { $post->post_keywords .= $line; } else if ( 'comment' == $context ) { $comment->comment_content .= $line; } else if ( 'ping' == $context ) { $ping->comment_content .= $line; } } } echo '
    '; wp_import_cleanup($this->id); do_action('import_done', 'mt'); echo '

    '.sprintf(__('All done. Have fun!'), get_option('home')).'

    '; } function import() { $this->id = (int) $_GET['id']; if ( $this->id == 0 ) $this->file = WP_CONTENT_DIR . '/mt-export.txt'; else $this->file = get_attached_file($this->id); $this->get_authors_from_post(); $result = $this->process_posts(); if ( is_wp_error( $result ) ) return $result; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; switch ($step) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-upload'); $this->select_authors(); break; case 2: check_admin_referer('import-mt'); $result = $this->import(); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; } } function MT_Import() { // Nothing. } } $mt_import = new MT_Import(); register_importer('mt', __('Movable Type and TypePad'), __('Import posts and comments from a Movable Type or Typepad blog.'), array ($mt_import, 'dispatch')); ?> wp/dev/wp-admin/import/jkw.php0000644000106600010660000001355610761355210013546 0ustar '; echo '

    '.__('Import Jerome’s Keywords').'

    '; echo '

    '.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'

    '; } function footer() { echo ''; } function greet() { echo '
    '; echo '

    '.__('Howdy! This imports tags from Jerome’s Keywords into WordPress tags.').'

    '; echo '

    '.__('This is suitable for Jerome’s Keywords version 1.x and 2.0a.').'

    '; echo '

    '.__('All existing Jerome’s Keywords will be removed after import.').'

    '; echo '

    '.__('Don’t be stupid - backup your database before proceeding!').'

    '; echo '
    '; wp_nonce_field('import-jkw'); echo '

    '; echo '
    '; echo '
    '; wp_nonce_field('import-jkw'); echo '

    '; echo '
    '; echo '
    '; } function dispatch() { if ( empty($_GET['step']) ) $step = 0; else $step = absint($_GET['step']); // load the header $this->header(); switch ( $step ) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-jkw'); $this->check_V1_post_keyword( true ); break; case 2 : check_admin_referer('import-jkw'); $this->check_V1_post_keyword( false ); break; case 3 : check_admin_referer('import-jkw'); $this->check_V2_post_keyword( true ); break; case 4 : check_admin_referer('import-jkw'); $this->check_V2_post_keyword( false ); break; case 5: check_admin_referer('import-jkw'); $this->cleanup_V2_import(); break; case 6: $this->done(); break; } // load the footer $this->footer(); } function check_V1_post_keyword($precheck = true) { global $wpdb; echo '
    '; echo '

    '.__('Reading Jerome’s Keywords Tags…').'

    '; // import Jerome's Keywords tags $metakeys = $wpdb->get_results("SELECT post_id, meta_id, meta_key, meta_value FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = 'keywords'"); if ( !is_array($metakeys)) { echo '

    ' . __('No Tags Found!') . '

    '; return false; } else { $count = count($metakeys); echo '

    ' . sprintf( __ngettext('Done! %s post with tags were read.', 'Done! %s posts with tags were read.', $count), $count ) . '

    '; echo '
      '; foreach ( $metakeys as $post_meta ) { if ( $post_meta->meta_value != '' ) { $post_keys = explode(',', $post_meta->meta_value); foreach ( $post_keys as $keyword ) { $keyword = addslashes(trim($keyword)); if ( '' != $keyword ) { echo '
    • ' . $post_meta->post_id . ' - ' . $keyword . '
    • '; if ( !$precheck ) wp_add_post_tags($post_meta->post_id, $keyword); } } } if ( !$precheck ) delete_post_meta($post_meta->post_id, 'keywords'); } echo '
    '; } echo '
    '; wp_nonce_field('import-jkw'); echo '

    '; echo '
    '; echo '
    '; } function check_V2_post_keyword($precheck = true) { global $wpdb; echo '
    '; echo '

    '.__('Reading Jerome’s Keywords Tags…').'

    '; // import Jerome's Keywords tags $tablename = $wpdb->prefix . substr(get_option('jkeywords_keywords_table'), 1, -1); $metakeys = $wpdb->get_results("SELECT post_id, tag_name FROM $tablename"); if ( !is_array($metakeys) ) { echo '

    ' . __('No Tags Found!') . '

    '; return false; } else { $count = count($metakeys); echo '

    ' . sprintf( __ngettext('Done! %s tag were read.', 'Done! %s tags were read.', $count), $count ) . '

    '; echo '
      '; foreach ( $metakeys as $post_meta ) { $keyword = addslashes(trim($post_meta->tag_name)); if ( $keyword != '' ) { echo '
    • ' . $post_meta->post_id . ' - ' . $keyword . '
    • '; if ( !$precheck ) wp_add_post_tags($post_meta->post_id, $keyword); } } echo '
    '; } echo '
    '; wp_nonce_field('import-jkw'); echo '

    '; echo '
    '; echo '
    '; } function cleanup_V2_import() { global $wpdb; /* options from V2.0a (jeromes-keywords.php) */ $options = array('version', 'keywords_table', 'query_varname', 'template', 'meta_always_include', 'meta_includecats', 'meta_autoheader', 'search_strict', 'use_feed_cats', 'post_linkformat', 'post_tagseparator', 'post_includecats', 'post_notagstext', 'cloud_linkformat', 'cloud_tagseparator', 'cloud_includecats', 'cloud_sortorder', 'cloud_displaymax', 'cloud_displaymin', 'cloud_scalemax', 'cloud_scalemin'); $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . substr(get_option('jkeywords_keywords_table'), 1, -1)); foreach ( $options as $o ) delete_option('jkeywords_' . $o); $this->done(); } function done() { echo '
    '; echo '

    '.__('Import Complete!').'

    '; echo '
    '; } function JeromesKeyword_Import() { } } // create the import object $jkw_import = new JeromesKeyword_Import(); // add it to the import page! register_importer('jkw', 'Jerome’s Keywords', __('Import Jerome’s Keywords into WordPress tags.'), array($jkw_import, 'dispatch')); ?> wp/dev/wp-admin/import/textpattern.php0000644000106600010660000004752711000701245015330 0ustar get_var( $wpdb->prepare("SELECT count(*) FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID) ); } } if(!function_exists('link_exists')) { function link_exists($linkname) { global $wpdb; return $wpdb->get_var( $wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_name = %s", $linkname) ); } } /** The Main Importer Class **/ class Textpattern_Import { function header() { echo '
    '; echo '

    '.__('Import Textpattern').'

    '; echo '

    '.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'

    '; } function footer() { echo '
    '; } function greet() { echo '
    '; echo '

    '.__('Howdy! This imports categories, users, posts, comments, and links from any Textpattern 4.0.2+ into this blog.').'

    '; echo '

    '.__('This has not been tested on previous versions of Textpattern. Mileage may vary.').'

    '; echo '

    '.__('Your Textpattern Configuration settings are as follows:').'

    '; echo '
    '; wp_nonce_field('import-textpattern'); $this->db_form(); echo '

    '; echo '
    '; echo '
    '; } function get_txp_cats() { global $wpdb; // General Housekeeping $txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost')); set_magic_quotes_runtime(0); $prefix = get_option('tpre'); // Get Categories return $txpdb->get_results('SELECT id, name, title FROM '.$prefix.'txp_category WHERE type = "article"', ARRAY_A); } function get_txp_users() { global $wpdb; // General Housekeeping $txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost')); set_magic_quotes_runtime(0); $prefix = get_option('tpre'); // Get Users return $txpdb->get_results('SELECT user_id, name, RealName, email, privs FROM '.$prefix.'txp_users', ARRAY_A); } function get_txp_posts() { // General Housekeeping $txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost')); set_magic_quotes_runtime(0); $prefix = get_option('tpre'); // Get Posts return $txpdb->get_results('SELECT ID, Posted, AuthorID, LastMod, Title, Body, Excerpt, Category1, Category2, Status, Keywords, url_title, comments_count FROM '.$prefix.'textpattern ', ARRAY_A); } function get_txp_comments() { global $wpdb; // General Housekeeping $txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost')); set_magic_quotes_runtime(0); $prefix = get_option('tpre'); // Get Comments return $txpdb->get_results('SELECT * FROM '.$prefix.'txp_discuss', ARRAY_A); } function get_txp_links() { //General Housekeeping $txpdb = new wpdb(get_option('txpuser'), get_option('txppass'), get_option('txpname'), get_option('txphost')); set_magic_quotes_runtime(0); $prefix = get_option('tpre'); return $txpdb->get_results('SELECT id, date, category, url, linkname, description FROM '.$prefix.'txp_link', ARRAY_A); } function cat2wp($categories='') { // General Housekeeping global $wpdb; $count = 0; $txpcat2wpcat = array(); // Do the Magic if(is_array($categories)) { echo '

    '.__('Importing Categories...').'

    '; foreach ($categories as $category) { $count++; extract($category); // Make Nice Variables $name = $wpdb->escape($name); $title = $wpdb->escape($title); if($cinfo = category_exists($name)) { $ret_id = wp_insert_category(array('cat_ID' => $cinfo, 'category_nicename' => $name, 'cat_name' => $title)); } else { $ret_id = wp_insert_category(array('category_nicename' => $name, 'cat_name' => $title)); } $txpcat2wpcat[$id] = $ret_id; } // Store category translation for future use add_option('txpcat2wpcat',$txpcat2wpcat); echo '

    '.sprintf(__ngettext('Done! %1$s category imported.', 'Done! %1$s categories imported.', $count), $count).'

    '; return true; } echo __('No Categories to Import!'); return false; } function users2wp($users='') { // General Housekeeping global $wpdb; $count = 0; $txpid2wpid = array(); // Midnight Mojo if(is_array($users)) { echo '

    '.__('Importing Users...').'

    '; foreach($users as $user) { $count++; extract($user); // Make Nice Variables $name = $wpdb->escape($name); $RealName = $wpdb->escape($RealName); if($uinfo = get_userdatabylogin($name)) { $ret_id = wp_insert_user(array( 'ID' => $uinfo->ID, 'user_login' => $name, 'user_nicename' => $RealName, 'user_email' => $email, 'user_url' => 'http://', 'display_name' => $name) ); } else { $ret_id = wp_insert_user(array( 'user_login' => $name, 'user_nicename' => $RealName, 'user_email' => $email, 'user_url' => 'http://', 'display_name' => $name) ); } $txpid2wpid[$user_id] = $ret_id; // Set Textpattern-to-WordPress permissions translation $transperms = array(1 => '10', 2 => '9', 3 => '5', 4 => '4', 5 => '3', 6 => '2', 7 => '0'); // Update Usermeta Data $user = new WP_User($ret_id); if('10' == $transperms[$privs]) { $user->set_role('administrator'); } if('9' == $transperms[$privs]) { $user->set_role('editor'); } if('5' == $transperms[$privs]) { $user->set_role('editor'); } if('4' == $transperms[$privs]) { $user->set_role('author'); } if('3' == $transperms[$privs]) { $user->set_role('contributor'); } if('2' == $transperms[$privs]) { $user->set_role('contributor'); } if('0' == $transperms[$privs]) { $user->set_role('subscriber'); } update_usermeta( $ret_id, 'wp_user_level', $transperms[$privs] ); update_usermeta( $ret_id, 'rich_editing', 'false'); }// End foreach($users as $user) // Store id translation array for future use add_option('txpid2wpid',$txpid2wpid); echo '

    '.sprintf(__('Done! %1$s users imported.'), $count).'

    '; return true; }// End if(is_array($users) echo __('No Users to Import!'); return false; }// End function user2wp() function posts2wp($posts='') { // General Housekeeping global $wpdb; $count = 0; $txpposts2wpposts = array(); $cats = array(); // Do the Magic if(is_array($posts)) { echo '

    '.__('Importing Posts...').'

    '; foreach($posts as $post) { $count++; extract($post); // Set Textpattern-to-WordPress status translation $stattrans = array(1 => 'draft', 2 => 'private', 3 => 'draft', 4 => 'publish', 5 => 'publish'); //Can we do this more efficiently? $uinfo = ( get_userdatabylogin( $AuthorID ) ) ? get_userdatabylogin( $AuthorID ) : 1; $authorid = ( is_object( $uinfo ) ) ? $uinfo->ID : $uinfo ; $Title = $wpdb->escape($Title); $Body = $wpdb->escape($Body); $Excerpt = $wpdb->escape($Excerpt); $post_status = $stattrans[$Status]; // Import Post data into WordPress if($pinfo = post_exists($Title,$Body)) { $ret_id = wp_insert_post(array( 'ID' => $pinfo, 'post_date' => $Posted, 'post_date_gmt' => $post_date_gmt, 'post_author' => $authorid, 'post_modified' => $LastMod, 'post_modified_gmt' => $post_modified_gmt, 'post_title' => $Title, 'post_content' => $Body, 'post_excerpt' => $Excerpt, 'post_status' => $post_status, 'post_name' => $url_title, 'comment_count' => $comments_count) ); if ( is_wp_error( $ret_id ) ) return $ret_id; } else { $ret_id = wp_insert_post(array( 'post_date' => $Posted, 'post_date_gmt' => $post_date_gmt, 'post_author' => $authorid, 'post_modified' => $LastMod, 'post_modified_gmt' => $post_modified_gmt, 'post_title' => $Title, 'post_content' => $Body, 'post_excerpt' => $Excerpt, 'post_status' => $post_status, 'post_name' => $url_title, 'comment_count' => $comments_count) ); if ( is_wp_error( $ret_id ) ) return $ret_id; } $txpposts2wpposts[$ID] = $ret_id; // Make Post-to-Category associations $cats = array(); $category1 = get_category_by_slug($Category1); $category1 = $category1->term_id; $category2 = get_category_by_slug($Category2); $category2 = $category1->term_id; if($cat1 = $category1) { $cats[1] = $cat1; } if($cat2 = $category2) { $cats[2] = $cat2; } if(!empty($cats)) { wp_set_post_categories($ret_id, $cats); } } } // Store ID translation for later use add_option('txpposts2wpposts',$txpposts2wpposts); echo '

    '.sprintf(__('Done! %1$s posts imported.'), $count).'

    '; return true; } function comments2wp($comments='') { // General Housekeeping global $wpdb; $count = 0; $txpcm2wpcm = array(); $postarr = get_option('txpposts2wpposts'); // Magic Mojo if(is_array($comments)) { echo '

    '.__('Importing Comments...').'

    '; foreach($comments as $comment) { $count++; extract($comment); // WordPressify Data $comment_ID = ltrim($discussid, '0'); $comment_post_ID = $postarr[$parentid]; $comment_approved = (1 == $visible) ? 1 : 0; $name = $wpdb->escape($name); $email = $wpdb->escape($email); $web = $wpdb->escape($web); $message = $wpdb->escape($message); if($cinfo = comment_exists($name, $posted)) { // Update comments $ret_id = wp_update_comment(array( 'comment_ID' => $cinfo, 'comment_post_ID' => $comment_post_ID, 'comment_author' => $name, 'comment_author_email' => $email, 'comment_author_url' => $web, 'comment_date' => $posted, 'comment_content' => $message, 'comment_approved' => $comment_approved) ); } else { // Insert comments $ret_id = wp_insert_comment(array( 'comment_post_ID' => $comment_post_ID, 'comment_author' => $name, 'comment_author_email' => $email, 'comment_author_url' => $web, 'comment_author_IP' => $ip, 'comment_date' => $posted, 'comment_content' => $message, 'comment_approved' => $comment_approved) ); } $txpcm2wpcm[$comment_ID] = $ret_id; } // Store Comment ID translation for future use add_option('txpcm2wpcm', $txpcm2wpcm); // Associate newly formed categories with posts get_comment_count($ret_id); echo '

    '.sprintf(__('Done! %1$s comments imported.'), $count).'

    '; return true; } echo __('No Comments to Import!'); return false; } function links2wp($links='') { // General Housekeeping global $wpdb; $count = 0; // Deal with the links if(is_array($links)) { echo '

    '.__('Importing Links...').'

    '; foreach($links as $link) { $count++; extract($link); // Make nice vars $category = $wpdb->escape($category); $linkname = $wpdb->escape($linkname); $description = $wpdb->escape($description); if($linfo = link_exists($linkname)) { $ret_id = wp_insert_link(array( 'link_id' => $linfo, 'link_url' => $url, 'link_name' => $linkname, 'link_category' => $category, 'link_description' => $description, 'link_updated' => $date) ); } else { $ret_id = wp_insert_link(array( 'link_url' => $url, 'link_name' => $linkname, 'link_category' => $category, 'link_description' => $description, 'link_updated' => $date) ); } $txplinks2wplinks[$link_id] = $ret_id; } add_option('txplinks2wplinks',$txplinks2wplinks); echo '

    '; printf(__ngettext('Done! %s link imported', 'Done! %s links imported', $count), $count); echo '

    '; return true; } echo __('No Links to Import!'); return false; } function import_categories() { // Category Import $cats = $this->get_txp_cats(); $this->cat2wp($cats); add_option('txp_cats', $cats); echo '
    '; wp_nonce_field('import-textpattern'); printf('', attribute_escape(__('Import Users'))); echo '
    '; } function import_users() { // User Import $users = $this->get_txp_users(); $this->users2wp($users); echo '
    '; wp_nonce_field('import-textpattern'); printf('', attribute_escape(__('Import Posts'))); echo '
    '; } function import_posts() { // Post Import $posts = $this->get_txp_posts(); $result = $this->posts2wp($posts); if ( is_wp_error( $result ) ) return $result; echo '
    '; wp_nonce_field('import-textpattern'); printf('', attribute_escape(__('Import Comments'))); echo '
    '; } function import_comments() { // Comment Import $comments = $this->get_txp_comments(); $this->comments2wp($comments); echo '
    '; wp_nonce_field('import-textpattern'); printf('', attribute_escape(__('Import Links'))); echo '
    '; } function import_links() { //Link Import $links = $this->get_txp_links(); $this->links2wp($links); add_option('txp_links', $links); echo '
    '; wp_nonce_field('import-textpattern'); printf('', attribute_escape(__('Finish'))); echo '
    '; } function cleanup_txpimport() { delete_option('tpre'); delete_option('txp_cats'); delete_option('txpid2wpid'); delete_option('txpcat2wpcat'); delete_option('txpposts2wpposts'); delete_option('txpcm2wpcm'); delete_option('txplinks2wplinks'); delete_option('txpuser'); delete_option('txppass'); delete_option('txpname'); delete_option('txphost'); do_action('import_done', 'textpattern'); $this->tips(); } function tips() { echo '

    '.__('Welcome to WordPress. We hope (and expect!) that you will find this platform incredibly rewarding! As a new WordPress user coming from Textpattern, there are some things that we would like to point out. Hopefully, they will help your transition go as smoothly as possible.').'

    '; echo '

    '.__('Users').'

    '; echo '

    '.sprintf(__('You have already setup WordPress and have been assigned an administrative login and password. Forget it. You didn’t have that login in Textpattern, why should you have it here? Instead we have taken care to import all of your users into our system. Unfortunately there is one downside. Because both WordPress and Textpattern uses a strong encryption hash with passwords, it is impossible to decrypt it and we are forced to assign temporary passwords to all your users. Every user has the same username, but their passwords are reset to password123. So Login and change it.'), get_bloginfo( 'wpurl' ) . '/wp-login.php').'

    '; echo '

    '.__('Preserving Authors').'

    '; echo '

    '.__('Secondly, we have attempted to preserve post authors. If you are the only author or contributor to your blog, then you are safe. In most cases, we are successful in this preservation endeavor. However, if we cannot ascertain the name of the writer due to discrepancies between database tables, we assign it to you, the administrative user.').'

    '; echo '

    '.__('Textile').'

    '; echo '

    '.__('Also, since you’re coming from Textpattern, you probably have been using Textile to format your comments and posts. If this is the case, we recommend downloading and installing Textile for WordPress. Trust me... You’ll want it.').'

    '; echo '

    '.__('WordPress Resources').'

    '; echo '

    '.__('Finally, there are numerous WordPress resources around the internet. Some of them are:').'

    '; echo ''; echo '

    '.sprintf(__('That’s it! What are you waiting for? Go login!'), get_bloginfo( 'wpurl' ) . '/wp-login.php').'

    '; } function db_form() { echo ''; printf('', __('Textpattern Database User:')); printf('', __('Textpattern Database Password:')); printf('', __('Textpattern Database Name:')); printf('', __('Textpattern Database Host:')); printf('', __('Textpattern Table prefix (if any):')); echo '
    '; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; $this->header(); if ( $step > 0 ) { check_admin_referer('import-textpattern'); if($_POST['dbuser']) { if(get_option('txpuser')) delete_option('txpuser'); add_option('txpuser', sanitize_user($_POST['dbuser'], true)); } if($_POST['dbpass']) { if(get_option('txppass')) delete_option('txppass'); add_option('txppass', sanitize_user($_POST['dbpass'], true)); } if($_POST['dbname']) { if(get_option('txpname')) delete_option('txpname'); add_option('txpname', sanitize_user($_POST['dbname'], true)); } if($_POST['dbhost']) { if(get_option('txphost')) delete_option('txphost'); add_option('txphost', sanitize_user($_POST['dbhost'], true)); } if($_POST['dbprefix']) { if(get_option('tpre')) delete_option('tpre'); add_option('tpre', sanitize_user($_POST['dbprefix'])); } } switch ($step) { default: case 0 : $this->greet(); break; case 1 : $this->import_categories(); break; case 2 : $this->import_users(); break; case 3 : $result = $this->import_posts(); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; case 4 : $this->import_comments(); break; case 5 : $this->import_links(); break; case 6 : $this->cleanup_txpimport(); break; } $this->footer(); } function Textpattern_Import() { // Nothing. } } $txp_import = new Textpattern_Import(); register_importer('textpattern', __('Textpattern'), __('Import categories, users, posts, comments, and links from a Textpattern blog.'), array ($txp_import, 'dispatch')); ?> wp/dev/wp-admin/import/livejournal.php0000644000106600010660000001303410762036130015272 0ustar '; echo '

    '.__('Import LiveJournal').'

    '; } function footer() { echo ''; } function unhtmlentities($string) { // From php.net for < 4.3 compat $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); return strtr($string, $trans_tbl); } function greet() { echo '
    '; echo '

    '.__('Howdy! Upload your LiveJournal XML export file and we’ll import the posts into this blog.').'

    '; echo '

    '.__('Choose a LiveJournal XML file to upload, then click Upload file and import.').'

    '; wp_import_upload_form("admin.php?import=livejournal&step=1"); echo '
    '; } function import_posts() { global $wpdb, $current_user; set_magic_quotes_runtime(0); $importdata = file($this->file); // Read the file into an array $importdata = implode('', $importdata); // squish it $importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata); preg_match_all('|(.*?)|is', $importdata, $posts); $posts = $posts[1]; unset($importdata); echo '
      '; foreach ($posts as $post) { preg_match('|(.*?)|is', $post, $post_title); $post_title = $wpdb->escape(trim($post_title[1])); if ( empty($post_title) ) { preg_match('|(.*?)|is', $post, $post_title); $post_title = $wpdb->escape(trim($post_title[1])); } preg_match('|(.*?)|is', $post, $post_date); $post_date = strtotime($post_date[1]); $post_date = date('Y-m-d H:i:s', $post_date); preg_match('|(.*?)|is', $post, $post_content); $post_content = str_replace(array (''), '', trim($post_content[1])); $post_content = $this->unhtmlentities($post_content); // Clean up content $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content); $post_content = str_replace('
      ', '
      ', $post_content); $post_content = str_replace('
      ', '
      ', $post_content); $post_content = $wpdb->escape($post_content); $post_author = $current_user->ID; $post_status = 'publish'; echo '
    1. '; if ($post_id = post_exists($post_title, $post_content, $post_date)) { printf(__('Post %s already exists.'), stripslashes($post_title)); } else { printf(__('Importing post %s...'), stripslashes($post_title)); $postdata = compact('post_author', 'post_date', 'post_content', 'post_title', 'post_status'); $post_id = wp_insert_post($postdata); if ( is_wp_error( $post_id ) ) return $post_id; if (!$post_id) { _e("Couldn't get post ID"); echo '
    2. '; break; } } preg_match_all('|(.*?)|is', $post, $comments); $comments = $comments[1]; if ( $comments ) { $comment_post_ID = (int) $post_id; $num_comments = 0; foreach ($comments as $comment) { preg_match('|(.*?)|is', $comment, $comment_content); $comment_content = str_replace(array (''), '', trim($comment_content[1])); $comment_content = $this->unhtmlentities($comment_content); // Clean up content $comment_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $comment_content); $comment_content = str_replace('
      ', '
      ', $comment_content); $comment_content = str_replace('
      ', '
      ', $comment_content); $comment_content = $wpdb->escape($comment_content); preg_match('|(.*?)|is', $comment, $comment_date); $comment_date = trim($comment_date[1]); $comment_date = date('Y-m-d H:i:s', strtotime($comment_date)); preg_match('|(.*?)|is', $comment, $comment_author); $comment_author = $wpdb->escape(trim($comment_author[1])); preg_match('|(.*?)|is', $comment, $comment_author_email); $comment_author_email = $wpdb->escape(trim($comment_author_email[1])); $comment_approved = 1; // Check if it's already there if (!comment_exists($comment_author, $comment_date)) { $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_date', 'comment_content', 'comment_approved'); $commentdata = wp_filter_comment($commentdata); wp_insert_comment($commentdata); $num_comments++; } } } if ( $num_comments ) { echo ' '; printf(__ngettext('(%s comment)', '(%s comments)', $num_comments), $num_comments); } echo ''; } echo '
    '; } function import() { $file = wp_import_handle_upload(); if ( isset($file['error']) ) { echo $file['error']; return; } $this->file = $file['file']; $result = $this->import_posts(); if ( is_wp_error( $result ) ) return $result; wp_import_cleanup($file['id']); do_action('import_done', 'livejournal'); echo '

    '; printf(__('All done. Have fun!'), get_option('home')); echo '

    '; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; $this->header(); switch ($step) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-upload'); $result = $this->import(); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; } $this->footer(); } function LJ_Import() { // Nothing. } } $livejournal_import = new LJ_Import(); register_importer('livejournal', __('LiveJournal'), __('Import posts from a LiveJournal XML export file.'), array ($livejournal_import, 'dispatch')); ?> wp/dev/wp-admin/import/btt.php0000644000106600010660000000662110761355210013537 0ustar '; echo '

    '.__('Import Bunny’s Technorati Tags').'

    '; echo '

    '.__('Steps may take a few minutes depending on the size of your database. Please be patient.').'

    '; } function footer() { echo ''; } function greet() { echo '
    '; echo '

    '.__('Howdy! This imports tags from Bunny’s Technorati Tags into WordPress tags.').'

    '; echo '

    '.__('This is suitable for Bunny’s Technorati Tags version 0.6.').'

    '; echo '

    '.__('All existing Bunny’s Technorati Tags will be removed after import.').'

    '; echo '

    '.__('Don’t be stupid - backup your database before proceeding!').'

    '; echo '
    '; wp_nonce_field('import-btt'); echo '

    '; echo '
    '; echo '
    '; } function dispatch() { if ( empty($_GET['step']) ) $step = 0; else $step = absint($_GET['step']); // load the header $this->header(); switch ( $step ) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-btt'); $this->check_post_keyword( true ); break; case 2 : check_admin_referer('import-btt'); $this->check_post_keyword( false ); break; case 3: $this->done(); break; } // load the footer $this->footer(); } function check_post_keyword($precheck = true) { global $wpdb; echo '
    '; echo '

    '.__('Reading Bunny’s Technorati Tags…').'

    '; // import Bunny's Keywords tags $metakeys = $wpdb->get_results("SELECT post_id, meta_id, meta_key, meta_value FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = 'tags'"); if ( !is_array($metakeys)) { echo '

    ' . __('No Tags Found!') . '

    '; return false; } else { $count = count($metakeys); echo '

    ' . sprintf( __ngettext('Done! %s post with tags were read.', 'Done! %s posts with tags were read.', $count), $count ) . '

    '; echo '
      '; foreach ( $metakeys as $post_meta ) { if ( $post_meta->meta_value != '' ) { $post_keys = explode(' ', $post_meta->meta_value); foreach ( $post_keys as $keyword ) { $keyword = addslashes(trim(str_replace('+',' ',$keyword))); if ( '' != $keyword ) { echo '
    • ' . $post_meta->post_id . ' - ' . $keyword . '
    • '; if ( !$precheck ) wp_add_post_tags($post_meta->post_id, $keyword); } } } if ( !$precheck ) delete_post_meta($post_meta->post_id, 'tags'); } echo '
    '; } echo '
    '; wp_nonce_field('import-btt'); echo '

    '; echo '
    '; echo '
    '; } function done() { echo '
    '; echo '

    '.__('Import Complete!').'

    '; echo '
    '; } function BunnyTags_Import() { } } // create the import object $btt_import = new BunnyTags_Import(); // add it to the import page! register_importer('btt', 'Bunny’s Technorati Tags', __('Import Bunny’s Technorati Tags into WordPress tags.'), array($btt_import, 'dispatch')); ?> wp/dev/wp-admin/import/rss.php0000644000106600010660000001166210761357276013574 0ustar '; echo '

    '.__('Import RSS').'

    '; } function footer() { echo ''; } function unhtmlentities($string) { // From php.net for < 4.3 compat $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); return strtr($string, $trans_tbl); } function greet() { echo '
    '; echo '

    '.__('Howdy! This importer allows you to extract posts from an RSS 2.0 file into your blog. This is useful if you want to import your posts from a system that is not handled by a custom import tool. Pick an RSS file to upload and click Import.').'

    '; wp_import_upload_form("admin.php?import=rss&step=1"); echo '
    '; } function get_posts() { global $wpdb; set_magic_quotes_runtime(0); $datalines = file($this->file); // Read the file into an array $importdata = implode('', $datalines); // squish it $importdata = str_replace(array ("\r\n", "\r"), "\n", $importdata); preg_match_all('|(.*?)|is', $importdata, $this->posts); $this->posts = $this->posts[1]; $index = 0; foreach ($this->posts as $post) { preg_match('|(.*?)|is', $post, $post_title); $post_title = str_replace(array(''), '', $wpdb->escape( trim($post_title[1]) )); preg_match('|(.*?)|is', $post, $post_date_gmt); if ($post_date_gmt) { $post_date_gmt = strtotime($post_date_gmt[1]); } else { // if we don't already have something from pubDate preg_match('|(.*?)|is', $post, $post_date_gmt); $post_date_gmt = preg_replace('|([-+])([0-9]+):([0-9]+)$|', '\1\2\3', $post_date_gmt[1]); $post_date_gmt = str_replace('T', ' ', $post_date_gmt); $post_date_gmt = strtotime($post_date_gmt); } $post_date_gmt = gmdate('Y-m-d H:i:s', $post_date_gmt); $post_date = get_date_from_gmt( $post_date_gmt ); preg_match_all('|(.*?)|is', $post, $categories); $categories = $categories[1]; if (!$categories) { preg_match_all('|(.*?)|is', $post, $categories); $categories = $categories[1]; } $cat_index = 0; foreach ($categories as $category) { $categories[$cat_index] = $wpdb->escape($this->unhtmlentities($category)); $cat_index++; } preg_match('|(.*?)|is', $post, $guid); if ($guid) $guid = $wpdb->escape(trim($guid[1])); else $guid = ''; preg_match('|(.*?)|is', $post, $post_content); $post_content = str_replace(array (''), '', $wpdb->escape(trim($post_content[1]))); if (!$post_content) { // This is for feeds that put content in description preg_match('|(.*?)|is', $post, $post_content); $post_content = $wpdb->escape($this->unhtmlentities(trim($post_content[1]))); } // Clean up content $post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content); $post_content = str_replace('
    ', '
    ', $post_content); $post_content = str_replace('
    ', '
    ', $post_content); $post_author = 1; $post_status = 'publish'; $this->posts[$index] = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_status', 'guid', 'categories'); $index++; } } function import_posts() { echo '
      '; foreach ($this->posts as $post) { echo "
    1. ".__('Importing post...'); extract($post); if ($post_id = post_exists($post_title, $post_content, $post_date)) { _e('Post already imported'); } else { $post_id = wp_insert_post($post); if ( is_wp_error( $post_id ) ) return $post_id; if (!$post_id) { _e("Couldn't get post ID"); return; } if (0 != count($categories)) wp_create_categories($categories, $post_id); _e('Done !'); } echo '
    2. '; } echo '
    '; } function import() { $file = wp_import_handle_upload(); if ( isset($file['error']) ) { echo $file['error']; return; } $this->file = $file['file']; $this->get_posts(); $result = $this->import_posts(); if ( is_wp_error( $result ) ) return $result; wp_import_cleanup($file['id']); do_action('import_done', 'rss'); echo '

    '; printf(__('All done. Have fun!'), get_option('home')); echo '

    '; } function dispatch() { if (empty ($_GET['step'])) $step = 0; else $step = (int) $_GET['step']; $this->header(); switch ($step) { case 0 : $this->greet(); break; case 1 : check_admin_referer('import-upload'); $result = $this->import(); if ( is_wp_error( $result ) ) echo $result->get_error_message(); break; } $this->footer(); } function RSS_Import() { // Nothing. } } $rss_import = new RSS_Import(); register_importer('rss', __('RSS'), __('Import posts from an RSS feed.'), array ($rss_import, 'dispatch')); ?> wp/dev/wp-admin/edit-attachment-rows.php0000644000106600010660000001022411004374210015461 0ustar $column_display_name) { if ( 'cb' === $post_column_key ) $class = ' class="check-column"'; elseif ( 'comments' === $post_column_key ) $class = ' class="num"'; else $class = ''; ?> ID == $post->post_author ? 'self' : 'other' ); $att_title = get_the_title(); if ( empty($att_title) ) $att_title = __('(no title)'); ?> post_status ); ?>' valign="top"> $column_display_name) { switch($column_name) { case 'cb': ?> post_date && 'date' == $column_name ) { $t_time = $h_time = __('Unpublished'); } else { $t_time = get_the_time(__('Y/m/d g:i:s A')); $m_time = $post->post_date; $time = get_post_time( 'G', true ); if ( ( abs($t_diff = time() - $time) ) < 86400 ) { if ( $t_diff < 0 ) $h_time = sprintf( __('%s from now'), human_time_diff( $time ) ); else $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); } else { $h_time = mysql2date(__('Y/m/d'), $m_time); } } ?> post_parent > 0 ) { if ( get_post($post->post_parent) ) { $parent_title = get_the_title($post->post_parent); if ( !empty($parent_title) ) $title = $parent_title; } ?>
    >
    ID, array(80, 60), false, true); ?> ">
    ID))); ?> ID); ?>
    post_excerpt : ''; ?>  
    ID ); $pending_phrase = sprintf( __('%s pending'), number_format( $left ) ); if ( $left ) echo ''; comments_number("" . __('0') . '', "" . __('1') . '', "" . __('%') . ''); if ( $left ) echo ''; ?>
    wp/dev/wp-admin/edit-link-form.php0000644000106600010660000003513411020067237014254 0ustar '; $nonce_action = 'update-bookmark_' . $link_id; } else { $heading = __('Add Link'); $submit_text = __('Add Link'); $form = ' wp/dev/wp-admin/link-parse-opml.php0000644000106600010660000000334011014735077014446 0ustar 'link_url', 'HTMLURL' => 'link_url', 'TEXT' => 'link_name', 'TITLE' => 'link_name', 'TARGET' => 'link_target', 'DESCRIPTION' => 'link_description', 'XMLURL' => 'link_rss' ); $map = $opml_map; /** ** startElement() ** Callback function. Called at the start of a new xml tag. **/ function startElement($parser, $tagName, $attrs) { global $updated_timestamp, $all_links, $map; global $names, $urls, $targets, $descriptions, $feeds; if ($tagName == 'OUTLINE') { foreach (array_keys($map) as $key) { if (isset($attrs[$key])) { $$map[$key] = $attrs[$key]; } } //echo("got data: link_url = [$link_url], link_name = [$link_name], link_target = [$link_target], link_description = [$link_description]
    \n"); // save the data away. $names[] = $link_name; $urls[] = $link_url; $targets[] = $link_target; $feeds[] = $link_rss; $descriptions[] = $link_description; } // end if outline } /** ** endElement() ** Callback function. Called at the end of an xml tag. **/ function endElement($parser, $tagName) { // nothing to do. } // Create an XML parser $xml_parser = xml_parser_create(); // Set the functions to handle opening and closing tags xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!xml_parse($xml_parser, $opml, true)) { echo(sprintf(__('XML error: %1$s at line %2$s'), xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } // Free up memory used by the XML parser xml_parser_free($xml_parser); ?> wp/dev/wp-admin/edit-link-categories.php0000644000106600010660000001106511041132661015430 0ustar %s category: this is the default one"), $cat_name)); wp_delete_term($cat_ID, 'link_category', array('default' => $default_cat_id)); } $location = 'edit-link-categories.php'; if ( $referer = wp_get_referer() ) { if ( false !== strpos($referer, 'edit-link-categories.php') ) $location = $referer; } $location = add_query_arg('message', 6, $location); wp_redirect($location); exit(); } elseif ( !empty($_GET['_wp_http_referer']) ) { wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI']))); exit; } $title = __('Link Categories'); $parent_file = 'edit.php'; wp_enqueue_script( 'admin-categories' ); wp_enqueue_script('admin-forms'); require_once ('admin-header.php'); $messages[1] = __('Category added.'); $messages[2] = __('Category deleted.'); $messages[3] = __('Category updated.'); $messages[4] = __('Category not added.'); $messages[5] = __('Category not updated.'); $messages[6] = __('Categories deleted.'); if (isset($_GET['message'])) : ?>

    add new)'), '#addcat') ?>


    add_query_arg( 'pagenum', '%#%' ), 'format' => '', 'total' => ceil(wp_count_terms('link_category') / $catsperpage), 'current' => $pagenum )); if ( $page_links ) echo "
    $page_links
    "; ?>


    $start, 'number' => $catsperpage, 'hide_empty' => 0); if ( !empty( $_GET['s'] ) ) $args['search'] = $_GET['s']; $categories = get_terms( 'link_category', $args ); if ( $categories ) { $output = ''; foreach ( $categories as $category ) { $category = sanitize_term($category, 'link_category', 'display'); $output .= link_cat_row($category); } $output = apply_filters('cat_rows', $output); echo $output; unset($category); } ?>
    $page_links
    "; ?>

    Note:
    Deleting a category does not delete the links in that category. Instead, links that were only assigned to the deleted category are set to the category %s.'), get_term_field('name', get_option('default_link_category'), 'link_category')) ?>

    wp/dev/wp-admin/images/0000755000106600010660000000000011051167753012171 5ustar wp/dev/wp-admin/images/logo-ghost.png0000644000106600010660000000156010733156345014764 0ustar PNG  IHDRDz5tEXtSoftwareAdobe ImageReadyqe<PLTEOOOGGGhhh{{{TTTHHHqqqQQQSSSyyy[[[lllnnnIIILLLMMMbbbiii]]]KKKgggVVVzzzaaaJJJ}}}ddduuukkk```xxxsssNNNfff^^^PPPXXXjjj|||___WWWeeepppRRRrrr~~~UUU\\\vvvtttZZZcccwwwmmmoooFFFg"\ IDATxڄSgs@ ]p {BBH#i~S}zbxz9(J.'3IDCҩlUBXLm,ҷZe]e>jhwVpMŬ$_Pxpq8^7Pĩ)N| I#dcPh{'2J,:D;9Dʍ1k63D4Y>7*QWme$Ko`1$g6"&@qjVP`{tð9e%$$:kc_7jY !ub٫/h)s25 PDj4k=K" @7*oJAks8ӧIs7qjj!v!̀0@bK?3JAmG(lТ֘ˉbio6#{'ul-](5U`fJD,m.Km8+9b3#eZJ!qTUff曛>OjH3?%dxtr~ODfREȿt1+Ca 7nejf93)#! %#j`fZkx!l68*-K:BD[kM)3ފȯ?mmZk qԔRDW i8 D:u]79єc1Oa2IDr"̜s@AoZGmM O k$ql+HHJ}M֛g{W!D׏_Z_E$EB9l6C nTfH.*c{3[,Spb$UuZBA5PJH$c$`f!U󜳪P.jrhTu\.I+lJ{#H:ίs뺇YiQdfRl!eHy YIENDB`wp/dev/wp-admin/images/logo.gif0000644000106600010660000000232611014317653013616 0ustar GIF89aABŹtttiii]]]RRRFFF!,AB di,L.1tmb`,@caHa"ҀrdB(rp: [-cdiShmsҷ@}' lA> b" x' ouF#V= A }h>#A = =>"= iQ>Zӗ ͱc=1#5V&5{ pSL"u"%PO*   _LX*'0 A> P,B1l"P$ l$UB*&y8+f?GLTűV 3bj,\J+bm'Z'4RCԕV!pz@,PqԀdRjF>`Uի+fL|kj/ZXUAx&a" tv@`&BIr' dyV]ػ xS(լϳn?\*%b@v1(B>@v*@ at85JgwƢ|a3'"&o8f`l>ŔI#;D)FR\qh7Hf7BoUL}lG!A T2,&;\ÜE&AaՍ3y(iDaaVN<'t剤Nt΅ɥ@_\'Gm7$+!! ,w Ie9*, (*(B5[1 ZIah!GexzJ0e6@V|U4Dm%$͛p \Gx }@+| =+ 1- Ea5l)+!! ,y )䨞'AKڍ,E\(l&;5 5D03a0--ÃpH4V % i p[R"| #  6iZwcw*!! ,y )䨞,K*0 a;׋аY8b`4n ¨Bbbx,( Ƚ  % >  2*i* /:+$v*!! ,u )䨞l[$ Jq[q 3`Q[5:IX!0rAD8 CvHPfiiQAP@pC %D PQ46  iciNj0w )#!! ,y ). q ,G Jr(J8 C*B,&< h W~-`, ,>; 8RN<, <1T] c' qk$ @)#!;wp/dev/wp-admin/images/xit.gif0000644000106600010660000000026510737035623013467 0ustar GIF89a !, bb0EJ",d H00KA(L&BB0DR!$ఓgJVsPH4"sKAn೏1*NJՒP,  ;wp/dev/wp-admin/images/yes.png0000644000106600010660000000114411035303340013461 0ustar PNG  IHDRa+IDAT8]HSa98[jDb4JֈĺK$( ҺꪏnBȆ6-Ksu,)6t45u;{Dl\'ZHtPn_2gVvv!c $kD2d߭Í:%!' p?x< _Fr'* a}=2>WU忉Op1Y/ &f*ԒLG{`C!Փ?%:~4ހ^-! G#hlD}Q.KեզŤ'YqWS=tHYs䲭= :B#$&8pL8 ?,QOѪsg/=poL;A.KJ4Ovj/1b tMIK[ؑbx Wj"o!M`2t\}̩\?P<OJqv=vYobf$RWqjyxQ2{K§Y_+5K RwH9]doi:R6dI?IENDB`wp/dev/wp-admin/images/comment-stalk-classic.gif0000644000106600010660000000211410765660031017051 0ustar GIF89a@P'>N!%&Ga&Ga&Ga&Ga!,@P0I8ͻ`x dihlC,tmxq * l:&oJZgv%p -ޫzr+=~ߚ:sqstww|[Ifk?!MT,9 '4Яߝꥺ/dg@L 0! KE|X(ĉFj_}mѧ.˟{?~F`b2Fa_va]օn]ՅU jP HXJT6]2JL2$hӎ8Ў<^EDDD:"H&YCeQЕSRiN.;WJ!O蔉zWYh2&s9j9geBsbg:~ei&@ڣa)E"#*餎lʨlxЦʧ$ꩨBj: *j+VjkG++ł+>*=e$Vk-}mt{Ӹʍm>;nꆖﺦkZ;T <Uz1e[AUVD2[ 5\ Բ/2--r/{͊,rρ\"ݘr M#-Ґ9#Ҷbr6XG7_5_C3g gvavvjm7sv+wmw}7YyG8}/x"_7q~X_9y;7%[~yd. ;wp/dev/wp-admin/images/loading.gif0000644000106600010660000000474211012411571014267 0ustar GIF89a! NETSCAPE2.0! ,///vvvd uBz4q@2,,F@( ;cKJ0(&$`fj0PhQ( B+Q\%Sr=0(FS A GKv E  Z$T 0#]# Z! ,===sssu귂z4=L#0 6D#0@Ƣ0hp.`0 M$c{j 3@X JI1 L'G4LB U  }NxO X` ] c54 Y#`#F ]! ,999$uzA0= >>ooo$2u {4= aă |ʠ̀X(1 M$n8 ؀pTۂVJ0S<|_   H l o5]Z jN b ]#NQ! ,???sss$2u {4= aă v2.FX(Eax,Ii L @o=:D(N D?A* t H.: CYa ^ ]-WOa#f#u ^! ,...ooo$2uz4= ă @5F X( H &qb 3I$&ش !((A,    H._  W( \$!  1!#_# \;wp/dev/wp-admin/images/browse-happy.gif0000644000106600010660000001045610304136202015267 0ustar GIF89a(MMy3Ȫjjj44mmRRrS 9Ұq$$qqqYY҉݉{kffxzcLLHHJJvv<yy!!((aamuznnn}}<<\\8섄Ɯvvv99EEAxyyyaaɥ8811~~~ĽAAVV--v__qƺN䆆3뮟kkkccvqi}~}zGGqq///??|Ɵ[T񰳷FnᾍK7ߪP@a*թܿ~ ˆ+68q|:9”lX,o_Ο=o},cIаI~-6۳s֍{oϖJF8Ms͟K_IJ$ߣOˣ_}ID1R0EPҧIU>H#Q ? ,A8 N)+C?#蜉BJ$B)#x$ '3䏳 0#BxdF8Eϓ"?E.I% >OAψ8?kf'%I&Pj:J&J$'I衆:i@ 3LEꏥm2饕J*馆>?xg8✪jP $̺&&h(X+첗Rr*:b;%ZO>ُ>?> #,&BɞARS. )2o 7,PX O)qOybdJ\(TBJ&|-?l#dH&R t$"J$HwDG}Q-uX_\g^WMcs|2*B ?hڎtB+J#T6͙h$Ȳ(j?kCSLGg枇l&%q8s#,ȩ)%r,;;Bbw`*QN|D?`VFpb ]\␰xr\؁ LIKS2Us*G q,E**AV4@E(7щW4B ,h( *~aX`8@A8`HؼGsT#0?Z+Mp*1щN#2`h?D#J `,D2ā V셫X[%2 {0|bVQ u D(E`Ѐ"td"Ѓ+8t( Y 7X8x69txD(^ `]ڑ#X8B0mH0@YDB!$6QVlt`G(&%ax@z ;08i A@x?^p 25  3xW_6&qx"D@ HJ U+hl.@ d!ȼ!%怀ABhFA U JLwAذCA8@9,(~@ 6a N6daه)g@U' '0\B ##8%pJ P@ iG(9"c 2 e8Ρ&` p`ܐ Br=]G`"D, 8 &FQl;v&' Mԁ:KXsw+la \"YsPs2:0K`&-OA9_ ZT!P|ЃЧ?! 9H=H45xQuC"pp?Pdf P0 p i @]@P 0_`Rg|P` Up r0bUmDw'H@7Ht@k 7 zXtd=&vM0 {p 0q@ g@F @ `l -# b AHCp^\]NH00e0o=d F@u @ pvK <@^`p 0 &u g@' 5F,g)pXtdf&dujR0yP 0W6k\0pj@6@^ @Aa6ZG– pƒ! m X1 spKp BYPCy| G@Kp E5P PApp5P`Q]ptey aM /PD;` jI!" ˅ 0 qG 0h4@ CD}2K ` `Od/!NXX[`z O` "HPv& ` `_aB  A D 0 P pZT FԠԜgHI  Xd -{L%#a SyH x/ C G3>GeP:HH;Ev:ji  r UA  7`B\ZvzxU2z0z0lP ~ʥAD9A+Kz@}U)  @gJ3@r::%@P% zP0` B gA< ?!  @! G!޺) C,`79 )p?:Zz*PJ!@ iZp 4P4!C0 )@ ;&{(*,۲.{:aJ6 {8:;wp/dev/wp-admin/images/media-button-gallery.gif0000644000106600010660000000011010753776325016706 0ustar GIF89a !, mRp3FB{vUeeR@;wp/dev/wp-admin/images/required.gif0000644000106600010660000000007611035303340014465 0ustar GIF89a!, Jgg~{H&;wp/dev/wp-admin/images/tail.gif0000644000106600010660000000014210766777420013620 0ustar GIF89a!,3fsmn}#Y 番gkqfaS<"B D*;wp/dev/wp-admin/images/logo-login.gif0000644000106600010660000000616010756670765014746 0ustar GIF89a"BFFF%ѢtttRRR]]]󹹹iii藗֌Ůw3iN@兹\Ÿ$FGGIGF%i2[!,"B@pH,D)8€ZجvzxLN("zf"yN^;TELk{V Z CjHU}jZ D mj B  Р ۱r_ im D jC78ǰ3IHCHǏ hu9\2H! 4{-sssHrsΣH$@/&PH.U:}j1B]^9;?\-7v@wBLwAw#RD&E!EM3 ab25]qeP{wYeZ^'?X"7 e,l&;Ex~J=Tk 5U4z"A8Д'f9zpPXA|GI-f&Sc0N80v[/ԙ'TnaFνj*0[ϓK~, 2*,LW& xBP`y#P@1^d+eB2|E,"xJHQf:" }iFos27 +gs5cJDBK2 9ғ-j|Cp>P,q;PP2<Rlaf;QVPq5*6 FA pSGU/[Y֗b\]CK gOY{eV@!&E̬} lP)`in L}B"d#O؟icmdIYp@q[W[5MC]pzӴ3뉓 -T?OZ]LH'##`eUeh 5<( Gv!iLNq>}/B X `_8]"frhwG5,B &L"[jmVаe4EpP5Ӂ&_Q uQyfx!;cV EDJoԺ6]EMys#K : ,}[4Jh=s< \-J0n)h"ϩ<,&V) ~<ܝъ!or0Y ~U|FEXУEjtf(J,>bI HI]5u{ ,`ށ+XF'-?$¹La_+LZ es.mfwWQ$X y`H ؀xS wCRE%Y`&vKz][7*'ҡCPð{i C#9۱~/x0Ђ\D׷fV8 ~ 9^J5߀?vdAPgRf&Eje8pRO]F@wF0 nPW (p78Ј1lH?hY0A X+m DЉ؊d0:Mb-0*ኼxpU1Q&BՋH7! G`m A L8 p@ aXH{!7h `T8 y[J\d F 9 0%YFF9vF3Yr;wp/dev/wp-admin/images/align-center.png0000644000106600010660000000107310741101145015234 0ustar PNG  IHDR8< pHYs  IDAT(OkAūkgc"݋~ ®1$Az$%$tUк?+ T{ ȗ$%@d($C `f9rQEN,qSڂc雏DU{_VOnp9J~ RsMvEϋp}a8g">=fp'SSe"Oft@9WtvMD9s"]B׮z_xK@2 զS7݋1yc@D\TP;^|M&g`}noX"-Pj׊t m۶mss>99SucAJxQFя:tvvvW?ڇ#t*"MӔ+Ο32pttt7?f@d.%_U=SSz|B9u's;ǫbIENDB`wp/dev/wp-admin/images/wordpress-logo.png0000644000106600010660000000443610756407545015703 0ustar PNG  IHDRD tEXtSoftwareAdobe ImageReadyqe<cPLTE\\\$fff™{{{ppp[̷2Mv˭儺i?L4!tRNS!$IDATxٖ: E fL ɲCWU]Oq;$Ŷ%Y8-EEEE@tJ$UL?]&n M+OV^&;=Mqt5$X,e=av[[J [EWE5* [:Ed6UNJjO"z%~Y{ɵa*seņ]Y6Kj{\͆"B/: yVOTI!6?_ӛ,SAWzg#ݠKЫp 'F+=kLc2őDl]2#igXR^] h>1Y{}ﶔUFT^Ž\j]w{}߾?땮s7SDY>{.`VO$0w3PI 6G2= #3 >QFj4V|:Xw0e3wX3&@7^=S|+n@gbݠ;fW#y:߼CË>5YԻm;=V"~sxgooPjwg;);V0k!w"_0"^v2N'뼆n=L{~e\4N^nv% b@I#7oEX_}]gƽlx'҃O&NW @'@KBHHi͞/@s^ݓw0{9o஼1Ũi$tWIA9ob #nӻ5䝤;zN ?</=1}suST7po+YbtT~z W>{^ngi ]r)Z3볧2@o>^@=#@Gߌ@JяЧutgvBRJ1 Do d{蘭 q߻AGoN{]Nn>g%w bVT+ G/"WK)^:b+T~GWgzzC=}}dbxWyN v֢[iHV`q“G-}*>]4z]g//qp +ayF{J)0 >Aŗ R~דݘtp]2W{*P ]}pu WҶes>Q9%˕fO=@t\Bѻ;(ks֠Is"F%Nk )F5Q7t♼9usl@lAHx2u wX۩Vy.Mf~JzjUɰuԸW|L .r{E͊ycttW'-b lN#OJxTi>m,_\_a6 d#x1\a%۴/xx-#q)=Ӓ6O 沠 g4V\@{3S9Lw~O6O}q{YwAbɍV,Wg#WepwRP(4n *EP rLD^_̓ρW sϏ#z |pӁwIL)zI^l8] ᨑ]|"#`sLh*7P`ޢ:\rrEv)ccY7A<~`?}+h^6+O-i]eսO{ Ί5LFv)sx486hE q@?sd&@rK܂'XqW½֓V|_X3(Sm=_NU]^pPTDi jĆ!AEal_* \1qPϹSʀq9 C|>"8" fb>xYIENDB`wp/dev/wp-admin/images/media-button-music.gif0000644000106600010660000000027410753776325016402 0ustar GIF89a 穫󟟠ɸ߰!, 9 $B J`<#L \K$]3ñp<`#6d:;wp/dev/wp-admin/images/toggle-arrow-rtl.gif0000644000106600010660000000011010770235143016054 0ustar GIF89a%!,a {lE6)9޷#DA;wp/dev/wp-admin/images/comment-stalk-fresh.gif0000644000106600010660000000205310765660031016541 0ustar GIF89a@P%&GaN!!,@P80I8ͻ`xdihlA,tmxq * l:&oJZgv%p -ޫzr+=~ߚ:sqstww|[Ifk?!MT,9 '4Яߝꥺ/dg@L 0! KE|X(ĉFg`];mڶo:xৃ q7+_hzУ N]_1s]5g.}.DdxVP(`H*V "L@MhӄaOf!Gv#8S$S鍣bF0>hэ4Xύ8V#?@2@Nd,ϒ,XK#R2)JdNuIMRdF&sƌf%;Y*@Tx '1Ss6)ފ5Af(O7o0Z6#}$ɞ7K-[ S 0bhAE;.h* a IDATx}yU餳vH` Y@EM|p8(.83n<EEGa㠠|qIBB Iwz]k?}ߓs+tg{[ԩ.[c ;w^`AUUHY!I@UUaPUeee% u]L2dc գ`QJȑ#P1MDfCy ǂjk„ ݦ:^`8b{ni6' \k <7L$@v@&IZZZPYYyJuWY/+ O7iq ˶O>峟\=8$ 0p\JUUP9==7#VV]U*dY(9}!`'-%Ǒى*=$ƛnsOه#Gpeb3!ķ-Va}p@,> #SEOΧ%#c!\ׅ"L^$[tT\$IhkkC:.:7\\+D=%y`ك" i?7xu ĶzRc]Ai?FT*//svQJk[L[ǝ1ƞR|iUUk.?'8_N|x>t&LpJ(% ɓW^Aѣy< sHѲ,CQ#N`8 Oz+8 ~s==rLlll<"z%Smwcc~ -1mڴ'<۰HJB*$Is \}|41cƌ ﯠoD_̰U@޽>6lXqFf ø>L"oL$hiiAww79sdٻ/OPeڬYƹ Q MJn\ 4, `՘>cF(f͚q׮]gY|4~޽}}}e-&!/2G,ܬ#il߾ 'Oa5k֗5M( 8qj LBQxl6S@VRD&n,H}Ghkk?A̙3Y@$5M0"Dǎ9D%0L8tqB.^)) @?݋K.Ļn< 3(++Ç?aqN"Itvvv(_|Co?%Eli~ўqymevIԫ5gx< U<r?-K"?!eee ྑ.;0vqk e]V:mp饗>1nܸͶJ4r9:t}}}D}+nDH'EA>k={`Ř2e |Q?OFԖy(//G,[WXЦ( dYX/++Þ={ǡiٝNW޽a…Esn8po&ϟDMM f QzGG> ۶Cs8m?3HǁeYHB:溄a J᷿-.@mS(u1ƾB#"( ^yH]G%af0 i{Lf>{kc}:VZݮ#Yeee(//=4.PZ[[ˑFO"$)eH$b $ D"""8/z8<'~uԩr$=MӰ~=zs=I6(2e Wɢ ؾm8|0v؁n` &O`q%)?/%`/2GؿzIɉir"8o@H'*@dYF2ܶuEz+f̘9@u9r{N |>z̝;Xk$m ahh||,0 !#pPUe^֭[3\fΜիWs A,`+=^&I/XIcrxF"$ \{4^Le H Fekoo_*"HQ$I0 ؽ{wG"޼y9s&WEAww7qrړFcc#NʉnٲeÆ %aرc(zkfׇ Q NkӦMXb \pp,aOO-Z'bhhiy7|q\ve:u*lۆioN> d|!8z(݋J,Yd2hhh5k~z$Ib1A0/MMM}eDtA<+z)S9A>/+W䉧T hT|={c۶h"n7[nEOO(|߇(, Lc̙hjjB:o~̟?\s rjkkxꩧf fY&M.X1144˟ Ks "R)l޼~/L&H$BgЀ dY.u]GOO:<"yaʔ)fPU;vCaX.Xcc'L𨪪?Ohhh@cc#ZZZvtt;v|lÆ hjjœ9sk.n뺨{0UTT[lUQVV6cp~Di..lJX)p__A<TUiݻyRgsn:eYSUP>&{#m3Dt H$044X uuu,AJc&a|R3f6;v x?<}h%˲#琨V ~VWWc݈FH&Fd2Xp!&Mĝ5ݻg"L!sPc@c̐$AD|߷ `awyeY_~[[jkk!2zzz8Ӡ?H,477#HW_Eoo/֬YzUU۶rOx z rˊ^ziSkk+q1?Ǐ,Xp!6o\kommży.t0yq^z/ү 0H11f$I3Ni ϩiH?5{NN /"Hwa sS&0 u7`ժU*++g.y+q֭f8t.P[[!:ۋqIB`(5-FTncEaedlH555P8F:.,Q$ L˄D"]׹@ ԄiLO:]r%??xmau]tww,cg ƀ#٧~%cDsE]]EqKs)Ȳ c"y8STQ,SGMDG2 IL&aLy{E_AKE YÄ́ nsX $IH$(++mhƕWzrdyR^z}'F- O ۿęR!B@uB/C`6t]G*B}}=t]\hફL&tiykƍ~``oL&IE E]|oIBevlxq?Fbٓ%"LrBHqsq ~$ :$ AZL0?lڵky=4˲y۶2UVV|>2},#WpmӘHF:ujc"S)ᚦq(`F&4\I: yM,z&L+WrtX"C,J ;zsFõ<[xH4 $Ĕ;1:.aOS{v"TU=XJĊu .Ν;aYfϞ]TwJăSxA²gk4p y@㤪*_3!˜~(FEqMIDiODB?N"xl'8硩 k֬N>tnr3R&ia8K^jr^lZ.IRqdYfappl'NDKKKQ,~$D1 Bit Q9-T*UsJqF#i%EKT$%œ)΍$ Àip] *l|z֤IpСg9Ey\.z I4*':k i.p|YWXDbnae04GA0Ԛj[+(NOcH&%q ax@4o@@)bZ?qB DpQ߇0J?c ,JH1HJt]h^Dbi/&tq9>(H$}/"4M4y*{,oT?x?dyqT2`p&mGywq?>$L`ؤ 6 }G4-4M 4CGL&AMRCyy9 SE!\|k4" @Ki`5mx$d /='QYaL`ю>!3@|v|ACpyD"= DQͶ')!H4iF @YY"H"**kb5 "3٨]M$ç?R0z[ZZ.8:B[i`V%I )Fee%\ŤIpȑA[3ѢDyA ;:88ȥQ]]Q iG `\.`321m\>X_|/*[Cp>VQvHUUU}hHs]555003>N! "}?tttRyPN$0|<^4ROؼy3<ϣPtQ{4mL4 !IR(Eïk[opkb@ @.nZʘ.ő_3Җ|ߏ,Ydꫯwڅt:]TX`ZtR444@|Ckk+:;;yRz,4Q[[ɓ'$8.eXd_ ƤIe$eI9UM1sog4 J믿j,pi|MT8;~/.]tkնoߎ~ ,#"({?>8ёD+xG*B&) D54M_#ICXǏiӦgu+h* %J"$Y,{1^HloLS@8dPʻE,$D/_>x7j/2$ϸI@J׶mӃŋK .IzH<Gyy f }G&)_oݺ{5ږe/ IDAT,Xv~ R ))4#yZ:qn}?jժ}ڦM˃Ab֑؎J$cǎMMM5k/H\Dҁ ̵!PoKK vڅ!vt~,*y*o} X.0 af$8/fH׮]@WWpSUmW_Ů]0{l444 '&'4ڿ?_m7 KsȲ̿?twh=СC*t]Ϟ-Ʀ; 4-TZUlٲիWCOO"H N RIaŽ;wD}}=Ə^& b Zr\/0/paسg|g>̴Ȳ<[W90&%GݱgŤI)bHFlzdQF'r*Om)M >,ö<A__n8O|E~d#`ppmcy_áCk.#eHd1?FV :4w a`5tM(sHSx[ٶ]x?яf78 _j_Q4t+>_oΝΒ-K:~$V}?B6h15Jt@& H׎r]CCC\lR}~.4:뮻/~?0?F16#f3pE$2vmPţ>q̙7}{`jC/%D"8vvqqƌPlr5b"K!7`OGGǾ+bɓy&)<ܶv-nfHDZmt?l""\/@ oWys=`Z[[y"9|/nSe bkfF"~+ؼy3Z[[H$8!F5sd9^ ѣؽ{7y^W_cl͟g) MT G>^ַp},//$fD7tz 8-[<}ݸKuDֆM6mc-}_&^UUap۶mDM,'.ݍd21F+h}_iӦgx閖qx{ߋu{]YQQwOJ?̑OmӱdM/^o?~---¦MXLs&- >Z)TX+xgLT$ L&y/Fd46\ulܸK4 gw _ױnݺuuug^/rQSEC",Zh;6y{<_,Qql2ľ}x08<TtBBH:F?|rP^rGټy3/y{}ݷrܸq_~9><_ .: IPٿiٲe}횦]&g.Bիqu^C8x ^z%[T-L""H$UVK.̙3~TUQ)(ϯYn݋D⚟'WVVr䟫qd2xPL>я~T.œ '&U<̞=]woǾ}xpG } B>Gcc#z!lٲB( :^?4aÆ$'mΧw"L3g%<Sdm+kRF`i .,L&2>GS!Z46狁I\/詤vh*} EG118R Ҕ D/ȱb=!"DFK$Ȋ2\=y?qL>nf-x6A$VrVŒXEČũ1".2m4bGD ++Et2/B$Q>V$)L`LӟbPtlN e'K`!e,"W,S|z!YԂ2+Oa CW_=ŸԧxSi"? Bٲe[ux۶q7cn#c0WkIHM%K,Dh]+q"15$5ESy\BGsc{兜F"Qds,x嗋>JeSÉ4@dykkkDZj* <ǝ:GܹW5L+$-=OB kc H2i'?(qr8f qzİtRDQ"d Bϱ7r 6oތeURW^'v m-rFHE$$Irx3e aڴi:?D"xy`N8T?] /`ݺuEQғ976qȭaBQyu``n(͋>W8S;d!36`!E\ttj[$<"_n:8iF0p &8{)q;L`=y^i|~. p!M{{;ETjlN_YSIs.Fx{J j3,$KI&aٲeȿ/$ QsEq2f\  API,lp`$Ip`$BP4]xlF>ǜ9sdy~o8P/B)"@ 8.Ei-++,f.\s^:Es󩸟"ӽbrh))!2ZZZ@tD*6/E#xL+0uu],//G<hjjfxjox,oOO @yy9\E[[}},ow;]/8E "h __aY_z]Pt]UWWEo>nj3H$ZBDo)~~@ee%c8|0 ^iFLD{眏h`ݺu? DRӴ&Mjr9dYL2HR!|a ~``B$ |˵]i1c***/a}db<܄ *ۇ#G@UտU)4F/~hmGw sAee%R$빍.N`lp%41m4{0 㛚}0 }d,o[ ַkjjjjjB<G2Dww7jjj/*# $"`وF8pك\.nĉ_>wa^,۞~5cƌ5-B$Agg'PYYYH A 4M,\eeehnnƎ;̤Iկ~كǥΕn-Zd(Gرc(/// BXWuK.Eee%ZZZ+`߾}/< C{ꛌŠ3X /v!B$#t6 (f|?Dht;̙37JB~*&Ii555ī~zB @Ai #W3'ܑ~8P Iq`0˅Ľx Kq |&Y_~Xh D{>waĉH&ؼy3455m%E워bą9M(˅Ή}'~yL`J !OD{ Ä10zD">SO._txi=W^ _= ˲hPq\28r""ÈKKoT (gg W *N$E8/G(&"Q' ip9{m'-[裏駟H&y LI Ƙ"˲HSͮ9{^x"RzEATa/+">FEQTYUY5EQ4YuƘ3Fc&A1TƘ&I*Ip%$I}ZD)cV:>O]v?!lƊ+~w^<ذaw:;;l$IE  A ba8$$F-IR.1f}߷$Ir]uc϶mBzPmaLJH啇~xruuvϟرcG~ww7aÆ O%ɖk4MS $I F$_e[`X<+(A$I,ˁ(LQOQM$W44MIu-7bP=abn݊gcA1JĹYԐueJ*{{{~9CCCdt:mr9=˙뚶mAAHr뺴wGsG\e)lVfa Y1u݈QXqD\׍}@ @ r,˾,ˎ(+ 9(JVUլi)IdYΫjɲl˲gyi՞idǓh(\D8NQ]8d&|V uIDAT>* (XUUu˲ ƘQ@|$3]$uT /8n\Y]I,EQ,EQ,}wc$I^$cnP[[Ӈc؈ꢋ.A@Âgz{$mܹlImˌ11&. K( /, "H=EQiA2Dmm-Od2J$ɢ29K!\Lp`M)E Vm}((E›ņRp۝%(s<IENDB`wp/dev/wp-admin/images/bubble_bg.gif0000644000106600010660000000061310771375647014576 0ustar GIF89ad&GaiN!%꧐𿿿d=3̡jgΠ4SkȺY/@A^uuャwN!),dpH,Ȥrl:ШtJ.X쁙ł] k)f6Ӓ~DL 'MNOPPQ&L#MNOPP!{ L$(M OPIA;wp/dev/wp-admin/images/fade-butt.png0000644000106600010660000000142110304135300014527 0ustar PNG  IHDR(*gAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE 2IDATxbpP``"uf Rg $`CM888 eueeeuA]_J]JL]_LDE#e@ <<@GBGH  )f@ |||||V|Ġjh(*i*) dĤjĤdd288CIbT6UV䔖VV0V4 'AAM{A-AM-A%%M-A%bbbaab KE[ |*@X @a U VA*@X @a U VA*@X @a U VAKv%FUIENDB`wp/dev/wp-admin/setup-config.php0000644000106600010660000001413711035437745014051 0ustar The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now.

    "); // Check if wp-config.php exists above the root directory if (file_exists('../../wp-config.php')) wp_die("

    The file 'wp-config.php' already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try installing now.

    "); if (isset($_GET['step'])) $step = $_GET['step']; else $step = 0; function display_header(){ header( 'Content-Type: text/html; charset=utf-8' ); ?> WordPress › Setup Configuration File

    WordPress

    Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.

    1. Database name
    2. Database username
    3. Database password
    4. Database host
    5. Table prefix (if you want to run more than one WordPress in a single database)

    If for any reason this automatic file creation doesn't work, don't worry. All this does is fill in the database information to a configuration file. You may also simply open wp-config-sample.php in a text editor, fill in your information, and save it as wp-config.php.

    In all likelihood, these items were supplied to you by your ISP. If you do not have this information, then you will need to contact them before you can continue. If you’re all ready…

    Let’s go!

    Below you should enter your database connection details. If you're not sure about these, contact your host.

    The name of the database you want to run WP in.
    Your MySQL username
    ...and MySQL password.
    99% chance you won't need to change this value.
    If you want to run multiple WordPress installations in a single database, change this.

    error) ) wp_die($wpdb->error->get_error_message()); $handle = fopen('../wp-config.php', 'w'); foreach ($configFile as $line_num => $line) { switch (substr($line,0,16)) { case "define('DB_NAME'": fwrite($handle, str_replace("putyourdbnamehere", $dbname, $line)); break; case "define('DB_USER'": fwrite($handle, str_replace("'usernamehere'", "'$uname'", $line)); break; case "define('DB_PASSW": fwrite($handle, str_replace("'yourpasswordhere'", "'$passwrd'", $line)); break; case "define('DB_HOST'": fwrite($handle, str_replace("localhost", $dbhost, $line)); break; case '$table_prefix =': fwrite($handle, str_replace('wp_', $prefix, $line)); break; default: fwrite($handle, $line); } } fclose($handle); chmod('../wp-config.php', 0666); display_header(); ?>

    All right sparky! You've made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to…

    Run the install

    wp/dev/wp-admin/page.php0000644000106600010660000001231111050374773012350 0ustar ID) ) wp_die( __("You attempted to edit a page that doesn't exist. Perhaps it was deleted?") ); if ( 'page' != $post->post_type ) { wp_redirect( get_edit_post_link( $post_ID, 'url' ) ); exit(); } wp_enqueue_script('page'); if ( user_can_richedit() ) wp_enqueue_script('editor'); add_thickbox(); wp_enqueue_script('media-upload'); wp_enqueue_script('word-count'); if ( current_user_can('edit_page', $page_ID) ) { if ( $last = wp_check_post_lock( $post->ID ) ) { $last_user = get_userdata( $last ); $last_user_name = $last_user ? $last_user->display_name : __('Somebody'); $message = sprintf( __( 'Warning: %s is currently editing this page' ), wp_specialchars( $last_user_name ) ); $message = str_replace( "'", "\'", "

    $message

    " ); add_action('admin_notices', create_function( '', "echo '$message';" ) ); } else { wp_set_post_lock( $post->ID ); wp_enqueue_script('autosave'); } } require_once('admin-header.php'); if ( !current_user_can('edit_page', $page_ID) ) die ( __('You are not allowed to edit this page.') ); include('edit-page-form.php'); break; case 'editattachment': $page_id = $post_ID = (int) $_POST['post_ID']; check_admin_referer('update-attachment_' . $page_id); // Don't let these be changed unset($_POST['guid']); $_POST['post_type'] = 'attachment'; // Update the thumbnail filename $newmeta = wp_get_attachment_metadata( $page_id, true ); $newmeta['thumb'] = $_POST['thumb']; wp_update_attachment_metadata( $newmeta ); case 'editpost': $page_ID = (int) $_POST['post_ID']; check_admin_referer('update-page_' . $page_ID); $page_ID = edit_post(); redirect_page($page_ID); exit(); break; case 'delete': $page_id = (isset($_GET['post'])) ? intval($_GET['post']) : intval($_POST['post_ID']); check_admin_referer('delete-page_' . $page_id); $page = & get_post($page_id); if ( !current_user_can('delete_page', $page_id) ) wp_die( __('You are not allowed to delete this page.') ); if ( $page->post_type == 'attachment' ) { if ( ! wp_delete_attachment($page_id) ) wp_die( __('Error in deleting...') ); } else { if ( !wp_delete_post($page_id) ) wp_die( __('Error in deleting...') ); } $sendback = wp_get_referer(); if (strpos($sendback, 'page.php') !== false) $sendback = admin_url('page.php'); elseif (strpos($sendback, 'attachments.php') !== false) $sendback = admin_url('attachments.php'); $sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback); wp_redirect($sendback); exit(); break; default: wp_redirect('edit-pages.php'); exit(); break; } // end switch include('admin-footer.php'); ?> wp/dev/wp-admin/theme-editor.php0000644000106600010660000001334711031245072014020 0ustar '.__('You do not have sufficient permissions to edit templates for this blog.').'

    '); $newcontent = stripslashes($_POST['newcontent']); $theme = urlencode($theme); if (is_writeable($real_file)) { //is_writable() not always reliable, check return value. see comments @ http://uk.php.net/is_writable $f = fopen($real_file, 'w+'); if ($f !== FALSE) { fwrite($f, $newcontent); fclose($f); $location = "theme-editor.php?file=$file&theme=$theme&a=te"; } else { $location = "theme-editor.php?file=$file&theme=$theme"; } } else { $location = "theme-editor.php?file=$file&theme=$theme"; } $location = wp_kses_no_null($location); $strip = array('%0d', '%0a'); $location = str_replace($strip, '', $location); header("Location: $location"); exit(); break; default: if ( !current_user_can('edit_themes') ) wp_die('

    '.__('You do not have sufficient permissions to edit themes for this blog.').'

    '); require_once('admin-header.php'); update_recently_edited($file); if (!is_file($real_file)) $error = 1; if (!$error && filesize($real_file) > 0) { $f = fopen($real_file, 'r'); $content = fread($f, filesize($real_file)); $content = htmlspecialchars($content); } ?>

    (%s)" : "%s"; ?>



      ($template_show)" : "$description"; $filedesc = ( $template_file == $file ) ? "$description ($template_show)" : $filedesc; ?>
    • &theme=">

      ($style_show)" : "$description"; $filedesc = ( $style_file == $file ) ? "$description ($style_show)" : $filedesc; ?>
    • &theme=">

    "; ?>

    the Codex for more information.'); ?>

    ' . __('Oops, no such file exists! Double check the name and try again, merci.') . '

    '; } ?>
     
    wp/dev/wp-admin/post.php0000644000106600010660000001311311050374606012415 0ustar ID) ) wp_die( __("You attempted to edit a post that doesn't exist. Perhaps it was deleted?") ); if ( 'post' != $post->post_type ) { wp_redirect( get_edit_post_link( $post->ID, 'url' ) ); exit(); } wp_enqueue_script('post'); if ( user_can_richedit() ) wp_enqueue_script('editor'); add_thickbox(); wp_enqueue_script('media-upload'); wp_enqueue_script('word-count'); if ( current_user_can('edit_post', $post_ID) ) { if ( $last = wp_check_post_lock( $post->ID ) ) { $last_user = get_userdata( $last ); $last_user_name = $last_user ? $last_user->display_name : __('Somebody'); $message = sprintf( __( 'Warning: %s is currently editing this post' ), wp_specialchars( $last_user_name ) ); $message = str_replace( "'", "\'", "

    $message

    " ); add_action('admin_notices', create_function( '', "echo '$message';" ) ); } else { wp_set_post_lock( $post->ID ); wp_enqueue_script('autosave'); } } require_once('admin-header.php'); if ( !current_user_can('edit_post', $post_ID) ) die ( __('You are not allowed to edit this post.') ); $post = get_post_to_edit($post_ID); include('edit-form-advanced.php'); break; case 'editattachment': $post_id = (int) $_POST['post_ID']; check_admin_referer('update-attachment_' . $post_id); // Don't let these be changed unset($_POST['guid']); $_POST['post_type'] = 'attachment'; // Update the thumbnail filename $newmeta = wp_get_attachment_metadata( $post_id, true ); $newmeta['thumb'] = $_POST['thumb']; wp_update_attachment_metadata( $post_id, $newmeta ); case 'editpost': $post_ID = (int) $_POST['post_ID']; check_admin_referer('update-post_' . $post_ID); $post_ID = edit_post(); redirect_post($post_ID); // Send user on their way while we keep working exit(); break; case 'delete': $post_id = (isset($_GET['post'])) ? intval($_GET['post']) : intval($_POST['post_ID']); check_admin_referer('delete-post_' . $post_id); $post = & get_post($post_id); if ( !current_user_can('delete_post', $post_id) ) wp_die( __('You are not allowed to delete this post.') ); if ( $post->post_type == 'attachment' ) { if ( ! wp_delete_attachment($post_id) ) wp_die( __('Error in deleting...') ); } else { if ( !wp_delete_post($post_id) ) wp_die( __('Error in deleting...') ); } $sendback = wp_get_referer(); if (strpos($sendback, 'post.php') !== false) $sendback = admin_url('post-new.php'); elseif (strpos($sendback, 'attachments.php') !== false) $sendback = admin_url('attachments.php'); $sendback = preg_replace('|[^a-z0-9-~+_.?#=&;,/:]|i', '', $sendback); wp_redirect($sendback); exit(); break; default: wp_redirect('edit.php'); exit(); break; } // end switch include('admin-footer.php'); ?> wp/dev/wp-admin/options-reading.php0000644000106600010660000000707611007310722014534 0ustar

    • ".__('Front page: %s')."", wp_dropdown_pages("name=page_on_front&echo=0&show_option_none=".__('- Select -')."&selected=" . get_option('page_on_front'))); ?>
    • ".__('Posts page: %s')."", wp_dropdown_pages("name=page_for_posts&echo=0&show_option_none=".__('- Select -')."&selected=" . get_option('page_for_posts'))); ?>

    Warning: these pages should not be the same!'); ?>



    recommended)') ?>

    wp/dev/wp-admin/upload.php0000644000106600010660000001771211007310722012714 0ustar post_type == 'attachment' ) if ( ! wp_delete_attachment($post_id_del) ) wp_die( __('Error in deleting...') ); } $location = 'upload.php'; if ( $referer = wp_get_referer() ) { if ( false !== strpos($referer, 'upload.php') ) $location = $referer; } $location = add_query_arg('message', 2, $location); $location = remove_query_arg('posted', $location); wp_redirect($location); exit; } elseif ( !empty($_GET['_wp_http_referer']) ) { wp_redirect(remove_query_arg(array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI']))); exit; } $title = __('Media Library'); $parent_file = 'edit.php'; wp_enqueue_script( 'admin-forms' ); list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query(); if ( is_singular() ) wp_enqueue_script( 'admin-comments' ); require_once('admin-header.php'); if ( !isset( $_GET['paged'] ) ) $_GET['paged'] = 1; ?>

    post_title)); } else { $post_mime_type_label = _c('Manage Media|manage media header'); if ( isset($_GET['post_mime_type']) && in_array( $_GET['post_mime_type'], array_keys($post_mime_types) ) ) $post_mime_type_label = $post_mime_types[$_GET['post_mime_type']][1]; if ( $post_listing_pageable && !is_archive() && !is_search() ) $h2_noun = is_paged() ? sprintf(__( 'Previous %s' ), $post_mime_type_label) : sprintf(__('Latest %s'), $post_mime_type_label); else $h2_noun = $post_mime_type_label; // Use $_GET instead of is_ since they can override each other $h2_author = ''; $_GET['author'] = (int) $_GET['author']; if ( $_GET['author'] != 0 ) { if ( $_GET['author'] == '-' . $user_ID ) { // author exclusion $h2_author = ' ' . __('by other authors'); } else { $author_user = get_userdata( get_query_var( 'author' ) ); $h2_author = ' ' . sprintf(__('by %s'), wp_specialchars( $author_user->display_name )); } } $h2_search = isset($_GET['s']) && $_GET['s'] ? ' ' . sprintf(__('matching “%s”'), wp_specialchars( get_search_query() ) ) : ''; $h2_cat = isset($_GET['cat']) && $_GET['cat'] ? ' ' . sprintf( __('in “%s”'), single_cat_title('', false) ) : ''; $h2_tag = isset($_GET['tag']) && $_GET['tag'] ? ' ' . sprintf( __('tagged with “%s”'), single_tag_title('', false) ) : ''; $h2_month = isset($_GET['m']) && $_GET['m'] ? ' ' . sprintf( __('during %s'), single_month_title(' ', false) ) : ''; printf( _c( '%1$s%2$s%3$s%4$s%5$s%6$s|You can reorder these: 1: Posts, 2: by {s}, 3: matching {s}, 4: in {s}, 5: tagged with {s}, 6: during {s}' ), $h2_noun, $h2_author, $h2_search, $h2_cat, $h2_tag, $h2_month ); } ?>

    |

    add_query_arg( 'paged', '%#%' ), 'format' => '', 'total' => $wp_query->max_num_pages, 'current' => $_GET['paged'] )); if ( $page_links ) echo "
    $page_links
    "; ?>
    posts WHERE post_type = 'attachment' ORDER BY post_date DESC"; $arc_result = $wpdb->get_results( $arc_query ); $month_count = count($arc_result); if ( $month_count && !( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) : ?>


    $page_links
    "; ?>

    get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved != 'spam' ORDER BY comment_date", $id) ); if ( $comments ) : // Make sure comments, post, and post_author are cached update_comment_cache($comments); $post = get_post($id); $authordata = get_userdata($post->post_author); ?>
    comment_ID, 'detail', false, false ); ?>
    wp/dev/wp-admin/menu-header.php0000644000106600010660000001344011021555133013617 0ustar
      $item ) { if ( 3 < $key ) // get each menu item before 3 continue; $class = ''; // 0 = name, 1 = capability, 2 = file if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"'; if ( !empty($submenu[$item[2]]) ) { $submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index. $menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]); if ( file_exists(WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook)) echo "\n\t
    • {$item[0]}
    • "; else echo "\n\t
    • {$item[0]}
    • "; } else if ( current_user_can($item[1]) ) { $menu_hook = get_plugin_page_hook($item[2], 'admin.php'); if ( file_exists(WP_PLUGIN_DIR . "/{$item[2]}") || !empty($menu_hook) ) echo "\n\t
    • {$item[0]}
    • "; else echo "\n\t
    • {$item[0]}
    • "; } } do_action( 'dashmenu' ); ?>
      $item ) { if ( 5 > $key || $key > 25 ) // get each menu item before 3 continue; $class = ''; // 0 = name, 1 = capability, 2 = file if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"'; if ( !empty($submenu[$item[2]]) ) { $submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index. $menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]); if ( file_exists(WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook)) echo "\n\t
    • {$item[0]}
    • "; else echo "\n\t
    • {$item[0]}
    • "; } else if ( current_user_can($item[1]) ) { $menu_hook = get_plugin_page_hook($item[2], 'admin.php'); if ( file_exists(WP_PLUGIN_DIR . "/{$item[2]}") || !empty($menu_hook) ) echo "\n\t
    • {$item[0]}
    • "; else echo "\n\t
    • {$item[0]}
    • "; } } foreach ( $menu as $key => $item ) { if ( $key < 41 ) // there is a more efficient way to do this! continue; $class = ''; // 0 = name, 1 = capability, 2 = file if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"'; if ( !empty($submenu[$item[2]]) ) { $submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index. $menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]); if ( file_exists(WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook)) echo "\n\t
    • {$item[0]}
    • "; else echo "\n\t
    • {$item[0]}
    • "; } else if ( current_user_can($item[1]) ) { $menu_hook = get_plugin_page_hook($item[2], 'admin.php'); if ( file_exists(WP_PLUGIN_DIR . "/{$item[2]}") || !empty($menu_hook) ) echo "\n\t
    • {$item[0]}
    • "; else echo "\n\t
    • {$item[0]}
    • "; } } do_action( 'adminmenu' ); ?>
      $item ) { if ( 26 > $key || $key > 40 ) continue; $class = ''; // 0 = name, 1 = capability, 2 = file if (( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file))) $class = ' class="current"'; if ( !empty($submenu[$item[2]]) ) { $submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index. $menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]); if ( file_exists(WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook)) $side_items[] = "\n\t
    • {$item[0]}"; else $side_items[] = "\n\t
    • {$item[0]}"; } else if ( current_user_can($item[1]) ) { $menu_hook = get_plugin_page_hook($item[2], 'admin.php'); if ( file_exists(WP_PLUGIN_DIR . "/{$item[2]}") || !empty($menu_hook) ) $side_items[] = "\n\t
    • {$item[0]}"; else $side_items[] = "\n\t
    • {$item[0]}"; } } echo implode('
    • ', $side_items) . ''; unset($side_items); do_action( 'sidemenu' ); ?>
    wp/dev/wp-admin/options.php0000644000106600010660000000536011007310722013117 0ustar $value) { if ( !in_array($key, array('_wpnonce', '_wp_http_referer')) ) $options[] = $key; } } else { $options = explode(',', stripslashes($_POST['page_options'])); } if ($options) { foreach ($options as $option) { $option = trim($option); $value = $_POST[$option]; if(!is_array($value)) $value = trim($value); $value = stripslashes_deep($value); update_option($option, $value); } } $goback = add_query_arg('updated', 'true', wp_get_referer()); wp_redirect($goback); break; default: include('admin-header.php'); ?>

    get_results("SELECT * FROM $wpdb->options ORDER BY option_name"); foreach ( (array) $options as $option) : $disabled = ''; $option->option_name = attribute_escape($option->option_name); if ( is_serialized($option->option_value) ) { if ( is_serialized_string($option->option_value) ) { // this is a serialized string, so we should display it $value = maybe_unserialize($option->option_value); $options_to_update[] = $option->option_name; $class = 'all-options'; } else { $value = 'SERIALIZED DATA'; $disabled = ' disabled="disabled"'; $class = 'all-options disabled'; } } else { $value = $option->option_value; $options_to_update[] = $option->option_name; $class = 'all-options'; } echo " "; endforeach; ?>
    "; if (strpos($value, "\n") !== false) echo ""; else echo ""; echo "

    wp/dev/wp-admin/link-import.php0000644000106600010660000000767611007310722013705 0ustar


    false, 'test_type' => false); $file = wp_handle_upload($_FILES['userfile'], $overrides); if ( isset($file['error']) ) wp_die($file['error']); $url = $file['url']; $opml_url = $file['file']; $blogrolling = false; } if ( isset($opml_url) && $opml_url != '' ) { if ( $blogrolling === true ) { $opml = wp_remote_fopen($opml_url); } else { $opml = file_get_contents($opml_url); } include_once('link-parse-opml.php'); $link_count = count($names); for ( $i = 0; $i < $link_count; $i++ ) { if ('Last' == substr($titles[$i], 0, 4)) $titles[$i] = ''; if ( 'http' == substr($titles[$i], 0, 4) ) $titles[$i] = ''; $link = array( 'link_url' => $urls[$i], 'link_name' => $wpdb->escape($names[$i]), 'link_category' => array($cat_id), 'link_description' => $wpdb->escape($descriptions[$i]), 'link_owner' => $user_ID, 'link_rss' => $feeds[$i]); wp_insert_link($link); echo sprintf('

    '.__('Inserted %s').'

    ', $names[$i]); } ?>

    manage those links.'), $link_count, $cat_id, 'link-manager.php') ?>

    " . __("You need to supply your OPML url. Press back on your browser and try again") . "

    \n"; } // end else if ( ! $blogrolling ) do_action( 'wp_delete_file', $opml_url); @unlink($opml_url); ?>
    wp/dev/wp-admin/includes/0000755000106600010660000000000011051167753012532 5ustar wp/dev/wp-admin/includes/export.php0000644000106600010660000002351411014647435014570 0ustar prepare(" WHERE post_author = %d ", $author_id); } // grab a snapshot of post IDs, just in case it changes during the export $post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts $where ORDER BY post_date_gmt ASC"); $categories = (array) get_categories('get=all'); $tags = (array) get_tags('get=all'); function wxr_missing_parents($categories) { if ( !is_array($categories) || empty($categories) ) return array(); foreach ( $categories as $category ) $parents[$category->term_id] = $category->parent; $parents = array_unique(array_diff($parents, array_keys($parents))); if ( $zero = array_search('0', $parents) ) unset($parents[$zero]); return $parents; } while ( $parents = wxr_missing_parents($categories) ) { $found_parents = get_categories("include=" . join(', ', $parents)); if ( is_array($found_parents) && count($found_parents) ) $categories = array_merge($categories, $found_parents); else break; } // Put them in order to be inserted with no child going before its parent $pass = 0; $passes = 1000 + count($categories); while ( ( $cat = array_shift($categories) ) && ++$pass < $passes ) { if ( $cat->parent == 0 || isset($cats[$cat->parent]) ) { $cats[$cat->term_id] = $cat; } else { $categories[] = $cat; } } unset($categories); function wxr_cdata($str) { if ( seems_utf8($str) == false ) $str = utf8_encode($str); // $str = ent2ncr(wp_specialchars($str)); $str = ""; return $str; } function wxr_site_url() { global $current_site; // mu: the base url if ( isset($current_site->domain) ) { return 'http://'.$current_site->domain.$current_site->path; } // wp: the blog url else { return get_bloginfo_rss('url'); } } function wxr_cat_name($c) { if ( empty($c->name) ) return; echo '' . wxr_cdata($c->name) . ''; } function wxr_category_description($c) { if ( empty($c->description) ) return; echo '' . wxr_cdata($c->description) . ''; } function wxr_tag_name($t) { if ( empty($t->name) ) return; echo '' . wxr_cdata($t->name) . ''; } function wxr_tag_description($t) { if ( empty($t->description) ) return; echo '' . wxr_cdata($t->description) . ''; } function wxr_post_taxonomy() { $categories = get_the_category(); $tags = get_the_tags(); $the_list = ''; $filter = 'rss'; if ( !empty($categories) ) foreach ( (array) $categories as $category ) { $cat_name = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter); // for backwards compatibility $the_list .= "\n\t\t\n"; // forwards compatibility: use a unique identifier for each cat to avoid clashes // http://trac.wordpress.org/ticket/5447 $the_list .= "\n\t\tslug}\">\n"; } if ( !empty($tags) ) foreach ( (array) $tags as $tag ) { $tag_name = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter); $the_list .= "\n\t\t\n"; // forwards compatibility as above $the_list .= "\n\t\tslug}\">\n"; } echo $the_list; } echo '\n"; ?> <?php bloginfo_rss('name'); ?> http://wordpress.org/?v= slug; ?>parent ? $cats[$c->parent]->name : ''; ?> slug; ?> in_the_loop = true; // Fake being in the loop. // fetch 20 posts at a time rather than loading the entire table into memory while ( $next_posts = array_splice($post_ids, 0, 20) ) { $where = "WHERE ID IN (".join(',', $next_posts).")"; $posts = $wpdb->get_results("SELECT * FROM $wpdb->posts $where ORDER BY post_date_gmt ASC"); foreach ($posts as $post) { setup_postdata($post); ?> <?php echo apply_filters('the_title_rss', $post->post_title); ?> post_content) ); ?> post_excerpt) ); ?> ID; ?> post_date; ?> post_date_gmt; ?> comment_status; ?> ping_status; ?> post_name; ?> post_status; ?> post_parent; ?> menu_order; ?> post_type; ?> post_password; ?> post_type == 'attachment') { ?> ID); ?> get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID) ); if ( $postmeta ) { ?> meta_key; ?> meta_value; ?> get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d", $post->ID) ); if ( $comments ) { foreach ( $comments as $c ) { ?> comment_ID; ?> comment_author); ?> comment_author_email; ?> comment_author_url; ?> comment_author_IP; ?> comment_date; ?> comment_date_gmt; ?> comment_content) ?> comment_approved; ?> comment_type; ?> comment_parent; ?> user_id; ?> wp/dev/wp-admin/includes/theme.php0000644000106600010660000000274211021621053014333 0ustar name = $current_theme; $ct->title = $themes[$current_theme]['Title']; $ct->version = $themes[$current_theme]['Version']; $ct->parent_theme = $themes[$current_theme]['Parent Theme']; $ct->template_dir = $themes[$current_theme]['Template Dir']; $ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir']; $ct->template = $themes[$current_theme]['Template']; $ct->stylesheet = $themes[$current_theme]['Stylesheet']; $ct->screenshot = $themes[$current_theme]['Screenshot']; $ct->description = $themes[$current_theme]['Description']; $ct->author = $themes[$current_theme]['Author']; $ct->tags = $themes[$current_theme]['Tags']; return $ct; } function get_broken_themes() { global $wp_broken_themes; get_themes(); return $wp_broken_themes; } function get_page_templates() { $themes = get_themes(); $theme = get_current_theme(); $templates = $themes[$theme]['Template Files']; $page_templates = array (); if ( is_array( $templates ) ) { foreach ( $templates as $template ) { $template_data = implode( '', file( WP_CONTENT_DIR.$template )); preg_match( '|Template Name:(.*)$|mi', $template_data, $name ); preg_match( '|Description:(.*)$|mi', $template_data, $description ); $name = $name[1]; $description = $description[1]; if ( !empty( $name ) ) { $page_templates[trim( $name )] = basename( $template ); } } } return $page_templates; } ?> wp/dev/wp-admin/includes/admin.php0000644000106600010660000000151511000707526014325 0ustar wp/dev/wp-admin/includes/dashboard.php0000644000106600010660000005344711026752641015205 0ustar 'WordPress Dashboard', 'id' => 'wp_dashboard', 'before_widget' => "\t
    \n\n\t\t
    \n\n", 'after_widget' => "\t\t
    \n\n\t
    \n\n", 'before_title' => "\t\t\t

    ", 'after_title' => "

    \n\n" ) ); /* Register Widgets and Controls */ // Recent Comments Widget $mod_comments = wp_count_comments(); $mod_comments = $mod_comments->moderated; if ( current_user_can( 'moderate_comments' ) && $mod_comments ) { $notice = sprintf( __ngettext( '%d comment awaiting moderation', '%d comments awaiting moderation', $mod_comments ), $mod_comments ); $notice = "$notice"; } else { $notice = ''; } wp_register_sidebar_widget( 'dashboard_recent_comments', __( 'Recent Comments' ), 'wp_dashboard_recent_comments', array( 'all_link' => 'edit-comments.php', 'notice' => $notice, 'width' => 'half' ) ); // Incoming Links Widget if ( !isset( $widget_options['dashboard_incoming_links'] ) || !isset( $widget_options['dashboard_incoming_links']['home'] ) || $widget_options['dashboard_incoming_links']['home'] != get_option('home') ) { $update = true; $widget_options['dashboard_incoming_links'] = array( 'home' => get_option('home'), 'link' => apply_filters( 'dashboard_incoming_links_link', 'http://blogsearch.google.com/blogsearch?hl=en&scoring=d&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ), 'url' => apply_filters( 'dashboard_incoming_links_feed', 'http://blogsearch.google.com/blogsearch_feeds?hl=en&scoring=d&ie=utf-8&num=10&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ), 'items' => 5, 'show_date' => 0 ); } wp_register_sidebar_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_empty', array( 'all_link' => $widget_options['dashboard_incoming_links']['link'], 'feed_link' => $widget_options['dashboard_incoming_links']['url'], 'width' => 'half' ), 'wp_dashboard_cached_rss_widget', 'wp_dashboard_incoming_links_output' ); wp_register_widget_control( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_rss_control', array(), array( 'widget_id' => 'dashboard_incoming_links', 'form_inputs' => array( 'title' => false, 'show_summary' => false, 'show_author' => false ) ) ); // WP Plugins Widget wp_register_sidebar_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_empty', array( 'all_link' => 'http://wordpress.org/extend/plugins/', 'feed_link' => 'http://wordpress.org/extend/plugins/rss/topics/', 'width' => 'half' ), 'wp_dashboard_cached_rss_widget', 'wp_dashboard_plugins_output', array( 'http://wordpress.org/extend/plugins/rss/browse/popular/', 'http://wordpress.org/extend/plugins/rss/browse/new/', 'http://wordpress.org/extend/plugins/rss/browse/updated/' ) ); // Primary feed (Dev Blog) Widget if ( !isset( $widget_options['dashboard_primary'] ) ) { $update = true; $widget_options['dashboard_primary'] = array( 'link' => apply_filters( 'dashboard_primary_link', __( 'http://wordpress.org/development/' ) ), 'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/development/feed/' ) ), 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Development Blog' ) ), 'items' => 2, 'show_summary' => 1, 'show_author' => 0, 'show_date' => 1 ); } wp_register_sidebar_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_empty', array( 'all_link' => $widget_options['dashboard_primary']['link'], 'feed_link' => $widget_options['dashboard_primary']['url'], 'width' => 'half', 'class' => 'widget_rss' ), 'wp_dashboard_cached_rss_widget', 'wp_dashboard_rss_output' ); wp_register_widget_control( 'dashboard_primary', __( 'Primary Feed' ), 'wp_dashboard_rss_control', array(), array( 'widget_id' => 'dashboard_primary' ) ); // Secondary Feed (Planet) Widget if ( !isset( $widget_options['dashboard_secondary'] ) ) { $update = true; $widget_options['dashboard_secondary'] = array( 'link' => apply_filters( 'dashboard_secondary_link', __( 'http://planet.wordpress.org/' ) ), 'url' => apply_filters( 'dashboard_secondary_feed', __( 'http://planet.wordpress.org/feed/' ) ), 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), 'items' => 15 ); } wp_register_sidebar_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_empty', array( 'all_link' => $widget_options['dashboard_secondary']['link'], 'feed_link' => $widget_options['dashboard_secondary']['url'], 'width' => 'full' ), 'wp_dashboard_cached_rss_widget', 'wp_dashboard_secondary_output' ); wp_register_widget_control( 'dashboard_secondary', __( 'Secondary Feed' ), 'wp_dashboard_rss_control', array(), array( 'widget_id' => 'dashboard_secondary', 'form_inputs' => array( 'show_summary' => false, 'show_author' => false, 'show_date' => false ) ) ); /* Dashboard Widget Template wp_register_sidebar_widget( $widget_id (unique slug) , $widget_title, $output_callback, array( 'all_link' => full url for "See All" link, 'feed_link' => full url for "RSS" link, 'width' => 'fourth', 'third', 'half', 'full' (defaults to 'half'), 'height' => 'single', 'double' (defaults to 'single'), ), $wp_dashboard_empty_callback (only needed if using 'wp_dashboard_empty' as your $output_callback), $arg, $arg, $arg... (further args passed to callbacks) ); // optional: if you want users to be able to edit the settings of your widget, you need to register a widget_control wp_register_widget_control( $widget_id, $widget_control_title, $control_output_callback, array(), // leave an empty array here: oddity in widget code array( 'widget_id' => $widget_id, // Yes - again. This is required: oddity in widget code 'arg' => an arg to pass to the $control_output_callback, 'another' => another arg to pass to the $control_output_callback, ... ) ); */ // Hook to register new widgets do_action( 'wp_dashboard_setup' ); // Hard code the sidebar's widgets and order $dashboard_widgets = array(); $dashboard_widgets[] = 'dashboard_recent_comments'; $dashboard_widgets[] = 'dashboard_incoming_links'; $dashboard_widgets[] = 'dashboard_primary'; if ( current_user_can( 'activate_plugins' ) ) $dashboard_widgets[] = 'dashboard_plugins'; $dashboard_widgets[] = 'dashboard_secondary'; // Filter widget order $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', $dashboard_widgets ); $wp_dashboard_sidebars = array( 'wp_dashboard' => $dashboard_widgets, 'array_version' => 3.5 ); add_filter( 'dynamic_sidebar_params', 'wp_dashboard_dynamic_sidebar_params' ); if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) { ob_start(); // hack - but the same hack wp-admin/widgets.php uses wp_dashboard_trigger_widget_control( $_POST['widget_id'] ); ob_end_clean(); wp_redirect( remove_query_arg( 'edit' ) ); exit; } if ( $update ) update_option( 'dashboard_widget_options', $widget_options ); } // Echoes out the dashboard function wp_dashboard() { echo "
    \n\n"; // We're already filtering dynamic_sidebar_params obove add_filter( 'option_sidebars_widgets', 'wp_dashboard_sidebars_widgets' ); // here there be hackery dynamic_sidebar( 'wp_dashboard' ); remove_filter( 'option_sidebars_widgets', 'wp_dashboard_sidebars_widgets' ); echo "
    \n
    \n\n\n"; } // Makes sidebar_widgets option reflect the dashboard settings function wp_dashboard_sidebars_widgets() { // hackery return $GLOBALS['wp_dashboard_sidebars']; } // Modifies sidbar params on the fly to set up ids, class names, titles for each widget (called once per widget) // Switches widget to edit mode if $_GET['edit'] function wp_dashboard_dynamic_sidebar_params( $params ) { global $wp_registered_widgets, $wp_registered_widget_controls; $sidebar_defaults = array('widget_id' => 0, 'before_widget' => '', 'after_widget' => '', 'before_title' => '', 'after_title' => ''); extract( $sidebar_defaults, EXTR_PREFIX_ALL, 'sidebar' ); extract( $params[0], EXTR_PREFIX_ALL, 'sidebar' ); if ( !isset($wp_registered_widgets[$sidebar_widget_id]) || !is_array($wp_registered_widgets[$sidebar_widget_id]) ) { return $params; } $widget_defaults = array('id' => '', 'width' => '', 'height' => '', 'class' => '', 'feed_link' => '', 'all_link' => '', 'notice' => false, 'error' => false); extract( $widget_defaults, EXTR_PREFIX_ALL, 'widget' ); extract( $wp_registered_widgets[$sidebar_widget_id], EXTR_PREFIX_ALL, 'widget' ); $the_classes = array(); if ( in_array($widget_width, array( 'third', 'fourth', 'full' ) ) ) $the_classes[] = $widget_width; if ( 'double' == $widget_height ) $the_classes[] = 'double'; if ( $widget_class ) $the_classes[] = $widget_class; // Add classes to the widget holder if ( $the_classes ) $sidebar_before_widget = str_replace( "
    ' . __( 'See All' ) . ''; $content_class = 'dashboard-widget-content'; if ( current_user_can( 'edit_dashboard' ) && isset($wp_registered_widget_controls[$widget_id]) && is_callable($wp_registered_widget_controls[$widget_id]['callback']) ) { // Switch this widget to edit mode if ( isset($_GET['edit']) && $_GET['edit'] == $widget_id ) { $content_class .= ' dashboard-widget-control'; $wp_registered_widgets[$widget_id]['callback'] = 'wp_dashboard_empty'; $sidebar_widget_name = $wp_registered_widget_controls[$widget_id]['name']; $params[1] = 'wp_dashboard_trigger_widget_control'; $sidebar_before_widget .= '
    '; $sidebar_after_widget = "
    $sidebar_after_widget"; $links[] = '' . __( 'Cancel' ) . ''; } else { $links[] = '' . __( 'Edit' ) . ''; } } if ( $widget_feed_link ) $links[] = '' . __( 'rss icon' ) . ' ' . __( 'RSS' ) . ''; $links = apply_filters( "wp_dashboard_widget_links_$widget_id", $links ); // Add links to widget's title bar if ( $links ) { $sidebar_before_title .= ''; $sidebar_after_title = '' . join( ' | ', $links ) . "
    $sidebar_after_title"; } // Could have put this in widget-content. Doesn't really matter if ( $widget_notice ) $sidebar_after_title .= "\t\t\t
    $widget_notice
    \n\n"; if ( $widget_error ) $sidebar_after_title .= "\t\t\t
    $widget_error
    \n\n"; $sidebar_after_title .= "\t\t\t
    \n\n"; $sidebar_after_widget .= "\t\t\t
    \n\n"; foreach( array_keys( $params[0] ) as $key ) $$key = ${'sidebar_' . $key}; $params[0] = compact( array_keys( $params[0] ) ); return $params; } /* Dashboard Widgets */ function wp_dashboard_recent_comments( $sidebar_args ) { global $comment; extract( $sidebar_args, EXTR_SKIP ); echo $before_widget; echo $before_title; echo $widget_name; echo $after_title; $lambda = create_function( '', 'return 5;' ); add_filter( 'option_posts_per_rss', $lambda ); // hack - comments query doesn't accept per_page parameter $comments_query = new WP_Query(array('feed' => 'rss2', 'withcomments' => 1)); remove_filter( 'option_posts_per_rss', $lambda ); $is_first = true; if ( $comments_query->have_comments() ) { while ( $comments_query->have_comments() ) { $comments_query->the_comment(); $comment_post_url = get_permalink( $comment->comment_post_ID ); $comment_post_title = get_the_title( $comment->comment_post_ID ); $comment_post_link = "$comment_post_title"; $comment_link = '#'; $comment_meta = sprintf( __( 'From %1$s on %2$s %3$s' ), get_comment_author(), $comment_post_link, $comment_link ); if ( $is_first ) : $is_first = false; ?>

    comment_count > 1 ) : ?>
    • comment_count > 1 ) : ?>
    items) && 0 < count($rss->items) ) { echo "
      \n"; $rss->items = array_slice($rss->items, 0, $items); foreach ( $rss->items as $item ) { $publisher = ''; $site_link = ''; $link = ''; $content = ''; $date = ''; $link = clean_url( strip_tags( $item['link'] ) ); if ( isset( $item['author_uri'] ) ) $site_link = clean_url( strip_tags( $item['author_uri'] ) ); if ( !$publisher = wp_specialchars( strip_tags( isset($item['dc']['publisher']) ? $item['dc']['publisher'] : $item['author_name'] ) ) ) $publisher = __( 'Somebody' ); if ( $site_link ) $publisher = "$publisher"; else $publisher = "$publisher"; if ( isset($item['description']) ) $content = $item['description']; elseif ( isset($item['summary']) ) $content = $item['summary']; elseif ( isset($item['atom_content']) ) $content = $item['atom_content']; else $content = __( 'something' ); $content = wp_html_excerpt($content, 50) . ' ...'; if ( $link ) $text = _c( '%1$s linked here saying, "%3$s"|feed_display' ); else $text = _c( '%1$s linked here saying, "%3$s"|feed_display' ); if ( $show_date ) { if ( $show_author || $show_summary ) $text .= _c( ' on %4$s|feed_display' ); $date = wp_specialchars( strip_tags( isset($item['pubdate']) ? $item['pubdate'] : $item['published'] ) ); $date = strtotime( $date ); $date = gmdate( get_option( 'date_format' ), $date ); } echo "\t
    • " . sprintf( _c( "$text|feed_display" ), $publisher, $link, $content, $date ) . "
    • \n"; } echo "
    \n"; } else { echo '

    ' . __('This dashboard widget queries Google Blog Search so that when another blog links to your site it will show up here. It has found no incoming links… yet. It’s okay — there is no rush.') . "

    \n"; } } // $sidebar_args are handled by wp_dashboard_empty() function wp_dashboard_rss_output( $widget_id ) { $widgets = get_option( 'dashboard_widget_options' ); wp_widget_rss_output( $widgets[$widget_id] ); } // $sidebar_args are handled by wp_dashboard_empty() function wp_dashboard_secondary_output() { $widgets = get_option( 'dashboard_widget_options' ); @extract( @$widgets['dashboard_secondary'], EXTR_SKIP ); $rss = @fetch_rss( $url ); if ( !isset($rss->items) || 0 == count($rss->items) ) return false; echo "
      \n"; $rss->items = array_slice($rss->items, 0, $items); foreach ($rss->items as $item ) { $title = wp_specialchars($item['title']); list($author,$post) = explode( ':', $title, 2 ); $link = clean_url($item['link']); echo "\t
    • $post$author
    • \n"; } echo "
    \n
    \n"; } // $sidebar_args are handled by wp_dashboard_empty() function wp_dashboard_plugins_output() { $popular = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/popular/' ); $new = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/new/' ); $updated = @fetch_rss( 'http://wordpress.org/extend/plugins/rss/browse/updated/' ); foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins'), 'updated' => __('Recently Updated') ) as $feed => $label ) { if ( !isset($$feed->items) || 0 == count($$feed->items) ) continue; $$feed->items = array_slice($$feed->items, 0, 5); $item_key = array_rand($$feed->items); // Eliminate some common badly formed plugin descriptions while ( ( null !== $item_key = array_rand($$feed->items) ) && false !== strpos( $$feed->items[$item_key]['description'], 'Plugin Name:' ) ) unset($$feed->items[$item_key]); if ( !isset($$feed->items[$item_key]) ) continue; $item = $$feed->items[$item_key]; // current bbPress feed item titles are: user on "topic title" if ( preg_match( '/"(.*)"/s', $item['title'], $matches ) ) $title = $matches[1]; else // but let's make it forward compatible if things change $title = $item['title']; $title = wp_specialchars( $title ); $description = wp_specialchars( strip_tags(html_entity_decode($item['description'], ENT_QUOTES)) ); list($link, $frag) = explode( '#', $item['link'] ); $link = clean_url($link); $dlink = rtrim($link, '/') . '/download/'; echo "

    $label

    \n"; echo "
    $title
     (" . __( 'Download' ) . ")\n"; echo "

    $description

    \n"; } } // Checks to see if all of the feed url in $check_urls are cached. // If $check_urls is empty, look for the rss feed url found in the dashboard widget optios of $widget_id. // If cached, call $callback, a function that echoes out output for this widget. // If not cache, echo a "Loading..." stub which is later replaced by AJAX call (see top of /wp-admin/index.php) function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) { $loading = '

    ' . __( 'Loading…' ) . '

    '; if ( empty($check_urls) ) { $widgets = get_option( 'dashboard_widget_options' ); if ( empty($widgets[$widget_id]['url']) ) { echo $loading; return false; } $check_urls = array( $widgets[$widget_id]['url'] ); } require_once( ABSPATH . WPINC . '/rss.php' ); init(); // initialize rss constants $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE ); foreach ( $check_urls as $check_url ) { $status = $cache->check_cache( $check_url ); if ( 'HIT' !== $status ) { echo $loading; return false; } } if ( $callback && is_callable( $callback ) ) { $args = array_slice( func_get_args(), 2 ); array_unshift( $args, $widget_id ); call_user_func_array( $callback, $args ); } return true; } // Empty widget used for JS/AJAX created output. // Callback inserts content between before_widget and after_widget. Used when widget is in edit mode. Can also be used for custom widgets. function wp_dashboard_empty( $sidebar_args, $callback = false ) { extract( $sidebar_args, EXTR_SKIP ); echo $before_widget; echo $before_title; echo $widget_name; echo $after_title; // When in edit mode, the callback passed to this function is the widget_control callback if ( $callback && is_callable( $callback ) ) { $args = array_slice( func_get_args(), 2 ); array_unshift( $args, $widget_id ); call_user_func_array( $callback, $args ); } echo $after_widget; } /* Dashboard Widgets Controls. Ssee also wp_dashboard_empty() */ // Calls widget_control callback function wp_dashboard_trigger_widget_control( $widget_control_id = false ) { global $wp_registered_widget_controls; if ( is_scalar($widget_control_id) && $widget_control_id && isset($wp_registered_widget_controls[$widget_control_id]) && is_callable($wp_registered_widget_controls[$widget_control_id]['callback']) ) call_user_func_array( $wp_registered_widget_controls[$widget_control_id]['callback'], $wp_registered_widget_controls[$widget_control_id]['params'] ); } // Sets up $args to be used as input to wp_widget_rss_form(), handles POST data from RSS-type widgets function wp_dashboard_rss_control( $args ) { extract( $args ); if ( !$widget_id ) return false; if ( !$widget_options = get_option( 'dashboard_widget_options' ) ) $widget_options = array(); if ( !isset($widget_options[$widget_id]) ) $widget_options[$widget_id] = array(); $number = 1; // Hack to use wp_widget_rss_form() $widget_options[$widget_id]['number'] = $number; if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-rss'][$number]) ) { $_POST['widget-rss'][$number] = stripslashes_deep( $_POST['widget-rss'][$number] ); $widget_options[$widget_id] = wp_widget_rss_process( $_POST['widget-rss'][$number] ); // title is optional. If black, fill it if possible if ( !$widget_options[$widget_id]['title'] && isset($_POST['widget-rss'][$number]['title']) ) { require_once(ABSPATH . WPINC . '/rss.php'); $rss = fetch_rss($widget_options[$widget_id]['url']); $widget_options[$widget_id]['title'] = htmlentities(strip_tags($rss->channel['title'])); } update_option( 'dashboard_widget_options', $widget_options ); } wp_widget_rss_form( $widget_options[$widget_id], $form_inputs ); } ?> wp/dev/wp-admin/includes/image.php0000644000106600010660000002243211000736103014311 0ustar 0, 'credit' => '', 'camera' => '', 'caption' => '', 'created_timestamp' => 0, 'copyright' => '', 'focal_length' => 0, 'iso' => 0, 'shutter_speed' => 0, 'title' => '', ); // read iptc first, since it might contain data not available in exif such as caption, description etc if ( is_callable('iptcparse') ) { getimagesize($file, $info); if ( !empty($info['APP13']) ) { $iptc = iptcparse($info['APP13']); if ( !empty($iptc['2#110'][0]) ) // credit $meta['credit'] = trim( $iptc['2#110'][0] ); elseif ( !empty($iptc['2#080'][0]) ) // byline $meta['credit'] = trim( $iptc['2#080'][0] ); if ( !empty($iptc['2#055'][0]) and !empty($iptc['2#060'][0]) ) // created datee and time $meta['created_timestamp'] = strtotime($iptc['2#055'][0] . ' ' . $iptc['2#060'][0]); if ( !empty($iptc['2#120'][0]) ) // caption $meta['caption'] = trim( $iptc['2#120'][0] ); if ( !empty($iptc['2#116'][0]) ) // copyright $meta['copyright'] = trim( $iptc['2#116'][0] ); if ( !empty($iptc['2#005'][0]) ) // title $meta['title'] = trim( $iptc['2#005'][0] ); } } // fetch additional info from exif if available if ( is_callable('exif_read_data') && in_array($sourceImageType, apply_filters('wp_read_image_metadata_types', array(IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM)) ) ) { $exif = @exif_read_data( $file ); if (!empty($exif['FNumber'])) $meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 ); if (!empty($exif['Model'])) $meta['camera'] = trim( $exif['Model'] ); if (!empty($exif['DateTimeDigitized'])) $meta['created_timestamp'] = wp_exif_date2ts($exif['DateTimeDigitized']); if (!empty($exif['FocalLength'])) $meta['focal_length'] = wp_exif_frac2dec( $exif['FocalLength'] ); if (!empty($exif['ISOSpeedRatings'])) $meta['iso'] = $exif['ISOSpeedRatings']; if (!empty($exif['ExposureTime'])) $meta['shutter_speed'] = wp_exif_frac2dec( $exif['ExposureTime'] ); } // FIXME: try other exif libraries if available return apply_filters( 'wp_read_image_metadata', $meta, $file, $sourceImageType ); } // is the file a real image file? function file_is_valid_image($path) { $size = @getimagesize($path); return !empty($size); } // is the file an image suitable for displaying within a web page? function file_is_displayable_image($path) { $info = @getimagesize($path); if ( empty($info) ) $result = false; elseif ( !in_array($info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)) ) // only gif, jpeg and png images can reliably be displayed $result = false; elseif ( $info['channels'] > 0 && $info['channels'] != 3 ) { // some web browsers can't display cmyk or grayscale jpegs $result = false; } else $result = true; return apply_filters('file_is_displayable_image', $result, $path); } ?> wp/dev/wp-admin/includes/plugin.php0000644000106600010660000003740011044674500014540 0ustar '.$plugin.''; } if ('' == $author_uri[1] ) { $author = trim( $author_name[1] ); } else { $author = '' . trim( $author_name[1] ) . ''; } return array('Name' => $name, 'Title' => $plugin, 'Description' => $description, 'Author' => $author, 'Version' => $version); } function get_plugins($plugin_folder = '') { if ( ! $cache_plugins = wp_cache_get('plugins', 'plugins') ) $cache_plugins = array(); if ( isset($cache_plugins[ $plugin_folder ]) ) return $cache_plugins[ $plugin_folder ]; $wp_plugins = array (); $plugin_root = WP_PLUGIN_DIR; if( !empty($plugin_folder) ) $plugin_root .= $plugin_folder; // Files in wp-content/plugins directory $plugins_dir = @ opendir( $plugin_root); if ( $plugins_dir ) { while (($file = readdir( $plugins_dir ) ) !== false ) { if ( substr($file, 0, 1) == '.' ) continue; if ( is_dir( $plugin_root.'/'.$file ) ) { $plugins_subdir = @ opendir( $plugin_root.'/'.$file ); if ( $plugins_subdir ) { while (($subfile = readdir( $plugins_subdir ) ) !== false ) { if ( substr($subfile, 0, 1) == '.' ) continue; if ( substr($subfile, -4) == '.php' ) $plugin_files[] = "$file/$subfile"; } } } else { if ( substr($file, -4) == '.php' ) $plugin_files[] = $file; } } } @closedir( $plugins_dir ); @closedir( $plugins_subdir ); if ( !$plugins_dir || !$plugin_files ) return $wp_plugins; foreach ( $plugin_files as $plugin_file ) { if ( !is_readable( "$plugin_root/$plugin_file" ) ) continue; $plugin_data = get_plugin_data( "$plugin_root/$plugin_file" ); if ( empty ( $plugin_data['Name'] ) ) continue; $wp_plugins[plugin_basename( $plugin_file )] = $plugin_data; } uasort( $wp_plugins, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' )); $cache_plugins[ $plugin_folder ] = $wp_plugins; wp_cache_set('plugins', $cache_plugins, 'plugins'); return $wp_plugins; } function is_plugin_active($plugin){ return in_array($plugin, get_option('active_plugins')); } function activate_plugin($plugin, $redirect = '') { $current = get_option('active_plugins'); $plugin = trim($plugin); $valid = validate_plugin($plugin); if ( is_wp_error($valid) ) return $valid; if ( !in_array($plugin, $current) ) { if ( !empty($redirect) ) wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error ob_start(); @include(WP_PLUGIN_DIR . '/' . $plugin); $current[] = $plugin; sort($current); update_option('active_plugins', $current); do_action('activate_' . $plugin); ob_end_clean(); } return null; } function deactivate_plugins($plugins, $silent= false) { $current = get_option('active_plugins'); if ( !is_array($plugins) ) $plugins = array($plugins); foreach ( $plugins as $plugin ) { if( ! is_plugin_active($plugin) ) continue; array_splice($current, array_search( $plugin, $current), 1 ); // Fixed Array-fu! if ( ! $silent ) //Used by Plugin updater to internally deactivate plugin, however, not to notify plugins of the fact to prevent plugin output. do_action('deactivate_' . trim( $plugin )); } update_option('active_plugins', $current); } function activate_plugins($plugins, $redirect = '') { if ( !is_array($plugins) ) $plugins = array($plugins); $errors = array(); foreach ( (array) $plugins as $plugin ) { if ( !empty($redirect) ) $redirect = add_query_arg('plugin', $plugin, $redirect); $result = activate_plugin($plugin, $redirect); if ( is_wp_error($result) ) $errors[$plugin] = $result; } if ( !empty($errors) ) return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors); return true; } function delete_plugins($plugins, $redirect = '' ) { global $wp_filesystem; if( empty($plugins) ) return false; $checked = array(); foreach( $plugins as $plugin ) $checked[] = 'checked[]=' . $plugin; ob_start(); $url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&' . implode('&', $checked), 'bulk-manage-plugins'); if ( false === ($credentials = request_filesystem_credentials($url)) ) { $data = ob_get_contents(); ob_end_clean(); if( ! empty($data) ){ include_once( ABSPATH . 'wp-admin/admin-header.php'); echo $data; include( ABSPATH . 'wp-admin/admin-footer.php'); exit; } return; } if ( ! WP_Filesystem($credentials) ) { request_filesystem_credentials($url, '', true); //Failed to connect, Error and request again $data = ob_get_contents(); ob_end_clean(); if( ! empty($data) ){ include_once( ABSPATH . 'wp-admin/admin-header.php'); echo $data; include( ABSPATH . 'wp-admin/admin-footer.php'); exit; } return; } if ( $wp_filesystem->errors->get_error_code() ) { return $wp_filesystem->errors; } if ( ! is_object($wp_filesystem) ) return new WP_Error('fs_unavailable', __('Could not access filesystem.')); if ( $wp_filesystem->errors->get_error_code() ) return new WP_Error('fs_error', __('Filesystem error'), $wp_filesystem->errors); //Get the base plugin folder $plugins_dir = $wp_filesystem->wp_plugins_dir(); if ( empty($plugins_dir) ) return new WP_Error('fs_no_plugins_dir', __('Unable to locate WordPress Plugin directory.')); $plugins_dir = trailingslashit( $plugins_dir ); $errors = array(); foreach( $plugins as $plugin_file ) { $this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin_file) ); // If plugin is in its own directory, recursively delete the directory. if ( st