(function(){ var defaultSettings = { prefetchNext: 5, //number of prefetched pages ahead prefetchBack: 5, //number of prefetched pages behind prefetchNextStart: 2, //number of prefetched pages ahead when the script starts prefetchBackStart: 1, //number of prefetched pages behind when the script starts prefetchNoNext: true, //specifies if previous page should be prefetched when theres no next page fullLayout: true, //true for full layout mode, false for minimalistic mode clickImgNavigates: true, //specifies if clicking the image will change pages clikLeftHalfGoesBack: true, //specifies if clicking the left half of the image will take you to the previous page flipControlsManga: false, //flip the controls (L/R arrows, L/R image click, back/next buttons) for mangas or other right-to-left content autozoom: false, //enable fit-to-screen shrinkWidth: false, //when fit-to-screen enabled and image too wide, shrink it shrinkHeight: false, //when fit-to-screen enabled and image too long, shrink it expandWidth: false, //when fit-to-screen enabled and image too narrow, expand it expandHeight: false, //when fit-to-screen enabled and image too short, expand it showButtons: true, //show or hide the buttons (back/next, bookmarks, settings, etc...) borderLR: 0, //pixels to leave as border to the sides of the image when zooming and scrolling borderUD: 0, //pixels to leave as border above and below the image when zooming and scrolling goToBookmark: true, //if you have 1 bookmark saved for a site, asks you if you want to go there when you visit the site moveWhileLoading: false, //lets you change pages even if the image for the next page is still loading debugMode: false, //alerts on errors, and shows some of the currently cache'd pages/images with the "," key showSettingsOnFail: false, //if no settings are found for this site and default ones didn't work, show settings screen keyboardShortcuts: { //keyboard shortcuts... back: {name: 'LEFT', keyCode: 37, ctrlKey: false, shiftKey: false, altKey: false}, next: {name: 'RIGHT', keyCode: 39, ctrlKey: false, shiftKey: false, altKey: false}, scroll_left: {name: 'CTRL + LEFT', keyCode: 37, ctrlKey: true, shiftKey: false, altKey: false}, scroll_right: {name: 'CTRL + RIGHT', keyCode: 39, ctrlKey: true, shiftKey: false, altKey: false}, scroll_up: {name: 'CTRL + UP', keyCode: 38, ctrlKey: true, shiftKey: false, altKey: false}, scroll_down: {name: 'CTRL + DOWN', keyCode: 40, ctrlKey: true, shiftKey: false, altKey: false}, reload: {name: '.', keyCode: 190, ctrlKey: false, shiftKey: false, altKey: false}, set_bm: {name: 'CTRL + ALT + B', keyCode: 66, ctrlKey: true, shiftKey: false, altKey: true}, add_bm: {name: 'CTRL + ALT + A', keyCode: 65, ctrlKey: true, shiftKey: false, altKey: true}, layout: {name: '-', keyCode: isWebKit() ? 189 : 173, ctrlKey: false, shiftKey: false, altKey: false}, botones: {name: 'SHIFT + -', keyCode: isWebKit() ? 189 : 173, ctrlKey: false, shiftKey: true, altKey: false}, fit: {name: '+', keyCode: isWebKit() ? 187 : 171, ctrlKey: false, shiftKey: false, altKey: false}, slide: {name: 'CTRL + ALT + S', keyCode: 83, ctrlKey: true, shiftKey: false, altKey: true}, debug_mode: {name: 'CTRL + ALT + X', keyCode: 88, ctrlKey: true, shiftKey: false, altKey: true}, debug_info: {name: ',', keyCode: 188, ctrlKey: false, shiftKey: false, altKey: false} } }; // ==UserScript== // @name Webcomic Reader - beta // @author Javier Lopez https://github.com/ameboide , fork by v4Lo https://github.com/v4Lo and by anka-213 http://github.com/anka-213 // @version 2016.08.31 // @namespace https://github.com/anka-213/webcomic_reader/tree/beta // @description Can work on almost any webcomic/manga page, preloads 5 or more pages ahead (or behind), navigates via ajax for instant-page-change, lets you use the keyboard, remembers your progress, and it's relatively easy to add new sites // @homepageURL https://github.com/anka-213/webcomic_reader#readme // @supportURL https://github.com/anka-213/webcomic_reader/issues // @updateURL https://raw.githubusercontent.com/anka-213/webcomic_reader/master/webcomic_reader.user.js // @updatetype 24 // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @grant GM_openInTab // @include http://www.sluggy.com/* // @include http://sluggy.com/* // @include http://www.penny-arcade.com/comic* // @include http://penny-arcade.com/comic* // @include https://www.penny-arcade.com/comic* // @include https://penny-arcade.com/comic* // @include http://www.xkcd.com/* // @include http://xkcd.com/* // @include http://www.xkcd.org/* // @include http://xkcd.org/* // @include http://www.xkcd.net/* // @include http://xkcd.net/* // @include https://www.xkcd.com/* // @include https://xkcd.com/* // @include http://www.giantitp.com/* // @include http://www.dilbert.com/strip/* // @include http://dilbert.com/strip/* // @include http://hf.dilbert.com/strip/* // @include http://www.explosm.net/* // @include http://explosm.net/* // @include http://www.nuklearpower.com/* // @include http://www.reallifecomics.com/* // @include http://reallifecomics.com/* // @include http://www.pvponline.com/* // @include http://pvponline.com/* // @include http://www.brawlinthefamily.com/* // @include http://drmcninja.com/* // @include http://www.vgcats.com/*/* // @include http://www.phdcomics.com/* // @include http://www.cad-comic.com/* // @include http://www.smbc-comics.com/* // @include http://smbc-comics.com/* // @include http://abstrusegoose.com/* // @include http://thedoghousediaries.com/* // @include http://www.erfworld.com/* // @include http://es.juanelo.net/*/* // @include http://www.mangastream.com/* // @include http://mangastream.com/* // @include http://readms.com/* // @include http://www.qwantz.com/* // @include http://qwantz.com/* // @include http://www.2pstart.com/*/* // @include http://www.spaceavalanche.com/* // @include http://www.gunshowcomic.com/* // @include http://gunshowcomic.com/* // @include http://www.terrorisland.net/* // @include http://nedroid.com/* // @include http://manga.animea.net/* // @include http://www.bobandgeorge.com/* // @include http://bobandgeorge.com/* // @include http://www.shamusyoung.com/* // @include http://www.stationv3.com/* // @include http://www.lfgcomic.com/page/* // @include http://lfgcomic.com/page/* // @include http://www.gpf-comics.com/* // @include http://www.questionablecontent.net/* // @include http://questionablecontent.net/* // @include http://miscellanea.wellingtongrey.net/* // @include http://www.daisyowl.com/* // @include http://daisyowl.com/* // @include http://www.hyperdeathbabies.com/* // @include http://www.mangatoshokan.com/* // @include http://amultiverse.com/* // @include http://wondermark.com/* // @include http://www.amazingsuperpowers.com/* // @include http://www.anymanga.com/* // @include http://anymanga.com/* // @include http://mangafox.me/* // @include http://m.mangafox.me/* // @include http://www.leasticoulddo.com/* // @include http://leasticoulddo.com/* // @include http://www.sinfest.net/* // @include http://www.crfh.net/* // @include http://crfh.net/* // @include http://www.pennyandaggie.com/* // @include http://pennyandaggie.com/* // @include http://www.darkbolt.com/* // @include http://darkbolt.com/* // @include http://www.egscomics.com/* // @include http://egscomics.com/* // @include http://www.the-gutters.com/* // @include http://www.punchanpie.net/* // @include http://punchanpie.net/* // @include http://noneedforbushido.com/* // @include http://www.teahousecomic.com/* // @include http://www.applegeeks.com/* // @include http://applegeeks.com/* // @include http://www.mangareader.net/* // @include http://stoptazmo.com/* // @include http://www.arcamax.com/* // @include http://www.nettserier.no/* // @include http://nettserier.no/* // @include http://www.nerfnow.com/* // @include http://nerfnow.com/* // @exclude http://www.nerfnow.com/*/comments* // @exclude http://nerfnow.com/*/comments* // @include http://www.virtualshackles.com/* // @include http://www.little-gamers.com/* // @include http://www.digitalunrestcomic.com/* // @include http://digitalunrestcomic.com/* // @include http://www.duelinganalogs.com/* // @include http://www.actiontrip.com/* // @include http://actiontrip.com/* // @include http://www.myextralife.com/* // @include http://www.mondaynightcrew.com/* // @include http://mondaynightcrew.com/* // @include http://notinventedhe.re/* // @include http://www.unshelved.com/* // @include https://www.eviscerati.org/comics* // @include http://read.mangashare.com/* // @include http://haven-reader.net/* // @include http://www.manga2u.me/* // @include http://manga2u.me/* // @include http://buttersafe.com/* // @include http://www.romanticallyapocalyptic.com/* // @include http://romanticallyapocalyptic.com/* // @include http://www.somethingpositive.net/* // @include http://somethingpositive.net/* // @include http://www.rhymes-with-witch.com/* // @include http://rhymes-with-witch.com/* // @include http://www.superstupor.com/* // @include http://superstupor.com/* // @include http://www.misfile.com/* // @include http://www.asofterworld.com/* // @include http://asofterworld.com/* // @include http://www.achewood.com/* // @include http://achewood.com/* // @include http://www.act-i-vate.com/* // @include http://act-i-vate.com/* // @include http://www.biggercheese.com/* // @include http://biggercheese.com/* // @include http://www.gwscomic.com/* // @include http://gwscomic.com/* // @include http://www.fonflatter.de/* // @include http://www.ruthe.de/* // @include http://ruthe.de/* // @include http://www.daybydaycartoon.com/* // @include http://daybydaycartoon.com/* // @include http://www.dieselsweeties.com/* // @include http://dieselsweeties.com/* // @include http://www.foxtrot.com/* // @include http://www.csectioncomics.com/* // @include http://garfieldminusgarfield.net/* // @include http://www.girlgeniusonline.com/* // @include http://www.gocomics.com/* // @exclude http://www.gocomics.com/ // @exclude http://www.gocomics.com/?* // @include http://www.gunnerkrigg.com/* // @include http://gunnerkrigg.com/* // @include http://www.ho-lo.co.il/* // @include http://www.jeffzugale.com/* // @include http://www.threepanelsoul.com/* // @include http://threepanelsoul.com/* // @include http://www.oglaf.com/* // @include http://oglaf.com/* // @include http://www.kevinandkell.com/* // @include http://kevinandkell.com/* // @include http://kittyhawkcomic.com/* // @include http://www.lackadaisycats.com/comic.php* // @include http://lackadaisycats.com/comic.php* // @include http://www.lukesurl.com/* // @include http://mycardboardlife.com/* // @include http://megatokyo.com/* // @include http://www.megatokyo.it/* // @include http://www.megatokyo.de/* // @include http://ex2.unixmanga.net/* // @include http://noreasoncomics.com/* // @include http://www.pixelcomic.net/* // @include http://pixelcomic.net/* // @include http://www.redmeat.com/* // @include http://redmeat.com/* // @include http://sexylosers.com/* // @include http://www.doonesbury.com/* // @include http://stalebacon.com/* // @include http://www.mangaeden.com/* // @include http://www.pbfcomics.com/* // @include http://tjandamal.com/* // @include http://sfeertheory.littlefoolery.com/* // @include http://wanderingones.com/* // @include http://www.big-big-truck.com/ayiw/* // @include http://big-big-truck.com/ayiw/* // @include http://wapsisquare.com/* // @include http://www.wastedtalent.ca/* // @include http://www.wulffmorgenthaler.com/* // @include http://wulffmorgenthaler.com/* // @include http://www.weregeek.com/* // @include http://*.katbox.net/* // @include http://*.keenspace.com/* // @include http://*.comicgenesis.com/* // @include http://www.beanleafpress.com/* // @include http://gipcomic.com/* // @include http://www.theoswaldchronicles.com/* // @include http://www.awkwardzombie.com/* // @include http://awkwardzombie.com/* // @include http://*.seraph-inn.com/* // @include https://www.fakku.net/manga/* // @include https://www.fakku.net/doujinshi/* // @include http://www.deadwinter.cc/* // @include http://deadwinter.cc/* // @include http://www.loveisintheblood.com/* // @include http://rhapsodies.wpmorse.com/* // @include http://www.piratesofmars.com/* // @include http://www.soulless-comic.com/* // @include http://www.earthsongsaga.com/vol* // @include http://rainchildstudios.com/strawberry/* // @include http://www.goblinscomic.org/* // @include http://www.venusenvycomic.com/* // @include http://venusenvycomic.com/* // @include http://www.meekcomic.com/* // @include http://www.dominic-deegan.com/* // @include http://dominic-deegan.com/* // @include http://yafgc.net/* // @include http://www.sdamned.com/* // @include http://www.twolumps.net/* // @include http://twolumps.net/* // @include http://www.precociouscomic.com/* // @include http://precociouscomic.com/* // @include http://betweenplaces.spiderforest.com/* // @include http://specialschool.spiderforest.com/* // @include http://requiem.spiderforest.com/* // @include http://sevensmith.net/chirault/* // @include http://www.junglestudio.com/roza/* // @include http://www.dream-scar.net/* // @include http://dream-scar.net/* // @include http://www.tryinghuman.com/* // @include http://tryinghuman.com/* // @include http://www.thedreamercomic.com/* // @include http://thedreamercomic.com/ // @include http://www.shazzbaa.com/* // @include http://shazzbaa.com/* // @include http://www.sandraandwoo.com/* // @include http://www.freakangels.com/* // @include http://comics.com/* // @include http://www.sakanacomic.com/* // @include http://www.jaygeefisher.com/* // @include http://jaygeefisher.com/* // @include http://www.doujin-moe.us/* // @include http://keychain.patternspider.net/* // @include http://www.collectedcurios.com/* // @include http://www.doomies.com/* // @include http://doomies.com/* // @include http://www.qgmindpolice.com/* // @include http://www.slowwave.com/* // @include http://slowwave.com/* // @include http://www.sylvanmigdal.com/* // @include http://sylvanmigdal.com/* // @include http://www.c.urvy.org/* // @include http://c.urvy.org/* // @include http://www.the-artiste.net/* // @include http://www.doublefine.com/* // @include http://www.survivingtheworld.net/* // @include http://survivingtheworld.net/* // @include http://view.thespectrum.net/* // @include http://www.mangavolume.com/* // @include http://nonadventures.com/* // @include http://www.robandelliot.cycomics.com/* // @include http://robandelliot.cycomics.com/* // @include http://soulsymphonycomic.com/* // @include http://www.blastwave-comic.com/* // @include http://www.channelate.com/* // @include http://www.picturesforsadchildren.com/* // @include http://picturesforsadchildren.com/* // @include http://www.optipess.com/* // @include http://www.drawuntilitsfunny.com/* // @include http://beardfluff.com/* // @include http://lawlscomic.com/* // @include http://www.maakies.com/* // @include http://www.lefthandedtoons.com/* // @include http://trollscience.com/* // @include http://www.diggercomic.com/* // @include http://luciphurrsimps.com/* // @include http://nikkisprite.com/* // @include http://planet-nowhere.com/* // @include http://www.mysisterthefreak.com/* // @include http://www.gronkcomic.com/* // @include http://www.redsplanet.com/* // @include http://www.cowshell.com/* // @include http://everblue-comic.com/* // @include http://tmkcomic.depleti.com/* // @include http://www.remindblog.com/* // @include http://inkdolls.com/* // @include http://www.terra-comic.com/* // @include http://lovecraftismissing.com/* // @include http://www.redmoonrising.org/* // @include http://www.khaoskomix.com/* // @include http://ipaintgirls.com/* // @include http://memoria.valice.net/* // @include http://www.twilightlady.com/* // @include http://submanga.com/* // @include http://g.e-hentai.org/* // @include http://crazytje.be/* // @include http://www.tenmangas.com/* // @include http://tenmangas.com/* // @include http://www.tenmanga.com/* // @include http://tenmanga.com/* // @include http://www.perveden.com/* // @include http://reader.imangascans.org/* // @include http://www.bittersweetcandybowl.com/* // @include http://www.doujintoshokan.com/* // @include http://www.imagebam.com/* // @include http://www.exploitationnow.com/* // @include http://www.otakuworks.com/* // @include http://h-manga.info/* // @include http://basicinstructions.net/* // @include http://www.insaneyetisquirrel.com/* // @include http://*.kukudm.com/comiclist/*/*/* // @include http://*.kukudm.net/comiclist/*/*/* // @include http://mh.socomic.com/comiclist/*/*/* // @include http://www.socomic.net/comiclist/*/*/* // @include http://www.webcomicsnation.com/* // @include http://www.pawn.se/* // @include http://www.rpgworldcomic.com/* // @include http://rpgworldcomic.com/* // @include http://maskedretriever.com/* // @include http://www.missmab.com/* // @include http://www.lookwhatibroughthome.com/* // @include http://hijinksensue.com/* // @include http://www.darthsanddroids.net/* // @include http://darthsanddroids.net/* // @include http://www.harkavagrant.com/* // @include http://www.turbosloth.net/* // @include http://turbosloth.net/* // @include http://www.walkinginsquares.com/* // @include http://walkinginsquares.com/* // @include http://dresdencodak.com/* // @include http://www.straysonline.com/comic/* // @include http://straysonline.com/comic/* // @include http://www.emi-art.com/* // @include http://emi-art.com/* // @include http://www.dragonball-multiverse.com/* // @include http://insanesoft.org/fanfyria/* // @include http://*.snafu-comics.com/* // @include http://www.wayfarersmoon.com/* // @include http://wayfarersmoon.com/* // @include http://*.smackjeeves.com/* // @include http://www.10kcommotion.com/* // @include http://10kcommotion.com/* // @include http://somemangas.com/* // @include http://www.multiplexcomic.com/* // @include http://multiplexcomic.com/* // @include http://www.johnandjohn.nl/index.php?*wltypeid=1* // @include http://www.sorcery101.net/* // @include http://www.treadingground.com/* // @include http://www.jerkcity.com/* // @include http://jerkcity.com/* // @include http://www.kiwiblitz.com/* // @include http://thepunchlineismachismo.com/* // @include http://kafkaskoffee.com/* // @include http://occasionalcomics.com/* // @include http://www.zombieboycomics.com/* // @include http://www.babyblues.com/* // @include http://babyblues.com/* // @include http://www.bearandtiger.com/* // @include http://mangatopia.net/* // @include http://exhentai.org/* // @include https://exhentai.org/* // @include http://www.wigucomics.com/* // @include http://www.mankin-trad.net/* // @include http://mankin-trad.net/* // @include http://www.mangahere.co/* // @include http://es.mangahere.co/* // @include http://www.scarygoround.com/* // @include http://scarygoround.com/* // @include http://www.schlockmercenary.com/* // @include http://www.warehousecomic.com/* // @include http://warehousecomic.com/* // @include http://www.tnemrot.com/* // @include http://www.holiday-wars.com/* // @include http://www.zapcomic.com/* // @include http://www.twokinds.net/* // @include http://twokinds.net/* // @include http://www.dumbingofage.com/* // @include http://www.shortpacked.com/* // @include http://www.itswalky.com/* // @include http://itswalky.com/* // @include http://www.evildivacomics.com/* // @include http://axecop.com/* // @include http://www.somethingofthatilk.com/* // @include http://somethingofthatilk.com/* // @include http://www.reddit.com/ // @include http://www.reddit.com/?* // @include http://www.reddit.com/r/* // @exclude http://www.reddit.com/*/comments/* // @include http://blankitcomics.com/* // @include http://www.anime-source.com/* // @include http://anime-source.com/* // @include http://www.mangarush.com/* // @include http://www.citymanga.com/*/*/* // @include http://citymanga.com/*/*/* // @include http://www.dctp.ws/*/V*.html // @include http://dctp.ws/*/V*.html // @include http://doctorcatmd.com/* // @include http://www.sheldoncomics.com/* // @include http://sheldoncomics.com/* // @include http://luscious.net/*/pictures/* // @include http://old.lu.scio.us/hentai/albums/* // @exclude http://old.lu.scio.us/hentai/albums/*/page/* // @include http://www.geekculture.com/joyoftech/* // @include http://www.basketcasecomix.com/* // @include http://www.geeklifecomic.com/* // @include http://www.realmofatland.com/* // @include http://realmofatland.com/* // @include http://thedoujin.com/index.php?page=post&s=view&id=* // @include http://eatmanga.com/* // @include http://www.oslevadosdabreca.com/* // @include http://www.thedevilbear.com/* // @include http://thedevilbear.com/* // @include http://www.bladebunny.com/* // @include http://www.exiern.com/* // @include http://nsfw-comix.com/* // @include http://jaynaylor.com/* // @include http://www.anelnoath.com/* // @include http://www.faans.com/* // @include http://www.truefork.org/* // @include http://truefork.org/* // @include http://www.aorange.com/* // @include http://www.thewotch.com/* // @include http://thewotch.com/* // @include http://www.cheercomic.com/* // @include http://cheercomic.com/* // @include http://www.sgvy.com/* // @include http://sgvy.com/* // @include http://www.drunkduck.com/* // @include http://drunkduck.com/* // @include http://www.ephralon.de/seekers_detailed.php* // @include http://ephralon.de/seekers_detailed.php* // @include http://www.terinu.com/* // @include http://terinu.com/* // @include http://dcisgoingtohell.com/* // @include http://las-historietas.blogspot.com/* // @include http://www.palcomix.com/* // @include http://palcomix.com/* // @include http://www.palcomix.org/* // @include http://palcomix.org/* // @include http://www.whiteninjacomics.com/* // @include http://whiteninjacomics.com/* // @include http://www.apenotmonkey.com/* // @include http://malandchad.com/* // @include http://www.goodmanga.net/* // @include http://www.digitalcomicmuseum.com/* // @include http://digitalcomicmuseum.com/* // @include http://goldenagecomics.co.uk/* // @include http://fourcolorshadows.blogspot.com/* // @include http://thehorrorsofitall.blogspot.com/* // @include *//bato.to/reader* // @include http://www.eegra.com/* // @include http://www.octopuspie.com/* // @include http://www.lovemenicecomic.com/* // @include http://www.ju-ni.net/* // @include http://ju-ni.net/* // @include http://blog.saveapathea.com/* // @include http://www.dead-philosophers.com/* // @include http://www.nerd-theater.com/* // @include http://nerd-theater.com/* // @include http://lackadaisy.foxprints.com/comic.php* // @include http://www.mangastream.to/* // @include http://www.kingfeatures.com/* // @include http://kingfeatures.com/* // @include http://www.thezombiehunters.com/* // @include http://thezombiehunters.com/* // @include http://www.bugcomic.com/* // @include http://www.interrobangstudios.com/* // @include http://interrobangstudios.com/* // @include http://www.hlcomic.com/* // @include http://hlcomic.com/* // @include http://syacartoonist.com/* // @include http://satwcomic.com/* // @include http://stupidfox.net/* // @include http://www.casualvillain.com/* // @include http://fanboys-online.com/* // @include http://www.girlswithslingshots.com/* // @include http://www.mntgaiden.com/* // @include http://lovehentaimanga.com/* // @include http://ravensdojo.com/* // @include http://freefall.purrsia.com/* // @include http://www.mangachapter.net/* // @include http://www.mangachapter.me/* // @include http://www.shd-wk.com/* // @include http://shd-wk.com/* // @include http://www.pepsaga.com/* // @include http://slimythief.com/* // @include http://www.pebbleversion.com/* // @include http://pebbleversion.com/* // @include http://mentalcatproductions.com/* // @include http://schoolbites.net/* // @include http://www.accurseddragon.com/* // @include http://www.krakowstudios.com/* // @include http://www.stringtheorycomic.com/* // @include http://www.supercrash.net/* // @include http://loveandcapes.com/* // @include http://victorycomic.comicgenesis.com/* // @include http://magellanverse.com/* // @include http://www.evil-comic.com/* // @include http://flakypastry.runningwithpencils.com/* // @include http://www.pointguardian.com/* // @include http://gogetaroomie.chloe-art.com/* // @include http://legendofbill.com/* // @include http://www.springiette.net/* // @include http://springiette.net/* // @include http://www.vampirecheerleaders.net/* // @include http://www.paranormalmysterysquad.com/* // @include http://www.draculaeverlasting.com/* // @include http://www.amazingagentjennifer.com/* // @include http://mindmistress.comicgenesis.com/* // @include http://www.evernightcomic.com/* // @include http://www.xindm.cn/* // @include http://mh2.xindm.cn/* // @include http://www.manga123.com/read/* // @include http://manga.redhawkscans.com/* // @include http://slide.extrascans.net/* // @include http://*.thewebcomic.com/* // @include http://www.mangapark.com/* // @include http://mangapark.com/* // @include http*://mangapark.me/* // @include http://www.manga-go.com/* // @include http://www.comicstriplibrary.org/display/* // @include http://comicstriplibrary.org/display/* // @include http://www.wirepop.com/* // @include http://wirepop.com/* // @include http://www.fantasyrealmsonline.com/manga/* // @include http://foolrulez.org/* // @include http://reader.japanzai.com/* // @include http://www.psychopandas.com/reader/* // @include http://psychopandas.com/reader/* // @include http://www.ourmanga.com/* // @include http://readonline.egscans.org/* // @include http://read.egscans.com/* // @include http://reader.eternalmanga.net/* // @include http://gallery.ryuutama.com/* // @include http://*.tiraecol.net/* // @include http://tiraecol.net/* // @include http://www.conejofrustrado.com/* // @include http://www.e2w-illustration.com/* // @include http://2gamerz.com/* // @include http://reader.fth-scans.com/* // @include http://www.simple-scans.com/* // @include http://simple-scans.com/* // @include http://www.mymangaspot.com/* // @include http://comic.naver.com/* // @include http://www.peteristhewolf.com/* // @include http://peteristhewolf.com/* // @include http://www.wlpcomics.com/* // @include http://wlpcomics.com/* // @include http://www.mangatraders.com/* // @include http://hentaifromhell.net/* // @include http://trenchescomic.com/* // @include http://www.sakicow.com/reader/* // @include http://sakicow.com/reader/* // @include http://www.goominet.com/unspeakable-vault/* // @include http://www.doesnotplaywellwithothers.com/* // @include http://krakowstudios.com/* // @include http://www.aikoniacomic.com/* // @include http://aikoniacomic.com/* // @include http://www.grrlpowercomic.com/* // @include http://www.poisonedminds.com/* // @include http://poisonedminds.com/* // @include http://nodwick.humor.gamespy.com/* // @include http://www.the-whiteboard.com/* // @include http://the-whiteboard.com/* // @include http://www.mezzacotta.net/* // @include http://www.hbrowse.com/* // @include http://aptitude.surfacingpoint.com/* // @include http://www.bardsworth.com/* // @include http://fancyadventures.com/* // @include http://www.chron.com/entertainment/comics-games/comic/* // @include http://www.purplepussy.net/* // @include http://purplepussy.net/* // @include http://www.heroeslocales.com/bunsen/* // @include http://www.readhentaionline.com/* // @include http://readhentaionline.com/* // @include http://www.darklegacycomics.com/* // @include http://darklegacycomics.com/* // @include http://candicomics.com/* // @include http://www.buckocomic.com/* // @include http://bearmageddon.com/* // @include http://betweenfailures.net/* // @include http://www.sisterclaire.com/* // @include http://www.fayerwayer.com/* // @include http://www.niubie.com/* // @include http://www.awesomehospital.com/* // @include http://ars.userfriendly.org/cartoons/* // @include http://www.friendswithboys.com/* // @include http://www.mangago.com/* // @include http://www.jesusandmo.net/* // @include http://www.calamitiesofnature.com/* // @include http://www.rosalarian.com/* // @include http://rosalarian.com/* // @include http://dungeond.com/* // @include http://www.irregularwebcomic.net/* // @include http://adistantsoil.com/* // @include http://comic.nodwick.com/* // @include http://ffn.nodwick.com/* // @include http://ps238.nodwick.com/* // @include http://kronos.mcanime.net/* // @include http://www.ghastlycomic.com/* // @include http://thedevilspanties.com/* // @include http://walkingdeadbr.com/*displayimage.php* // @include http://www.mangapanda.com/* // @include http://mangable.com/* // @include http://dragonflyscans.org/* // @include http://readincesthentai.com/* // @include http://www.animephile.com/* // @include http://hentaistreamer.com/* // @include http://kissmanga.com/* // @include http://www.mangatank.com/* // @include http://www.snowflakescomic.com/* // @include http://mangafox.mobi/* // @include http://www.mangainn.me/* // @include http://invisiblebread.com/* // @include http://onlinereader.mangapirate.net/* // @include http://www.8comic.com/love/* // @include http://8comic.com/love/* // @include http://www.mangahead.com/* // @include http://mangahead.com/* // @include http://www.vickifox.com/* // @include http://www.spinnyverse.com/* // @include http://zenpencils.com/* // @include http://wootmanga.com/* // @include http://hentai2read.com/* // @include http://m.hentai2read.com/* // @include http://komikmy.com/*/*/* // @include http://www.hentaifr.net/doujinshisheng.php* // @include http://www.commissionedcomic.com/* // @include http://www.mangasky.com/* // @include http://mangapirate.net/* // @include http://nomanga.com/* // @include http://hentaimangaonline.com/* // @include http://webcomics.yaoi911.com/* // @include http://www.whompcomic.com/* // @include http://actiontimebuddies.com/* // @include http://www.superbrophybrothers.com/* // @include http://www.surasplace.com/* // @include http://surasplace.com/* // @include http://fallensyndicate.com/reader/* // @include http://www.nekothekitty.net/* // @include http://curtailedcomic.com/* // @include http://www.wiemanga.com/* // @include http://img.wiemanga.com/* // @include http://hentai4manga.com/* // @include http://bradcolbow.com/* // @include http://www.gaomanga.com/* // @include http://www.theherobiz.com/* // @include http://guildedage.net/* // @include http://betweenfailures.com/* // @include http://www.claudeandmonet.com/* // @include http://phobia.subcultura.es/tira/* // @include http://www.manga-tu.be/* // @include http://de.ninemanga.com/* // @include http://proxer.me/* // @include http://www.demanga.com/* // @include http://www.meinmanga.com/* // @include http*://www.senmanga.com/* // @include http*://raw.senmanga.com/* // @include http://www.mangaesta.net/* // @include http://www.mabuns.web.id/* // @include http://www.manga4indo.com/* // @include http://www.bloomingfaeries.com/* // @include http://www.friendshipscans.com/* // @include http://neechan.net/* // @include http://www.komikid.com/* // @include http://komikid.com/* // @include http://blog.komikid.com/* // @include http://www.findchaos.com/* // @include http://chaoslife.findchaos.com/* // @include http://moonoverjune.com/* // @include http://www.shadbase.com/* // @include http://www.shagbase.com/* // @include http://www.mrlovenstein.com/* // @include http://www.anticscomic.com/* // @include http://octopuns.blogspot.com/* // @include http://www.onemanga.me/* // @include http://mangacow.co/* // @include http://www.mangabee.com/* // @include http://mangadoom.co/* // @include http://www.powernapcomic.com/* // @include http://mangachrome.com/* // @include http://www.7manga.com/* // @include http://7manga.com/* // @include http://www.mangadevil.com/* // @include http://mangadevil.com/* // @include http://www.mangamofo.com/* // @include http://*.hentai.ms/* // @include http://view.mangamonger.com/* // @include http://blackbird.ashen-ray.com/* // @include http://carciphona.com/* // @include http://ahs-comic.com/* // @include http://www.gogetaroomie.com/* // @include http://gogetaroomie.com/* // @include http://*.thecomicseries.com/* // @include http://www.sleepymaid.com/gallery/displayimage.php* // @include http://sleepymaid.com/gallery/displayimage.php* // @include http://www.squid-ops.com/* // @include http://squid-ops.com/* // @include http://www.endcomic.com/* // @include http://www.thenoobcomic.com/* // @include http://thenoobcomic.com/* // @include http://zizki.com/* // @include http://*.zizki.com/* // @include http://pururin.com/* // @include http://www.thedailyblink.com/* // @include http://mangabandits.net/* // @include http://www.neumanga.com/* // @include http://www.pecintakomik.com/* // @include http://www.schizmatic.com/* // @include http://schizmatic.com/* // @include http://www.yuri-ism.net/* // @include http://www.bringbackroomies.com/* // @include http://blindsprings.com/* // @include http://www.wtfcomics.com/*archive.html?* // @include http://wtfcomics.com/*archive.html?* // @include http://www.olympusoverdrive.com/index.php?* // @include http://olympusoverdrive.com/index.php?* // @include http://*gucomics.com/* // @include http://www.punksandnerds.com/* // @include http://*.troutcave.net/* // @include http://www.berserkersdaughter.com/* // @include http://gingerhaze.com/nimona/comic/* // @include http://aiacrowd.com/* // @include http://aspect.waywardstudios.net/* // @include http://chirault.sevensmith.net/* // @include http://cucumber.gigidigi.com/* // @include http://filteredfuzz.com/* // @include http://www.dorktower.com/* // @include http://mangajoy.com/* // @include http://nhentai.net/* // @include http://www.hejibits.com/* // @include http://mangaindo.co/* // @include http://5.79.87.81/* // @include http://www.gao-subs.com/* // @include http://www.mangawindow.com/* // @include http://mangawindow.com/* // @include http://omgmanga.com/* // @include http://paintraincomic.com/* // @include http://extrafabulouscomics.com/* // @include http://hellocomic.com/* // @include http://*.hellocomic.com/* // @include http://www.feywinds.com/comic/* // @include http://www.omgbeaupeep.com/* // @include http://orgymania.net/* // @include http://mspaintadventures.com/* // @include http://www.mspaintadventures.com/* // @include http://mspfanventures.com/ // @include http://agc.deskslave.org/comic_viewer.html // @include http://www.readmanga.today/* // @include http://www.mangatown.com/manga/* // @include http://www.mymanga.me/manga/* // @include http://www.blindsprings.com/comic/* // @include http://www.legostargalactica.net/* // @include http://hentaihere.com/m/*/*/* // @include http://gomanga.co/reader/read* // @include http://mangafap.com/image/* // @include http://*.keenspot.com/* // @include http://dynasty-scans.com/* // @include http://*.dynasty-scans.com/* // @include http://mangasee.co/manga/* // @include http://mangafast.online/manga/* // @include http://www.demonicscans.com/FoOlSlide/read/* // @include http://raws.yomanga.co/read/* // @include http://*.dm5.com/m* // @include https://nhentai.net/g/* // @include http://www.marycagle.com/* // @include http://www.sleeplessdomain.com/* // @include http://www.webtoons.com/* // ==/UserScript== var dataCache = null; //cache para no leer del disco y parsear la configuracion en cada getData var firstRun = false; //por si funcionan las GM_* pero falla preguntar sin el "this.", o si tiran una excepcion al preguntar try{ GM_getValue = GM_getValue || this.GM_getValue; }catch(e){ GM_getValue = false; } try{ GM_setValue = GM_setValue || this.GM_setValue; }catch(e){ GM_setValue = false; } try{ GM_deleteValue = GM_deleteValue || this.GM_deleteValue; }catch(e){ GM_deleteValue = false; } try{ GM_xmlhttpRequest = GM_xmlhttpRequest || this.GM_xmlhttpRequest; }catch(e){ GM_xmlhttpRequest = false; } try{ GM_registerMenuCommand = GM_registerMenuCommand || this.GM_registerMenuCommand; }catch(e){ GM_registerMenuCommand = false; } try{ GM_openInTab = GM_openInTab || this.GM_openInTab; }catch(e){ GM_openInTab = false; } try{ //fix para usar data persistente sin pseudogreasemonkey if (!GM_getValue || GM_getValue.toString().indexOf("not supported")>-1) { GM_getValue=function (key,def) { if(!localStorage || !localStorage.hasOwnProperty(key)) return def; var val = localStorage[key]; return val !== undefined ? val : def; }; GM_setValue=function (key,value) { if(!localStorage) return null; return localStorage[key]=value; }; GM_deleteValue=function (key) { if(localStorage) localStorage.removeItem(key); }; } else{ var gmsets = GM_getValue('wcr.settings', null); if(gmsets) dataCache = JSON.parse(gmsets); else{ firstRun = true; GM_setValue('wcr.settings', '{}'); dataCache = {}; } } if(!GM_openInTab) GM_openInTab = window.open; if(!GM_registerMenuCommand || GM_registerMenuCommand.toString().indexOf("not supported")>-1){ GM_registerMenuCommand = function(txt, fun){ var boton = document.createElement('button'); boton.innerHTML = txt; setEvt(boton, 'click', fun); document.body.appendChild(boton); }; } }catch(e){} var prefetchSize = confPrefetchSize([defaultSettings.prefetchBack, defaultSettings.prefetchNext]); //number of prefetched pages ahead in each direction var prefetchSizeStart = confPrefetchSizeStart([defaultSettings.prefetchBackStart, defaultSettings.prefetchNextStart]); //number of prefetched pages in each direction the first time var prefetchNoNext = confBool('prefetchNoNext', true); var keepLayout = confKeepLayout(defaultSettings.fullLayout); //decide to keep the original layout of the page (true) or use a clean minimalistic layout (false) var debug = confDebug(defaultSettings.debugMode); //alerts on errors, and shows some of the currently cache'd pages/images with the "," key var showButtons = confShowButtons(defaultSettings.showButtons); //show or hide the buttons (back/next, bookmarks, settings, etc...) var leftImageClick = confLeftImageClick(defaultSettings.clikLeftHalfGoesBack); //specifies if clicking the left half of the image will take you to the previous page var goToBookmark = confBool('goToBookmark', defaultSettings.goToBookmark); var useHistoryAPI = confBool('useHistoryAPI', true); var moveWhileLoading = confBool('moveWhileLoading', defaultSettings.moveWhileLoading); var maximgs = []; //mantener solo este num de imagenes cargadas atras y adelante de la actual para no comer memoria maximgs[1] = Math.max(23, prefetchSize[1]); maximgs[-1] = Math.max(23, prefetchSize[0]); var usarb64 = confBool('b64_images', false); /* paginas[i] = { url: //'substring' or /regexp/ that matches the url img: //gets the element containing the desired image (not just the src, but the whole ) //if not present, searches an img with a src containing some common strings like "/comics/" or "/strips/" //'string' means "the element whose src starts with 'string'" back: next: //get the href of the back and next links //if not present, defaults to links containing "back"|"prev" / "next" in the element's innerHTML //'string' means "the href of the element that satisfies 'string' (as an xpath expression) extra: //optional array of additional content, as a 'literal string' or taken from the html by either ['xpath'] or [/regexp/, group number] bgcol: txtcol: //override the default colors of the page for readability or aesthetics //'#RRGGBB', '#RGB', 'rgb(r, g, b)' js: //executes a custom function after a page change, receiving the direction (1=forward, -1=back, 0 the first time) as a parameter scrollx: scrolly: //tells the top-left coordinates for scrolling after changing page (default = U/L) //'U', 'D', 'L', 'R' and 'M' are to show the top, bottom, left, right and middle of the image //or it can be a number (in pixels) or a function that returns a number layout: //forces the default behaviour for the layout (true=keep the original, false=clean it) xelem: //string with an xpath expression to get the element to be used as placeholder for the extra content //used only when keeping the original layout } img/back/next/extra[i] can be either: 'string', ['xpath expression that returns the first element found'], ['xpath expression that returns an array of elements', 'string to put between each element', ?first_index, ?last_index], [/regular expression/, group number to get the desired content] function(html_of_requested_page, position_relative_to_the_starting_page){ return content; } a 'string' is interpreted as part of a default xpath expression for img/back/next, or a literal string for extra[i] */ var paginas = [ { url: 'penny-arcade.com', img: [['#comicFrame img']], fixurl: function(url, img, link, pos){return url.replace("http:","");}, extra: [[['.title h2']]], style: '#bb,#header{position:relative;}' }, { url: 'xkcd.', img: ['//div[@id="comic"]//img'], first: '.="|<"', last: '.=">|"', extra: ['
', ['//div[@id="ctitle"]'], function(html, pos) { var href = xpath('//div[@id="comic"]//a/@href', html); return '
' + (href.indexOf('xkcd') >= 0 ? 'Large version' : 'Bonus Link!') + ''; }, function(html, pos) { var comic = xpath('//div[@id="comic"]', html); var img = comic.getElementsByTagName('img')[0]; img.parentNode.removeChild(img); return comic; }, function(html, pos){ var nr = link[pos].match(/(\d+)\/$/)[1]; var url = 'http://www.explainxkcd.com/wiki/index.php/' + nr; return 'Explain Xkcd'; }], bgcol: '#fff' }, { url: '*.dilbert.com', img: [['.img-comic']], back: '@alt="Older Strip"', next: '@alt="Newer Strip"' }, { url: 'explosm.net/comics', img: [['#main-comic']], extra: [['//small[@class="author-credit-name"]/../../..'], [/[', ['//h3/*/text()'], ']

', [/"storycontent"[\s\S]+?([\s\S]+?)<\/div>/i, 1]] }, { url: 'thedoghousediaries.com', img: [['#imgdiv img']], back: [['#previouslink']], next: [['#nextlink']], extra: [[['#title-signoff-share']]] }, { url: /erfworld\.com\/(page\/|$)/, img: ['//div[@class="entry"]//img'], back: 'contains(.,"Older")', next: 'contains(.,"Newer")', extra: [['//div[@class="post"]/*', '', 0, 2], ['//div[@class="post"][1]//div[@class="entry"]/p[not(.//img)]', ''], ''] }, { url: 'erfworld.com', extra: [[['.post>h2']], ['//table[@class="PxgGalleryTable"]//p[not(img)]', '']] }, { url: 'es.juanelo.net/archivo', img: 'http://es.juanelo.net/tiras/', back: '.="« Anterior"', next: '.="Siguiente »"', style: '#page{width:1210px;} .narrowcolumn{width:810px;}' }, { url: 'es.juanelo.net/show', img: ['//div[@id="tirashow"]//img[starts-with(@src, "http://es.juanelo.net/tiras/")]'], back: ['//div[@id="tirashow"]//a[.="« Anterior"]/@href'], next: ['//div[@id="tirashow"]//a[.="Siguiente »"]/@href'], style: '#page{width:1210px;} .narrowcolumn{width:810px;}' }, { url: 'es.juanelo.net/20', img: 'http://es.juanelo.net/tiras/', back: 'contains(.,"«")', next: 'contains(.,"»")', extra: [[['img[src*="/tiras/"]', '
', 1]], [['.post>h2']], [['.entry>p']]], style: '#page{width:1210px;} .narrowcolumn{width:810px;}', bgcol: '#334255' }, { url: 'mangastream.com|readms.com', img: [['#manga-page']], back: [['.previous a']], next: [['.next a']], style: '.subnav[style*="fixed"]{display: none;}#wcr_imagen{max-width:none;}#reader-sky{z-index:-1;}', scrollx:'R', layout: true }, { url: 'terrorisland.net', extra: [['//div[@class="commentary"]', '']] }, { url: 'drmcninja.com', img: 'http://drmcninja.com/comics/', extra: ['
', ['//select[@id="series_select"]'], ['//select[@id="page_select"]'], [['.post-comic .entry']]], js: function(dir){ var selSer = xpath('//div[@id="wcr_div"]//*[@id="series_select"]'); setEvt(selSer, 'change', function(){ exec("document.location.href = '/archives/comic/'+series_arr["+selSer.selectedIndex+"].posts[0];"); }); selSer.style.visibility = 'visible'; selSer.disabled = false; var selPag = xpath('//div[@id="wcr_div"]//*[@id="page_select"]'); setEvt(selPag, 'change', function(){ document.location.href = '/archives/comic/'+selPag.value; }); } }, { url: 'manga.animea.net', img: ['//img[@class="mangaimg"]'], back: function(html, pos){ var page = parseInt(html.match(/var page = (\d+);/)[1]); var pages = parseInt(html.match(/var pages=(\d+);/)[1]); var chapter = html.match(/var chapter="(.+?)";/)[1]; var manga = decodeURI(link[pos]).match(new RegExp('/([^/]+)'+chapter.replace(/[-[\]{}()+?.,\\^$#\s]/g, "\\$&")))[1]; if(page > 1) return '/'+manga+chapter+'-page-'+(page-1)+'.html'; var chap = xpath('//select[@id="chapterlistheader"]/option[@value="'+chapter+'"]/preceding-sibling::option[1]/@value'); return '/'+manga+chap+'-page-end.html'; }, next: function(html, pos){ var page = parseInt(html.match(/var page = (\d+);/)[1]); var pages = parseInt(html.match(/var pages=(\d+);/)[1]); var chapter = html.match(/var chapter="(.+?)";/)[1]; var manga = decodeURI(link[pos]).match(new RegExp('/([^/]+)'+chapter.replace(/[-[\]{}()+?.,\\^$#\s]/g, "\\$&")))[1]; if(page < pages) return '/'+manga+chapter+'-page-'+(page+1)+'.html'; var chap = xpath('//select[@id="chapterlistheader"]/option[@value="'+chapter+'"]/following-sibling::option[1]/@value'); return '/'+manga+chap+'-page-1.html'; }, extra: [[['#chapterlistheader']], [['[name="page"]']]], scrollx:'R', js: function(dir){ var selchap = selCss('#wcr_extra #chapterlistheader'); if(dir){ selchap.innerHTML = selCss('#chapterlistheader', '
'+extra[0]+'
').innerHTML; } selchap.value = link[posActual].match(/(-chapter-.+?)-/)[1]; } }, { url: 'shamusyoung.com/twentysidedtale', img: 'http://shamusyoung.mu.nu/images/comic_', extra: [['//div[@class="entry-text"]/*', '', 5, -4], ['//h2[@class="entry-title"]']] }, { url: 'gpf-comics.com', img: '/comics/', back: './img[@alt="Previous Comic"]', next: './img[@alt="Next Comic"]' }, { url: 'daisyowl.com', img: ['//div[@align="center"]//img[starts-with(@src,"/comic_images/")]'] }, { url: 'hyperdeathbabies.com', img: 'anomaly/' }, { url: 'mangatoshokan.com|doujintoshokan.com', img: ['//img[@id="readerPage"]'], back: '.="« Last"', next: '.="Next »"', extra: ['Chapter: ', ['//table[@class="reader"]//select', ' Page: ', 0, 2], '

', ['//form/select[@onchange]']], txtcol: '#fff', scrollx:'R' }, { url: 'amultiverse.com', img: [['#comic img']], extra: [['//div[@class="post-content"]']], js: function(){ if(keepLayout) get('comic').style.height = get('wcr_div').offsetHeight + 'px'; }, xelem: '//div[@id="content"]//div[@class="post-content"]', style: '#comic button{float:none;}' }, { url: 'wondermark.com', img: 'http://wondermark.com/c/', back: '@rel="prev"', next: '@rel="next"', txtcol: '#fff' }, { url: 'amazingsuperpowers.com', img: function(html, pos){ try{ return selCss('#comic-1 img', html); } catch(e){ if(selCss('#comic-1 #comic-short', html)) return selCss('img', html); } }, extra: [[['#comic-1 #comic-short']], function(html, pos){ var href = selCss('#question a', html).href; var htmlHidden = syncRequest(href, pos); return contenido(htmlHidden, [['#comic > *', '']]); }, [['.post']]], style: '#page,#header{width:auto;}', layelem:'//div[@id="comic-1"]' }, { url: 'anymanga.com', img: ['//img[starts-with(@src, "/manga") and not(contains(@src, "/covers/"))]'], back: [/var url_back = "([^\"]+)"/, 1], next: [/var url_next = "([^\"]+)"/, 1], scrollx:'R' }, { url: 'm.mangafox.me', img: ['//img[@id="image"]'], back: ['//select/option[@selected]/preceding-sibling::*[1]'], next: ['//div[@id="viewer"]/a'], scrollx:'R' }, { url: 'mangafox.me', img: ['//img[@id="image"]'], back: function(html, pos){ var href = contenido(html, ['//a[contains(@class, "prev_page")]/@href'], pos); if(href.indexOf('javascript')<0){ if(href.indexOf('/')<0) return link[pos].replace(/[^\/]*$/, href); return href; } return contenido(html, ['//span[contains(., "Previous Chapter")]/../a/@href'], pos).replace(/\d+\.html/, '999.html'); }, next: function(html, pos){ var current_page = parseInt(html.match(/var current_page=(\d+);/)[1]); var final_page_of_chapter = parseInt(html.match(/var total_pages=(\d+);/)[1]); if(current_page < final_page_of_chapter){ //just load next page var href = contenido(html, ['//a[contains(@class, "next_page")]/@href'], pos); if(href.indexOf('/')<0) return link[pos].replace(/[^\/]*$/, href); return href; } return contenido(html, ['//span[contains(., "Next Chapter")]/../a/@href'], pos); }, extra: [function(html, pos){ if(extra[0]) return extra[0].replace(/(<\/select>)[\s\S]*/i, '$1'); return contenido(html, ['//select[@id="bottom_chapter_list"]'], pos); }, ' ', [['select.m']], '', function(html, pos){ var alt = xpath('//img[@id="image"]/@onerror', html).replace(/^.+?'|'$/g, ''); return ''+link+''; }], txtcol: 'orange', layout: false }, { url: 'sorcery101.net', img: [['.comic img']] }, { url: 'treadingground.com', extra: [[['.entry']]] }, { url: 'jerkcity.com', img: [['.aidsy']], extra: [[['.slurping']]], style: '#wcr_div a{color:#000;}', js: function(dir){ if(!dir) document.onkeyup = ''; } }, { url: 'kiwiblitz.com', img: [['#cc-comic']], extra: [[['.cc-newsarea']]], style: '#cc-comicbody{position: relative !important;} #pixiestrip {visibility: hidden;}', }, { url: 'thepunchlineismachismo.com|zombieboycomics.com', img: [['#comic img']], extra: [[['.entry']]], style: '#wcr_div button{float:none;}', }, { url: 'kafkaskoffee.com', img: [['.webcomic-object img']], extra: [[['.webcomic_post h1']], [['.content']]] }, { url: 'out-at-home.com', extra: [[['.comic']]], txtcol: '#fff' }, { url: 'occasionalcomics.com|bearandtiger.com', extra: [[['.entry']]] }, { url: 'babyblues.com', img: [['.comic img']] }, { url: 'mangatopia.net', img: 'manga/', back: ['//input[@id="left"]/@value'], next: ['//input[@id="right"]/@value'], extra: [[['.page_selector']]], scrollx:'R' }, { url: 'mankin-trad.net', img: 'read/', js: function(dir){ if(!dir){ var hn = get('hoverNav'); hn.parentNode.removeChild(hn); } }, extra: [[['.pagination']]], scrollx:'R' }, { url: '*.mangahere.co', img: [['#image']], back: function(html, pos){ var a = selCss('.prew_page', html); if(a.href.indexOf('javascript:')) return a; return xpath('//strong[.="Previous Chapter:" or .="Capítulo Anterior:"]/following-sibling::a/@href', html) + "last.html"; }, next: function(html, pos){ try{ return xpath('//select[@class="wid60"]/option[@selected]/following-sibling::option[1]/@value', html); } catch(e){ return xpath('//p[contains(., "es el siguiente...")]/a | //strong[.="Next Chapter:"]/following-sibling::a', html); } }, js: function(dir){ if(!dir) exec("previous_page = next_page = '';"); var selcap = selCss('#wcr_extra #top_chapter_list'); var caps = selcap.options; for(var i=0; i= 0){ selcap.selectedIndex = i; break; } } }, extra: [function(html, pos){ return selCss('#top_chapter_list', pos ? document : html); }, [['.wid60']]], scrollx:'R' }, { url: 'spaceavalanche.com', img: [['.entry img']] }, { url: 'schlockmercenary.com', img: [['#comic img']], back: '.="Previous Comic"', next: '.="Next Comic"', extra: [[['#comic img', '', 1]], [['div.footnote']]], style: '#wcr_extra{width:780px; margin:0 auto;}' }, { url: 'warehousecomic.com', extra: [[['.newsBox p', '']]] }, { url: 'nerfnow.com', img: [['#comic img']], extra: [[['.comment']]], }, { url: 'zapcomic.com', img: 'http://www.zapcomic.com?comic_object=' }, { url: 'shortpacked.com', img: 'http://www.shortpacked.com/comics/' }, { url: 'axecop.com', img: [['#comic img']], back: '.="Prev"', next: '.="Next"', extra: [[['.entry-content']]], txtcol: '#fff' }, { url: 'somethingofthatilk.com', img: '/comics/', back: '@class="prev"', next: '@class="next"', extra: [[['#captioning']]] }, { url: 'reddit.com', img: function(html, pos){ var posts = selCss('#siteTable>.thing:not(.promoted)', html, true); var post = posts[((pos%25)+25)%25]; var tit = selCss('a.title', post).href; if(tit.match(/\.(jpg|png|gif)(\?.+)?$/i)) return tit; else if(tit.match(/http:\/\/imgur\.com\/\w+$/i)) return 'http://i.imgur.com/'+tit.match(/http:\/\/imgur\.com\/(\w+)$/i)[1]+'.jpg'; else if(tit.match(/http:\/\/www\.quickmeme\.com\/meme\/\w+\/?$/i)) return 'http://i.qkme.me/'+tit.match(/http:\/\/www\.quickmeme\.com\/meme\/(\w+)/i)[1]+'.jpg'; else if(tit.match(/http:\/\/qkme\.me\//i)) return 'http://c0016417.cdn2.cloudfiles.rackspacecloud.com/'+tit.match(/http:\/\/qkme\.me\/(\w+)/i)[1]+'.jpg'; try{ return selCss('a.thumbnail img', post); } catch(e){} try{ return selCss('img#header-img', html); } catch(e){ return '/favicon.ico'; } }, back: function(html, pos){ if(pos%25) return '##'+(pos-1); return selCss('a[rel~="prev"]', html); }, next: function(html, pos){ if((pos+1)%25) return '##'+(pos+1); return selCss('a[rel~="next"]', html); }, extra: [function(html, pos){ var posts = selCss('#siteTable>.thing:not(.promoted)', html, true); return posts[((pos%25)+25)%25]; }], js: function(dir){ exec("expando_child($('.expando-button'))"); }, layelem:'//body/div[contains(@class,"content")]' }, { url: 'blankitcomics.com', img: 'http://blankitcomics.com/bicomics/' }, { url: 'anime-source.com', img: 'http://www.anime-source.com/html/images/', scrollx:'R' }, { url: 'mangarush.com', img: 'http://www.mangarush.com/files/mangas/', back: function(html, pos){ var path = match(html, /var path = '(.+)';/, 1); var manga = match(html, /var thisManga = '(.+)';/, 1); var chapter = match(html, /var thisChapter = '(.+)';/, 1); var page = Number(match(html, /var thisPage = (.+);/, 1)); if(page > 1) return path + "manga/" + escape(manga) + "/" + escape(chapter) + "/p-" + (page-1); var prevChap = xpath('//select[@id="chapters_list"]/option[@selected]/preceding-sibling::option[1]/@value', html); return path + "manga/" + escape(manga) + "/" + escape(prevChap) + "/p-1"; }, next: function(html, pos){ var path = match(html, /var path = '(.+)';/, 1); var manga = match(html, /var thisManga = '(.+)';/, 1); var chapter = match(html, /var thisChapter = '(.+)';/, 1); var page = Number(match(html, /var thisPage = (.+);/, 1)); var pages = Number(match(html, /var pages = (.+);/, 1)); var nextChapter = match(html, /var nextChapter = '(.*)';/, 1); if(page < pages) return path + "manga/" + escape(manga) + "/" + escape(chapter) + "/p-" + (page+1); if(nextChapter !== "") return path + "manga/" + escape(manga) + "/" + escape(nextChapter) + "/p-1"; throw new Error('fin'); }, extra: [[['.mangareader select', '']]], scrollx:'R' }, { url: 'citymanga.com', img: '/files/images/', back: [/id="previousbutton" onclick="javascript:window.location='(.+?)';"/, 1], next: [/id="nextbutton" onclick="javascript:window.location='(.+?)';"/, 1], extra: [[['#chapterselector']], [['#pageselector']]], scrollx:'R' }, { url: 'luscious.net', img: [['#single_picture']], fixurl: function(url, img, link){ if(img) return url.replace(/(\.\d+x\d+)(\.\w+$)/, '$2'); return url; }, style: '#wcr_div button{display:inline;}', scrollx:'R' }, { url: 'old.lu.scio.us', img: 'http://static.lu.scio.us/hentai/', fixurl: function(url, img, link){ if(img) return url.replace('normal__', ''); return url; }, scrollx:'R' }, { url: 'geekculture.com', img: [['p > img']] }, { url: 'geeklifecomic.com', extra: [[['.entry']]] }, { url: 'thedoujin.com', img: 'http://img', back: [/Previous/, 1], next: [/Next/, 1], scrollx:'R' }, { url: 'eatmanga.com', img: [['#eatmanga_image, #eatmanga_image_big, #bigimage, .eatmanga_bigimage']], back: function(html, pos){ try{ return selCss('#page_previous:not([onclick])', html); } catch(e){ return xpath('//select[@id="bottom_chapter_list"]/option[contains("'+link[pos]+'", @value)]/following-sibling::option[1]/@value', pos ? '
'+extra[0]+'
' : document); } }, next: function(html, pos){ try{ return selCss('#page_next:not([onclick])', html); } catch(e){ return xpath('//select[@id="bottom_chapter_list"]/option[contains("'+link[pos]+'", @value)]/preceding-sibling::option[1]/@value', pos ? '
'+extra[0]+'
' : document); } }, extra: [[['.navigation select', ' ', 2]]], js: function(dir){ var selchap = selCss('#wcr_extra #bottom_chapter_list'); if(dir) selchap.innerHTML = selCss('#bottom_chapter_list', '
'+extra[0]+'
').innerHTML; selchap.value = xpath('//select[@id="bottom_chapter_list"]/option[contains("'+link[posActual]+'", @value)]/@value', selchap); }, scrollx:'R' }, { url: 'oslevadosdabreca.com', img: 'http://www.oslevadosdabreca.com/tiras/', first: [['.nav-first a']], last: [['.nav-last a']] }, { url: 'faans.com', back: '@rel="prev"', next: '@rel="next"' }, { url: 'cheercomic.com', img: 'comics/', back: 'img[@id="navimg3"]', next: 'img[@id="navimg4"]' }, { url: 'drunkduck.com', img: [['#comic img']], back: 'img[@class="arrow_prev"]', next: 'img[@class="arrow_next"]', first: 'img[@class="arrow_first"]', last: 'img[@class="arrow_last"]', extra: [[['#author_note_holder']]], style: '#wcr_extra #author_note_holder{float:none;text-align:left;min-height:0;} #wcr_extra .thumbnailleft img{width:60px;} #wcr_extra .postcontent{width:auto;}' }, { url: 'ephralon.de', img: '/seekers/' }, { url: 'sgvy.com', img: [['#comic']] }, { url: 'truefork.org', extra: [[['.plaintext']]] }, { url: /anelnoath\.com\/\w+\d+\.htm/, img: [['img']] }, { url: 'nsfw-comix.com', img: 'comix/', extra: [[['img[src^="comix/"]', '
', 1]]] }, { url: 'thewotch.com', img: 'comics/', back: 'img[contains(@src,"nav_prevpage")]', next: 'img[contains(@src,"nav_nextpage")]', extra: [[['.comments']]] }, { url: 'thedevilbear.com', img: 'comixx/' }, { url: 'terinu.com', img: function(html, pos){ if(!pos) return selCss('#Image1'); var cappag = imagen[0].match(/Comic(\d+)Pg(\d+)/); var nombre = 'Chapter '+parseInt(cappag[1])+' Page '+parseInt(cappag[2]); var op = xpath('//option[.="'+nombre+'"]/'+ (pos>0?'following':'preceding')+'-sibling::option['+Math.abs(pos)+']'); var cappagimg = op.textContent.match(/Chapter (\d+) Page (\d+)/); var cap = cappagimg[1]; while(cap.length<2) cap='0'+cap; var pag = cappagimg[2]; while(pag.length<3) pag='0'+pag; return '/Comic/Comic'+cap+'Pg'+pag+'.jpg'; }, back: function(html, pos){ return '##'+(pos-1); }, next: function(html, pos){ return '##'+(pos+1); } }, { url: 'las-historietas.blogspot.com', img: ['//div[contains(@class, "post-body")]//a[img and (contains(@href, ".png") or contains(@href, ".jpg") or contains(@href, ".gif"))]/@href'], back: '@id="blog-pager-older-link"', next: '@id="blog-pager-newer-link"', extra: [function(html, pos){ var div = selCss('.post-body', html); var aimgs = selCss('[href$=".png"]>img,[href$=".jpg"]>img,[href$=".gif"]>img,[href$=".PNG"]>img,[href$=".JPG"]>img,[href$=".GIF"]>img', div, true); aimgs[0].parentNode.removeChild(aimgs[0]); for(var i=1; iimg']] }, { url: 'whiteninjacomics.com', img: [['[valign="top"]>[src^="/images/comics/"]']], back: 'img[@src="/images/previous.jpg"]', next: 'img[@src="/images/next.jpg"]', extra: [[['[valign="bottom"]>[src^="/images/comics/"]']]] }, { url: 'apenotmonkey.com', back: '@rel="prev"', next: '@rel="next"' }, { url: 'malandchad.com', back: '@rel="prev"', next: '@rel="next"' }, { url: 'goodmanga.net', img: [['#manga_viewer img']], back: [['a.previous_page']], next: [['a.next_page']], extra: [[['#asset_1 select.chapter_select']], 'Page ', [['#asset_2 select.page_select']], ' ', ['//select[@class="page_select"]/following-sibling::span'], ''], xelem: '//div[@id="manga_nav_top"]', style: '#manga_nav_bottom{display:none}', scrollx:'R' }, { url: 'digitalcomicmuseum.com/preview', img: 'cache/' }, { url: 'goldenagecomics.co.uk', img: function(html, pos){ return get('img_'+pos).href; }, back: function(html, pos){ if(!pos) throw new Error('fail'); return '##'+(pos-1); }, next: function(html, pos){ if(!get('img_'+(pos+1))) throw new Error('fail'); return '##'+(pos+1); }, layelem:'//div' }, { url: 'fourcolorshadows.blogspot.com|thehorrorsofitall.blogspot.com', img: function(html, pos){ var aimgs = xpath('//div[contains(@class,"blog-posts")]//div/a[img[not(@class="icon-action")]]', html, true); var num = pos ? Number(link[pos].match(/##(\d+);/)[1]) : 0; return aimgs[pos-num].href; }, back: function(html, pos){ throw new Error('fail'); }, next: function(html, pos){ if(!pos) return '##0;1'; var aimgs = xpath('//div[contains(@class,"blog-posts")]//div/a[img[not(@class="icon-action")]]', html, true); var num = Number(link[pos].match(/##(\d+);/)[1]); if(num+aimgs.length > pos+1) return '##' + num + ';' + (pos+1); return selCss('#Blog1_blog-pager-older-link', html).href + '##' + (num+aimgs.length) + ';' + (pos+1); }, extra: [function(html, pos){ var post = xpath('//div[contains(@class,"post-body") and .//a[@href="'+imagen[pos]+'"]]', html); return outerHTML(selCss('h3', post.parentNode)) + '
' + post.textContent + outerHTML(selCss('.post-footer', post.parentNode)); }], layelem:'//div[@id="header-wrapper"]' }, { url: 'bato.to/reader', img: function(html, pos) { try { return selCss("#comic_page", html, 0); } catch (e) { // Not loaded yet if (pos === 0) setTimeout(run_script, 2000); throw new Error(e); } }, back: function(html, pos) { var url; try { url = xpath('//a[img[@title="Previous Page"]]', html).href; } catch (e) { url = xpath('//a[img[@title="Previous Chapter"]]', html).href; } url2 = url.replace(/#[^_]*$/, "$&_1").replace("reader#", "areader?id=").replace("_", "&p=").replace("http:",""); var both = [url, url2]; both.doubleLink = true; return both; }, next: function(html, pos) { var url; try { url = xpath('//a[img[@title="Next Page"]]', html).href; } catch (e) { url = xpath('//a[img[@title="Next Chapter"]]', html).href; } url2 = url.replace(/#[^_]*$/, "$&_1").replace("reader#", "areader?id=").replace("_", "&p=").replace("http:",""); var both = [url, url2]; both.doubleLink = true; return both; }, extra: [['//img[@id="comic_page" and not(./ancestor::div[contains(@style, "display: none;")])]', '
', 1], [['.moderation_bar']], function(html, pos){ var xs = selCss('.moderation_bar select', null, true); for(var i =0; i0) return '##'+(pos-1)+'_'+num; return xpath('//div[@class="selector2" and starts-with(., "chapter:")]//a[contains("'+link[pos]+'", @href)]/preceding-sibling::a[1]/@href', html)+'##'+(pos-1)+'_0'; }, next: function(html, pos){ var num = link[pos].match(/##.*_(\d+)/); num = num ? parseInt(num[1])+1 : 1; if(html.match(new RegExp("imageArray\\["+num+"\\]='(.+?)';"))) return '##'+(pos+1)+'_'+num; return xpath('//div[@class="selector2" and starts-with(., "chapter:")]//a[contains("'+link[pos]+'", @href)]/following-sibling::a[1]/@href', html)+'##'+(pos+1)+'_0'; }, js: function(dir){ if(!dir) exec("$(document).unbind('keyup');"); }, layelem:'//div[@id="thePic"]', scrollx:'R' }, { url: 'foolrulez.org|manga.redhawkscans.com|mangatopia.net|simple-scans.com|fallensyndicate.com|slide.extrascans.net|reader.fth-scans.com|reader.japanzai.com|manga-tu.be|friendshipscans.com|yuri-ism.net', img: [['#page img']], back: function(html, pos){ try{ var relpath = xpath('//div[@class="topbar_right"]/span[@class="numbers"]/div[contains(concat(" ",@class," ")," current_page ")]/following-sibling::div[1]//@href', html); if (relpath.match(/^http/i)) return relpath; var basepath = ""; try{ basepath = html.match(/var\s+base_?url\s*=\s*(['"])(.*?)\1\s*;/i)[2]; } catch(e){} return basepath + relpath; } catch(e){ var chap = xpath('//div[@class="topbar_left"]/div[2]/ul/li[.//text()=//div[@class="topbar_left"]/div[2]/div/a/text()]/following-sibling::li[1]//@href', html); var request = new XMLHttpRequest(); request.open('GET', chap, false); request.send(null); if (request.status === 200) { return xpath('//div[@class="topbar_right"]/div[1]/ul/li[last()]//@href', request.responseText); } } }, next: function(html, pos){ try{ var relpath = xpath('//div[@class="topbar_right"]/span[@class="numbers"]/div[contains(concat(" ",@class," ")," current_page ")]/preceding-sibling::div[1]//@href', html); if (relpath.match(/^http/i)) return relpath; var basepath = ""; try{ basepath = html.match(/var\s+base_?url\s*=\s*(['"])(.*?)\1\s*;/i)[2]; } catch(e){} return basepath + relpath; } catch(e){ return xpath('//div[@class="topbar_left"]/div[2]/ul/li[.//text()=//div[@class="topbar_left"]/div[2]/div/a/text()]/preceding-sibling::li[1]//@href', html); } }, js: function(dir){ if(!dir) exec("$(document).unbind('keydown');"); }, extra: [function(html, pos){ var topbar = selCss('div.topbar', html); if (!topbar) return; var basepath = ""; try{ basepath = html.match(/var\s+base_?url\s*=\s*([\'\"])(.*?)\1\s*;/i)[2]; } catch(e){} var relpaths = xpath('//a[starts-with(@href,"page/")]', topbar, true); for (var x = 0; x < relpaths.length; ++x) { relpaths[x].setAttribute('href', basepath + relpaths[x].getAttribute('href')); } var pagesLinks = xpath('//a[@onclick]', topbar, true); for (var x = 0; x < pagesLinks.length; ++x) { pagesLinks[x].removeAttribute('onclick'); } return topbar.outerHTML; }], xelem: '//div[@class="panel"]', layelem:'//div[@id="page"]', scrollx:'R', style: '#wrapper{overflow:visible !important;}' }, { url: 'manga-go.com', img: [['#page1']], back: '@class="prev_page"', next: '@class="next_page"', scrollx:'R' }, { url: 'comicstriplibrary.org', img: '/images/comics/', back: '.="<< Previous"', next: '.="Next >>"' }, { url: 'wirepop.com', img: [['center>a>img, center>img']], scrollx:'R' }, { url: 'fantasyrealmsonline.com', img: [['img[border="1"]']] }, { url: 'psychopandas.com', img: '/files/', style: '.imgPage span{display:none !important;}', scrollx:'R' }, { url: 'readonline.egscans.org|read.egscans.com', img: function(html, pos){ var num = link[pos].match(/(##.*_|\/)(\d+)$/); num = num ? parseInt(num[2])-1 : 0; return html.match(/img_url.push\('.+' \);/g)[num].match(/'(.+)'/)[1]; }, back: function(html, pos){ var base; var num = link[pos].match(/(##.*_|\/)(\d+)$/); num = num ? parseInt(num[2])-1 : 0; if(!num){ base = '/' + html.match(/var prev_chap = '(.+)';/)[1] + '/'; var htmlPrev = syncRequest(base, pos); num = parseInt(htmlPrev.match(/var page_max = parseInt\('(\d+)'\);/)[1]); base += num + '/'; } else{ var selpag = selCss('[name="page"]', html); base = selpag.getAttribute('onchange').match(/'(.+)', '(.+)'/); base = base[1]+'/'+base[2]+'/'+num; } return base+'##'+(pos-1)+'_'+num; }, next: function(html, pos){ var base; var num = link[pos].match(/(##.*_|\/)(\d+)$/); num = num ? parseInt(num[2])+1 : 2; var page_max = parseInt(html.match(/var page_max = parseInt\('(.+)'\);/)[1]); if(num > page_max){ base = html.match(/var next_chap = '(.+)';/)[1]+'/1'; num = 1; } else{ var selpag = selCss('[name="page"]', html); base = selpag.getAttribute('onchange').match(/'(.+)', '(.+)'/); base = base[1]+'/'+base[2]+'/'+num; } return base+'##'+(pos+1)+'_'+num; }, extra: [[['.pager>*', '']]], xelem: '//div[@class="pager"]', style: '#page_select a{display:none;} #wcr_div button{background-color:#ccc;}', txtcol: '#fff', fixurl: function(url, img, link){ if(link && document.location.host == 'read.egscans.org'){ var base = selCss('base'); if(base) base.href = base.href.replace('readonline.egscans.org', 'read.egscans.org'); return url.replace('readonline.egscans.org', 'read.egscans.org'); } return url; }, scrollx:'R' }, { url: 'gallery.ryuutama.com/view.php', img: [['img']], back: function(html, pos){ var page; if(!pos){ var manga = html.match(/current_manga = "(.+?)";/)[1]; page = parseInt(html.match(/current_page = "(.+?)";/)[1]) - 1; var total = parseInt(html.match(/total_pages = "(.+?)";/)[1]); if(page) return '/api.php?grab=manga&id='+manga+'&page='+page+'##'+total; } else{ page = parseInt(link[pos].match(/page=(\d+)/)[1]) - 1; if(page) return link[pos].replace(/page=(\d+)/,'page='+page); } throw new Error('fail'); }, next: function(html, pos){ var page, total; if(!pos){ var manga = html.match(/current_manga = "(.+?)";/)[1]; page = parseInt(html.match(/current_page = "(.+?)";/)[1]); total = parseInt(html.match(/total_pages = "(.+?)";/)[1]); return '/api.php?grab=manga&id='+manga+'&page='+page+'##'+total; } else{ page = parseInt(link[pos].match(/page=(\d+)/)[1]) + 1; total = parseInt(link[pos].match(/#(\d+)/)[1]); if(page <= total) return link[pos].replace(/page=(\d+)/,'page='+page); } throw new Error('fail'); }, scrollx:'R', layelem:'//div[@id="imageContainer"]' }, { url: 'gallery.ryuutama.com/api.php', img: function(html, pos){ redirect(link[0].replace('api.php?grab=manga&id=', 'view.php?manga=')); } }, { url: '*.tiraecol.net', img: [['img[src*="tiraecol.net/modules/comic/cache/images/"]']], back: ['//td[@width="200px" and @align="left"]/a[2]'], next: ['//td[@width="200px" and @align="right"]/a[1]'], extra: [[['.title']]] }, { url: 'conejofrustrado.com', back: '@class="navAnterior"', next: '@class="navSiguiente"' }, { url: 'e2w-illustration.com', img: 'http://www.e2w-illustration.com/images/' }, { url: '2gamerz.com', img: 'http://2gamerz.com/wp-content/webcomic/' }, { url: 'mymangaspot.com', img: [['.mng_rdr a img']], back: '.="Prev"', next: '.="Next"', extra: [[['.wpm_nav select', ' ', 0, 2]]], style: '.mng_rdr>div{overflow:visible !important;}', scrollx:'R' }, { url: 'comic.naver.com', img: [['.wt_viewer img']], back: [['.pre a']], next: [['.next a']], extra: [[['.wt_viewer img', '
', 1]]], style: '.wt_viewer>img{display:none;}' }, { url: 'webtoons.com', img: ['//*[@id="_imageList"]/img/@data-url'], back: [['.pg_prev']], next: [['.pg_next']], extra: [[['#_imageList']]], layelem: '//*[@id="_imageList"]', js: function(dir){ // Refresh webtoon's image loading script exec("oVisible.refresh();oVisible.check()"); // Click on any img var elemImagen = document.querySelectorAll('#wcr_extra img'); setEvt(elemImagen, 'click', imgClick); setEvt(elemImagen, 'mousemove', imgCursor); }, style: '#wcr_imagen{display:none;}', }, { url: 'mangatraders.com', img: [['#image']], back: [/value="Prev Page" onclick="window.location.href='([^']+)'"/, 1], next: [/value="Next Page" onclick="window.location.href='([^']+)'"/, 1], js: function(dir){ exec('window.removeEventListener("keydown", handleKey, true)'); }, scrollx:'R', extra: [[['div#viewerHeader>div', '']], '
', [['div#file_dropdown_top', '']], [['div#page_dropdown_top']], [['div#reportLink']], [['div#image_display div']]], xelem: '//div[@id="viewerHeader"]', layelem:'//div[@id="image_display"]', style: '#page_dropdown_top,#file_dropdown_top,#page_path_bottom,#reportLink{display:none} #viewerHeader>div{display:block} #reportLink{padding-top:0 !important' }, { url: 'hentaifromhell.net', img: [['img.imageborder']], scrollx:'R' }, { url: 'trenchescomic.com', img: [['.comic img']] }, { url: 'goominet.com', img: [['center>img[src^="uploads/"]']], extra: [[['center>img[src^="t"]']]] }, { url: 'doesnotplaywellwithothers.com', extra: [[['#sidebar-undercomic p']]] }, { url: 'aikoniacomic.com', style: '#comic{height:auto;}', extra: [[['#blurb']]] }, { url: 'grrlpowercomic.com', extra: [[['.post-comic']]] }, { url: 'the-whiteboard.com', img: [['center>img']] }, { url: 'mezzacotta.net', extra: [[['h2']], ['//h2/following-sibling::p', '', 2]] }, { url: 'hbrowse.com', img: [['.pageImage img']], back: ['//a[not(@href)]/preceding-sibling::a[1] | //a[@name="prev" and not(starts-with(@href, "javascript"))]'], next: ['//a[not(@href)]/following-sibling::a[1] | //a[@name="next" and not(starts-with(@href, "javascript"))]'] }, { url: 'aptitude.surfacingpoint.com', img: 'comics/', extra: [[['.rant']]] }, { url: 'fancyadventures.com', extra: [[['.entry p']]] }, { url: 'chron.com', img: [['div.hst-comic li>img']], back: 'img[@id="hst_galleryitem_index_prev_en"]', next: 'img[@id="hst_galleryitem_index_next_en"]' }, { url: 'heroeslocales.com', img: [['#comic img']], back: 'img[contains(@src, "/b_ant.png")]', next: 'img[contains(@src, "/b_sig.png")]' }, { url: 'readhentaionline.com', img: [['div[align="center"] img']], next: [['div[align="center"] a']] }, { url: 'darklegacycomics.com', img: [['td[background="comic_mid.gif"] img']] }, { url: 'bearmageddon.com', extra: [[['.post']]] }, { url: 'betweenfailures.net', img: 'http://betweenfailures.net/wp-content/webcomic/', extra: [[['.webcomic_post h1']], [['.webcomic_post .content']]] }, { url: 'sisterclaire.com', back: function(html, pos){ try{ return xpath('//a[.="Previous"]', html); } catch(e){ return xpath('//a[.="Previous Chapter"]', html); } }, next: '.="Next" or .="Next Chapter"', extra: [[['.entry']]], }, { url: 'fayerwayer.com|niubie.com', img: [['.attachment-post-full-galeria']], back: '.="Anterior"', next: '.="Próxima"' }, { url: 'awesomehospital.com', extra: [[['.post-comic']]] }, { url: 'ars.userfriendly.org', img: 'http://www.userfriendly.org/cartoons/archives/', back: [['[alt="Previous Cartoon"]']], next: [['[alt="Next Day\'s Cartoon"]']] }, { url: 'friendswithboys.com', img: [['.entry img']], extra: [[['.entry>*', '', 1]]] }, { url: 'calamitiesofnature.com', img: [['#comic img']] }, { url: 'irregularwebcomic.net', extra: [[['#annotation']]], style: 'div.hide {display: block; text-align: left;}', }, { url: 'adistantsoil.com', back: '@title="Previous"', next: '@title="Next"', extra: [['//div[@class="post-content"]']], bgcol: '#f4eebc' }, { url: 'kronos.mcanime.net', img: [['#current-image img']], back: function(html, pos){ try{ return xpath('//select[@id="pages"]/option[@selected]/preceding-sibling::option[1]/@value', html); } catch(e){ var cap = xpath('//select[@id="chapters"]/option[@selected]/following-sibling::option[1]/@value', html); var pag = xpath('//input[@id="lastpage"]/@value', html); return cap.replace(/\/\d+$/, pag); } }, next: function(html, pos){ try{ return xpath('//select[@id="pages"]/option[@selected]/following-sibling::option[1]/@value', html); } catch(e){ return xpath('//select[@id="chapters"]/option[@selected]/preceding-sibling::option[1]/@value', html); } }, scrollx:'R' }, { url: 'ghastlycomic.com', extra: [function(html, pos){ iframe = xpath('//iframe[@id="newsbox"]', html); blockquote = iframe.parentNode; blockquote.removeChild(iframe); return blockquote; }], }, { url: 'walkingdeadbr.com', img: 'albums/' }, { url: 'mangapanda.com', scrollx:'R' }, { url: 'mangable.com', img: [['#image']], scrollx:'R' }, { url: 'dragonflyscans.org', img: [['#page img']], scrollx:'R' }, { url: 'readincesthentai.com|hentaistreamer.com', img: [['.picture']], scrollx:'R', style: '#container{width:auto;}' }, { url: 'kissmanga.com', img: function(html, pos){ var imgs = html.match(/lstImages\.push\(".+?"\);/g); var num = 0; try {num = Number(link[pos].match(/##(-?\d+)/)[1]);} catch (e) {num = 0;} if (num == -1) num = imgs.length - 1; return imgs[num].match(/"(.+)"/)[1]; }, back: function(html, pos){ var num; var imgs = html.match(/lstImages\.push\(".+?"\);/g); try {num = Number(link[pos].match(/##(-?\d+)/)[1]);} catch (e) {var num = 0;} if (num == -1) num = imgs.length - 1; if (num > 0) return '##' + (num-1); return xpath('//select[(@id|@class)="selectChapter"]/option[@selected]/preceding-sibling::option[1]/@value', html) + '##-1'; }, next: function(html, pos){ var num; var imgs = html.match(/lstImages\.push\(".+?"\);/g); try {num = Number(link[pos].match(/##(-?\d+)/)[1]);} catch (e) {var num = 0;} if (num == -1) num = imgs.length - 1; if (imgs.length > num+1) return '##' + (num+1); return xpath('//select[(@id|@class)="selectChapter"]/option[@selected]/following-sibling::option[1]/@value', html) + '##0'; }, scrollx: 'R', layelem: '//div[@id="divImage"]', }, { url: 'mangatank.com|mangapark.com|mangawindow.com|mangapark.me', img: [['.img-link img']], style: '#wcr_div{line-height:1;}', js: function(dir){ if(!dir) document.onkeyup = ''; }, scrollx:'R' }, { url: 'snowflakescomic.com', back: './img[contains(@src, "nav_prior")]' }, { url: 'mangafox.mobi', img: [['a img']], back: '.="Previous Page"', next: 'img', scrollx:'R' }, { url: 'mangainn.me', img: [['#imgPage']], back: function(html, pos){ var m = link[pos].match(/^(.+\/chapter\/)([^\/]+)/); try{ return m[1] + m[2] + '/page_' + xpath('//select[@id="cmbpages"]/option[@selected]/preceding-sibling::option[1]/@value', html); }catch(e){ return m[1] + xpath('//select[@id="chapters"]/option[@selected]/preceding-sibling::option[1]/@value', html) + '/page_1'; } }, next: function(html, pos){ var m = link[pos].match(/^(.+\/chapter\/)([^\/]+)/); try{ return m[1] + m[2] + '/page_' + xpath('//select[@id="cmbpages"]/option[@selected]/following-sibling::option[1]/@value', html); }catch(e){ return m[1] + xpath('//select[@id="chapters"]/option[@selected]/following-sibling::option[1]/@value', html) + '/page_1'; } }, scrollx:'R' }, { url: 'onlinereader.mangapirate.net', img: [['#page']], back: '@id="prev"', next: '@id="next"' }, { url: '8comic.com', img: function(html, pos){ var ch = link[pos].match(/ch=([\d-]+)/)[1].split('-'); var p = ch.length > 1 ? parseInt(ch[1]) : 1; ch = parseInt(ch[0]); var chs = parseInt(html.match(/var chs=(\d+)/)[1]); var itemid = parseInt(html.match(/var itemid=(\d+)/)[1]); var codes = html.match(/var codes="([^\"]+)"/)[1].split('|'); var code=""; var cid=0; for(i=0;ich) {cid=i;code=codes[i];ch=parseInt(codes[i].split(' ')[0]);break;}} if(code==="") {cid=codes.length-1;code=codes[cid];ch=chs;} var previd=cid>0?parseInt(codes[cid-1].split(' ')[0]):ch; var nextid=cid 1 ? parseInt(ch[1]) : 1; ch = parseInt(ch[0]); var chs = parseInt(html.match(/var chs=(\d+)/)[1]); var itemid = parseInt(html.match(/var itemid=(\d+)/)[1]); var codes = html.match(/var codes="([^\"]+)"/)[1].split('|'); var code=""; var cid=0; for(i=0;ich) {cid=i;code=codes[i];ch=parseInt(codes[i].split(' ')[0]);break;}} if(code==="") {cid=codes.length-1;code=codes[cid];ch=chs;} var previd=cid>0?parseInt(codes[cid-1].split(' ')[0]):ch; var nextid=cid 1 ? parseInt(ch[1]) : 1; ch = parseInt(ch[0]); var chs = parseInt(html.match(/var chs=(\d+)/)[1]); var itemid = parseInt(html.match(/var itemid=(\d+)/)[1]); var codes = html.match(/var codes="([^\"]+)"/)[1].split('|'); var code=""; var cid=0; for(i=0;ich) {cid=i;code=codes[i];ch=parseInt(codes[i].split(' ')[0]);break;}} if(code==="") {cid=codes.length-1;code=codes[cid];ch=chs;} var previd=cid>0?parseInt(codes[cid-1].split(' ')[0]):ch; var nextid=cid=page){ if(ch>=chs) throw new Error('last'); x = nextid; } return link[pos].replace(/ch=.+/, 'ch='+x); }, scrollx:'R' }, { url: 'mangahead.com', img: [['#mangahead_image']], back: '@id="page_previous"', next: '@id="page_next"', scrollx:'R' }, { url: 'vickifox.com', img: [['.comic']] }, { url: 'spinnyverse.com', back: [['.nav-previous a']], next: [['.nav-next a']] }, { url: 'zenpencils.com', extra: [[['.comicpress_comic_blog_post_widget']]] }, { url: 'wootmanga.com', fixurl: function(url, img, link){ if(link && url.split('/').length == 5) url += '/1'; return url; }, scrollx:'R' }, { url: 'hentai2read.com', img: [['.prw img']], back: function(html, pos){ var baseurl = xpath('(//select[@class="cbo_wpm_chp"])/@onchange', html).replace(/^.*?'|'.*$/gi, ''); try{ var pag = xpath('(//select[@class="cbo_wpm_pag"])/option[@selected]/preceding-sibling::option[1]/@value', html); var chap = selCss('select.cbo_wpm_chp > option[selected]', html).value; return baseurl + chap +'/' + pag + '/'; } catch(e){ var chap = xpath('(//select[@class="cbo_wpm_chp"])/option[@selected]/following-sibling::option[1]/@value', html); var htmlPrev = syncRequest(baseurl + chap +'/', pos); var pag = xpath('(//select[@class="cbo_wpm_pag"])/option[last()]/@value', htmlPrev); return baseurl + chap +'/' + pag + '/'; } }, next: ['//div[@class="wpm_seo"]/a[.="Next" and not(@href="")]'], extra: [[['.wpm_nav']]], style: '#wcr_imagen{max-width:none;} .prw{overflow:visible !important;} div.wpm_nav{display:none} #wcr_extra>div.wpm_nav{display:block}', fixurl: function(url, img, link) { if (link) return url.replace('m.hentai2read.com', 'hentai2read.com'); return url; }, scrollx:'R' }, { url: 'm.hentai2read.com', img: [['.prw img']], back: function(html, pos){ var baseurl = xpath('//select[@class="cbo_wpm_chp"]/@onchange', html).replace(/^.*?'|'.*$/gi, ''); try{ var pag = xpath('//select[@class="cbo_wpm_pag"]/option[@selected]/preceding-sibling::option[1]/@value', html); var chap = selCss('select.cbo_wpm_chp > option[selected]', html).value; return baseurl + chap +'/' + pag + '/'; } catch(e){ var chap = xpath('//select[@class="cbo_wpm_chp"]/option[@selected]/following-sibling::option[1]/@value', html); var htmlPrev = syncRequest(baseurl + chap +'/', pos); var pag = xpath('//select[@class="cbo_wpm_pag"]/option[last()]/@value', htmlPrev); return baseurl + chap +'/' + pag + '/'; } }, next: ['//img[contains(concat(" ",@class," ")," cmd ") and @alt="Next Page" and starts-with(../@href,"http")]/..'], extra: ['Chapter ', [['.cbo_wpm_chp']], 'Page ', [['.cbo_wpm_pag']], ''], style: '.header{position:relative;} .content-box{padding-top:20px;} #wcr_imagen{max-width:none;} .prw{overflow:visible !important;} div.wpm_nav{display:none}', scrollx:'R' }, { url: 'komikmy.com', img: [['.wpm_pag img']], style: '.bmk + div{overflow:visible !important;}', scrollx:'R' }, { url: 'hentaifr.net', img: 'http://www.hentaifr.net/contenu/', back: 'img[contains(@src, "previous")]', next: 'img[contains(@src, "suivant")]', scrollx:'R' }, { url: 'mangasky.com', img: [['.manga-page']], scrollx:'R' }, { url: 'mangapirate.net', img: [['#mangapage']], scrollx:'R' }, { url: 'nomanga.com', img: [['div.prw>a>img']], extra: [[['.wpm_nav']]], scrollx:'R' }, { url: 'hentaimangaonline.com', img: [['#p']], back: function(html, pos){ var pageid = match(html, /var pageid = (\w+);/, 1); var pages = match(html, /var pages=new Array\((.+?)\);/, 1).split(','); var idx = pages.indexOf(pageid); if(!pages[idx-1]) throw new Error('fail'); return link[pos].replace(pageid, pages[idx-1]); }, next: function(html, pos){ var pageid = match(html, /var pageid = (\w+);/, 1); var pages = match(html, /var pages=new Array\((.+?)\);/, 1).split(','); var idx = pages.indexOf(pageid); if(!pages[idx+1]) throw new Error('fail'); return link[pos].replace(pageid, pages[idx+1]); }, style: '.pull-left{max-width:none !important;}', scrollx:'R' }, { url: 'webcomics.yaoi911.com', img: [['.webcomic-object img']], back: '@rel="previous"', next: '@rel="next"' }, { url: 'actiontimebuddies.com', img: [['#comic img']], back: function(html, pos){ try{ return selCss('a.navi-prev-in', html); } catch(e){ return selCss('a.navi-prevchap', html); } }, extra: [[['#comic img', '', 1]], [['.entry']]] }, { url: 'superbrophybrothers.com', img: [['.post-body img']], back: '.="Back"', next: '.="Next"', extra: [['//div[contains(@class, "post-body")]//span[@title]/@title'], '
', ['//u[.="News"]/following::span[./ancestor::*[contains(@class, "post-body")] and not(./ancestor::span/ancestor::*[contains(@class, "post-body")])]', '
']] }, { url: 'surasplace.com', img: function(html, pos){ var data = document.querySelectorAll('a.sigProLink'), x = link[0].match(/[&?]ipage=(.*?)(&|$)/i); x = Number(x ? x[1] : 0) + pos; if(!x) return '.'; if(x<0 || x>data.length) throw new Error('fail'); return data[x-1].getAttribute('image-src') || data[x-1].href; }, back: function(html, pos){ var data = document.querySelectorAll('a.sigProLink'), pgregex = /(\\?|\\&)ipage=(.*?)(?=(&|$))/i, x = link[0].match(pgregex); x = Number(x ? x[2] : 0) + pos - 1; if (x<0 || x>data.length) throw new Error('fail'); if (!x) return link[0].replace(/#.*$|(\\?|\\&)ipage=(.*?)(&|$)/gi, ''); if (pgregex.test(link[0])) return link[0].replace(pgregex, '$1ipage=' + x); return link[0].replace(/#.*$/, '') + (/\?./.test(link[0])?'&':'?') + 'ipage=' + x; }, next: function(html, pos){ var data = document.querySelectorAll('a.sigProLink'), pgregex = /(\\?|\\&)ipage=(.*?)(?=(&|$))/i, x = link[0].match(pgregex); x = Number(x ? x[2] : 0)+pos+1; if(x<0 || x>data.length) throw new Error('fail'); if (pgregex.test(link[0])) return link[0].replace(pgregex, '$1ipage=' + x); return link[0].replace(/#.*$/, '') + (/\?./.test(link[0])?'&':'?') + 'ipage=' + x; }, extra: ['Images from article: ', ['//div[@class="page-header"]/following-sibling::p[1]/text()'], function(html, pos){ var data = document.querySelectorAll('a.sigProLink'), x = link[0].match(/[&?]ipage=(.*?)(&|$)/i); if (!(data && data.length)) throw new Error('fail'); x = Number(x ? x[1] : 0)+pos; if (!x) return "
Thumbs"; var filename = data[x-1].getAttribute('image-src') || data[x-1].href; return "
Image " + x + " of " + data.length + " (File: '" + filename.replace(/^.*\//, '') + "')"; } ], js: function(dir){ var pgregex = /(\\?|\\&)ipage=.*?(?=(&|$))/i, x; x = link[0].match(pgregex); x = Number(x ? x[2] : 0)+posActual; if (!x) scrollTo(0,0); if (!dir) { function changeIPage(url, pagenum) { if (pgregex.test(url)) return url.replace(pgregex, '$1ipage=' + pagenum); return url.replace(/#.*$/, '') + (/\?./.test(url)?'&':'?') + 'ipage=' + pagenum; } var contentLinks = document.querySelectorAll('a.sigProLink'); for (x = 0; x < contentLinks.length;) { contentLinks[x].removeAttribute('rel'); contentLinks[x].removeAttribute('target'); contentLinks[x].setAttribute('image-src', contentLinks[x].href); contentLinks[x].href = changeIPage(link[0], ++x); } } }, scrollx:'R', layelem:'//div[@class="sigProPrintMessage"]', style: '#header, .navbar-fixed-top, .navbar-fixed-bottom {position:static;}' }, { url: 'thedevilspanties.com', extra: [['//div[@class="entry"]']], }, { url: 'hentai4manga.com', img: [['#textboxContent img']], back: [['#sub_page_left a']], next: [['#sub_page_right a']], style: '#innerWrapper, .content{width: auto !important; max-width: none !important;} .textbox > div{float: none !important;}', scrollx:'R' }, { url: 'bradcolbow.com', img: [['.entry img']], extra: [[['h2']], [['h5']]] }, { url: 'gaomanga.com', img: [['#slice0']], back: ['//div[@class="pageButtonDivSelected"]/preceding-sibling::div[1]/a'], scrollx:'R' }, { url: 'guildedage.net', img: [['#comic img']], back: [['.navi-prev']], next: [['.navi-next']] }, { url: 'betweenfailures.com', img: [['.webcomic-image img']] }, { url: 'claudeandmonet.com', img: [['.webcomic-object img']] }, { url: 'phobia.subcultura.es', img: [['#tira img']], back: '.="Anterior"', next: '.="Siguiente"' }, { url: 'de.ninemanga.com', img: [['.manga_pic']], back: [['.blue']], next: '.=">>"', scrollx:'R' }, { url: 'proxer.me', img: [['.open']], back: function(html, pos){ var c = parseInt(match(link[pos], /[?&]c=(\d+)/, 1, 1)); var p = parseInt(match(link[pos], /[?&]p=(\d+)/, 1, 1)) - 1; if(!p){ c--; p=1; } console.log([pos,-1,c,p]); if(!c) throw new Error('inicio'); return link[pos].replace(/&[cp]=\d+/g, '') + '&c='+c+'&p='+p; }, next: function(html, pos){ var c = parseInt(match(link[pos], /[?&]c=(\d+)/, 1, 1)); var p = parseInt(match(link[pos], /[?&]p=(\d+)/, 1, 1)) + 1; try { selCss('.number_'+p, html); } catch(e){ c++; p=1; } console.log([pos,1,c,p]); return link[pos].replace(/&[cp]=\d+/g, '') + '&c='+c+'&p='+p; }, scrollx:'R' }, { url: 'meinmanga.com', img: [['.pic_fragment,.pic_fragment_biggest']], back: function(html, pos){ try{ return xpath('//table[@class="pagebar"]//td[3]/select/option[@selected]/preceding-sibling::option[1]/@value', html) + '.html'; } catch(e){ return xpath('//table[@class="pagebar"]//td[1]/select/option[@selected]/following-sibling::option[1]/@value', html); } }, next: function(html, pos){ try{ return xpath('//table[@class="pagebar"]//td[3]/select/option[@selected]/following-sibling::option[1]/@value', html) + '.html'; } catch(e){ return xpath('//table[@class="pagebar"]//td[1]/select/option[@selected]/preceding-sibling::option[1]/@value', html); } }, extra: [[['.pic_fragment,.pic_fragment_biggest', '
', 1]], '
', [['.pagebar']]], layelem:'//div[@class="topad"]', style: '#content > table:not(.pagebar){display:none;} .pic_fragment_biggest{margin-left:0;} #content{overflow:visible;}', scrollx:'R' }, { url: '*.senmanga.com', img: function(html, pos){ try{ return match(html, /img\.src *= *'([^\']+)'/, 1); } catch(e){ return selCss('#picture', html); } }, back: function(html, pos){ try{ return xpath('//a[.="Previous Page"]', html); } catch(e){ var manga = document.location.pathname.match(/^\/[^\/]+\//)[0]; return manga + xpath('//select[@name="chapter"]/option[@selected]/following-sibling::option[1]/@value', html); } }, next: function(html, pos){ try{ return xpath('//a[.="Next Page"]', html); } catch(e){ var manga = document.location.pathname.match(/^\/[^\/]+\//)[0]; return manga + xpath('//select[@name="chapter"]/option[@selected]/preceding-sibling::option[1]/@value', html); } }, scrollx:'R' }, { url: 'mangaesta.net|www.mabuns.web.id|manga4indo.com|neumanga.com', img: function(html, pos){ var page = match(link[pos], /page=(\d+)$/, 1, 1); var pages = html.match(/addpage\('(.+)?'.*\)/g); return pages[page-1].match(/'(.+?)'/)[1]; }, back: function(html, pos){ var page = match(link[pos], /page=(\d+)$/, 1, 1); if(--page) return link[pos].replace(/(##page=\d+)?$/, '##page='+page); throw new Error('first'); }, next: function(html, pos){ var page = match(link[pos], /page=(\d+)$/, 1, 1); var pages = html.match(/addpage\('(.+)?'.*\)/g); if(++page <= pages.length) return link[pos].replace(/(##page=\d+)?$/, '##page='+page); throw new Error('last'); }, layelem:'//span[@id="page"]', scrollx:'R' }, { url: 'bloomingfaeries.com', img: [['#comic img']] }, { url: 'neechan.net', img: [['.prw img']], scrollx:'R' }, { url: '*.komikid.com', img: [['td>a>img']], back: function(html, pos){ try{ return xpath('//a[img[@title="Previous Page"]]', html); } catch(e){ var chapter = xpath('//select[@name="chapter"]/option[@selected]/following-sibling::option[1]/@value', html); return link[pos].replace(/(\/\/([^\/]+\/){2}).*/, '$1' + chapter); } }, next: function(html, pos){ try{ return xpath('//a[img[@title="Next Page"]]', html); } catch(e){ var chapter = xpath('//select[@name="chapter"]/option[@selected]/preceding-sibling::option[1]/@value', html); return link[pos].replace(/(\/\/([^\/]+\/){2}).*/, '$1' + chapter); } }, scrollx:'R' }, { url: 'moonoverjune.com', img: [['.comicpage']] }, { url: 'shadbase.com|shagbase.com', img: [['#comic img']], extra: [['//div[@id="comic-1" and not(img)]'], [['#comic .comicpane', '', 1]]], layelem:'//div[@id="comic"]' }, { url: 'mangago.com', img: [['#page1']], scrollx:'R' }, { url: 'mrlovenstein.com', img: [['.comic_image div img']], back: 'img[contains(@src, "nav_left")]', next: 'img[contains(@src, "nav_right")]', layelem:'//div[@class="comic_image"]' }, { url: 'anticscomic.com', img: [['#comic img']] }, { url: 'octopuns.blogspot.com', img: [['.post-body img']], back: 'img[contains(@src,"Back.png")]', next: 'img[contains(@src,"Next.png")]', extra: [['//div[contains(@class, "post-body")]/*[not(@class="separator") or contains(@style, "text-align: left")] | //div[contains(@class, "post-body")]/text()', '']], fixurl: function(url, img, link){ if(link) return url.replace('.com.au/', '.com/'); return url; } }, { url: 'onemanga.me|mangabee.com', img: [['.manga-page']], scrollx:'R' }, { url: 'mangadoom.co|omgmanga.com', img: [['.prw a img']], back: '.="Prev"', next: '.="Next"', style: '#wcr_imagen{max-width:none;}#sct_col_l.full_width{width:auto;}', scrollx:'R' }, { url: 'mangacow.co', img: [['.prw a img']], back: 'img[@alt="Back"]', next: 'img[@alt="Next"]', style: '#wcr_imagen{max-width:none;}#sct_col_l.full_width{width:auto;}', scrollx:'R' }, { url: 'powernapcomic.com', img: [['center > img']], extra: [[['.titulo2']], [['.titulo2 + .news']]] }, { url: 'mangachrome.com', img: [/src="([^\"]+)".+name="img"/, 1], scrollx:'R' }, { url: '7manga.com', img: function(html, pos){ if(!pos) return get('TheImg'); var m = link[pos].match(/[&?]n=(\d+)/); var n = m ? parseInt(m[1]) : 1; return imagen[0].replace(/\/0\/.+$/, '/0/' + selCss('#pic', html).value.split('\n')[n-1] + '.jpg'); }, back: function(html, pos){ var m = link[pos].match(/[&?]n=(\d+)/); var n = m ? parseInt(m[1]) : 1; if(n > 1) return link[pos].replace(/([&?]n=)\d+/, '$1'+(n-1)); return link[pos].replace(/(\d+)\.html/, function(s, n){ return n=='1' ? s : (parseInt(n) - 1) + '.html'; }); }, next: function(html, pos){ var pc = html.match(/var pc=.*?(\d+)/)[1]; var m = link[pos].match(/[&?]n=(\d+)/); var n = m ? parseInt(m[1]) : 0; if(n != pc){ if(n) return link[pos].replace(/([&?]n=)\d+/, '$1'+(n+1)); return link[pos] + '?n=2'; } return link[pos].replace(/(\d+)\.html.+/, function(s, n){ return n=='1' ? s : (parseInt(n) + 1) + '.html'; }); }, scrollx:'R' }, { url: 'mangadevil.com', img: [['#manga_image img']], scrollx:'R' }, { url: 'mangamofo.com', img: [['.prw img']], style: '#wcr_imagen{max-width:none;}.prw{overflow:visible !important;}', scrollx:'R' }, { url: '*.hentai.ms', img: [['.index_box > table center img, .pagination img']], scrollx:'R' }, { url: 'view.mangamonger.com', img: [['#mainimage']], back: function(html, pos){ try{ var page = xpath('//select[@name="page"]/option[@selected]/preceding-sibling::option[1]/@value', html); var ch = xpath('//select[@name="ch"]/option[@selected]/@value', html); }catch(e){ var page = xpath('//input[@name="lastpage"]/@value', html); var ch = xpath('//select[@name="ch"]/option[@selected]/preceding-sibling::option[1]/@value', html); } return '?ch='+ch+'&page='+page; }, next: function(html, pos){ try{ var page = xpath('//select[@name="page"]/option[@selected]/following-sibling::option[1]/@value', html); var ch = xpath('//select[@name="ch"]/option[@selected]/@value', html); }catch(e){ var page = '1'; var ch = xpath('//select[@name="ch"]/option[@selected]/following-sibling::option[1]/@value', html); } return '?ch='+ch+'&page='+page; }, style: '#wcr_imagen{max-width:none;}', scrollx:'R' }, { url: 'blackbird.ashen-ray.com|carciphona.com', img: function(html, pos){ return selCss('.page', html).style.backgroundImage.match(/"(.+)"/)[1]; }, layelem:'//div[@class="page"]', scrollx:'R' }, { url: 'ahs-comic.com', img: [['.webcomic-image img']], extra: [[['#main article']]], style: '.webcomic-image{font-size: 1em; line-height: 1;}' }, { url: 'gogetaroomie.com', extra: [[['#newsarea > *', '', 0, -3]]] }, { url: 'sleepymaid.com', img: [['.image']] }, { url: 'squid-ops.com', img: [['#content img']] }, { url: 'endcomic.com', img: [['#comic img']], extra: [[['.entry']]] }, { url: 'thenoobcomic.com', back: [['.comic_nav_previous_button']], next: [['.comic_nav_next_button']] }, { url: '*.zizki.com', img: [['.back img']], back: [['.larr']], next: [['.rarr']] }, { url: 'pururin.com', img: [['.b']], style: '.imageView .block{width:auto !important;}', scrollx:'R' }, { url: 'pecintakomik.com', img: [['.picture']], back: function(html, pos){ try{ return xpath('//a[./img[contains(@src, "/previous.png")]]', html); } catch(e){ var chapter = xpath('//select[@name="chapter"]/option[@selected]/following-sibling::option[1]', html).value; return link[pos].replace(/(\/manga\/[^\/]+\/)(.+)/, '$1' + chapter); } }, next: function(html, pos){ try{ return xpath('//a[./img[contains(@src, "/next.png")]]', html); } catch(e){ var chapter = xpath('//select[@name="chapter"]/option[@selected]/preceding-sibling::option[1]', html).value; return link[pos].replace(/(\/manga\/[^\/]+\/)(.+)/, '$1' + chapter); } }, scrollx:'R' }, { url: 'schizmatic.com', img: [/src="(.+?)"/, 1], extra: [[['#authorText']]] }, { url: 'bringbackroomies.com', img: [['#comic img']] }, { url: 'blindsprings.com', img: [['#cc-comic']], next: [['.next']], extra: [[['#bottomleft']]], xelem: '//div[@id="bottomleft"]', js: function(dir){ var disqusJs = selCss('.cc-commentbody>script').innerHTML; DISQUS && DISQUS.reset({ reload: true, config: function () { this.page.identifier = disqusJs.match(/identifier = '(.*)'/)[1]; this.page.url = disqusJs.match(/url = '(.*)'/)[1]; } }); }, }, { url: 'wtfcomics.com', img: function(html, pos){ var m = link[pos].match(/\?(\d+)_(\d+)?/); var id = Math.max(Math.min(Number(m[2] || '1'), Number(m[1])), 1); return html.match(/document.writeln\(\" p > img']], back: '.="Previous"', next: '.="Next"' }, { url: 'mangajoy.com', img: [['.prw a img']], back: '.="Prev"', next: '.="Next"', style: '.prw{overflow: visible !important;}', scrollx:'R' }, { url: 'octopuspie.com', img: 'http://www.octopuspie.com/strippy/' }, { url: 'nhentai.net', img: [['#image-container a img']], back: [['.previous']], next: [['.next']], extra: [[['#page-container > *', '
', 2]]], style: '#page-container img{max-width: none;}', layelem:'//div[@id="content"]', scrollx:'R' }, { url: 'hejibits.com', extra: [[['.post-content']]] }, { url: 'mangaindo.co', img: [['.prw a img']], back: [['.pvs']], next: [['.nxt']], style: '.prw img{max-width:none !important;}', scrollx:'R' }, { url: '5.79.87.81', img: [['#gsImageView img']], back: [['.previous']], next: [['.next']], scrollx:'R' }, { url: 'gao-subs.com', img: [['#midManga img']], back: ['//div[@class="pageButtonDivSelected"]/preceding-sibling::div[1]/a'], js: function(dir){ if(!dir) document.onkeyup = null; }, scrollx:'R' }, { url: 'paintraincomic.com', img: [['#comic img']], extra: [[['.post-content']]] }, { url: 'extrafabulouscomics.com', style: '#page{width:auto;}' }, { url: 'hellocomic.com', img: [['.coverIssue a img']], back: [['.prevBtn']], next: [['.nextBtn']] }, { url: 'feywinds.com/comic', img: '../comic/pages' }, { url: 'omgbeaupeep.com', img: [['#omv .picture']], back: function(html, pos) { try { return xpath('//a[img[@alt="Previous Page"]]/@href', html); } catch (e) { var currChapter = xpath('//select[@name="chapter"]/*[@selected]', html); return link[pos].replace(currChapter.value, currChapter.previousSibling.value); } }, next: function(html, pos) { try { return xpath('//a[img[@alt="Next Page"]]/@href', html); } catch (e) { var currChapter = xpath('//select[@name="chapter"]/*[@selected]', html); return link[pos].replace(currChapter.value, currChapter.nextSibling.value).replace(/\/[^\/]*$/, "/1"); } }, extra: [[[".pager"]]], }, { url: 'orgymania.net', img: '/slippreview/', back: 'text()="< prev"', next: 'text()="next >"', first: 'text()="|<"', }, { url: 'http://www.egscomics.com/', extra: ['
',[['#newsarea']],'
'], }, { url: 'http://mspfanventures.com/', img: [['article img']], next: [['#nextlinks a']], extra: [[['article']],''], js: function(dir){debugger; assignOnClicks();}, style: '#wcr_imagen { display: none; }', }, { url: 'http://agc.deskslave.org/comic_viewer.html', img: function(html, pos){var comicNr = parseInt(link[pos].match(/\d+$/)[0]); if(!link.extraNotes) { eval(syncRequest("ComicNotes.js",0)); link.extraNotes = n; // For lack of a better place to store it } if(comicNr == 269 || comicNr >= 275) { return 'comics/AGC' + comic_number + '.swf'; } else { return "comics/AGC"+ comicNr+".GIF"; }}, back: function(html, pos){var comicNr = parseInt(link[pos].match(/\d+$/)[0]); if(comicNr == 1) throw new Error("First comic"); return link[pos].replace(/\d+$/,comicNr-1);}, next: function(html, pos){var comicNr = parseInt(link[pos].match(/\d+$/)[0]); // var maxPage = parseInt(html.match(/var MAXCOMIC = (\d+);/)[1]); // if(comicNr == maxPage) return link[pos].replace(/\d+$/,comicNr+1);}, first: function(html){return "?goNumber=1";}, extra: [function(html, pos){var comicNr = parseInt(link[pos].match(/\d+$/)[0]); return '
'+link.extraNotes[comicNr] + '
';}], style: '#notes {\n width: 600;\n background-color: #ccc;\n margin: auto;\n text-align: left;\n}', layout: false, }, { url: 'mspaintadventures.com/?s=1', img: 'http://cdn.mspaintadventures.com/advimgs', next: [['font[size="5"]>a']], extra: [['//table[@width="600"]']], js: function(dir){/*[].slice.call(document.getElementsByTagName("table")).forEach(function(x){x.width = 800;})*/ // Click on any img var elemImagen=document.querySelectorAll('#wcr_extra img'); setEvt(elemImagen, 'click', imgClick); setEvt(elemImagen, 'mousemove', imgCursor);}, style: '#wcr_imagen { display: none; }\np { font-size: large; }', }, { url: 'mspaintadventures.com/extras', img: 'http://www.mspaintadventures.com/extra', back: function(html, pos){var comicNr = parseInt(link[pos].match(/\d+/)[0]); if (comicNr == 1) throw new Error("First comic"); comicNr--; comicNr = ("000000" + comicNr).match(/0*(\d{6})$/)[1]; return link[pos].replace(/\d+/, comicNr);}, next: function(html, pos){var comicNr = parseInt(link[pos].match(/\d+/)[0]); comicNr++; comicNr = ("000000" + comicNr).match(/0*(\d{6})/)[1]; return link[pos].replace(/\d+/, comicNr);}, extra: [['//table[@width="800"]']], js: function(dir){/*[].slice.call(document.getElementsByTagName("table")).forEach(function(x){x.width = 800;})*/ // Click on any img var elemImagen=document.querySelectorAll('#wcr_extra img'); setEvt(elemImagen, 'click', imgClick); setEvt(elemImagen, 'mousemove', imgCursor);}, style: '#wcr_imagen { display: none; }\np { font-size: large; }', }, { url: 'mspaintadventures.com/?s=4', img: 'http://cdn.mspaintadventures.com/advimgs', back: 'text()="Go Back"', next: [['font[size="5"]>a']], extra: [['//table[@width="600"]']], js: function(dir){ // Click on any img var elemImagen=document.querySelectorAll('#wcr_extra img'); setEvt(elemImagen, 'click', imgClick); setEvt(elemImagen, 'mousemove', imgCursor);}, style: '#wcr_imagen { display: none; }\np { font-size: large; }', }, { url: 'mspaintadventures.com/?s=6', img: 'http://cdn.mspaintadventures.com/storyfiles/', back: 'text()="Go Back"', next: function(html, pos){var x = selCss('font[size="5"]>a',html,true); return x[x.length-1];}, extra: [['//table[@width="600"]']], xelem: '//table[@width="600"]', layelem: '//table[@width="600"]', js: function(dir){ // Click on any img to switch page var elemImagen=document.querySelectorAll('#wcr_extra img'); setEvt(elemImagen, 'click', imgClick); setEvt(elemImagen, 'mousemove', imgCursor); // Show pesterlogs var x = document.getElementsByClassName('spoiler'); for (var i = 0; i < x.length; i++) {x[i].previousSibling.firstChild.click();} }, style: '#wcr_imagen { display: none; }\np { font-size: large; }', }, { url: 'mspaintadventures.com/scratch.php?', img: 'storyfiles/', back: 'text()="Go Back"', next: function(html, pos){var x = selCss('font[size="5"]>a',html,true); return x[x.length-1];}, extra: [['//table[@width="600"]']], xelem: '//table[@width="600"]/tbody', layelem: '//table[@width="600"]', js: function(dir){/*[].slice.call(document.getElementsByTagName("table")).forEach(function(x){x.width = 800;})*/ // Click on any img to switch page var elemImagen=document.querySelectorAll('#wcr_extra img'); setEvt(elemImagen, 'click', imgClick); setEvt(elemImagen, 'mousemove', imgCursor); // Show pesterlogs var x = document.getElementsByClassName('spoiler'); for (var i = 0; i < x.length; i++) {x[i].previousSibling.firstChild.click();} typeof onChange == 'function' && onChange(dir);}, style: '#wcr_imagena { display: none; }\np { font-size: large; }', }, { url: 'mangatown.com/manga/', img: [['#image']], back: function(html, pos){try { return xpath('//div[@class="page_select"]/select/option[@selected]/preceding-sibling::option[1]/@value',html); } catch (e) { var chapterUrl = xpath('//h1/a/@href', html); var prevChapter = xpath('//select[@class="chapter_select"]/option[@value="' + chapterUrl + '"]/preceding-sibling::option[1]/@value'); return prevChapter; }}, next: function(html, pos){try { return xpath('//div[@class="page_select"]/select/option[@selected]/following-sibling::option[1]/@value',html); } catch (e) { var chapterUrl = xpath('//h1/a/@href', html); var nextChapter = xpath('//select[@class="chapter_select"]/option[@value="' + chapterUrl + '"]/following-sibling::option[1]/@value'); return nextChapter; }}, first: ['//div[@class="page_select"]/select/option[1]/@value'], last: ['//div[@class="page_select"]/select/option[last()]/@value'], js: function(dir){document.onkeyup = null;}, scrollx:'R' }, { url: 'readmanga.today', img: 'http://manga-joy.com/wp-content/manga/', back: [['.prev-a-btn']], next: [['.next-a-btn']], scrollx:'R' }, { url: 'mymanga.me/manga/*/*/*', img: [['.reader-image img']], back: 'text()="Prev"', next: 'text()="Next"', scrollx:'R' }, { url: 'http://www.legostargalactica.net/', extra: [['//div[@class="post-comic"]'],[['.comment-wrap']]], xelem: '//div[@class="post-comic"]', layelem: '//div[@id="comic"]', }, { url: 'http://hentaihere.com/m/', img: [['#arf-reader-img']], back: function(html, pos){var page = parseInt(html.match(/var rff_thisIndex = (\d+);/)[1]); var pages = html.match(/var rff_imageList = (.+);/)[1]; var previous_chapter = html.match(/var rff_previousChapter = "([^"]*?)";/)[1]; var base_url = html.match(/var rff_thisChapter = "(.+?)";/)[1]; if (page >1) { return base_url + (page-1); } else { return previous_chapter; }}, next: function(html, pos){var page = parseInt(html.match(/var rff_thisIndex = (\d+);/)[1]); var pages = html.match(/var rff_imageList = (.+);/)[1]; var num_pages = JSON.parse(pages).length; var next_chapter = html.match(/var rff_nextChapter = "([^"]*?)";/)[1]; var base_url = html.match(/var rff_thisChapter = "(.+?)";/)[1]; if (page < num_pages) { return base_url + (page+1); } else { return next_chapter; }}, }, { url: 'http://mangafap.com/image/', back: function(html, pos){return "/image/"+html.match(/pageid = (\d+);[^;]*[(,](\d+),\1/)[2]+"/";}, next: function(html, pos){return "/image/"+html.match(/pageid = (\d+);[^;]*\1,(\d+)/)[2]+"/";}, }, { url: 'http://gomanga.co/reader/read/', img: 'http://gomanga.co/reader/content/comics/', back: function(html, pos){ var chapter = link[pos].replace(/page.*/,""); try { return xpath('//div[contains(@class,"current")]/following-sibling::div/a', html); } catch (e) { return xpath('//li[a/@href="'+chapter+'"]/following-sibling::li/a', html); } }, next: function(html, pos){ var chapter = link[pos].replace(/page.*/,""); try { var next_page = xpath('//div[contains(@class,"current")]/preceding-sibling::div[not(contains(@class,"dnone"))][1]/a/@href', html); return next_page.replace(/^(\d+)$/,chapter+"page/$1"); } catch (e) { return xpath('//li[a/@href="'+chapter+'"]/preceding-sibling::li[1]/a/@href', html); } }, }, { url: 'dynasty-scans.com', img: function(html, pos){ var page; var img = selCss("#image > img", html); var pages = JSON.parse(html.match(/var pages = ([^;]*);/)[1]); if (link[pos].match(/#last$/)) { page = pages.length - 1; } else { page = Number(match(link[pos], /#(\d+)$/, 1, 1)); } link[pos] = link[pos].replace(/(#?#.*)?$/,"##"+page); var url = pages[page-1].image; img.src = url; return img; }, back: function(html, pos){ var page = Number(match(link[pos], /#(\d+)$/, 1, 1)); if (--page) { return link[pos].replace(/(#?#.*)?$/,"##"+page); } return selCss("#prev_link", html).href.replace(/$/,"##last"); }, next: function(html, pos){ var page = Number(match(link[pos], /#(\d+)$/, 1, 1)); var pages = JSON.parse(html.match(/var pages = ([^;]*);/)[1]); if (++page < pages.length) { return link[pos].replace(/(#?#.*)?$/,"##"+page); } var url = selCss("#next_link", html).href; if (url.match(/#$/)) { throw new Error("Last page"); } return url; }, extra: [[['.pages-list']]], layelem:'//*[@id="image"]', }, { url: 'mangasee.co/manga/', img: [['a > img']], next: function(html, pos) { return match(match(html, /
]*next[^>]*>/i, 0), /href="([^"]*)"/, 1); }, extra: [[['.navbar > *']]], js: function(dir){ document.querySelector('.navbar').className = "navbar navbar-default"; }, }, { url: 'girlgeniusonline.com/comic.php', img: 'http://www.girlgeniusonline.com/ggmain/strips/', back: [['#bottomprev']], next: [['#bottomnext']], }, { url: 'mangafast.online/manga/', img: [['#ppp img']], back: function(html, pos){ var current_page = getVar(html, "current_page"); var base_url = getVar(html, "base_url"); var prev_chapter = getVar(html,"prev_chapter"); if (current_page > 1) { return base_url + "/" + (current_page-1); } else { return prev_chapter; } }, next: function(html, pos){ var current_page = getVar(html, "current_page"); var base_url = getVar(html, "base_url"); var next_chapter = getVar(html,"next_chapter"); var pages = getVar(html,"pages"); if (current_page < pages.length) { return base_url + "/" + (current_page+1); } else { return next_chapter; } }, }, { url: 'demonicscans.com/FoOlSlide/read|raws.yomanga.co/read', back: function(html, pos){ var base_url = match(html, /var base_url *= *'([^']+)'/,1); var current_page = getVar(html, "current_page")+1; if (current_page > 1) { return base_url + "page/" + (current_page-1); } else { var chap = xpath('//li[a/@href="'+base_url+'"]/following-sibling::li[1]/a/@href', html); var htmlPrev = syncRequest(chap, pos); return xpath('//*[contains(@class, "dropdown_right" )]//li[last()]/a/@href', htmlPrev); } }, next: [['.inner>a']], }, { url: 'dm5.com/m|en.dm5.com/m', img: function(html, pos){ var DM5_CID = getVar(html, 'DM5_CID'); var page = match(link[pos],/m\d+-p(\d+)/, 1, 1); var url = '/chapterfun.ashx?cid=' + DM5_CID+'&page='+page; var metadata = syncRequest(url, pos); eval(metadata); // puts result in array "d" return d[0]; }, back: [['#s_pre>a']], next: [['#s_next>a']], layelem:'//*[@id="cp_img"]', }, /* , { url: '', img: '', back: '', next: '' } , { url: '', img: '', back: '', next: '', first: '', last: '', extra: [[['']]], fixurl: function(url, img, link){ }, js: function(dir){ }, scrollx:'R', xelem: '', layelem:'', txtcol: '', bgcol: '', style: '', layout: true } */ ]; /* xpath: X = elemento X @A = atributo A * = comodin . = self, innerHTML al usarla en condiciones, usar /text() para retornar el texto X[Y] = X q cumple Y (Y puede referenciar atributos o hijos) X[num o last()] = el X q es el num-esimo hijo de su padre .. = parentNode / = hijo // = descendiente contains(x, y) = x.indexOf(y)>=0 starts-with(x, y) = x.indexOf(y)==0 name() = nombre del tag EN MAYUSCULAS X | Y = lo q matchee el xpath X o el Y http://xpath.alephzarro.com/content/cheatsheet.html http://www.zvon.org/xxl/XPathTutorial/General/examples.html */ var imagen = new Array(); //src de la imagen[i] var imagenOK = [true]; //dice si la imagen[i] esta cargada var imagen64 = new Array(); //contenido de la imagen[i] como data:url en base64 var imgTitle = new Array(); //el alt text de la imagen[i] var titulo = new Array(); //titulo de la pagina[i] var link = new Array(); //url de la pagina[i] var extra = new Array(); //contenido extra de la pagina[i] var posActual = 0; //posicion actual relativa a donde se empezo var prefetcheado = new Array(); prefetcheado[-1] = prefetcheado[1] = 0; var layoutDefault = '
'+ ''+ '
' + '
' + '
' + '
'+ '
'+ '<< First '+ ' '+ ' '+ 'Last >>'+ '

'+ '
'+ ''+ ' '+ '
'+ '
'+ ''+ '

'+ '
'+ ' '+ ' '+ ' '+ ''+ '
'+ '
'+ ''+ ''+ '
'; //en vez de reemplazar el body.innerHTML, meter el layoutdefault donde estaba la imagen y dejar el resto de la pagina intacta function layoutIntacto(){ //hago q los links a las pags anterior/sgte funcionen como los botones back/next if(confBool('overwrite_links', true)){ try{ var next = contenido(document.documentElement.innerHTML, getNext, 0); var linksNext = xpath('//*[@href="'+next+'"]', document, true); for(var i=0;i]*href *= *"([^\"]+)"([^<]|<[^\/]|<\/[^a])*(back(?!ground)|prev)/i, 1]; var getNext = [/]*href *= *"([^\"]+)"([^<]|<[^\/]|<\/[^a])*next/i, 1]; var getFirst = [/]*href *= *"([^\"]+)"([^<]|<[^\/]|<\/[^a])*first/i, 1]; var getLast = [/]*href *= *"([^\"]+)"([^<]|<[^\/]|<\/[^a])*(last|latest|newest|today)/i, 1]; var getExtras = false; //(opcional) arreglo de getters para meterlos al div extra var bgColor = false, txtColor = false; //(opcionales) fuerza el color de fondo/texto var funcionJs = false; //(opcional) ejecuta una funcion despues de mostrar una pagina var scrollx = confVal('scrollx', 'L'); //para donde se autoscrollea la pagina (L/M/R de la imagen, o pixeles) var scrolly = confVal('scrolly', 'U'); //idem (U/M/D) var extraElement = false; //donde se pone el extra cuando se use el layout completo var fixUrl = false; //f(url, origen (link/img)) q se aplica a los links y src de la imagen, para paginas raras (ej, en sinfest el link en el www apunta al no-www y el no-www redirige al www) var layoutElement = null; //donde se pone todo cuando se usa el layout completo var style = ''; //contenido de un '; document.body.appendChild(divsets); initLayout(opsGeneral, 'general'); initLayout(opsLayout, 'layout'); initSitio(propsSitio); initTeclas(teclas); //setear eventos para tabs/guardar/cancelar var tabs = xpath('//div[@id="wcr_settings_links"]/span', document, true); for(var i=0; i0 ? 'L' : 'R'; else val = val>0 ? 'D' : 'U'; } if(typeof(valdef)=='number'){ get('wcr_sel_layout__offset_'+o+'_def').value = valdef<0 ? -valdef : valdef; if(o=='scrollx') valdef = valdef>0 ? 'L' : 'R'; else valdef = valdef>0 ? 'D' : 'U'; } } get(id).value = val; get(id+'_def').value = valdef; if(!o.indexOf('cursor_custom_')){ setEvt(id+'_def', 'mouseover', function(evt){ evt.target.style.cursor = cursorUrl(evt.target.value); }); setEvt(id, 'mouseover', function(evt){ evt.target.style.cursor = cursorUrl(evt.target.value); }); } else if(!o.indexOf('cursor_')){ setEvt(id+'_def', 'mouseover', function(evt){ evt.target.style.cursor = confCursor(null, null, evt.target.value); }); setEvt(id, 'mouseover', function(evt){ evt.target.style.cursor = confCursor(null, null, evt.target.value || get(evt.target.id+'_def').value); }); } } } //inicializar los valores y eventos del sitio function initSitio(props){ var lista = getConfPagina('lista'); var selConf = get('wcr_sel_confpag'); for(var i=0; i'+ (lista[i][0]=='d'?'(default) ':'(custom) ')+ lista[i].substr(3)+ ''; } if(!lista.length){ selConf.innerHTML += ''; } setEvt('wcr_btn_delconfpag', 'click', function(evt){ if(!confirm('Are you sure you want to delete these settings?')) return; var customs = getData('confpags', {}, 'custompages'); var nombre = unescape(get('wcr_sel_confpag').value); delete customs[nombre]; setData('confpags', customs, 'custompages'); if(getData('confpag') == nombre) delData('confpag'); var selConf = get('wcr_sel_confpag'); selConf.removeChild(selConf.options[selConf.selectedIndex]); if(selConf.options.length == 2){ selConf.innerHTML += ''; } selConf.selectedIndex = selConf.options.length-1; initValoresSitio(props, selConf.value); }); setEvt('wcr_btn_editconfpag', 'click', function(evt){ selConf.selectedIndex = 0; initValoresSitio(props, selConf.value); }); for(var p in props){ var seltipo = get('wcr_sitio_tipo_'+p); setEvt(seltipo, 'change', function(evt){ cambiaTipo(evt.target); }); } var confActual = initValoresSitio(props, getData('confpag', '')); selConf.value = escape(confActual); setEvt(selConf, 'change', function(evt){ initValoresSitio(props, unescape(evt.target.value)); }); setEvt('wcr_btn_add_extra', 'click', function(evt){ var p = 'extra_'+Number(new Date()); trExtraConfSitio(p, props.extra); var seltipo = get('wcr_sitio_tipo_'+p); cambiaTipo(seltipo); }); } //rellena la tabla de conf del sitio con los valores de una conf especifica function initValoresSitio(props, conf){ var pag = null; if(conf != 'new'){ //si es nuevo me quedo con los valores q ya estaban pag = getConfPagina(conf); for(var p in props){ if(p=='extra'){// es un arreglo, meterse a cada uno try{ var extrasViejos = xpath('//tr[@class="wcr_extras"]', document, true); for(var i=0; i1 ? '1' : ''; if(valor.length>1) get(base+'_xp_glue').value = valor[1]; if(valor.length>2) get(base+'_xp_first').value = valor[2]; if(valor.length>3) get(base+'_xp_last').value = valor[3]; } else if(isArray(valor[0])){ //css valor = valor[0]; seltipo.value = 'css'; get(base+'_css_val').value = valor[0]; if(get(base+'_css_arr')) get(base+'_css_arr').value = valor.length>1 ? '1' : ''; if(valor.length>1) get(base+'_css_glue').value = valor[1]; if(valor.length>2) get(base+'_css_first').value = valor[2]; if(valor.length>3) get(base+'_css_last').value = valor[3]; } else{ //re seltipo.value = 're'; get(base+'_re_val').value = valor[0]; if(valor.length>1) get(base+'_re_grp').value = valor[1]; } break; case 'function': //fn seltipo.value = 'fn'; //sacar el "^func..{" y el "}$" var fn = valor.toString(); fn = fn.replace(/^.+?\{(\s*[\r\n]+)*|\s*\}$/g, ''); fn = fn.replace(new RegExp('^' + fn.match(/^\s*/), 'mg'), ''); get(base+'_fn_val').innerHTML = fn; break; case 'boolean': seltipo.value = 'bool'; get(base+'_bool_val').value = valor; break; case 'number': seltipo.value = 'num'; get(base+'_num_val').value = valor; break; } } } catch(e){ error('rellenarSitio.'+p+': ', e); } } } //mostrar los inputs q corresponden y esconder los q no al cambiar el tipo de selector para una prop de la conf de un sitio function cambiaTipo(sel){ var clave = sel.id.substr('wcr_sitio_tipo_'.length), tipo = sel.value; var elems = xpath('//*[starts-with(@id,"wcr_sitio_valor_'+clave+'")]', document, true); for(var i=0; i0 ? '' : 'none'; } //inicializar los valores y eventos de las teclas function initTeclas(teclas){ var input, inputaux, hiddens = ['keyCode', 'ctrlKey', 'shiftKey', 'altKey']; teclado = getTeclas(); //por si me cambiaron la conf desde otra pag for(var t in teclas){ var teclasAlternativas = teclado[t] || [{}]; if(!isArray(teclasAlternativas)) teclasAlternativas = [teclasAlternativas]; for(var i=0; i<2; i++){ input = get('wcr_tecla_'+i+'_'+t); var tecla = teclasAlternativas[i] || {}; input.value = tecla.name || ''; for(var h=0; h= 16 && evt.keyCode <= 18 || evt.keyCode == 27) return; //ctrl/shift/alt o ESC (funca raro) if(evt.keyCode == 8){ //BACKSPACE, dejo la accion sin tecla for(var h=0; h'+ ''+ ''+ 'Default settings'+ 'Settings for '+document.location.host.replace(/^www\./, '')+''+ ''; for(var o in ops){ var op = ops[o]; if(!o.indexOf('_grp_')){ html += ''+ ''+op.desc+''+ ''; } else{ var opts = ''; if(op.vals) for(var v in op.vals){ opts += ''; } html += ''+ ''+op.desc+''+ ''+ (op.vals ? ('') : ('') )+''+ ''+ (op.vals ? ('') : ('') )+''+ ''; } } html += ''; //poder esconder divs/botones? (first/last, bookmarks, last visited, toggle layout) //si se esconden cosas, asegurarse q no falle al tratar de usarlas return html; } //generar el html de la conf del sitio function htmlSitio(props){ var html = '
Current site settings: '+ ''+ ''+ ''+ '

'; for(var p in props){ html += ''; if(p=='extra') html += ''; else{ var tds = tdsConfSitio(p, props[p]); html += ''; } } html += '
'+props[p].desc+'
'+tds[0]+''+tds[1]+'

Hover over a textbox for its meaning and an explanation on how to use it

For a detailed guide on adding new sites, check
this thread in the script site'; /*todo: agregar los tests 4° td con boton test y un tr invisible abajo para el resultado requestear link[posActual] y aplicarle ese getter poder exportar/importar esta cosa poder exportar este sitio o todos los customs para mergear repetidos preguntar si quedarse con el actual o el importado */ return html; } //retorna los innerhtmls de los tds para especificar el contenido function tdsConfSitio(p, prop){ var tds = ['', '']; for(var t in prop.tipos) tds[0] += ''; tds[0] = ''; for(t in prop.tipos) for(var v in prop.tipos[t]){ if(v=='desc') continue; tds[1] += '<'+prop.tipos[t][v].elem+' id="wcr_sitio_valor_'+p+'_'+t+'_'+v+'"'; for(var a in prop.tipos[t][v]) if(a!='elem' && a!='html') tds[1] += ' '+a+'="'+prop.tipos[t][v][a]+'"'; tds[1] += prop.tipos[t][v].html ? '>'+prop.tipos[t][v].html+'' : (prop.tipos[t][v].elem == 'textarea' ? '>' : '/>'); } return tds; } //insertar un tr para agregar mas contenido extra function trExtraConfSitio(p, prop){ var tr = document.createElement('tr'); tr.className = 'wcr_extras'; tr.id = 'wcr_tr_sitio_'+p; var tds = [ document.createElement('td'), document.createElement('td'), document.createElement('td')]; var tdsConf = tdsConfSitio(p, prop); tds[0].innerHTML = '
'+ ''+ ''+ ''+ '
'; tds[1].innerHTML = tdsConf[0]; tds[2].innerHTML = tdsConf[1]; tr.appendChild(tds[0]); tr.appendChild(tds[1]); tr.appendChild(tds[2]); var trAfterExtra = get('wcr_tr_sitio_xelem'); trAfterExtra.parentNode.insertBefore(tr, trAfterExtra); var seltipo = get('wcr_sitio_tipo_'+p); setEvt(seltipo, 'change', function(evt){ cambiaTipo(evt.target); }); setEvt('wcr_btn_del_'+p, 'click', function(evt){ var tr = evt.target.parentNode.parentNode.parentNode; tr.parentNode.removeChild(tr); }); setEvt('wcr_btn_up_'+p, 'click', function(evt){ var tr = evt.target.parentNode.parentNode.parentNode; var otro = tr.previousSibling; if(otro.id.indexOf('wcr_tr_sitio_extra_')===0){ tr.parentNode.insertBefore(tr, otro); } }); setEvt('wcr_btn_down_'+p, 'click', function(evt){ var tr = evt.target.parentNode.parentNode.parentNode; var otro = tr.nextSibling; if(otro.id.indexOf('wcr_tr_sitio_extra_')===0){ tr.parentNode.insertBefore(otro, tr); } }); } //generar el html de la conf del teclado function htmlTeclas(teclas){ var html = ''+ ''+ ''+ ''+ ''; for(var t in teclas) html += ''+ ''+ ''+ ''+ ''; html += '
'+ 'KeyAlternate Key
'+teclas[t][0]+'

Press BackSpace to unset a key'; return html; } //guardar todo lo de las pantallas de configuracion function guardarSettings(teclas, props, tiposUp, opsLayout){ try{ //guardar teclas var hiddens = ['keyCode', 'ctrlKey', 'shiftKey', 'altKey']; for(var t in teclas){ teclado[t] = []; for(var i=0; i<2; i++){ teclado[t][i] = { name: get('wcr_tecla_'+i+'_'+t).value, keyCode: get('wcr_tecla_'+i+'_'+t+'_keyCode').value }; for(var h=1; h0) setData(o, valdef, 'default'); if(o.indexOf('prefetch_')<0 || val === '' || val.match(/^\d+$/) && Number(val)>0){ if(val != '') setData(o, val); else delData(o); } } //guardar sitio var conf = unescape(get('wcr_sel_confpag').value); if(conf == '' || conf[0]=='d') setData('confpag', conf); else{ //es new o un custom var ok = true; var tipourl = get('wcr_sitio_tipo_url').value; var nombre = 'c'+tipourl[0]+':'+get('wcr_sitio_valor_url_'+tipourl+'_val').value; var customPag = {}; for(var p in props){ if(p=='extra'){ try{ var xx = []; var extras = selCss('tr.wcr_extras', document, true); for(var i=0; i1){ if(!elems[1].value.match(/^\d+$/) || Number(elems[1].value)===0){ alert(p+': "'+elems[1].value+'" is not a valid number'); ok = false; } else valor.push(Number(elems[1].value)); } break; case 'xp': case 'css': valor = [elems[0].value]; if(elems[1] && elems[1].value){ //si es arreglo... valor.push(elems[2].value); if(elems[4].value && !elems[3].value) elems[3].value = '0'; if(elems[3].value){ var num = Number(elems[3].value); if(!elems[3].value.match(/^[-\d]+$/) || isNaN(num)){ alert(p+': "'+elems[3].value+'" is not a valid number'); ok = false; } else valor.push(num); } if(elems[4].value){ num = Number(elems[4].value); if(!elems[4].value.match(/^[-\d]+$/) || isNaN(num)){ alert(p+': "'+elems[4].value+'" is not a valid number'); ok = false; } else valor.push(num); } } if(tipo=='css') valor = [valor]; break; case 'fn': valor = xpath('//select[@id="wcr_sitio_tipo_'+p+'"]/option[@value="fn"]').innerHTML+'{\n'+ elems[0].value + '\n}'; try{ eval('f='+valor); } catch(e){ alert(p+': "'+valor+'" is not a valid function ('+e+')'); ok = false; } break; case 'bool': valor = elems[0].value == 'true'; break; case 'num': valor = Number(elems[0].value); if(isNaN(valor)){ alert(p+': "'+elems[0].value+'" is not a valid number'); ok = false; } break; } if(p=='url'){ if(!valor){ alert('url: this field is obligatory'); ok = false; } else{ if(tipo=='str') re = strToRegexp(valor); else eval('re = '+elems[0].value); if(!document.location.href.match(re)){ alert('url: the expression '+elems[0].value+' doesn\'t match the current URL'); ok = false; } } } if(!ok) throw new Error('error'); return {tipo: tipo, valor: valor}; } //esconder los otros tabs y mostrar el q corresponde function cambiarTabSettings(nombre){ var tabs = xpath('//div[@id="wcr_settings_content"]/div', document, true); for(var i=0; i0; } //ver si usa el motor de firefox function isFirefox(){ return navigator.userAgent.indexOf('Gecko/')>0; } //pantalla de configuracion q sale cuando se habilita el zoom pero no esta configurado function mostrarSettingsZoom(){ try{ var html = ''; var cbs = { achw: 'Shrink wide images to fit in the width of the screen', achh: 'Shrink high images to fit in the height of the screen', agrw: 'Expand narrow images to use the width of the screen', agrh: 'Expand short images to use the height of the screen' }; for(var p in cbs) html += ' '+ '
'; var txts = { bordex: 'Pixels to leave as a border to the left and right', bordey: 'Pixels to leave as a border above and below the image' }; for(p in txts) html += ' '+txts[p]+'
'; html += '
'+ '
'; var divsets = document.createElement('div'); divsets.id = 'wcr_settings'; divsets.style.textAlign = 'center'; divsets.innerHTML = '
'+ '
'+ '
How do you want the images to be fitted?

'+ '
'+html+'

'+ 'These (and more) settings can be changed later by clicking the "Settings" button
'+ '
'+ '
'+ ''+ '
'+ '
'+ ''; document.body.appendChild(divsets); //setear el porte y posicion var popup = get('wcr_settings_popup'); var top = document.documentElement.scrollTop; if(!top) top = document.body.scrollTop; popup.style.top = (top+10) + 'px'; popup.style.marginLeft = -popup.offsetWidth/2 + 'px'; //inicializar los valores for(p in cbs){ eval('var x = '+p); get('wcr_set_cb_'+p).checked = x; } setEvt('wcr_set_btn_guardar', 'click', function(){ //guardar las confs y setear las variables var dom = get('wcr_set_cb_def').checked ? 'default' : undefined; for(var p in cbs){ eval(p+' = '+get('wcr_set_cb_'+p).checked); setData(p, get('wcr_set_cb_'+p).checked ? 1 : 0, dom); } for(p in txts){ var val = Number(get('wcr_set_txt_'+p).value); if(isNaN(val)) continue; eval(p+' = '+val); setData(p, val, dom); } document.body.removeChild(divsets); fitImagen(); scrollear(); }); setEvt('wcr_set_btn_disable', 'click', function(){ if(confirm('Are you sure you want to disable Webcomic Reader on this site?\n'+ '(It can be re-enabled later with the Greasemonkey menu)')){ setData('confpag', 'dis'); redirect(link[posActual]); } }); } catch(e){ alert('Error while initializing the zoom settings window: ' + e); if(get('wcr_settings')) document.body.removeChild(get('wcr_settings')); } } run_script(); })(); /* alert( 0*1+ //'Bug fixes (Firefox)', 0*2+ //'Bug fixes (Other browsers)', 0*4+ //'New features', 0*8+ //'New sites', 0*16+ //'Fixes for old sites', 0*32+ //'Graphic changes', 0*64+ //'New options', 0*128+ //??? 0 ); */ /*todo: forma facil de extraer varias paginas a partir de un solo request (blogs, reddit, pags ajaxeadas, etc) el img tendria q recuperar una lista de resultados se agrega una funcion extra_context: function(html, pos, relpos) q retorna el contexto sobre el q se buscan los extras para cada item las urls se rellenarian con ##pos-relativa-a-la-pag los back/next buscan el link normalmente el prefetcheador avanza los n de una poder definir un contenedor para cada extra [v2] extras: {selector: [cosas, mascosas]} poder hacer extras fijos (se llenan una vez y no se buscan ni se tocan mas) [v2] agregar un contenedor de extras fijos, rellenarlo en el js o con extras: {contendorfijo: [function(html, pos){if(pos)return ''; return selector;}]} poder leer extras por ajax? function(){request sincrono} en site settings, boton para exportar a formato copypasteable al script opcion para definir cuantos links se precargan, separado de cuantas imagenes se precargan los puros html, y en un proceso aparte las imagenes cargo link, if(!cargandoimg) cargarimgs -> carga primera no cargada y sigue hasta la N select con las pags cargadas, diferenciando las con img lista cambiar condicion de img cargada para cambiar pag btnback y btnnext no avanzan si no se ha cargado la pag q viene saltar directo a una pag si funciona, y empieza a cargar las imgs alrededor cambiar condicion para sacar un img de las cargadas (actualmente mantiene la actual +-23) usar el doc magico para parsear las cosas ajaxeadas, asi no carga las imgs hacer q las funciones parseadoras reciban el html y el doc hacer una funcion htmlToDoc en vez de mantener solo las imgs en la cosa de imgs cargadas, agregar los extras next/prev chapter (+ teclas) soportar AMR en minimalistic? tener una lista de selectores "no borrar" para cada elemento "no borrar", agregarlo a una lista junto con sus ancestros para cada elemento de la lista, borrar todos los hermanos q no esten en la lista tb podria soportar el Greased Webcomic Manager cambiar la forma en q se graban los datos (el objeto actual crece mucho, el mio pesa 50kb) 1 setting por sitio 1 setting con lo default 1 setting con la lista de todos los settings usar una variable "settings" q tenga toda la conf cargada, igual q defaultSettings reemplazar las variables random q se usan ahora usar los nombres q se usan para guardar mapear nombresCoherentes -> nombresGuardados rehacer el codigo OOPmente clase q maneje el script per se clase para la conf de una pag clase para los settings clase para la pantalla de settings poder listar todos los sitios q reviso de alguna forma al guardar ultima pag visitada, guardar: url, title, fecha, img.src y next lista con la pag y la ultima fecha q se reviso (à la GreasedWebcomicManager?) avisar q hay pag nueva si cambio el img.src o next boton para forzar q se revise una pag o todas las de la lista mostrar una estrella para las favoritas, clickeable para (des)favoritear poder deshabilitar sitios boton para cambiar entre ver todos/favoritos/no-favoritos checks para mostrar [favoritos], [no-favoritos], [deshabilitados], [nueva pag] boton para agregar/quitar de los favoritos boton para deshabilitar script en este sitio boton para forzar check de pag nueva en una/todas las pags solo checkea las q no tienen pag nueva tecla para pasar al sgte tecla para pasar a un random pagina "comics del dia" usar una pag especial para rehacerla (@include *wcr_latest_comics. en ffox about:blank?wcr_..., si no google.com/wcr_... (404)) con las imagenes del dia de mis comics cada una con back/next chico (a los lados y/o con click en img)? mostrar solo las nuevas? (marcar como leidas?) tener al lado (escondida?) la lista completa de pags modo fullchapterloader mostrar todas las imagenes una bajo otra avanzar solo hacia adelante avanzar (posActual++, cargar mas pags...) al ir scrolleando mostrar las imagenes y el extra en un div poner los botones (settings/cambiar de modo) arriba mensaje al final cuando no queden mas pags (o link a la pag sin img) ????: al ir para atras, revisar si el next es el mismo, y si no es cargarlo entremedio habria q ir shifteando todo para atras hasta llenar el hoyo... o algo asi... ta dificil... en vez de rellenar, avisar? ????: borrar los extras de la pag 0? hacer mas facil la agregacion de sitios poder cambiar entre modo @include * on/off on: solo iniciar en las pags incluidas explicitamente (if(!getConfPag) break;) off: tratar de iniciar siempre (como ahora) configuracion de sitios 4° columna con boton test en propsSitio tener un elemento test, puede ser una funcion o true para el default test default: convertir a getter y obtener contenido como string agregar tr con el resultado (td[1] "Test results:" align-right, td[2,3] contenido, td[4] boton hide) poder exportar/importar esta variable para mergear repetidos preguntar si quedarse con el actual o el importado poder exportar/importar todas las pags o solo esta poder importar desde otras paginas (foro de userscripts?) @include http://userscripts.org/topics/* persona random postea sus pags exportadas el script las encuentra y las hace clickeables, onclick se importan poder centralizar esto en una pagina? lemontecho? :P personas random suben sus settings se pueden mirar e importar tener una configuracion "oficial" mantenida por mi tener un autoupdater q baje esa version wizard para agregar sitios accesible desde el menu gm pide clickear la imagen y los links carga la pag anterior y sgte, y busca img/links q coincidan con los marcados buscar por atributos, patrones, etc? despues preguntar las cosas mas basicas pasar al editor de confs ir guardando los mensajes de los cambios de las versiones no notificadas? dejar el layout mas custom-ready-pa-lo-que-benga? arreglo de layouts funciones personalizadas para los "eventos" q modifican los botones en vez de boton "toggle", poner un select con los layouts agregar pags http://www.viruscomix.com/subnormality.html incluir subreddits en vez de todo reddit http://www.harrington-artwerkes.com/Lana5.htm http://eecomics.net/?strip_id=152 http://www.shadowgirlscomic.com/comics/maxmachine-interface/ http://www.pantheracomic.com/?p=214 http://dimensiondust.blogspot.com/search?updated-max=2010-06-16T02%3A38%3A00-05%3A00&max-results=1 http://www.joelcarroll.com/topaz/page-four/ http://www.yoshcomic.com/latest.php?i=20101201 http://agirlandherfed.com/1.833.html http://www.casualvillain.com/Unsounded/comic/ch02/ch02_27.html http://undertow.dreamshards.org/3/u3_13.html http://www.sisterclaire.com/comic/chapter-6-comic/chapter-6-the-trials/ http://sarahzero.com/sz_0588.html http://www.colourofivy.com/annyseed_webcomic8.htm http://flakypastry.runningwithpencils.com/comic.php?strip_id=326 */