1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796 |
- /******/ (function(modules) { // webpackBootstrap
- /******/ // The module cache
- /******/ var installedModules = {};
- /******/
- /******/ // The require function
- /******/ function __webpack_require__(moduleId) {
- /******/
- /******/ // Check if module is in cache
- /******/ if(installedModules[moduleId])
- /******/ return installedModules[moduleId].exports;
- /******/
- /******/ // Create a new module (and put it into the cache)
- /******/ var module = installedModules[moduleId] = {
- /******/ i: moduleId,
- /******/ l: false,
- /******/ exports: {}
- /******/ };
- /******/
- /******/ // Execute the module function
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
- /******/
- /******/ // Flag the module as loaded
- /******/ module.l = true;
- /******/
- /******/ // Return the exports of the module
- /******/ return module.exports;
- /******/ }
- /******/
- /******/
- /******/ // expose the modules object (__webpack_modules__)
- /******/ __webpack_require__.m = modules;
- /******/
- /******/ // expose the module cache
- /******/ __webpack_require__.c = installedModules;
- /******/
- /******/ // identity function for calling harmony imports with the correct context
- /******/ __webpack_require__.i = function(value) { return value; };
- /******/
- /******/ // define getter function for harmony exports
- /******/ __webpack_require__.d = function(exports, name, getter) {
- /******/ if(!__webpack_require__.o(exports, name)) {
- /******/ Object.defineProperty(exports, name, {
- /******/ configurable: false,
- /******/ enumerable: true,
- /******/ get: getter
- /******/ });
- /******/ }
- /******/ };
- /******/
- /******/ // getDefaultExport function for compatibility with non-harmony modules
- /******/ __webpack_require__.n = function(module) {
- /******/ var getter = module && module.__esModule ?
- /******/ function getDefault() { return module['default']; } :
- /******/ function getModuleExports() { return module; };
- /******/ __webpack_require__.d(getter, 'a', getter);
- /******/ return getter;
- /******/ };
- /******/
- /******/ // Object.prototype.hasOwnProperty.call
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
- /******/
- /******/ // __webpack_public_path__
- /******/ __webpack_require__.p = "";
- /******/
- /******/ // Load entry module and return exports
- /******/ return __webpack_require__(__webpack_require__.s = 87);
- /******/ })
- /************************************************************************/
- /******/ ([
- /* 0 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Utilities
- //
- function _class(obj) { return Object.prototype.toString.call(obj); }
- function isString(obj) { return _class(obj) === '[object String]'; }
- var _hasOwnProperty = Object.prototype.hasOwnProperty;
- function has(object, key) {
- return _hasOwnProperty.call(object, key);
- }
- // Merge objects
- //
- function assign(obj /*from1, from2, from3, ...*/) {
- var sources = Array.prototype.slice.call(arguments, 1);
- sources.forEach(function (source) {
- if (!source) { return; }
- if (typeof source !== 'object') {
- throw new TypeError(source + 'must be object');
- }
- Object.keys(source).forEach(function (key) {
- obj[key] = source[key];
- });
- });
- return obj;
- }
- // Remove element from array and put another array at those position.
- // Useful for some operations with tokens
- function arrayReplaceAt(src, pos, newElements) {
- return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1));
- }
- ////////////////////////////////////////////////////////////////////////////////
- function isValidEntityCode(c) {
- /*eslint no-bitwise:0*/
- // broken sequence
- if (c >= 0xD800 && c <= 0xDFFF) { return false; }
- // never used
- if (c >= 0xFDD0 && c <= 0xFDEF) { return false; }
- if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false; }
- // control codes
- if (c >= 0x00 && c <= 0x08) { return false; }
- if (c === 0x0B) { return false; }
- if (c >= 0x0E && c <= 0x1F) { return false; }
- if (c >= 0x7F && c <= 0x9F) { return false; }
- // out of range
- if (c > 0x10FFFF) { return false; }
- return true;
- }
- function fromCodePoint(c) {
- /*eslint no-bitwise:0*/
- if (c > 0xffff) {
- c -= 0x10000;
- var surrogate1 = 0xd800 + (c >> 10),
- surrogate2 = 0xdc00 + (c & 0x3ff);
- return String.fromCharCode(surrogate1, surrogate2);
- }
- return String.fromCharCode(c);
- }
- var UNESCAPE_MD_RE = /\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g;
- var ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi;
- var UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi');
- var DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;
- var entities = __webpack_require__(11);
- function replaceEntityPattern(match, name) {
- var code = 0;
- if (has(entities, name)) {
- return entities[name];
- }
- if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {
- code = name[1].toLowerCase() === 'x' ?
- parseInt(name.slice(2), 16)
- :
- parseInt(name.slice(1), 10);
- if (isValidEntityCode(code)) {
- return fromCodePoint(code);
- }
- }
- return match;
- }
- /*function replaceEntities(str) {
- if (str.indexOf('&') < 0) { return str; }
- return str.replace(ENTITY_RE, replaceEntityPattern);
- }*/
- function unescapeMd(str) {
- if (str.indexOf('\\') < 0) { return str; }
- return str.replace(UNESCAPE_MD_RE, '$1');
- }
- function unescapeAll(str) {
- if (str.indexOf('\\') < 0 && str.indexOf('&') < 0) { return str; }
- return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {
- if (escaped) { return escaped; }
- return replaceEntityPattern(match, entity);
- });
- }
- ////////////////////////////////////////////////////////////////////////////////
- var HTML_ESCAPE_TEST_RE = /[&<>"]/;
- var HTML_ESCAPE_REPLACE_RE = /[&<>"]/g;
- var HTML_REPLACEMENTS = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"'
- };
- function replaceUnsafeChar(ch) {
- return HTML_REPLACEMENTS[ch];
- }
- function escapeHtml(str) {
- if (HTML_ESCAPE_TEST_RE.test(str)) {
- return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar);
- }
- return str;
- }
- ////////////////////////////////////////////////////////////////////////////////
- var REGEXP_ESCAPE_RE = /[.?*+^$[\]\\(){}|-]/g;
- function escapeRE(str) {
- return str.replace(REGEXP_ESCAPE_RE, '\\$&');
- }
- ////////////////////////////////////////////////////////////////////////////////
- function isSpace(code) {
- switch (code) {
- case 0x09:
- case 0x20:
- return true;
- }
- return false;
- }
- // Zs (unicode class) || [\t\f\v\r\n]
- function isWhiteSpace(code) {
- if (code >= 0x2000 && code <= 0x200A) { return true; }
- switch (code) {
- case 0x09: // \t
- case 0x0A: // \n
- case 0x0B: // \v
- case 0x0C: // \f
- case 0x0D: // \r
- case 0x20:
- case 0xA0:
- case 0x1680:
- case 0x202F:
- case 0x205F:
- case 0x3000:
- return true;
- }
- return false;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /*eslint-disable max-len*/
- var UNICODE_PUNCT_RE = __webpack_require__(5);
- // Currently without astral characters support.
- function isPunctChar(ch) {
- return UNICODE_PUNCT_RE.test(ch);
- }
- // Markdown ASCII punctuation characters.
- //
- // !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~
- // http://spec.commonmark.org/0.15/#ascii-punctuation-character
- //
- // Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.
- //
- function isMdAsciiPunct(ch) {
- switch (ch) {
- case 0x21/* ! */:
- case 0x22/* " */:
- case 0x23/* # */:
- case 0x24/* $ */:
- case 0x25/* % */:
- case 0x26/* & */:
- case 0x27/* ' */:
- case 0x28/* ( */:
- case 0x29/* ) */:
- case 0x2A/* * */:
- case 0x2B/* + */:
- case 0x2C/* , */:
- case 0x2D/* - */:
- case 0x2E/* . */:
- case 0x2F/* / */:
- case 0x3A/* : */:
- case 0x3B/* ; */:
- case 0x3C/* < */:
- case 0x3D/* = */:
- case 0x3E/* > */:
- case 0x3F/* ? */:
- case 0x40/* @ */:
- case 0x5B/* [ */:
- case 0x5C/* \ */:
- case 0x5D/* ] */:
- case 0x5E/* ^ */:
- case 0x5F/* _ */:
- case 0x60/* ` */:
- case 0x7B/* { */:
- case 0x7C/* | */:
- case 0x7D/* } */:
- case 0x7E/* ~ */:
- return true;
- default:
- return false;
- }
- }
- // Hepler to unify [reference labels].
- //
- function normalizeReference(str) {
- // use .toUpperCase() instead of .toLowerCase()
- // here to avoid a conflict with Object.prototype
- // members (most notably, `__proto__`)
- return str.trim().replace(/\s+/g, ' ').toUpperCase();
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Re-export libraries commonly used in both markdown-it and its plugins,
- // so plugins won't have to depend on them explicitly, which reduces their
- // bundled size (e.g. a browser build).
- //
- exports.lib = {};
- exports.lib.mdurl = __webpack_require__(15);
- exports.lib.ucmicro = __webpack_require__(85);
- exports.assign = assign;
- exports.isString = isString;
- exports.has = has;
- exports.unescapeMd = unescapeMd;
- exports.unescapeAll = unescapeAll;
- exports.isValidEntityCode = isValidEntityCode;
- exports.fromCodePoint = fromCodePoint;
- // exports.replaceEntities = replaceEntities;
- exports.escapeHtml = escapeHtml;
- exports.arrayReplaceAt = arrayReplaceAt;
- exports.isSpace = isSpace;
- exports.isWhiteSpace = isWhiteSpace;
- exports.isMdAsciiPunct = isMdAsciiPunct;
- exports.isPunctChar = isPunctChar;
- exports.escapeRE = escapeRE;
- exports.normalizeReference = normalizeReference;
- /***/ }),
- /* 1 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(setImmediate, global) {;(function() {
- "use strict"
- function Vnode(tag, key, attrs0, children, text, dom) {
- return {tag: tag, key: key, attrs: attrs0, children: children, text: text, dom: dom, domSize: undefined, state: undefined, _state: undefined, events: undefined, instance: undefined, skip: false}
- }
- Vnode.normalize = function(node) {
- if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined)
- if (node != null && typeof node !== "object") return Vnode("#", undefined, undefined, node === false ? "" : node, undefined, undefined)
- return node
- }
- Vnode.normalizeChildren = function normalizeChildren(children) {
- for (var i = 0; i < children.length; i++) {
- children[i] = Vnode.normalize(children[i])
- }
- return children
- }
- var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g
- var selectorCache = {}
- var hasOwn = {}.hasOwnProperty
- function compileSelector(selector) {
- var match, tag = "div", classes = [], attrs = {}
- while (match = selectorParser.exec(selector)) {
- var type = match[1], value = match[2]
- if (type === "" && value !== "") tag = value
- else if (type === "#") attrs.id = value
- else if (type === ".") classes.push(value)
- else if (match[3][0] === "[") {
- var attrValue = match[6]
- if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\")
- if (match[4] === "class") classes.push(attrValue)
- else attrs[match[4]] = attrValue || true
- }
- }
- if (classes.length > 0) attrs.className = classes.join(" ")
- return selectorCache[selector] = {tag: tag, attrs: attrs}
- }
- function execSelector(state, attrs, children) {
- var hasAttrs = false, childList, text
- var className = attrs.className || attrs.class
- for (var key in state.attrs) {
- if (hasOwn.call(state.attrs, key)) {
- attrs[key] = state.attrs[key]
- }
- }
- if (className !== undefined) {
- if (attrs.class !== undefined) {
- attrs.class = undefined
- attrs.className = className
- }
- if (state.attrs.className != null) {
- attrs.className = state.attrs.className + " " + className
- }
- }
- for (var key in attrs) {
- if (hasOwn.call(attrs, key) && key !== "key") {
- hasAttrs = true
- break
- }
- }
- if (Array.isArray(children) && children.length === 1 && children[0] != null && children[0].tag === "#") {
- text = children[0].children
- } else {
- childList = children
- }
- return Vnode(state.tag, attrs.key, hasAttrs ? attrs : undefined, childList, text)
- }
- function hyperscript(selector) {
- // Because sloppy mode sucks
- var attrs = arguments[1], start = 2, children
- if (selector == null || typeof selector !== "string" && typeof selector !== "function" && typeof selector.view !== "function") {
- throw Error("The selector must be either a string or a component.");
- }
- if (typeof selector === "string") {
- var cached = selectorCache[selector] || compileSelector(selector)
- }
- if (attrs == null) {
- attrs = {}
- } else if (typeof attrs !== "object" || attrs.tag != null || Array.isArray(attrs)) {
- attrs = {}
- start = 1
- }
- if (arguments.length === start + 1) {
- children = arguments[start]
- if (!Array.isArray(children)) children = [children]
- } else {
- children = []
- while (start < arguments.length) children.push(arguments[start++])
- }
- var normalized = Vnode.normalizeChildren(children)
- if (typeof selector === "string") {
- return execSelector(cached, attrs, normalized)
- } else {
- return Vnode(selector, attrs.key, attrs, normalized)
- }
- }
- hyperscript.trust = function(html) {
- if (html == null) html = ""
- return Vnode("<", undefined, undefined, html, undefined, undefined)
- }
- hyperscript.fragment = function(attrs1, children) {
- return Vnode("[", attrs1.key, attrs1, Vnode.normalizeChildren(children), undefined, undefined)
- }
- var m = hyperscript
- /** @constructor */
- var PromisePolyfill = function(executor) {
- if (!(this instanceof PromisePolyfill)) throw new Error("Promise must be called with `new`")
- if (typeof executor !== "function") throw new TypeError("executor must be a function")
- var self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false)
- var instance = self._instance = {resolvers: resolvers, rejectors: rejectors}
- var callAsync = typeof setImmediate === "function" ? setImmediate : setTimeout
- function handler(list, shouldAbsorb) {
- return function execute(value) {
- var then
- try {
- if (shouldAbsorb && value != null && (typeof value === "object" || typeof value === "function") && typeof (then = value.then) === "function") {
- if (value === self) throw new TypeError("Promise can't be resolved w/ itself")
- executeOnce(then.bind(value))
- }
- else {
- callAsync(function() {
- if (!shouldAbsorb && list.length === 0) console.error("Possible unhandled promise rejection:", value)
- for (var i = 0; i < list.length; i++) list[i](value)
- resolvers.length = 0, rejectors.length = 0
- instance.state = shouldAbsorb
- instance.retry = function() {execute(value)}
- })
- }
- }
- catch (e) {
- rejectCurrent(e)
- }
- }
- }
- function executeOnce(then) {
- var runs = 0
- function run(fn) {
- return function(value) {
- if (runs++ > 0) return
- fn(value)
- }
- }
- var onerror = run(rejectCurrent)
- try {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)}
- }
- executeOnce(executor)
- }
- PromisePolyfill.prototype.then = function(onFulfilled, onRejection) {
- var self = this, instance = self._instance
- function handle(callback, list, next, state) {
- list.push(function(value) {
- if (typeof callback !== "function") next(value)
- else try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)}
- })
- if (typeof instance.retry === "function" && state === instance.state) instance.retry()
- }
- var resolveNext, rejectNext
- var promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject})
- handle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false)
- return promise
- }
- PromisePolyfill.prototype.catch = function(onRejection) {
- return this.then(null, onRejection)
- }
- PromisePolyfill.resolve = function(value) {
- if (value instanceof PromisePolyfill) return value
- return new PromisePolyfill(function(resolve) {resolve(value)})
- }
- PromisePolyfill.reject = function(value) {
- return new PromisePolyfill(function(resolve, reject) {reject(value)})
- }
- PromisePolyfill.all = function(list) {
- return new PromisePolyfill(function(resolve, reject) {
- var total = list.length, count = 0, values = []
- if (list.length === 0) resolve([])
- else for (var i = 0; i < list.length; i++) {
- (function(i) {
- function consume(value) {
- count++
- values[i] = value
- if (count === total) resolve(values)
- }
- if (list[i] != null && (typeof list[i] === "object" || typeof list[i] === "function") && typeof list[i].then === "function") {
- list[i].then(consume, reject)
- }
- else consume(list[i])
- })(i)
- }
- })
- }
- PromisePolyfill.race = function(list) {
- return new PromisePolyfill(function(resolve, reject) {
- for (var i = 0; i < list.length; i++) {
- list[i].then(resolve, reject)
- }
- })
- }
- if (typeof window !== "undefined") {
- if (typeof window.Promise === "undefined") window.Promise = PromisePolyfill
- var PromisePolyfill = window.Promise
- } else if (typeof global !== "undefined") {
- if (typeof global.Promise === "undefined") global.Promise = PromisePolyfill
- var PromisePolyfill = global.Promise
- } else {
- }
- var buildQueryString = function(object) {
- if (Object.prototype.toString.call(object) !== "[object Object]") return ""
- var args = []
- for (var key0 in object) {
- destructure(key0, object[key0])
- }
- return args.join("&")
- function destructure(key0, value) {
- if (Array.isArray(value)) {
- for (var i = 0; i < value.length; i++) {
- destructure(key0 + "[" + i + "]", value[i])
- }
- }
- else if (Object.prototype.toString.call(value) === "[object Object]") {
- for (var i in value) {
- destructure(key0 + "[" + i + "]", value[i])
- }
- }
- else args.push(encodeURIComponent(key0) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : ""))
- }
- }
- var FILE_PROTOCOL_REGEX = new RegExp("^file://", "i")
- var _8 = function($window, Promise) {
- var callbackCount = 0
- var oncompletion
- function setCompletionCallback(callback) {oncompletion = callback}
- function finalizer() {
- var count = 0
- function complete() {if (--count === 0 && typeof oncompletion === "function") oncompletion()}
- return function finalize(promise0) {
- var then0 = promise0.then
- promise0.then = function() {
- count++
- var next = then0.apply(promise0, arguments)
- next.then(complete, function(e) {
- complete()
- if (count === 0) throw e
- })
- return finalize(next)
- }
- return promise0
- }
- }
- function normalize(args, extra) {
- if (typeof args === "string") {
- var url = args
- args = extra || {}
- if (args.url == null) args.url = url
- }
- return args
- }
- function request(args, extra) {
- var finalize = finalizer()
- args = normalize(args, extra)
- var promise0 = new Promise(function(resolve, reject) {
- if (args.method == null) args.method = "GET"
- args.method = args.method.toUpperCase()
- var useBody = (args.method === "GET" || args.method === "TRACE") ? false : (typeof args.useBody === "boolean" ? args.useBody : true)
- if (typeof args.serialize !== "function") args.serialize = typeof FormData !== "undefined" && args.data instanceof FormData ? function(value) {return value} : JSON.stringify
- if (typeof args.deserialize !== "function") args.deserialize = deserialize
- if (typeof args.extract !== "function") args.extract = extract
- args.url = interpolate(args.url, args.data)
- if (useBody) args.data = args.serialize(args.data)
- else args.url = assemble(args.url, args.data)
- var xhr = new $window.XMLHttpRequest(),
- aborted = false,
- _abort = xhr.abort
- xhr.abort = function abort() {
- aborted = true
- _abort.call(xhr)
- }
- xhr.open(args.method, args.url, typeof args.async === "boolean" ? args.async : true, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined)
- if (args.serialize === JSON.stringify && useBody) {
- xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8")
- }
- if (args.deserialize === deserialize) {
- xhr.setRequestHeader("Accept", "application/json, text/*")
- }
- if (args.withCredentials) xhr.withCredentials = args.withCredentials
- for (var key in args.headers) if ({}.hasOwnProperty.call(args.headers, key)) {
- xhr.setRequestHeader(key, args.headers[key])
- }
- if (typeof args.config === "function") xhr = args.config(xhr, args) || xhr
- xhr.onreadystatechange = function() {
- // Don't throw errors on xhr.abort().
- if(aborted) return
- if (xhr.readyState === 4) {
- try {
- var response = (args.extract !== extract) ? args.extract(xhr, args) : args.deserialize(args.extract(xhr, args))
- if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 || FILE_PROTOCOL_REGEX.test(args.url)) {
- resolve(cast(args.type, response))
- }
- else {
- var error = new Error(xhr.responseText)
- for (var key in response) error[key] = response[key]
- reject(error)
- }
- }
- catch (e) {
- reject(e)
- }
- }
- }
- if (useBody && (args.data != null)) xhr.send(args.data)
- else xhr.send()
- })
- return args.background === true ? promise0 : finalize(promise0)
- }
- function jsonp(args, extra) {
- var finalize = finalizer()
- args = normalize(args, extra)
- var promise0 = new Promise(function(resolve, reject) {
- var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++
- var script = $window.document.createElement("script")
- $window[callbackName] = function(data) {
- script.parentNode.removeChild(script)
- resolve(cast(args.type, data))
- delete $window[callbackName]
- }
- script.onerror = function() {
- script.parentNode.removeChild(script)
- reject(new Error("JSONP request failed"))
- delete $window[callbackName]
- }
- if (args.data == null) args.data = {}
- args.url = interpolate(args.url, args.data)
- args.data[args.callbackKey || "callback"] = callbackName
- script.src = assemble(args.url, args.data)
- $window.document.documentElement.appendChild(script)
- })
- return args.background === true? promise0 : finalize(promise0)
- }
- function interpolate(url, data) {
- if (data == null) return url
- var tokens = url.match(/:[^\/]+/gi) || []
- for (var i = 0; i < tokens.length; i++) {
- var key = tokens[i].slice(1)
- if (data[key] != null) {
- url = url.replace(tokens[i], data[key])
- }
- }
- return url
- }
- function assemble(url, data) {
- var querystring = buildQueryString(data)
- if (querystring !== "") {
- var prefix = url.indexOf("?") < 0 ? "?" : "&"
- url += prefix + querystring
- }
- return url
- }
- function deserialize(data) {
- try {return data !== "" ? JSON.parse(data) : null}
- catch (e) {throw new Error(data)}
- }
- function extract(xhr) {return xhr.responseText}
- function cast(type0, data) {
- if (typeof type0 === "function") {
- if (Array.isArray(data)) {
- for (var i = 0; i < data.length; i++) {
- data[i] = new type0(data[i])
- }
- }
- else return new type0(data)
- }
- return data
- }
- return {request: request, jsonp: jsonp, setCompletionCallback: setCompletionCallback}
- }
- var requestService = _8(window, PromisePolyfill)
- var coreRenderer = function($window) {
- var $doc = $window.document
- var $emptyFragment = $doc.createDocumentFragment()
- var onevent
- function setEventCallback(callback) {return onevent = callback}
- //create
- function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {
- for (var i = start; i < end; i++) {
- var vnode = vnodes[i]
- if (vnode != null) {
- createNode(parent, vnode, hooks, ns, nextSibling)
- }
- }
- }
- function createNode(parent, vnode, hooks, ns, nextSibling) {
- var tag = vnode.tag
- if (typeof tag === "string") {
- vnode.state = {}
- if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)
- switch (tag) {
- case "#": return createText(parent, vnode, nextSibling)
- case "<": return createHTML(parent, vnode, nextSibling)
- case "[": return createFragment(parent, vnode, hooks, ns, nextSibling)
- default: return createElement(parent, vnode, hooks, ns, nextSibling)
- }
- }
- else return createComponent(parent, vnode, hooks, ns, nextSibling)
- }
- function createText(parent, vnode, nextSibling) {
- vnode.dom = $doc.createTextNode(vnode.children)
- insertNode(parent, vnode.dom, nextSibling)
- return vnode.dom
- }
- function createHTML(parent, vnode, nextSibling) {
- var match1 = vnode.children.match(/^\s*?<(\w+)/im) || []
- var parent1 = {caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup"}[match1[1]] || "div"
- var temp = $doc.createElement(parent1)
- temp.innerHTML = vnode.children
- vnode.dom = temp.firstChild
- vnode.domSize = temp.childNodes.length
- var fragment = $doc.createDocumentFragment()
- var child
- while (child = temp.firstChild) {
- fragment.appendChild(child)
- }
- insertNode(parent, fragment, nextSibling)
- return fragment
- }
- function createFragment(parent, vnode, hooks, ns, nextSibling) {
- var fragment = $doc.createDocumentFragment()
- if (vnode.children != null) {
- var children = vnode.children
- createNodes(fragment, children, 0, children.length, hooks, null, ns)
- }
- vnode.dom = fragment.firstChild
- vnode.domSize = fragment.childNodes.length
- insertNode(parent, fragment, nextSibling)
- return fragment
- }
- function createElement(parent, vnode, hooks, ns, nextSibling) {
- var tag = vnode.tag
- switch (vnode.tag) {
- case "svg": ns = "http://www.w3.org/2000/svg"; break
- case "math": ns = "http://www.w3.org/1998/Math/MathML"; break
- }
- var attrs2 = vnode.attrs
- var is = attrs2 && attrs2.is
- var element = ns ?
- is ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) :
- is ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag)
- vnode.dom = element
- if (attrs2 != null) {
- setAttrs(vnode, attrs2, ns)
- }
- insertNode(parent, element, nextSibling)
- if (vnode.attrs != null && vnode.attrs.contenteditable != null) {
- setContentEditable(vnode)
- }
- else {
- if (vnode.text != null) {
- if (vnode.text !== "") element.textContent = vnode.text
- else vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)]
- }
- if (vnode.children != null) {
- var children = vnode.children
- createNodes(element, children, 0, children.length, hooks, null, ns)
- setLateAttrs(vnode)
- }
- }
- return element
- }
- function initComponent(vnode, hooks) {
- var sentinel
- if (typeof vnode.tag.view === "function") {
- vnode.state = Object.create(vnode.tag)
- sentinel = vnode.state.view
- if (sentinel.$$reentrantLock$$ != null) return $emptyFragment
- sentinel.$$reentrantLock$$ = true
- } else {
- vnode.state = void 0
- sentinel = vnode.tag
- if (sentinel.$$reentrantLock$$ != null) return $emptyFragment
- sentinel.$$reentrantLock$$ = true
- vnode.state = (vnode.tag.prototype != null && typeof vnode.tag.prototype.view === "function") ? new vnode.tag(vnode) : vnode.tag(vnode)
- }
- vnode._state = vnode.state
- if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks)
- initLifecycle(vnode._state, vnode, hooks)
- vnode.instance = Vnode.normalize(vnode._state.view.call(vnode.state, vnode))
- if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as argument")
- sentinel.$$reentrantLock$$ = null
- }
- function createComponent(parent, vnode, hooks, ns, nextSibling) {
- initComponent(vnode, hooks)
- if (vnode.instance != null) {
- var element = createNode(parent, vnode.instance, hooks, ns, nextSibling)
- vnode.dom = vnode.instance.dom
- vnode.domSize = vnode.dom != null ? vnode.instance.domSize : 0
- insertNode(parent, element, nextSibling)
- return element
- }
- else {
- vnode.domSize = 0
- return $emptyFragment
- }
- }
- //update
- function updateNodes(parent, old, vnodes, recycling, hooks, nextSibling, ns) {
- if (old === vnodes || old == null && vnodes == null) return
- else if (old == null) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, undefined)
- else if (vnodes == null) removeNodes(old, 0, old.length, vnodes)
- else {
- if (old.length === vnodes.length) {
- var isUnkeyed = false
- for (var i = 0; i < vnodes.length; i++) {
- if (vnodes[i] != null && old[i] != null) {
- isUnkeyed = vnodes[i].key == null && old[i].key == null
- break
- }
- }
- if (isUnkeyed) {
- for (var i = 0; i < old.length; i++) {
- if (old[i] === vnodes[i]) continue
- else if (old[i] == null && vnodes[i] != null) createNode(parent, vnodes[i], hooks, ns, getNextSibling(old, i + 1, nextSibling))
- else if (vnodes[i] == null) removeNodes(old, i, i + 1, vnodes)
- else updateNode(parent, old[i], vnodes[i], hooks, getNextSibling(old, i + 1, nextSibling), recycling, ns)
- }
- return
- }
- }
- recycling = recycling || isRecyclable(old, vnodes)
- if (recycling) {
- var pool = old.pool
- old = old.concat(old.pool)
- }
- var oldStart = 0, start = 0, oldEnd = old.length - 1, end = vnodes.length - 1, map
- while (oldEnd >= oldStart && end >= start) {
- var o = old[oldStart], v = vnodes[start]
- if (o === v && !recycling) oldStart++, start++
- else if (o == null) oldStart++
- else if (v == null) start++
- else if (o.key === v.key) {
- var shouldRecycle = (pool != null && oldStart >= old.length - pool.length) || ((pool == null) && recycling)
- oldStart++, start++
- updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), shouldRecycle, ns)
- if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling)
- }
- else {
- var o = old[oldEnd]
- if (o === v && !recycling) oldEnd--, start++
- else if (o == null) oldEnd--
- else if (v == null) start++
- else if (o.key === v.key) {
- var shouldRecycle = (pool != null && oldEnd >= old.length - pool.length) || ((pool == null) && recycling)
- updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), shouldRecycle, ns)
- if (recycling || start < end) insertNode(parent, toFragment(o), getNextSibling(old, oldStart, nextSibling))
- oldEnd--, start++
- }
- else break
- }
- }
- while (oldEnd >= oldStart && end >= start) {
- var o = old[oldEnd], v = vnodes[end]
- if (o === v && !recycling) oldEnd--, end--
- else if (o == null) oldEnd--
- else if (v == null) end--
- else if (o.key === v.key) {
- var shouldRecycle = (pool != null && oldEnd >= old.length - pool.length) || ((pool == null) && recycling)
- updateNode(parent, o, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), shouldRecycle, ns)
- if (recycling && o.tag === v.tag) insertNode(parent, toFragment(o), nextSibling)
- if (o.dom != null) nextSibling = o.dom
- oldEnd--, end--
- }
- else {
- if (!map) map = getKeyMap(old, oldEnd)
- if (v != null) {
- var oldIndex = map[v.key]
- if (oldIndex != null) {
- var movable = old[oldIndex]
- var shouldRecycle = (pool != null && oldIndex >= old.length - pool.length) || ((pool == null) && recycling)
- updateNode(parent, movable, v, hooks, getNextSibling(old, oldEnd + 1, nextSibling), recycling, ns)
- insertNode(parent, toFragment(movable), nextSibling)
- old[oldIndex].skip = true
- if (movable.dom != null) nextSibling = movable.dom
- }
- else {
- var dom = createNode(parent, v, hooks, undefined, nextSibling)
- nextSibling = dom
- }
- }
- end--
- }
- if (end < start) break
- }
- createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)
- removeNodes(old, oldStart, oldEnd + 1, vnodes)
- }
- }
- function updateNode(parent, old, vnode, hooks, nextSibling, recycling, ns) {
- var oldTag = old.tag, tag = vnode.tag
- if (oldTag === tag) {
- vnode.state = old.state
- vnode._state = old._state
- vnode.events = old.events
- if (!recycling && shouldNotUpdate(vnode, old)) return
- if (typeof oldTag === "string") {
- if (vnode.attrs != null) {
- if (recycling) {
- vnode.state = {}
- initLifecycle(vnode.attrs, vnode, hooks)
- }
- else updateLifecycle(vnode.attrs, vnode, hooks)
- }
- switch (oldTag) {
- case "#": updateText(old, vnode); break
- case "<": updateHTML(parent, old, vnode, nextSibling); break
- case "[": updateFragment(parent, old, vnode, recycling, hooks, nextSibling, ns); break
- default: updateElement(old, vnode, recycling, hooks, ns)
- }
- }
- else updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns)
- }
- else {
- removeNode(old, null)
- createNode(parent, vnode, hooks, ns, nextSibling)
- }
- }
- function updateText(old, vnode) {
- if (old.children.toString() !== vnode.children.toString()) {
- old.dom.nodeValue = vnode.children
- }
- vnode.dom = old.dom
- }
- function updateHTML(parent, old, vnode, nextSibling) {
- if (old.children !== vnode.children) {
- toFragment(old)
- createHTML(parent, vnode, nextSibling)
- }
- else vnode.dom = old.dom, vnode.domSize = old.domSize
- }
- function updateFragment(parent, old, vnode, recycling, hooks, nextSibling, ns) {
- updateNodes(parent, old.children, vnode.children, recycling, hooks, nextSibling, ns)
- var domSize = 0, children = vnode.children
- vnode.dom = null
- if (children != null) {
- for (var i = 0; i < children.length; i++) {
- var child = children[i]
- if (child != null && child.dom != null) {
- if (vnode.dom == null) vnode.dom = child.dom
- domSize += child.domSize || 1
- }
- }
- if (domSize !== 1) vnode.domSize = domSize
- }
- }
- function updateElement(old, vnode, recycling, hooks, ns) {
- var element = vnode.dom = old.dom
- switch (vnode.tag) {
- case "svg": ns = "http://www.w3.org/2000/svg"; break
- case "math": ns = "http://www.w3.org/1998/Math/MathML"; break
- }
- if (vnode.tag === "textarea") {
- if (vnode.attrs == null) vnode.attrs = {}
- if (vnode.text != null) {
- vnode.attrs.value = vnode.text //FIXME handle0 multiple children
- vnode.text = undefined
- }
- }
- updateAttrs(vnode, old.attrs, vnode.attrs, ns)
- if (vnode.attrs != null && vnode.attrs.contenteditable != null) {
- setContentEditable(vnode)
- }
- else if (old.text != null && vnode.text != null && vnode.text !== "") {
- if (old.text.toString() !== vnode.text.toString()) old.dom.firstChild.nodeValue = vnode.text
- }
- else {
- if (old.text != null) old.children = [Vnode("#", undefined, undefined, old.text, undefined, old.dom.firstChild)]
- if (vnode.text != null) vnode.children = [Vnode("#", undefined, undefined, vnode.text, undefined, undefined)]
- updateNodes(element, old.children, vnode.children, recycling, hooks, null, ns)
- }
- }
- function updateComponent(parent, old, vnode, hooks, nextSibling, recycling, ns) {
- if (recycling) {
- initComponent(vnode, hooks)
- } else {
- vnode.instance = Vnode.normalize(vnode._state.view.call(vnode.state, vnode))
- if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as argument")
- if (vnode.attrs != null) updateLifecycle(vnode.attrs, vnode, hooks)
- updateLifecycle(vnode._state, vnode, hooks)
- }
- if (vnode.instance != null) {
- if (old.instance == null) createNode(parent, vnode.instance, hooks, ns, nextSibling)
- else updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, recycling, ns)
- vnode.dom = vnode.instance.dom
- vnode.domSize = vnode.instance.domSize
- }
- else if (old.instance != null) {
- removeNode(old.instance, null)
- vnode.dom = undefined
- vnode.domSize = 0
- }
- else {
- vnode.dom = old.dom
- vnode.domSize = old.domSize
- }
- }
- function isRecyclable(old, vnodes) {
- if (old.pool != null && Math.abs(old.pool.length - vnodes.length) <= Math.abs(old.length - vnodes.length)) {
- var oldChildrenLength = old[0] && old[0].children && old[0].children.length || 0
- var poolChildrenLength = old.pool[0] && old.pool[0].children && old.pool[0].children.length || 0
- var vnodesChildrenLength = vnodes[0] && vnodes[0].children && vnodes[0].children.length || 0
- if (Math.abs(poolChildrenLength - vnodesChildrenLength) <= Math.abs(oldChildrenLength - vnodesChildrenLength)) {
- return true
- }
- }
- return false
- }
- function getKeyMap(vnodes, end) {
- var map = {}, i = 0
- for (var i = 0; i < end; i++) {
- var vnode = vnodes[i]
- if (vnode != null) {
- var key2 = vnode.key
- if (key2 != null) map[key2] = i
- }
- }
- return map
- }
- function toFragment(vnode) {
- var count0 = vnode.domSize
- if (count0 != null || vnode.dom == null) {
- var fragment = $doc.createDocumentFragment()
- if (count0 > 0) {
- var dom = vnode.dom
- while (--count0) fragment.appendChild(dom.nextSibling)
- fragment.insertBefore(dom, fragment.firstChild)
- }
- return fragment
- }
- else return vnode.dom
- }
- function getNextSibling(vnodes, i, nextSibling) {
- for (; i < vnodes.length; i++) {
- if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom
- }
- return nextSibling
- }
- function insertNode(parent, dom, nextSibling) {
- if (nextSibling && nextSibling.parentNode) parent.insertBefore(dom, nextSibling)
- else parent.appendChild(dom)
- }
- function setContentEditable(vnode) {
- var children = vnode.children
- if (children != null && children.length === 1 && children[0].tag === "<") {
- var content = children[0].children
- if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content
- }
- else if (vnode.text != null || children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted")
- }
- //remove
- function removeNodes(vnodes, start, end, context) {
- for (var i = start; i < end; i++) {
- var vnode = vnodes[i]
- if (vnode != null) {
- if (vnode.skip) vnode.skip = false
- else removeNode(vnode, context)
- }
- }
- }
- function removeNode(vnode, context) {
- var expected = 1, called = 0
- if (vnode.attrs && typeof vnode.attrs.onbeforeremove === "function") {
- var result = vnode.attrs.onbeforeremove.call(vnode.state, vnode)
- if (result != null && typeof result.then === "function") {
- expected++
- result.then(continuation, continuation)
- }
- }
- if (typeof vnode.tag !== "string" && typeof vnode._state.onbeforeremove === "function") {
- var result = vnode._state.onbeforeremove.call(vnode.state, vnode)
- if (result != null && typeof result.then === "function") {
- expected++
- result.then(continuation, continuation)
- }
- }
- continuation()
- function continuation() {
- if (++called === expected) {
- onremove(vnode)
- if (vnode.dom) {
- var count0 = vnode.domSize || 1
- if (count0 > 1) {
- var dom = vnode.dom
- while (--count0) {
- removeNodeFromDOM(dom.nextSibling)
- }
- }
- removeNodeFromDOM(vnode.dom)
- if (context != null && vnode.domSize == null && !hasIntegrationMethods(vnode.attrs) && typeof vnode.tag === "string") { //TODO test custom elements
- if (!context.pool) context.pool = [vnode]
- else context.pool.push(vnode)
- }
- }
- }
- }
- }
- function removeNodeFromDOM(node) {
- var parent = node.parentNode
- if (parent != null) parent.removeChild(node)
- }
- function onremove(vnode) {
- if (vnode.attrs && typeof vnode.attrs.onremove === "function") vnode.attrs.onremove.call(vnode.state, vnode)
- if (typeof vnode.tag !== "string" && typeof vnode._state.onremove === "function") vnode._state.onremove.call(vnode.state, vnode)
- if (vnode.instance != null) onremove(vnode.instance)
- else {
- var children = vnode.children
- if (Array.isArray(children)) {
- for (var i = 0; i < children.length; i++) {
- var child = children[i]
- if (child != null) onremove(child)
- }
- }
- }
- }
- //attrs2
- function setAttrs(vnode, attrs2, ns) {
- for (var key2 in attrs2) {
- setAttr(vnode, key2, null, attrs2[key2], ns)
- }
- }
- function setAttr(vnode, key2, old, value, ns) {
- var element = vnode.dom
- if (key2 === "key" || key2 === "is" || (old === value && !isFormAttribute(vnode, key2)) && typeof value !== "object" || typeof value === "undefined" || isLifecycleMethod(key2)) return
- var nsLastIndex = key2.indexOf(":")
- if (nsLastIndex > -1 && key2.substr(0, nsLastIndex) === "xlink") {
- element.setAttributeNS("http://www.w3.org/1999/xlink", key2.slice(nsLastIndex + 1), value)
- }
- else if (key2[0] === "o" && key2[1] === "n" && typeof value === "function") updateEvent(vnode, key2, value)
- else if (key2 === "style") updateStyle(element, old, value)
- else if (key2 in element && !isAttribute(key2) && ns === undefined && !isCustomElement(vnode)) {
- //setting input[value] to same value by typing on focused element moves cursor to end in Chrome
- if (vnode.tag === "input" && key2 === "value" && vnode.dom.value == value && vnode.dom === $doc.activeElement) return
- //setting select[value] to same value while having select open blinks select dropdown in Chrome
- if (vnode.tag === "select" && key2 === "value" && vnode.dom.value == value && vnode.dom === $doc.activeElement) return
- //setting option[value] to same value while having select open blinks select dropdown in Chrome
- if (vnode.tag === "option" && key2 === "value" && vnode.dom.value == value) return
- // If you assign an input type1 that is not supported by IE 11 with an assignment expression, an error0 will occur.
- if (vnode.tag === "input" && key2 === "type") {
- element.setAttribute(key2, value)
- return
- }
- element[key2] = value
- }
- else {
- if (typeof value === "boolean") {
- if (value) element.setAttribute(key2, "")
- else element.removeAttribute(key2)
- }
- else element.setAttribute(key2 === "className" ? "class" : key2, value)
- }
- }
- function setLateAttrs(vnode) {
- var attrs2 = vnode.attrs
- if (vnode.tag === "select" && attrs2 != null) {
- if ("value" in attrs2) setAttr(vnode, "value", null, attrs2.value, undefined)
- if ("selectedIndex" in attrs2) setAttr(vnode, "selectedIndex", null, attrs2.selectedIndex, undefined)
- }
- }
- function updateAttrs(vnode, old, attrs2, ns) {
- if (attrs2 != null) {
- for (var key2 in attrs2) {
- setAttr(vnode, key2, old && old[key2], attrs2[key2], ns)
- }
- }
- if (old != null) {
- for (var key2 in old) {
- if (attrs2 == null || !(key2 in attrs2)) {
- if (key2 === "className") key2 = "class"
- if (key2[0] === "o" && key2[1] === "n" && !isLifecycleMethod(key2)) updateEvent(vnode, key2, undefined)
- else if (key2 !== "key") vnode.dom.removeAttribute(key2)
- }
- }
- }
- }
- function isFormAttribute(vnode, attr) {
- return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode.dom === $doc.activeElement
- }
- function isLifecycleMethod(attr) {
- return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate"
- }
- function isAttribute(attr) {
- return attr === "href" || attr === "list" || attr === "form" || attr === "width" || attr === "height"// || attr === "type"
- }
- function isCustomElement(vnode){
- return vnode.attrs.is || vnode.tag.indexOf("-") > -1
- }
- function hasIntegrationMethods(source) {
- return source != null && (source.oncreate || source.onupdate || source.onbeforeremove || source.onremove)
- }
- //style
- function updateStyle(element, old, style) {
- if (old === style) element.style.cssText = "", old = null
- if (style == null) element.style.cssText = ""
- else if (typeof style === "string") element.style.cssText = style
- else {
- if (typeof old === "string") element.style.cssText = ""
- for (var key2 in style) {
- element.style[key2] = style[key2]
- }
- if (old != null && typeof old !== "string") {
- for (var key2 in old) {
- if (!(key2 in style)) element.style[key2] = ""
- }
- }
- }
- }
- //event
- function updateEvent(vnode, key2, value) {
- var element = vnode.dom
- var callback = typeof onevent !== "function" ? value : function(e) {
- var result = value.call(element, e)
- onevent.call(element, e)
- return result
- }
- if (key2 in element) element[key2] = typeof value === "function" ? callback : null
- else {
- var eventName = key2.slice(2)
- if (vnode.events === undefined) vnode.events = {}
- if (vnode.events[key2] === callback) return
- if (vnode.events[key2] != null) element.removeEventListener(eventName, vnode.events[key2], false)
- if (typeof value === "function") {
- vnode.events[key2] = callback
- element.addEventListener(eventName, vnode.events[key2], false)
- }
- }
- }
- //lifecycle
- function initLifecycle(source, vnode, hooks) {
- if (typeof source.oninit === "function") source.oninit.call(vnode.state, vnode)
- if (typeof source.oncreate === "function") hooks.push(source.oncreate.bind(vnode.state, vnode))
- }
- function updateLifecycle(source, vnode, hooks) {
- if (typeof source.onupdate === "function") hooks.push(source.onupdate.bind(vnode.state, vnode))
- }
- function shouldNotUpdate(vnode, old) {
- var forceVnodeUpdate, forceComponentUpdate
- if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") forceVnodeUpdate = vnode.attrs.onbeforeupdate.call(vnode.state, vnode, old)
- if (typeof vnode.tag !== "string" && typeof vnode._state.onbeforeupdate === "function") forceComponentUpdate = vnode._state.onbeforeupdate.call(vnode.state, vnode, old)
- if (!(forceVnodeUpdate === undefined && forceComponentUpdate === undefined) && !forceVnodeUpdate && !forceComponentUpdate) {
- vnode.dom = old.dom
- vnode.domSize = old.domSize
- vnode.instance = old.instance
- return true
- }
- return false
- }
- function render(dom, vnodes) {
- if (!dom) throw new Error("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.")
- var hooks = []
- var active = $doc.activeElement
- // First time0 rendering into a node clears it out
- if (dom.vnodes == null) dom.textContent = ""
- if (!Array.isArray(vnodes)) vnodes = [vnodes]
- updateNodes(dom, dom.vnodes, Vnode.normalizeChildren(vnodes), false, hooks, null, undefined)
- dom.vnodes = vnodes
- for (var i = 0; i < hooks.length; i++) hooks[i]()
- if ($doc.activeElement !== active) active.focus()
- }
- return {render: render, setEventCallback: setEventCallback}
- }
- function throttle(callback) {
- //60fps translates to 16.6ms, round it down since setTimeout requires int
- var time = 16
- var last = 0, pending = null
- var timeout = typeof requestAnimationFrame === "function" ? requestAnimationFrame : setTimeout
- return function() {
- var now = Date.now()
- if (last === 0 || now - last >= time) {
- last = now
- callback()
- }
- else if (pending === null) {
- pending = timeout(function() {
- pending = null
- callback()
- last = Date.now()
- }, time - (now - last))
- }
- }
- }
- var _11 = function($window) {
- var renderService = coreRenderer($window)
- renderService.setEventCallback(function(e) {
- if (e.redraw !== false) redraw()
- })
- var callbacks = []
- function subscribe(key1, callback) {
- unsubscribe(key1)
- callbacks.push(key1, throttle(callback))
- }
- function unsubscribe(key1) {
- var index = callbacks.indexOf(key1)
- if (index > -1) callbacks.splice(index, 2)
- }
- function redraw() {
- for (var i = 1; i < callbacks.length; i += 2) {
- callbacks[i]()
- }
- }
- return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render}
- }
- var redrawService = _11(window)
- requestService.setCompletionCallback(redrawService.redraw)
- var _16 = function(redrawService0) {
- return function(root, component) {
- if (component === null) {
- redrawService0.render(root, [])
- redrawService0.unsubscribe(root)
- return
- }
-
- if (component.view == null && typeof component !== "function") throw new Error("m.mount(element, component) expects a component, not a vnode")
-
- var run0 = function() {
- redrawService0.render(root, Vnode(component))
- }
- redrawService0.subscribe(root, run0)
- redrawService0.redraw()
- }
- }
- m.mount = _16(redrawService)
- var Promise = PromisePolyfill
- var parseQueryString = function(string) {
- if (string === "" || string == null) return {}
- if (string.charAt(0) === "?") string = string.slice(1)
- var entries = string.split("&"), data0 = {}, counters = {}
- for (var i = 0; i < entries.length; i++) {
- var entry = entries[i].split("=")
- var key5 = decodeURIComponent(entry[0])
- var value = entry.length === 2 ? decodeURIComponent(entry[1]) : ""
- if (value === "true") value = true
- else if (value === "false") value = false
- var levels = key5.split(/\]\[?|\[/)
- var cursor = data0
- if (key5.indexOf("[") > -1) levels.pop()
- for (var j = 0; j < levels.length; j++) {
- var level = levels[j], nextLevel = levels[j + 1]
- var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10))
- var isValue = j === levels.length - 1
- if (level === "") {
- var key5 = levels.slice(0, j).join()
- if (counters[key5] == null) counters[key5] = 0
- level = counters[key5]++
- }
- if (cursor[level] == null) {
- cursor[level] = isValue ? value : isNumber ? [] : {}
- }
- cursor = cursor[level]
- }
- }
- return data0
- }
- var coreRouter = function($window) {
- var supportsPushState = typeof $window.history.pushState === "function"
- var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout
- function normalize1(fragment0) {
- var data = $window.location[fragment0].replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent)
- if (fragment0 === "pathname" && data[0] !== "/") data = "/" + data
- return data
- }
- var asyncId
- function debounceAsync(callback0) {
- return function() {
- if (asyncId != null) return
- asyncId = callAsync0(function() {
- asyncId = null
- callback0()
- })
- }
- }
- function parsePath(path, queryData, hashData) {
- var queryIndex = path.indexOf("?")
- var hashIndex = path.indexOf("#")
- var pathEnd = queryIndex > -1 ? queryIndex : hashIndex > -1 ? hashIndex : path.length
- if (queryIndex > -1) {
- var queryEnd = hashIndex > -1 ? hashIndex : path.length
- var queryParams = parseQueryString(path.slice(queryIndex + 1, queryEnd))
- for (var key4 in queryParams) queryData[key4] = queryParams[key4]
- }
- if (hashIndex > -1) {
- var hashParams = parseQueryString(path.slice(hashIndex + 1))
- for (var key4 in hashParams) hashData[key4] = hashParams[key4]
- }
- return path.slice(0, pathEnd)
- }
- var router = {prefix: "#!"}
- router.getPath = function() {
- var type2 = router.prefix.charAt(0)
- switch (type2) {
- case "#": return normalize1("hash").slice(router.prefix.length)
- case "?": return normalize1("search").slice(router.prefix.length) + normalize1("hash")
- default: return normalize1("pathname").slice(router.prefix.length) + normalize1("search") + normalize1("hash")
- }
- }
- router.setPath = function(path, data, options) {
- var queryData = {}, hashData = {}
- path = parsePath(path, queryData, hashData)
- if (data != null) {
- for (var key4 in data) queryData[key4] = data[key4]
- path = path.replace(/:([^\/]+)/g, function(match2, token) {
- delete queryData[token]
- return data[token]
- })
- }
- var query = buildQueryString(queryData)
- if (query) path += "?" + query
- var hash = buildQueryString(hashData)
- if (hash) path += "#" + hash
- if (supportsPushState) {
- var state = options ? options.state : null
- var title = options ? options.title : null
- $window.onpopstate()
- if (options && options.replace) $window.history.replaceState(state, title, router.prefix + path)
- else $window.history.pushState(state, title, router.prefix + path)
- }
- else $window.location.href = router.prefix + path
- }
- router.defineRoutes = function(routes, resolve, reject) {
- function resolveRoute() {
- var path = router.getPath()
- var params = {}
- var pathname = parsePath(path, params, params)
- var state = $window.history.state
- if (state != null) {
- for (var k in state) params[k] = state[k]
- }
- for (var route0 in routes) {
- var matcher = new RegExp("^" + route0.replace(/:[^\/]+?\.{3}/g, "(.*?)").replace(/:[^\/]+/g, "([^\\/]+)") + "\/?$")
- if (matcher.test(pathname)) {
- pathname.replace(matcher, function() {
- var keys = route0.match(/:[^\/]+/g) || []
- var values = [].slice.call(arguments, 1, -2)
- for (var i = 0; i < keys.length; i++) {
- params[keys[i].replace(/:|\./g, "")] = decodeURIComponent(values[i])
- }
- resolve(routes[route0], params, path, route0)
- })
- return
- }
- }
- reject(path, params)
- }
- if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute)
- else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute
- resolveRoute()
- }
- return router
- }
- var _20 = function($window, redrawService0) {
- var routeService = coreRouter($window)
- var identity = function(v) {return v}
- var render1, component, attrs3, currentPath, lastUpdate
- var route = function(root, defaultRoute, routes) {
- if (root == null) throw new Error("Ensure the DOM element that was passed to `m.route` is not undefined")
- var run1 = function() {
- if (render1 != null) redrawService0.render(root, render1(Vnode(component, attrs3.key, attrs3)))
- }
- var bail = function(path) {
- if (path !== defaultRoute) routeService.setPath(defaultRoute, null, {replace: true})
- else throw new Error("Could not resolve default route " + defaultRoute)
- }
- routeService.defineRoutes(routes, function(payload, params, path) {
- var update = lastUpdate = function(routeResolver, comp) {
- if (update !== lastUpdate) return
- component = comp != null && (typeof comp.view === "function" || typeof comp === "function")? comp : "div"
- attrs3 = params, currentPath = path, lastUpdate = null
- render1 = (routeResolver.render || identity).bind(routeResolver)
- run1()
- }
- if (payload.view || typeof payload === "function") update({}, payload)
- else {
- if (payload.onmatch) {
- Promise.resolve(payload.onmatch(params, path)).then(function(resolved) {
- update(payload, resolved)
- }, bail)
- }
- else update(payload, "div")
- }
- }, bail)
- redrawService0.subscribe(root, run1)
- }
- route.set = function(path, data, options) {
- if (lastUpdate != null) options = {replace: true}
- lastUpdate = null
- routeService.setPath(path, data, options)
- }
- route.get = function() {return currentPath}
- route.prefix = function(prefix0) {routeService.prefix = prefix0}
- route.link = function(vnode1) {
- vnode1.dom.setAttribute("href", routeService.prefix + vnode1.attrs.href)
- vnode1.dom.onclick = function(e) {
- if (e.ctrlKey || e.metaKey || e.shiftKey || e.which === 2) return
- e.preventDefault()
- e.redraw = false
- var href = this.getAttribute("href")
- if (href.indexOf(routeService.prefix) === 0) href = href.slice(routeService.prefix.length)
- route.set(href, undefined, undefined)
- }
- }
- route.param = function(key3) {
- if(typeof attrs3 !== "undefined" && typeof key3 !== "undefined") return attrs3[key3]
- return attrs3
- }
- return route
- }
- m.route = _20(window, redrawService)
- m.withAttr = function(attrName, callback1, context) {
- return function(e) {
- callback1.call(context || this, attrName in e.currentTarget ? e.currentTarget[attrName] : e.currentTarget.getAttribute(attrName))
- }
- }
- var _28 = coreRenderer(window)
- m.render = _28.render
- m.redraw = redrawService.redraw
- m.request = requestService.request
- m.jsonp = requestService.jsonp
- m.parseQueryString = parseQueryString
- m.buildQueryString = buildQueryString
- m.version = "1.1.1"
- m.vnode = Vnode
- if (true) module["exports"] = m
- else window.m = m
- }());
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(83).setImmediate, __webpack_require__(6)))
- /***/ }),
- /* 2 */
- /***/ (function(module, exports) {
- // _
- // (_)________ ____
- // / / ___/ __ \/ __ \
- // / (__ ) /_/ / / / /
- // __/ /____/\____/_/ /_/
- // /___/
- module.exports = {
- lang:'fr',
- langs:[
- {'lc':'lat', 'label':'Latin', 'db':'0-LAT-ethicadb.json'},
- {'lc':'fr', 'label':'Français', 'db':'2-Appuhn-FR-ethicadb.json'},
- {'lc':'bra', 'label':'Brazilian', 'db':'ethica-bresilen.json'},
- {'lc':'en', 'label':'English', 'db':'3-Elwes-EN-ethicadb.json'}
- ],
- data:[],
- loaded_dbs:0,
- data_byid:[],
- data_strct:{},
- load: function(callback) {
- // load all dbs, when all loaded call main app callback function
- for (var i = 0; i < this.langs.length; i++) {
- this.loadJSON(this.langs[i].lc, '/assets/jsondb/'+this.langs[i].db, callback)
- }
- },
- loadJSON: function(lc, file, callback){
- var xobj = new XMLHttpRequest();
- xobj.overrideMimeType("application/json");
- // TODO: load and unzip gziped json
- // xobj.setRequestHeader('Accept-Encoding', 'gzip');
- xobj.onreadystatechange = function () {
- // console.log('onreadystatechange', xobj.readyState);
- switch(xobj.readyState){
- case 3:
- console.log('loading');
- break;
- case 4:
- if (xobj.status === 200) {
- this.onJSONLoaded(lc, xobj.responseText, callback);
- } else {
- console.log("Status de la réponse: %d (%s)", xobj.status, xobj.statusText);
- }
- break;
- }
- }.bind(this);
- xobj.open('GET', file, true);
- xobj.send(null);
- },
- onJSONLoaded: function(lc, json, callback){
- console.log('onDBLoaded '+lc);
- this.data[lc] = JSON.parse(json);
- this.loaded_dbs ++;
- //
- if (this.loaded_dbs == this.langs.length) {
- this.parseByID(callback);
- }
- },
- parseByID: function(callback){
- for(l in this.data){
- // console.log('l', l);
- this.data_byid[l] = {};
- for (p in this.data[l]) {
- // console.log(this.data[l][p]);
- for (e in this.data[l][p].enonces) {
- // console.log('e',e);
- this.data_byid[l][this.data[l][p].enonces[e].id] = this.data[l][p].enonces[e];
- for (c in this.data[l][p].enonces[e].childs){
- // console.log(_db[p][e][c]);
- this.data_byid[l][this.data[l][p].enonces[e].childs[c].id] = this.data[l][p].enonces[e].childs[c];
- }
- }
- }
- }
- // console.log('this.data_byid', this.data_byid);
- this.parseStrct(callback);
- },
- parseStrct: function(callback){
- var id, item, obj, links_match, link, tid;
- for (id in this.data_byid[this.langs[0].lc]) {
- item = this.data_byid[this.langs[0].lc][id];
- // console.log(item);
- // skeep titles as they don't have structure data
- if(item.type == "title") continue;
- obj = {
- 'to':[],
- 'from':[],
- };
- // get links
- links_match = item.text.match(/\[[^\]]+\]\([^\)]+\)/g);
- // console.log(links_match);
- // if links exist on text
- if(links_match){
- for(link of links_match){
- // console.log(link);
- // get the target id
- tid = link.match(/\((.+)\)/)[1];
- // avoid duplicates
- if (obj.to.indexOf(tid) == -1)
- obj.to.push(tid);
- // add id to "from" links in target
- // if target exists
- if(typeof this.data_strct[tid] !== 'undefined'){
- // avoid duplicates
- if (this.data_strct[tid].from.indexOf(tid) == -1)
- this.data_strct[tid].from.push(id);
- }else{
- // if targets does not exists, the db has an issue, warn about that
- console.log('!! warning : '+tid+' target id does not exists');
- }
- }
- }
- // add the item links to the main links listings
- this.data_strct[id] = obj;
- }
- // console.log('data_strct',this.data_strct);
- callback();
- }
- }
- /***/ }),
- /* 3 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /**
- * class Ruler
- *
- * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and
- * [[MarkdownIt#inline]] to manage sequences of functions (rules):
- *
- * - keep rules in defined order
- * - assign the name to each rule
- * - enable/disable rules
- * - add/replace rules
- * - allow assign rules to additional named chains (in the same)
- * - cacheing lists of active rules
- *
- * You will not need use this class directly until write plugins. For simple
- * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and
- * [[MarkdownIt.use]].
- **/
- /**
- * new Ruler()
- **/
- function Ruler() {
- // List of added rules. Each element is:
- //
- // {
- // name: XXX,
- // enabled: Boolean,
- // fn: Function(),
- // alt: [ name2, name3 ]
- // }
- //
- this.__rules__ = [];
- // Cached rule chains.
- //
- // First level - chain name, '' for default.
- // Second level - diginal anchor for fast filtering by charcodes.
- //
- this.__cache__ = null;
- }
- ////////////////////////////////////////////////////////////////////////////////
- // Helper methods, should not be used directly
- // Find rule index by name
- //
- Ruler.prototype.__find__ = function (name) {
- for (var i = 0; i < this.__rules__.length; i++) {
- if (this.__rules__[i].name === name) {
- return i;
- }
- }
- return -1;
- };
- // Build rules lookup cache
- //
- Ruler.prototype.__compile__ = function () {
- var self = this;
- var chains = [ '' ];
- // collect unique names
- self.__rules__.forEach(function (rule) {
- if (!rule.enabled) { return; }
- rule.alt.forEach(function (altName) {
- if (chains.indexOf(altName) < 0) {
- chains.push(altName);
- }
- });
- });
- self.__cache__ = {};
- chains.forEach(function (chain) {
- self.__cache__[chain] = [];
- self.__rules__.forEach(function (rule) {
- if (!rule.enabled) { return; }
- if (chain && rule.alt.indexOf(chain) < 0) { return; }
- self.__cache__[chain].push(rule.fn);
- });
- });
- };
- /**
- * Ruler.at(name, fn [, options])
- * - name (String): rule name to replace.
- * - fn (Function): new rule function.
- * - options (Object): new rule options (not mandatory).
- *
- * Replace rule by name with new function & options. Throws error if name not
- * found.
- *
- * ##### Options:
- *
- * - __alt__ - array with names of "alternate" chains.
- *
- * ##### Example
- *
- * Replace existing typorgapher replacement rule with new one:
- *
- * ```javascript
- * var md = require('markdown-it')();
- *
- * md.core.ruler.at('replacements', function replace(state) {
- * //...
- * });
- * ```
- **/
- Ruler.prototype.at = function (name, fn, options) {
- var index = this.__find__(name);
- var opt = options || {};
- if (index === -1) { throw new Error('Parser rule not found: ' + name); }
- this.__rules__[index].fn = fn;
- this.__rules__[index].alt = opt.alt || [];
- this.__cache__ = null;
- };
- /**
- * Ruler.before(beforeName, ruleName, fn [, options])
- * - beforeName (String): new rule will be added before this one.
- * - ruleName (String): name of added rule.
- * - fn (Function): rule function.
- * - options (Object): rule options (not mandatory).
- *
- * Add new rule to chain before one with given name. See also
- * [[Ruler.after]], [[Ruler.push]].
- *
- * ##### Options:
- *
- * - __alt__ - array with names of "alternate" chains.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')();
- *
- * md.block.ruler.before('paragraph', 'my_rule', function replace(state) {
- * //...
- * });
- * ```
- **/
- Ruler.prototype.before = function (beforeName, ruleName, fn, options) {
- var index = this.__find__(beforeName);
- var opt = options || {};
- if (index === -1) { throw new Error('Parser rule not found: ' + beforeName); }
- this.__rules__.splice(index, 0, {
- name: ruleName,
- enabled: true,
- fn: fn,
- alt: opt.alt || []
- });
- this.__cache__ = null;
- };
- /**
- * Ruler.after(afterName, ruleName, fn [, options])
- * - afterName (String): new rule will be added after this one.
- * - ruleName (String): name of added rule.
- * - fn (Function): rule function.
- * - options (Object): rule options (not mandatory).
- *
- * Add new rule to chain after one with given name. See also
- * [[Ruler.before]], [[Ruler.push]].
- *
- * ##### Options:
- *
- * - __alt__ - array with names of "alternate" chains.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')();
- *
- * md.inline.ruler.after('text', 'my_rule', function replace(state) {
- * //...
- * });
- * ```
- **/
- Ruler.prototype.after = function (afterName, ruleName, fn, options) {
- var index = this.__find__(afterName);
- var opt = options || {};
- if (index === -1) { throw new Error('Parser rule not found: ' + afterName); }
- this.__rules__.splice(index + 1, 0, {
- name: ruleName,
- enabled: true,
- fn: fn,
- alt: opt.alt || []
- });
- this.__cache__ = null;
- };
- /**
- * Ruler.push(ruleName, fn [, options])
- * - ruleName (String): name of added rule.
- * - fn (Function): rule function.
- * - options (Object): rule options (not mandatory).
- *
- * Push new rule to the end of chain. See also
- * [[Ruler.before]], [[Ruler.after]].
- *
- * ##### Options:
- *
- * - __alt__ - array with names of "alternate" chains.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')();
- *
- * md.core.ruler.push('my_rule', function replace(state) {
- * //...
- * });
- * ```
- **/
- Ruler.prototype.push = function (ruleName, fn, options) {
- var opt = options || {};
- this.__rules__.push({
- name: ruleName,
- enabled: true,
- fn: fn,
- alt: opt.alt || []
- });
- this.__cache__ = null;
- };
- /**
- * Ruler.enable(list [, ignoreInvalid]) -> Array
- * - list (String|Array): list of rule names to enable.
- * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.
- *
- * Enable rules with given names. If any rule name not found - throw Error.
- * Errors can be disabled by second param.
- *
- * Returns list of found rule names (if no exception happened).
- *
- * See also [[Ruler.disable]], [[Ruler.enableOnly]].
- **/
- Ruler.prototype.enable = function (list, ignoreInvalid) {
- if (!Array.isArray(list)) { list = [ list ]; }
- var result = [];
- // Search by name and enable
- list.forEach(function (name) {
- var idx = this.__find__(name);
- if (idx < 0) {
- if (ignoreInvalid) { return; }
- throw new Error('Rules manager: invalid rule name ' + name);
- }
- this.__rules__[idx].enabled = true;
- result.push(name);
- }, this);
- this.__cache__ = null;
- return result;
- };
- /**
- * Ruler.enableOnly(list [, ignoreInvalid])
- * - list (String|Array): list of rule names to enable (whitelist).
- * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.
- *
- * Enable rules with given names, and disable everything else. If any rule name
- * not found - throw Error. Errors can be disabled by second param.
- *
- * See also [[Ruler.disable]], [[Ruler.enable]].
- **/
- Ruler.prototype.enableOnly = function (list, ignoreInvalid) {
- if (!Array.isArray(list)) { list = [ list ]; }
- this.__rules__.forEach(function (rule) { rule.enabled = false; });
- this.enable(list, ignoreInvalid);
- };
- /**
- * Ruler.disable(list [, ignoreInvalid]) -> Array
- * - list (String|Array): list of rule names to disable.
- * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.
- *
- * Disable rules with given names. If any rule name not found - throw Error.
- * Errors can be disabled by second param.
- *
- * Returns list of found rule names (if no exception happened).
- *
- * See also [[Ruler.enable]], [[Ruler.enableOnly]].
- **/
- Ruler.prototype.disable = function (list, ignoreInvalid) {
- if (!Array.isArray(list)) { list = [ list ]; }
- var result = [];
- // Search by name and disable
- list.forEach(function (name) {
- var idx = this.__find__(name);
- if (idx < 0) {
- if (ignoreInvalid) { return; }
- throw new Error('Rules manager: invalid rule name ' + name);
- }
- this.__rules__[idx].enabled = false;
- result.push(name);
- }, this);
- this.__cache__ = null;
- return result;
- };
- /**
- * Ruler.getRules(chainName) -> Array
- *
- * Return array of active functions (rules) for given chain name. It analyzes
- * rules configuration, compiles caches if not exists and returns result.
- *
- * Default chain name is `''` (empty string). It can't be skipped. That's
- * done intentionally, to keep signature monomorphic for high speed.
- **/
- Ruler.prototype.getRules = function (chainName) {
- if (this.__cache__ === null) {
- this.__compile__();
- }
- // Chain can be empty, if rules disabled. But we still have to return Array.
- return this.__cache__[chainName] || [];
- };
- module.exports = Ruler;
- /***/ }),
- /* 4 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Token class
- /**
- * class Token
- **/
- /**
- * new Token(type, tag, nesting)
- *
- * Create new token and fill passed properties.
- **/
- function Token(type, tag, nesting) {
- /**
- * Token#type -> String
- *
- * Type of the token (string, e.g. "paragraph_open")
- **/
- this.type = type;
- /**
- * Token#tag -> String
- *
- * html tag name, e.g. "p"
- **/
- this.tag = tag;
- /**
- * Token#attrs -> Array
- *
- * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]`
- **/
- this.attrs = null;
- /**
- * Token#map -> Array
- *
- * Source map info. Format: `[ line_begin, line_end ]`
- **/
- this.map = null;
- /**
- * Token#nesting -> Number
- *
- * Level change (number in {-1, 0, 1} set), where:
- *
- * - `1` means the tag is opening
- * - `0` means the tag is self-closing
- * - `-1` means the tag is closing
- **/
- this.nesting = nesting;
- /**
- * Token#level -> Number
- *
- * nesting level, the same as `state.level`
- **/
- this.level = 0;
- /**
- * Token#children -> Array
- *
- * An array of child nodes (inline and img tokens)
- **/
- this.children = null;
- /**
- * Token#content -> String
- *
- * In a case of self-closing tag (code, html, fence, etc.),
- * it has contents of this tag.
- **/
- this.content = '';
- /**
- * Token#markup -> String
- *
- * '*' or '_' for emphasis, fence string for fence, etc.
- **/
- this.markup = '';
- /**
- * Token#info -> String
- *
- * fence infostring
- **/
- this.info = '';
- /**
- * Token#meta -> Object
- *
- * A place for plugins to store an arbitrary data
- **/
- this.meta = null;
- /**
- * Token#block -> Boolean
- *
- * True for block-level tokens, false for inline tokens.
- * Used in renderer to calculate line breaks
- **/
- this.block = false;
- /**
- * Token#hidden -> Boolean
- *
- * If it's true, ignore this element when rendering. Used for tight lists
- * to hide paragraphs.
- **/
- this.hidden = false;
- }
- /**
- * Token.attrIndex(name) -> Number
- *
- * Search attribute index by name.
- **/
- Token.prototype.attrIndex = function attrIndex(name) {
- var attrs, i, len;
- if (!this.attrs) { return -1; }
- attrs = this.attrs;
- for (i = 0, len = attrs.length; i < len; i++) {
- if (attrs[i][0] === name) { return i; }
- }
- return -1;
- };
- /**
- * Token.attrPush(attrData)
- *
- * Add `[ name, value ]` attribute to list. Init attrs if necessary
- **/
- Token.prototype.attrPush = function attrPush(attrData) {
- if (this.attrs) {
- this.attrs.push(attrData);
- } else {
- this.attrs = [ attrData ];
- }
- };
- /**
- * Token.attrSet(name, value)
- *
- * Set `name` attribute to `value`. Override old value if exists.
- **/
- Token.prototype.attrSet = function attrSet(name, value) {
- var idx = this.attrIndex(name),
- attrData = [ name, value ];
- if (idx < 0) {
- this.attrPush(attrData);
- } else {
- this.attrs[idx] = attrData;
- }
- };
- /**
- * Token.attrGet(name)
- *
- * Get the value of attribute `name`, or null if it does not exist.
- **/
- Token.prototype.attrGet = function attrGet(name) {
- var idx = this.attrIndex(name), value = null;
- if (idx >= 0) {
- value = this.attrs[idx][1];
- }
- return value;
- };
- /**
- * Token.attrJoin(name, value)
- *
- * Join value to existing attribute via space. Or create new attribute if not
- * exists. Useful to operate with token classes.
- **/
- Token.prototype.attrJoin = function attrJoin(name, value) {
- var idx = this.attrIndex(name);
- if (idx < 0) {
- this.attrPush([ name, value ]);
- } else {
- this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value;
- }
- };
- module.exports = Token;
- /***/ }),
- /* 5 */
- /***/ (function(module, exports) {
- module.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/
- /***/ }),
- /* 6 */
- /***/ (function(module, exports) {
- var g;
- // This works in non-strict mode
- g = (function() {
- return this;
- })();
- try {
- // This works if eval is allowed (see CSP)
- g = g || Function("return this")() || (1,eval)("this");
- } catch(e) {
- // This works if the window reference is available
- if(typeof window === "object")
- g = window;
- }
- // g can still be undefined, but nothing to do about it...
- // We return undefined, instead of nothing here, so it's
- // easier to handle this case. if(!global) { ...}
- module.exports = g;
- /***/ }),
- /* 7 */
- /***/ (function(module, exports, __webpack_require__) {
- var m = __webpack_require__(1);
- // ____ __
- // / __/___ ____ / /____ _____
- // / /_/ __ \/ __ \/ __/ _ \/ ___/
- // / __/ /_/ / /_/ / /_/ __/ /
- // /_/ \____/\____/\__/\___/_/
- module.exports = {
- view: function(vn){
- return m('footer', [
- m('p', m.trust('© 2017 <a href="./">Ethica Spinoza</a>'))
- ]);
- }
- }
- /***/ }),
- /* 8 */
- /***/ (function(module, exports, __webpack_require__) {
- var m = __webpack_require__(1);
- var _dbs = __webpack_require__(2);
- var markdown = __webpack_require__(10)()
- .use(__webpack_require__(9));
- // __ __ __
- // / / / /__ ____ _____/ /__ _____
- // / /_/ / _ \/ __ `/ __ / _ \/ ___/
- // / __ / __/ /_/ / /_/ / __/ /
- // /_/ /_/\___/\__,_/\__,_/\___/_/
- module.exports = {
- view: function(vn){
- return m('header', [
- m('h1', 'Ethica'),
- // m('nav', {'id':'parts-nav'}, [
- //
- // ]),
- m('div', {'id':"menus"}, [
- m(_PartsNav),
- m(_RouteMenu),
- m(_LangMenu)
- ])
- ]);
- }
- }
- // ____ __
- // / __ \____ ______/ /______ ____ ___ ___ ____ __ __
- // / /_/ / __ `/ ___/ __/ ___/ / __ `__ \/ _ \/ __ \/ / / /
- // / ____/ /_/ / / / /_(__ ) / / / / / / __/ / / / /_/ /
- // /_/ \__,_/_/ \__/____/ /_/ /_/ /_/\___/_/ /_/\__,_/
- var _PartsNav = {
- view: function(vn){
- var lang = m.route.param('lang');
- console.log('partsmenu', lang);
- return m('nav', {id:'parts-nav'}, [
- // TODO: replaced labels with localized content
- m('h3', 'Parts'),
- m('ul', _dbs.data[lang].map(function(p){
- // console.log("anchors, part", p);
- return m('li', [
- m('a', {'href':'#'+p.id}, m.trust(markdown.renderInline(p.title)))
- ]);
- })
- )
- ]);
- }
- };
- // ____ __
- // / __ \____ __ __/ /____ ____ ___ ___ ____ __ __
- // / /_/ / __ \/ / / / __/ _ \ / __ `__ \/ _ \/ __ \/ / / /
- // / _, _/ /_/ / /_/ / /_/ __/ / / / / / / __/ / / / /_/ /
- // /_/ |_|\____/\__,_/\__/\___/ /_/ /_/ /_/\___/_/ /_/\__,_/
- var _RouteMenu = {
- view: function(){
- var lang = m.route.param('lang');
- var path = m.route.get().match(/^(\/[^\/]+)(\/[^\/|#]+)(.*)$/);
- console.log('Route menu Path', path);
- return m('nav', {id:'routes'}, [
- // TODO: replaced labels with localized content
- m('h3', 'Routes'),
- m('ul', [
- m('li', m('a', {
- 'href':'/'+lang+'/inline'+path[3],
- oncreate : m.route.link,
- onupdate : m.route.link
- }, "inline")),
- m('li', m('a', {
- 'href':'/'+lang+'/tree'+path[3],
- oncreate : m.route.link,
- onupdate : m.route.link
- }, "tree")),
- ])
- ]);
- }
- }
- // __ __ ___
- // / / ____ _____ ____ _/ |/ /__ ____ __ __
- // / / / __ `/ __ \/ __ `/ /|_/ / _ \/ __ \/ / / /
- // / /___/ /_/ / / / / /_/ / / / / __/ / / / /_/ /
- // /_____/\__,_/_/ /_/\__, /_/ /_/\___/_/ /_/\__,_/
- // /____/
- var _LangMenu = {
- view: function(){
- var path = m.route.get().match(/^\/[^\/]+(.+)$/);
- // console.log('Lang menu Path', path);
- // create ul dom
- return m('nav', {id:'languages'}, [
- // TODO: replaced labels with localized content
- m('h3', 'languages'),
- m('ul', _dbs.langs.map(function(lang){
- // create li dom for each lank link
- return m('li',
- // create a dom
- m('a', {
- 'lang':lang.lc,
- 'href':'/'+lang.lc+path[1]
- // onclick:function(e){
- // e.preventDefault();
- // // console.log('click lang', e);
- // var lang = e.target.getAttribute('lang');
- // // console.log(lang);
- // if(lang != _dbs.lang){
- // // change url variable
- // // change db
- // _dbs.lang = lang;
- // // redraw UI
- // // m.redraw();
- // }
- // return false;
- // }
- }, lang.label)
- );
- }))
- ]);
- }
- }
- /***/ }),
- /* 9 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process footnotes
- //
- ////////////////////////////////////////////////////////////////////////////////
- // Renderer partials
- function render_footnote_anchor_name(tokens, idx, options, env/*, slf*/) {
- var n = Number(tokens[idx].meta.id + 1).toString();
- var prefix = '';
- if (typeof env.docId === 'string') {
- prefix = '-' + env.docId + '-';
- }
- return prefix + n;
- }
- function render_footnote_caption(tokens, idx/*, options, env, slf*/) {
- var n = Number(tokens[idx].meta.id + 1).toString();
- if (tokens[idx].meta.subId > 0) {
- n += ':' + tokens[idx].meta.subId;
- }
- return '[' + n + ']';
- }
- function render_footnote_ref(tokens, idx, options, env, slf) {
- var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
- var caption = slf.rules.footnote_caption(tokens, idx, options, env, slf);
- var refid = id;
- if (tokens[idx].meta.subId > 0) {
- refid += ':' + tokens[idx].meta.subId;
- }
- return '<sup class="footnote-ref"><a href="#fn' + id + '" id="fnref' + refid + '">' + caption + '</a></sup>';
- }
- function render_footnote_block_open(tokens, idx, options) {
- return (options.xhtmlOut ? '<hr class="footnotes-sep" />\n' : '<hr class="footnotes-sep">\n') +
- '<section class="footnotes">\n' +
- '<ol class="footnotes-list">\n';
- }
- function render_footnote_block_close() {
- return '</ol>\n</section>\n';
- }
- function render_footnote_open(tokens, idx, options, env, slf) {
- var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
- if (tokens[idx].meta.subId > 0) {
- id += ':' + tokens[idx].meta.subId;
- }
- return '<li id="fn' + id + '" class="footnote-item">';
- }
- function render_footnote_close() {
- return '</li>\n';
- }
- function render_footnote_anchor(tokens, idx, options, env, slf) {
- var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
- if (tokens[idx].meta.subId > 0) {
- id += ':' + tokens[idx].meta.subId;
- }
- /* ↩ with escape code to prevent display as Apple Emoji on iOS */
- return ' <a href="#fnref' + id + '" class="footnote-backref">\u21a9\uFE0E</a>';
- }
- module.exports = function footnote_plugin(md) {
- var parseLinkLabel = md.helpers.parseLinkLabel,
- isSpace = md.utils.isSpace;
- md.renderer.rules.footnote_ref = render_footnote_ref;
- md.renderer.rules.footnote_block_open = render_footnote_block_open;
- md.renderer.rules.footnote_block_close = render_footnote_block_close;
- md.renderer.rules.footnote_open = render_footnote_open;
- md.renderer.rules.footnote_close = render_footnote_close;
- md.renderer.rules.footnote_anchor = render_footnote_anchor;
- // helpers (only used in other rules, no tokens are attached to those)
- md.renderer.rules.footnote_caption = render_footnote_caption;
- md.renderer.rules.footnote_anchor_name = render_footnote_anchor_name;
- // Process footnote block definition
- function footnote_def(state, startLine, endLine, silent) {
- var oldBMark, oldTShift, oldSCount, oldParentType, pos, label, token,
- initial, offset, ch, posAfterColon,
- start = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine];
- // line should be at least 5 chars - "[^x]:"
- if (start + 4 > max) { return false; }
- if (state.src.charCodeAt(start) !== 0x5B/* [ */) { return false; }
- if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) { return false; }
- for (pos = start + 2; pos < max; pos++) {
- if (state.src.charCodeAt(pos) === 0x20) { return false; }
- if (state.src.charCodeAt(pos) === 0x5D /* ] */) {
- break;
- }
- }
- if (pos === start + 2) { return false; } // no empty footnote labels
- if (pos + 1 >= max || state.src.charCodeAt(++pos) !== 0x3A /* : */) { return false; }
- if (silent) { return true; }
- pos++;
- if (!state.env.footnotes) { state.env.footnotes = {}; }
- if (!state.env.footnotes.refs) { state.env.footnotes.refs = {}; }
- label = state.src.slice(start + 2, pos - 2);
- state.env.footnotes.refs[':' + label] = -1;
- token = new state.Token('footnote_reference_open', '', 1);
- token.meta = { label: label };
- token.level = state.level++;
- state.tokens.push(token);
- oldBMark = state.bMarks[startLine];
- oldTShift = state.tShift[startLine];
- oldSCount = state.sCount[startLine];
- oldParentType = state.parentType;
- posAfterColon = pos;
- initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);
- while (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (isSpace(ch)) {
- if (ch === 0x09) {
- offset += 4 - offset % 4;
- } else {
- offset++;
- }
- } else {
- break;
- }
- pos++;
- }
- state.tShift[startLine] = pos - posAfterColon;
- state.sCount[startLine] = offset - initial;
- state.bMarks[startLine] = posAfterColon;
- state.blkIndent += 4;
- state.parentType = 'footnote';
- if (state.sCount[startLine] < state.blkIndent) {
- state.sCount[startLine] += state.blkIndent;
- }
- state.md.block.tokenize(state, startLine, endLine, true);
- state.parentType = oldParentType;
- state.blkIndent -= 4;
- state.tShift[startLine] = oldTShift;
- state.sCount[startLine] = oldSCount;
- state.bMarks[startLine] = oldBMark;
- token = new state.Token('footnote_reference_close', '', -1);
- token.level = --state.level;
- state.tokens.push(token);
- return true;
- }
- // Process inline footnotes (^[...])
- function footnote_inline(state, silent) {
- var labelStart,
- labelEnd,
- footnoteId,
- token,
- tokens,
- max = state.posMax,
- start = state.pos;
- if (start + 2 >= max) { return false; }
- if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; }
- if (state.src.charCodeAt(start + 1) !== 0x5B/* [ */) { return false; }
- labelStart = start + 2;
- labelEnd = parseLinkLabel(state, start + 1);
- // parser failed to find ']', so it's not a valid note
- if (labelEnd < 0) { return false; }
- // We found the end of the link, and know for a fact it's a valid link;
- // so all that's left to do is to call tokenizer.
- //
- if (!silent) {
- if (!state.env.footnotes) { state.env.footnotes = {}; }
- if (!state.env.footnotes.list) { state.env.footnotes.list = []; }
- footnoteId = state.env.footnotes.list.length;
- state.md.inline.parse(
- state.src.slice(labelStart, labelEnd),
- state.md,
- state.env,
- tokens = []
- );
- token = state.push('footnote_ref', '', 0);
- token.meta = { id: footnoteId };
- state.env.footnotes.list[footnoteId] = { tokens: tokens };
- }
- state.pos = labelEnd + 1;
- state.posMax = max;
- return true;
- }
- // Process footnote references ([^...])
- function footnote_ref(state, silent) {
- var label,
- pos,
- footnoteId,
- footnoteSubId,
- token,
- max = state.posMax,
- start = state.pos;
- // should be at least 4 chars - "[^x]"
- if (start + 3 > max) { return false; }
- if (!state.env.footnotes || !state.env.footnotes.refs) { return false; }
- if (state.src.charCodeAt(start) !== 0x5B/* [ */) { return false; }
- if (state.src.charCodeAt(start + 1) !== 0x5E/* ^ */) { return false; }
- for (pos = start + 2; pos < max; pos++) {
- if (state.src.charCodeAt(pos) === 0x20) { return false; }
- if (state.src.charCodeAt(pos) === 0x0A) { return false; }
- if (state.src.charCodeAt(pos) === 0x5D /* ] */) {
- break;
- }
- }
- if (pos === start + 2) { return false; } // no empty footnote labels
- if (pos >= max) { return false; }
- pos++;
- label = state.src.slice(start + 2, pos - 1);
- if (typeof state.env.footnotes.refs[':' + label] === 'undefined') { return false; }
- if (!silent) {
- if (!state.env.footnotes.list) { state.env.footnotes.list = []; }
- if (state.env.footnotes.refs[':' + label] < 0) {
- footnoteId = state.env.footnotes.list.length;
- state.env.footnotes.list[footnoteId] = { label: label, count: 0 };
- state.env.footnotes.refs[':' + label] = footnoteId;
- } else {
- footnoteId = state.env.footnotes.refs[':' + label];
- }
- footnoteSubId = state.env.footnotes.list[footnoteId].count;
- state.env.footnotes.list[footnoteId].count++;
- token = state.push('footnote_ref', '', 0);
- token.meta = { id: footnoteId, subId: footnoteSubId, label: label };
- }
- state.pos = pos;
- state.posMax = max;
- return true;
- }
- // Glue footnote tokens to end of token stream
- function footnote_tail(state) {
- var i, l, j, t, lastParagraph, list, token, tokens, current, currentLabel,
- insideRef = false,
- refTokens = {};
- if (!state.env.footnotes) { return; }
- state.tokens = state.tokens.filter(function (tok) {
- if (tok.type === 'footnote_reference_open') {
- insideRef = true;
- current = [];
- currentLabel = tok.meta.label;
- return false;
- }
- if (tok.type === 'footnote_reference_close') {
- insideRef = false;
- // prepend ':' to avoid conflict with Object.prototype members
- refTokens[':' + currentLabel] = current;
- return false;
- }
- if (insideRef) { current.push(tok); }
- return !insideRef;
- });
- if (!state.env.footnotes.list) { return; }
- list = state.env.footnotes.list;
- token = new state.Token('footnote_block_open', '', 1);
- state.tokens.push(token);
- for (i = 0, l = list.length; i < l; i++) {
- token = new state.Token('footnote_open', '', 1);
- token.meta = { id: i, label: list[i].label };
- state.tokens.push(token);
- if (list[i].tokens) {
- tokens = [];
- token = new state.Token('paragraph_open', 'p', 1);
- token.block = true;
- tokens.push(token);
- token = new state.Token('inline', '', 0);
- token.children = list[i].tokens;
- token.content = '';
- tokens.push(token);
- token = new state.Token('paragraph_close', 'p', -1);
- token.block = true;
- tokens.push(token);
- } else if (list[i].label) {
- tokens = refTokens[':' + list[i].label];
- }
- state.tokens = state.tokens.concat(tokens);
- if (state.tokens[state.tokens.length - 1].type === 'paragraph_close') {
- lastParagraph = state.tokens.pop();
- } else {
- lastParagraph = null;
- }
- t = list[i].count > 0 ? list[i].count : 1;
- for (j = 0; j < t; j++) {
- token = new state.Token('footnote_anchor', '', 0);
- token.meta = { id: i, subId: j, label: list[i].label };
- state.tokens.push(token);
- }
- if (lastParagraph) {
- state.tokens.push(lastParagraph);
- }
- token = new state.Token('footnote_close', '', -1);
- state.tokens.push(token);
- }
- token = new state.Token('footnote_block_close', '', -1);
- state.tokens.push(token);
- }
- md.block.ruler.before('reference', 'footnote_def', footnote_def, { alt: [ 'paragraph', 'reference' ] });
- md.inline.ruler.after('image', 'footnote_inline', footnote_inline);
- md.inline.ruler.after('footnote_inline', 'footnote_ref', footnote_ref);
- md.core.ruler.after('inline', 'footnote_tail', footnote_tail);
- };
- /***/ }),
- /* 10 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports = __webpack_require__(37);
- /***/ }),
- /* 11 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // HTML5 entities map: { name -> utf16string }
- //
- /*eslint quotes:0*/
- module.exports = __webpack_require__(24);
- /***/ }),
- /* 12 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Regexps to match html elements
- var attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*';
- var unquoted = '[^"\'=<>`\\x00-\\x20]+';
- var single_quoted = "'[^']*'";
- var double_quoted = '"[^"]*"';
- var attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')';
- var attribute = '(?:\\s+' + attr_name + '(?:\\s*=\\s*' + attr_value + ')?)';
- var open_tag = '<[A-Za-z][A-Za-z0-9\\-]*' + attribute + '*\\s*\\/?>';
- var close_tag = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>';
- var comment = '<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->';
- var processing = '<[?].*?[?]>';
- var declaration = '<![A-Z]+\\s+[^>]*>';
- var cdata = '<!\\[CDATA\\[[\\s\\S]*?\\]\\]>';
- var HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment +
- '|' + processing + '|' + declaration + '|' + cdata + ')');
- var HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')');
- module.exports.HTML_TAG_RE = HTML_TAG_RE;
- module.exports.HTML_OPEN_CLOSE_TAG_RE = HTML_OPEN_CLOSE_TAG_RE;
- /***/ }),
- /* 13 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process *this* and _that_
- //
- // Insert each marker as a separate text token, and add it to delimiter list
- //
- module.exports.tokenize = function emphasis(state, silent) {
- var i, scanned, token,
- start = state.pos,
- marker = state.src.charCodeAt(start);
- if (silent) { return false; }
- if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { return false; }
- scanned = state.scanDelims(state.pos, marker === 0x2A);
- for (i = 0; i < scanned.length; i++) {
- token = state.push('text', '', 0);
- token.content = String.fromCharCode(marker);
- state.delimiters.push({
- // Char code of the starting marker (number).
- //
- marker: marker,
- // Total length of these series of delimiters.
- //
- length: scanned.length,
- // An amount of characters before this one that's equivalent to
- // current one. In plain English: if this delimiter does not open
- // an emphasis, neither do previous `jump` characters.
- //
- // Used to skip sequences like "*****" in one step, for 1st asterisk
- // value will be 0, for 2nd it's 1 and so on.
- //
- jump: i,
- // A position of the token this delimiter corresponds to.
- //
- token: state.tokens.length - 1,
- // Token level.
- //
- level: state.level,
- // If this delimiter is matched as a valid opener, `end` will be
- // equal to its position, otherwise it's `-1`.
- //
- end: -1,
- // Boolean flags that determine if this delimiter could open or close
- // an emphasis.
- //
- open: scanned.can_open,
- close: scanned.can_close
- });
- }
- state.pos += scanned.length;
- return true;
- };
- // Walk through delimiter list and replace text tokens with tags
- //
- module.exports.postProcess = function emphasis(state) {
- var i,
- startDelim,
- endDelim,
- token,
- ch,
- isStrong,
- delimiters = state.delimiters,
- max = state.delimiters.length;
- for (i = 0; i < max; i++) {
- startDelim = delimiters[i];
- if (startDelim.marker !== 0x5F/* _ */ && startDelim.marker !== 0x2A/* * */) {
- continue;
- }
- // Process only opening markers
- if (startDelim.end === -1) {
- continue;
- }
- endDelim = delimiters[startDelim.end];
- // If the next delimiter has the same marker and is adjacent to this one,
- // merge those into one strong delimiter.
- //
- // `<em><em>whatever</em></em>` -> `<strong>whatever</strong>`
- //
- isStrong = i + 1 < max &&
- delimiters[i + 1].end === startDelim.end - 1 &&
- delimiters[i + 1].token === startDelim.token + 1 &&
- delimiters[startDelim.end - 1].token === endDelim.token - 1 &&
- delimiters[i + 1].marker === startDelim.marker;
- ch = String.fromCharCode(startDelim.marker);
- token = state.tokens[startDelim.token];
- token.type = isStrong ? 'strong_open' : 'em_open';
- token.tag = isStrong ? 'strong' : 'em';
- token.nesting = 1;
- token.markup = isStrong ? ch + ch : ch;
- token.content = '';
- token = state.tokens[endDelim.token];
- token.type = isStrong ? 'strong_close' : 'em_close';
- token.tag = isStrong ? 'strong' : 'em';
- token.nesting = -1;
- token.markup = isStrong ? ch + ch : ch;
- token.content = '';
- if (isStrong) {
- state.tokens[delimiters[i + 1].token].content = '';
- state.tokens[delimiters[startDelim.end - 1].token].content = '';
- i++;
- }
- }
- };
- /***/ }),
- /* 14 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // ~~strike through~~
- //
- // Insert each marker as a separate text token, and add it to delimiter list
- //
- module.exports.tokenize = function strikethrough(state, silent) {
- var i, scanned, token, len, ch,
- start = state.pos,
- marker = state.src.charCodeAt(start);
- if (silent) { return false; }
- if (marker !== 0x7E/* ~ */) { return false; }
- scanned = state.scanDelims(state.pos, true);
- len = scanned.length;
- ch = String.fromCharCode(marker);
- if (len < 2) { return false; }
- if (len % 2) {
- token = state.push('text', '', 0);
- token.content = ch;
- len--;
- }
- for (i = 0; i < len; i += 2) {
- token = state.push('text', '', 0);
- token.content = ch + ch;
- state.delimiters.push({
- marker: marker,
- jump: i,
- token: state.tokens.length - 1,
- level: state.level,
- end: -1,
- open: scanned.can_open,
- close: scanned.can_close
- });
- }
- state.pos += scanned.length;
- return true;
- };
- // Walk through delimiter list and replace text tokens with tags
- //
- module.exports.postProcess = function strikethrough(state) {
- var i, j,
- startDelim,
- endDelim,
- token,
- loneMarkers = [],
- delimiters = state.delimiters,
- max = state.delimiters.length;
- for (i = 0; i < max; i++) {
- startDelim = delimiters[i];
- if (startDelim.marker !== 0x7E/* ~ */) {
- continue;
- }
- if (startDelim.end === -1) {
- continue;
- }
- endDelim = delimiters[startDelim.end];
- token = state.tokens[startDelim.token];
- token.type = 's_open';
- token.tag = 's';
- token.nesting = 1;
- token.markup = '~~';
- token.content = '';
- token = state.tokens[endDelim.token];
- token.type = 's_close';
- token.tag = 's';
- token.nesting = -1;
- token.markup = '~~';
- token.content = '';
- if (state.tokens[endDelim.token - 1].type === 'text' &&
- state.tokens[endDelim.token - 1].content === '~') {
- loneMarkers.push(endDelim.token - 1);
- }
- }
- // If a marker sequence has an odd number of characters, it's splitted
- // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the
- // start of the sequence.
- //
- // So, we have to move all those markers after subsequent s_close tags.
- //
- while (loneMarkers.length) {
- i = loneMarkers.pop();
- j = i + 1;
- while (j < state.tokens.length && state.tokens[j].type === 's_close') {
- j++;
- }
- j--;
- if (i !== j) {
- token = state.tokens[j];
- state.tokens[j] = state.tokens[i];
- state.tokens[i] = token;
- }
- }
- };
- /***/ }),
- /* 15 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports.encode = __webpack_require__(77);
- module.exports.decode = __webpack_require__(76);
- module.exports.format = __webpack_require__(78);
- module.exports.parse = __webpack_require__(79);
- /***/ }),
- /* 16 */
- /***/ (function(module, exports) {
- module.exports=/[\0-\x1F\x7F-\x9F]/
- /***/ }),
- /* 17 */
- /***/ (function(module, exports) {
- module.exports=/[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/
- /***/ }),
- /* 18 */
- /***/ (function(module, exports) {
- module.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/
- /***/ }),
- /* 19 */
- /***/ (function(module, exports, __webpack_require__) {
- /**
- * @Author: Bachir Soussi Chiadmi <bach>
- * @Date: 16-04-2017
- * @Email: bachir@figureslibres.io
- * @Last modified by: bach
- * @Last modified time: 18-04-2017
- * @License: GPL-V3
- */
- __webpack_require__(28);
- __webpack_require__(25);
- __webpack_require__(26);
- __webpack_require__(27);
- var m = __webpack_require__(1);
- // var marked = require('marked');
- // var _helpers = require('modules/helpers');
- var _dbs = __webpack_require__(2);
- var _Inline = __webpack_require__(21);
- var _Tree = __webpack_require__(22);
- function init(){
- _dbs.load(function(){
- console.log("Init _dbs.data", _dbs.data);
- console.log("Init _dbs.data_byid", _dbs.data_byid);
- console.log("Init _dbs.data_strct", _dbs.data_strct);
- m.route.prefix("");
- m.route(document.body, "/lat/inline", {
- "/:lang/inline": _Inline,
- "/:lang/tree": _Tree,
- });
- });
- };
- // ___
- // / | ____ ____
- // / /| | / __ \/ __ \
- // / ___ |/ /_/ / /_/ /
- // /_/ |_/ .___/ .___/
- // /_/ /_/
- // var _App = {
- // view: function(){
- // console.log('_App view', _lang);
- // return [
- // m('header', [
- // m('h1', 'Ethica'),
- // m('aside', {'id':"menus"}, m(_LangMenu) )
- // ]),
- // m(_Tree),
- // m('footer', [
- // m('p', m.trust('© 2017 <a href="./">Ethica Spinoza</a>'))
- // ])
- // ]
- // }
- // }
- // _ _ __
- // (_)___ (_) /_
- // / / __ \/ / __/
- // / / / / / / /_
- // /_/_/ /_/_/\__/
- init()
- /***/ }),
- /* 20 */
- /***/ (function(module, exports) {
- // removed by extract-text-webpack-plugin
- /***/ }),
- /* 21 */
- /***/ (function(module, exports, __webpack_require__) {
- var m = __webpack_require__(1);
- // https://github.com/markdown-it/markdown-it
- var markdown = __webpack_require__(10)()
- .use(__webpack_require__(9));
- var _dbs = __webpack_require__(2);
- var _Header = __webpack_require__(8);
- var _Footer = __webpack_require__(7);
- var _Ui = __webpack_require__(23);
- // __ _ __
- // / / (_)___ / /__
- // / / / / __ \/ //_/
- // / /___/ / / / / ,<
- // /_____/_/_/ /_/_/|_|
- var _Link = {
- tid:"",
- opened:false,
- oninit: function(vn){
- // console.log("INIT LINK : vn", vn);
- // define target id
- this.tid = vn.attrs.href;
- },
- onbeforeupdate: function(vn){
- this.tid = vn.attrs.href;
- },
- view: function(vn){
- this.tid_known = typeof _dbs.data_byid[_dbs.lang][this.tid] === 'undefined' ? false : true;
- if (!this.tid_known) {
- console.log('!! target id '+this.tid+' unkonwn !!');
- }
- if(this.opened && this.tid_known){
- // console.log('this.tid', vn.state);
- return m('div', {'class':'opened-link'},
- [
- m('span', {'class':"link text"}, vn.children),
- typeof _dbs.data_byid[_dbs.lang][this.tid].childs != "undefined"
- ? m(_Enonce, _dbs.data_byid[_dbs.lang][this.tid])
- : m(_Item, _dbs.data_byid[_dbs.lang][this.tid])
- ]
- );
- }else{
- // console.log(vn);
- return m('a', {
- 'class':'link',
- 'href':'#'+this.tid,
- 'rel':this.tid,
- onclick:function(e){
- e.preventDefault();
- console.log('click', this);
- vn.state.opened = true;
- return false;
- }
- }, vn.children); // c'est quoi ce vn.children ?
- }
- }
- }
- // ______ __
- // /_ __/__ _ __/ /_
- // / / / _ \| |/_/ __/
- // / / / __/> </ /_
- // /_/ \___/_/|_|\__/
- // recusive function to record information of all subnodes
- function parseTextDom(nodes){
- var list = [];
- // loop through childNodes
- for (var i = 0; i < nodes.length; i++) {
- var n = {};
- if(typeof nodes[i].localName != "undefined"){
- n.tag=nodes[i].localName;
- if (n.tag == 'p') {
- // replace p by div as we will insert other div in them
- n.tag = 'div';
- n.attrs = {'class':'paragraph'};
- }
- if (n.tag == 'a') {
- // record the href attribute for cross reference
- n.attrs = {'href':nodes[i].attributes.href.value};
- }
- if(nodes[i].childNodes.length){
- // again parse node's childs
- n.childs = parseTextDom(nodes[i].childNodes);
- }
- }else if (nodes[i].textContent.length > 1){
- // if node has no localName it is probably a #text node
- // we record it if it's not empty
- n.tag='#text';
- n.text=nodes[i].textContent;
- }
- // add the node to the list if it has a tag
- if(typeof n.tag != "undefined")
- list.push(n);
- }
- return list;
- }
- // recusive fucntion to generate mithril object from information recorded with parseTextDom()
- function populateTextDom(n,i){
- // console.log('populateTextDom : '+i,n);
- return n.tag == "#text"
- ? m.trust(n.text)
- : m(
- n.tag != 'a' ? n.tag : _Link,
- typeof n.attrs != "undefined" ? n.attrs : {},
- typeof n.childs != "undefined"
- ? n.childs.map(populateTextDom)
- : typeof n.text != "undefined"
- ? m.trust(n.text)
- : null
- );
- }
- var _Text = {
- id:null,
- text:"",
- texthtml:"",
- textdom:null,
- textchilds:[],
- parsetext: function(){
- // console.log('parsetext', this);
- // !! we need to convert markdown to html here because parseTextDom() is recursive through nodes tree
- // convert markdown to html
- this.texthtml = markdown.render(this.text)
- // TODO: fixe number link text disapear [3](1d3) ( in 104d )
- // TODO: fixe parenthèse disparait _(par les Défin. [test 3](1d3) et [test 5](1d5))_ ( in 104d )
- // parse html string to virtual dom
- this.textdom = new DOMParser().parseFromString(this.texthtml, "text/html");
- // get the text nodes (avoid html document extra)
- this.textchilds = parseTextDom(this.textdom.getElementsByTagName('body')[0].childNodes);
- },
- oninit: function(vn){
- this.id = vn.attrs.id;
- this.text = vn.attrs.text || "";
- this.parsetext();
- },
- onbeforeupdate: function(vn,old){
- this.text = vn.attrs.text;
- this.parsetext();
- },
- view: function(vn){
- // console.log('_Text :: view : '+vn.attrs.slug, vn);
- return m('div',
- {'class':'text'},
- // loop through childNodes list generated by parseTextDom() in init
- this.textchilds.map(populateTextDom)
- ); // /m.div.text
- } // view:
- }
- // ______
- // / _/ /____ ____ ___
- // / // __/ _ \/ __ `__ \
- // _/ // /_/ __/ / / / / /
- // /___/\__/\___/_/ /_/ /_/
- var _Item = {
- id:null,
- part:null,
- type:null,
- nested:false,
- oninit: function(vn){
- // console.log('vn.attrs', vn.attrs);
- this.id = vn.attrs.id;
- this.type = vn.attrs.type;
- // vn.state.part = vn.state.slug.match(/^(\d)(.+)/)[1];
- this.text = vn.attrs.text;
- this.nested = vn.attrs.nested || false;
- },
- onbeforeupdate: function(vn, old){
- this.nested = vn.attrs.nested || false;
- this.type = vn.attrs.type;
- this.text = vn.attrs.text;
- },
- view: function(vn){
- return m("section", {
- 'id':this.id,
- 'class':'item'+(this.nested ? ' nested':'')
- },
- [
- // create title node
- m("h3", {
- // 'ref':vn.attrs.href,
- onclick: function(e){
- vn.state.active = vn.state.active ? 0 : 1;
- }
- }, this.type),
- // create text node
- m(_Text, {'text':this.text, 'id':this.id})
- ]
- )
- }
- };
- // ______
- // / ____/___ ____ ____ ________
- // / __/ / __ \/ __ \/ __ \/ ___/ _ \
- // / /___/ / / / /_/ / / / / /__/ __/
- // /_____/_/ /_/\____/_/ /_/\___/\___/
- var _Enonce = {
- partid:null,
- id:null,
- title:null,
- text:null,
- nested:false,
- childs:[],
- oninit:function(vn){
- // // console.log('Enonce on init', vn);
- this.partid = vn.attrs.partid;
- this.id = vn.attrs.id;
- this.title = vn.attrs.title;
- this.text = vn.attrs.text;
- this.childs = vn.attrs.childs || [];
- this.nested = vn.attrs.nested || false;
- },
- onbeforeupdate:function(vn, old) {
- // console.log(vn.attrs.childs);
- this.title = vn.attrs.title;
- this.text = vn.attrs.text;
- this.childs = vn.attrs.childs;
- this.nested = vn.attrs.nested || false;
- // if(vn.attrs.id == '1d1') console.log('_Enonce UPDATE, text :', vn.attrs.text);
- },
- view: function(vn){
- // if(vn.attrs.id == '1d1') console.log('_Enonce VIEW, text :', vn.attrs.text);
- return m("section", {
- 'id' :this.id,
- 'class' :'enonce'+(this.nested ? ' nested':'')
- },
- [
- // create title node
- m("h2", {}, this.title),
- // create text node
- m(_Text, {'text':this.text, 'id':this.id}),
- // addd children
- this.childs.map(function(c){
- return m(_Item, c)
- })
- ])
- }
- }
- // ____ __
- // / __ \____ ______/ /_
- // / /_/ / __ `/ ___/ __/
- // / ____/ /_/ / / / /_
- // /_/ \__,_/_/ \__/
- var _Part = {
- oninit: function(vn){
- this.id = vn.attrs.id;
- this.title = vn.attrs.title || '';
- this.enonces = vn.attrs.enonces;
- },
- onbeforeupdate: function(vn, old){
- // console.log('_Part, onbeforeupdate old',old);
- this.title = vn.attrs.title || '';
- this.enonces = vn.attrs.enonces;
- },
- view: function(vn){
- // console.log(vn.attrs.enonces);
- return m("section", {
- 'id' :this.id,
- 'class' :'part'
- },
- [
- // create title node
- m("h1", {'class':'part-title', 'part':this.id}, m.trust(markdown.renderInline(this.title))),
- // create text node
- this.enonces.map(function(e){
- // console.log(e.type);
- // var title = e.title || '';
- switch (e.type) {
- case "title":
- // handle titles
- // console.log('title');
- return m("h2", {'class':'title'}, m.trust(markdown.renderInline(e.title)));
- break;
- case "filet":
- // handle filets
- // console.log('filet');
- return m("h4", {'class':'filet'}, m.trust(markdown.renderInline(e.title)));
- break;
- default:
- // or build structure
- return m(_Enonce, Object.assign({"partid":this.id},e));
- }
- })
- ]
- )
- }
- }
- // ____ __ _
- // / _/___ / / (_)___ ___
- // / // __ \/ / / / __ \/ _ \
- // _/ // / / / /___/ / / / / __/
- // /___/_/ /_/_____/_/_/ /_/\___/
- module.exports = {
- // oninit : function(vn){
- // this.lang = vn.attrs.lang;
- // },
- oncreate: function(vn){
- document.body.classList.add('inline');
- _Ui.init();
- },
- view: function(vn){
- console.log('_Inline view', vn.attrs.lang);
- return [
- m(_Header),
- m('main', {id:"content", 'class':'inline'}, _dbs.data[vn.attrs.lang].map(function(p){
- // console.log("MAP _dbs", p);
- return m(_Part,p);
- })
- ),
- m(_Footer)
- ]
- }
- }
- /***/ }),
- /* 22 */
- /***/ (function(module, exports, __webpack_require__) {
- var m = __webpack_require__(1);
- // https://github.com/markdown-it/markdown-it
- var markdown = __webpack_require__(10)()
- .use(__webpack_require__(9));
- var _dbs = __webpack_require__(2);
- var _Header = __webpack_require__(8);
- var _Footer = __webpack_require__(7);
- var _Ui = __webpack_require__(23);
- // ____ __
- // / __ \____ / /_
- // / / / / __ \/ __/
- // / /_/ / /_/ / /_
- // /_____/\____/\__/
- var _Dot = {
- id:null,
- type:'',
- text:'',
- summary:'',
- active:true,
- opened:false,
- links:null,
- parents:[],
- lang:_dbs.lang,
- setuptext:function(vn){
- // console.log('setuptext', vn);
- // construct text
- this.text = markdown.render(vn.attrs.text);
- // construct summary
- // TODO: summary needs more work (strip tags, markdown render)
- this.summary = vn.attrs.text.match('([^ ]*[ ]{0,1}){1,6}')[0];
- this.summary = this.summary.trim().replace(/_([^_]+)$/g, "_$1_");
- this.summary = this.summary.replace(/\[([^\]]+)$/g, "$1");
- this.summary = markdown.renderInline(this.summary) + " …";
- },
- oninit: function(vn){
- this.id = vn.attrs.id;
- this.type = vn.attrs.type;
- this.setuptext(vn);
- if(typeof vn.attrs.active !== 'undefined')
- this.active = vn.attrs.active;
- // links
- this.links = _dbs.data_strct[this.id];
- // console.log(this.links);
- // parents memorize where do we come from to avoid duplicates and looping nav
- if(vn.attrs.parents){
- this.parents = this.parents.concat(vn.attrs.parents);
- // console.log('_Dot init '+this.id+' parents :',this.parents);
- }
- },
- oncreate: function(vn){
- if(this.active){
- vn.dom.classList.remove('disabled');
- }else{
- vn.dom.classList.add('disabled');
- }
- },
- onbeforeupdate: function(vn){
- // console.log('onbeforeupdate');
- if(this.lang != _dbs.lang){
- this.lang = _dbs.lang;
- this.setuptext(vn);
- }
- },
- view: function(vn){
- if (this.active && this.opened) {
- // full view of dot with linked dots
- // console.log('_Dot view '+this.id+' parents :',this.parents);
- var dot_content = [
- // links to
- this.links.to.length
- ? m('nav', {'class':'links to'}, this.links.to.map(function(id){
- // console.log(id);
- if(typeof _dbs.data_byid[_dbs.lang][id] !== 'undefined'){
- return m(_Dot, {
- "id":id,
- 'text':_dbs.data_byid[_dbs.lang][id].text,
- 'type':'',
- // passe the memory of crossed dots plus the current one
- 'parents':vn.state.parents.concat([vn.state.id]),
- // activate link only if not in parents (already went through it)
- 'active':vn.state.parents.indexOf(id) == -1 ? true:false
- });
- }
- })
- )
- : null,
- // id
- m('span', {'class':'id'}, this.id), // this.type+' '+
- // bullet
- m('span', {'class':'bullet'}, m.trust('⚫')),
- // full text
- m('section', {
- 'class':'text',
- onmouseover: function(e){
- e.preventDefault();
- if(e.target.nodeName == "A" ){
- // console.log("over e.target", e.target);
- // console.log('over vn', vn);
- var id = e.target.getAttribute("href");
- // add highlight class
- vn.dom.querySelector('nav.links>div[uid="'+id+'"]').classList.add('highlight');
- }else{
- // remove all hilight class
- for (link of vn.dom.querySelectorAll('nav.links>div.dot')) {
- link.classList.remove('highlight');
- }
- }
- },
- onclick:function(e){
- e.preventDefault();
- if(e.target.nodeName == "A" ){
- // console.log("over e.target", e.target);
- // console.log('over vn', vn);
- var id = e.target.getAttribute("href");
- // add highlight class
- vn.dom.querySelector('nav.links>div[uid="'+id+'"]>.summary').click();
- }
- }
- }, m.trust(this.text)),
- // links from
- this.links.from.length
- ? m('nav', {'class':'links from'}, this.links.from.map(function(id){
- // retrun a dot
- return m(_Dot, {
- "id":id,
- 'text':_dbs.data_byid[_dbs.lang][id].text,
- 'type':'',
- // passe the memory of crossed dots plus the current one
- 'parents':vn.state.parents.concat([vn.state.id]),
- // activate link only if not in parents (already went through it)
- 'active':vn.state.parents.indexOf(id) == -1 ? true:false
- });
- })
- )
- : null
- ];
- }else{
- // preview dot
- var dot_content = [
- m('span', {'class':'id'}, this.id), // this.type+' '+
- m('span', {'class':'bullet'}, m.trust('•')),
- m('p', {
- 'class':'summary',
- onclick:function(e){
- // TODO: animate openening (text and links separatly)
- vn.state.opened = true;
- }
- }, m.trust(this.summary))
- ];
- }
- return m('div',{
- 'uid':this.id,
- 'class':'dot'
- },
- dot_content
- );
- },
- onupdate: function(vn){
- // console.log('_Dot : onupdate', vn);
- if(this.active){
- if (this.opened){
- vn.dom.classList.add('opened');
- if(this.links.to.length)
- vn.dom.classList.add('to-links');
- if(this.links.from.length)
- vn.dom.classList.add('from-links');
- }else{
- vn.dom.classList.remove('opened');
- }
- }
- }
- }
- /*
- down vote
- Here's full list of black dotlikes from unicode
- ● - ● - Black Circle
- ⏺ - ⏺ - Black Circle for Record
- ⚫ - ⚫ - Medium Black Circle
- ⬤ - ⬤ - Black Large Circle
- ⧭ - ⧭ - Black Circle with Down Arrow
- 🞄 - 🞄 - Black Slightly Small Circle
- • - • - Bullet
- ∙ - ∙ - Bullet Operator
- ⋅ - ⋅ - Dot Operator
- 🌑 - 🌑 - New Moon Symbol
- */
- // _______ _ __ __
- // / ___/ / (_) /__/ /
- // / /__/ _ \/ / / _ /
- // \___/_//_/_/_/\_,_/
- var _Child = {
- id:null,
- part:null,
- type:null,
- // nested:false,
- text:'',
- oninit: function(vn){
- // console.log('vn.attrs', vn.attrs);
- this.id = vn.attrs.id;
- this.type = vn.attrs.type;
- // vn.state.part = vn.state.slug.match(/^(\d)(.+)/)[1];
- this.text = vn.attrs.text;
- // this.nested = vn.attrs.nested || false;
- },
- onbeforeupdate: function(vn, old){
- // this.nested = vn.attrs.nested || false;
- this.type = vn.attrs.type;
- this.text = vn.attrs.text;
- },
- view: function(vn){
- return m(_Dot, {"id":this.id, 'text':this.text, 'type':this.type});
- }
- };
- // ______
- // / ____/___ ____ ____ ________
- // / __/ / __ \/ __ \/ __ \/ ___/ _ \
- // / /___/ / / / /_/ / / / / /__/ __/
- // /_____/_/ /_/\____/_/ /_/\___/\___/
- var _Enonce = {
- partid:null,
- id:null,
- title:null,
- text:null,
- // nested:false,
- childs:[],
- oninit:function(vn){
- // // console.log('Enonce on init', vn);
- this.partid = vn.attrs.partid;
- this.id = vn.attrs.id;
- this.title = vn.attrs.title;
- this.text = vn.attrs.text;
- this.childs = vn.attrs.childs;
- // this.nested = vn.attrs.nested || false;
- },
- onbeforeupdate:function(vn, old) {
- // console.log(vn.attrs.childs);
- this.title = vn.attrs.title;
- this.text = vn.attrs.text;
- this.childs = vn.attrs.childs;
- // this.nested = vn.attrs.nested || false;
- // if(vn.attrs.id == '1d1') console.log('_Enonce UPDATE, text :', vn.attrs.text);
- },
- view: function(vn){
- // if(vn.attrs.id == '1d1') console.log('_Enonce VIEW, text :', vn.attrs.text);
- return [
- // create dot
- m(_Dot, {"id":this.id, 'text':this.text,'type':this.title}),
- // addd children
- this.childs.map(function(c){
- return m(_Child, c);
- })
- ]
- }
- }
- // ____ __
- // / __ \____ ______/ /_
- // / /_/ / __ `/ ___/ __/
- // / ____/ /_/ / / / /_
- // /_/ \__,_/_/ \__/
- var _Part = {
- oninit: function(vn){
- this.id = vn.attrs.id;
- this.title = vn.attrs.title;
- this.enonces = vn.attrs.enonces;
- },
- onbeforeupdate: function(vn, old){
- // console.log('_Part, onbeforeupdate old',old);
- this.title = vn.attrs.title;
- this.enonces = vn.attrs.enonces;
- },
- view: function(vn){
- // console.log(vn.attrs.enonces);
- return m("section", {
- 'id' :this.id,
- 'class' :'part'
- },
- [
- // create title node
- m("h1", {'class':'part-title', 'part':this.id}, m.trust(markdown.renderInline(this.title))),
- // create text node
- this.enonces.map(function(e){
- // console.log(e.text);
- // return m(_Enonce, Object.assign({"partid":this.id},e))
- switch (e.type) {
- case "title":
- // handle titles
- return m("h2", {'class':'title'}, m.trust(markdown.renderInline(e.title)));
- break;
- case "filet":
- // handle filets
- return m("h4", {'class':'filet'}, m.trust(markdown.renderInline(e.title)));
- break;
- default:
- // or build structure
- return m(_Enonce, Object.assign({"partid":this.id},e));
- }
- })
- ]
- )
- }
- }
- // ______
- // /_ __/_______ ___
- // / / / ___/ _ \/ _ \
- // / / / / / __/ __/
- // /_/ /_/ \___/\___/
- module.exports = {
- // oninit : function(vn){
- // this.lang = vn.attrs.lang;
- // },
- oncreate: function(vn){
- document.body.classList.add('tree');
- _Ui.init();
- },
- view: function(vn){
- console.log('_Tree view', vn.attrs.lang);
- return [
- m(_Header),
- m('main', {id:"content", 'class':'tree'}, _dbs.data[vn.attrs.lang].map(function(p){
- return m(_Part,p);
- })
- ),
- m(_Footer)
- ];
- }
- }
- // function(){
- // switch(_dbs.lang){
- // case 'fr':
- // return "Hello dots !";
- // break;
- // case 'bra':
- // return '"Hola dots !"'
- // break;
- // }
- // }
- /***/ }),
- /* 23 */
- /***/ (function(module, exports) {
- /**
- * @Author: Bachir Soussi Chiadmi <bach>
- * @Date: 12-09-2017
- * @Email: bachir@figureslibres.io
- * @Last modified by: bach
- * @Last modified time: 12-09-2017
- * @License: GPL-V3
- */
- // var $ = require('jquery');
- // https://plainjs.com
- // jQuery(document).ready(function($) {
- // console.log('Hello Jquery');
- // var $window;
- var init = function(){
- console.log('UI init');
- // $window = $(window);
- // _____ __ _ __ __ _ __ __
- // / ___// /_(_)____/ /____ __ / /_(_) /_/ /__
- // \__ \/ __/ / ___/ //_/ / / / / __/ / __/ / _ \
- // ___/ / /_/ / /__/ ,< / /_/ / / /_/ / /_/ / __/
- // /____/\__/_/\___/_/|_|\__, / \__/_/\__/_/\___/
- // /____/
- // https://codepen.io/chrissp26/pen/gBrdo?editors=0010
- // var header_height = $('header').height();
- var header_height = document.getElementsByTagName('header')[0].clientHeight;
- console.log(header_height);
- // var $sticky_clone_wrapper = $('<div>').addClass('sticky-clone-wrapper').appendTo('body');
- var sticky_clone_wrapper = document.createElement('div');
- sticky_clone_wrapper.classList.add('sticky-clone-wrapper');
- document.body.append(sticky_clone_wrapper);
- //
- // var $stickies = $('h1.part-title').addClass('sticky').each(function(i){
- // var $sticky = $(this);
- // $sticky
- // .data('originalPosition', $sticky.offset().top)
- // .data('originalHeight', $sticky.outerHeight());
- // });
- var stickies = new Array();
- Array.from(document.querySelectorAll('h1.part-title')).forEach(function(e){
- // console.log('sticky', e);
- e._part = e.getAttribute('part');
- stickies.push(e)
- });
- console.log('stickies', stickies);
- //
- // var OnScroll = function(event){
- // var $last_sticky;
- // $stickies.each(function(i){
- // var $sticky = $(this);
- // var pos = $sticky.data('originalPosition');
- // if(pos < $window.scrollTop()+header_height){
- //
- // }
- // // if(i == 1){
- // // console.log(pos +" | "+$window.scrollTop());
- // // }
- // // if(pos < $window.scrollTop()+header_height){
- // // if(!$sticky.is('.sticked')){
- // // $sticky.addClass('sticked').clone().appendTo($sticky_clone_wrapper.empty());
- // // }
- // // }else{
- // // if($sticky.is('.sticked')){
- // // $sticky.removeClass('sticked');
- // // $('.part-title[part="'+$sticky.attr('part')+'"]', $sticky_clone_wrapper).remove();
- // // }
- // // }
- // });
- // };
- var last_sticky = "", sticked_sticky, clone;
- var OnScroll = function(event){
- // console.log('on scrool', event);
- sticked_sticky = false;
- for (var i = stickies.length-1; i >= 0; i--) {
- if(stickies[i].getBoundingClientRect().top < header_height){
- sticked_sticky = stickies[i];
- break;
- }
- }
- if (sticked_sticky) {
- // console.log('sticked_sticky', sticked_sticky._part);
- if(last_sticky !== sticked_sticky._part){
- // console.log('new sticky', last_sticky);
- // fill sticky_clone_wrapper
- clone = sticked_sticky.cloneNode(true);
- sticky_clone_wrapper.innerHTML = '';
- sticky_clone_wrapper.appendChild(clone);
- last_sticky = sticked_sticky._part;
- }
- }else{
- // empty sticky_clone_wrapper
- sticky_clone_wrapper.innerHTML = '';
- }
- };
- //
- // $window.on('scroll', OnScroll);
- // console.log('window', window);
- window.onscroll = OnScroll;
- }
- // });
- module.exports = {
- init : init
- }
- /***/ }),
- /* 24 */
- /***/ (function(module, exports) {
- module.exports = {
- "Aacute": "Á",
- "aacute": "á",
- "Abreve": "Ă",
- "abreve": "ă",
- "ac": "∾",
- "acd": "∿",
- "acE": "∾̳",
- "Acirc": "Â",
- "acirc": "â",
- "acute": "´",
- "Acy": "А",
- "acy": "а",
- "AElig": "Æ",
- "aelig": "æ",
- "af": "",
- "Afr": "𝔄",
- "afr": "𝔞",
- "Agrave": "À",
- "agrave": "à",
- "alefsym": "ℵ",
- "aleph": "ℵ",
- "Alpha": "Α",
- "alpha": "α",
- "Amacr": "Ā",
- "amacr": "ā",
- "amalg": "⨿",
- "amp": "&",
- "AMP": "&",
- "andand": "⩕",
- "And": "⩓",
- "and": "∧",
- "andd": "⩜",
- "andslope": "⩘",
- "andv": "⩚",
- "ang": "∠",
- "ange": "⦤",
- "angle": "∠",
- "angmsdaa": "⦨",
- "angmsdab": "⦩",
- "angmsdac": "⦪",
- "angmsdad": "⦫",
- "angmsdae": "⦬",
- "angmsdaf": "⦭",
- "angmsdag": "⦮",
- "angmsdah": "⦯",
- "angmsd": "∡",
- "angrt": "∟",
- "angrtvb": "⊾",
- "angrtvbd": "⦝",
- "angsph": "∢",
- "angst": "Å",
- "angzarr": "⍼",
- "Aogon": "Ą",
- "aogon": "ą",
- "Aopf": "𝔸",
- "aopf": "𝕒",
- "apacir": "⩯",
- "ap": "≈",
- "apE": "⩰",
- "ape": "≊",
- "apid": "≋",
- "apos": "'",
- "ApplyFunction": "",
- "approx": "≈",
- "approxeq": "≊",
- "Aring": "Å",
- "aring": "å",
- "Ascr": "𝒜",
- "ascr": "𝒶",
- "Assign": "≔",
- "ast": "*",
- "asymp": "≈",
- "asympeq": "≍",
- "Atilde": "Ã",
- "atilde": "ã",
- "Auml": "Ä",
- "auml": "ä",
- "awconint": "∳",
- "awint": "⨑",
- "backcong": "≌",
- "backepsilon": "϶",
- "backprime": "‵",
- "backsim": "∽",
- "backsimeq": "⋍",
- "Backslash": "∖",
- "Barv": "⫧",
- "barvee": "⊽",
- "barwed": "⌅",
- "Barwed": "⌆",
- "barwedge": "⌅",
- "bbrk": "⎵",
- "bbrktbrk": "⎶",
- "bcong": "≌",
- "Bcy": "Б",
- "bcy": "б",
- "bdquo": "„",
- "becaus": "∵",
- "because": "∵",
- "Because": "∵",
- "bemptyv": "⦰",
- "bepsi": "϶",
- "bernou": "ℬ",
- "Bernoullis": "ℬ",
- "Beta": "Β",
- "beta": "β",
- "beth": "ℶ",
- "between": "≬",
- "Bfr": "𝔅",
- "bfr": "𝔟",
- "bigcap": "⋂",
- "bigcirc": "◯",
- "bigcup": "⋃",
- "bigodot": "⨀",
- "bigoplus": "⨁",
- "bigotimes": "⨂",
- "bigsqcup": "⨆",
- "bigstar": "★",
- "bigtriangledown": "▽",
- "bigtriangleup": "△",
- "biguplus": "⨄",
- "bigvee": "⋁",
- "bigwedge": "⋀",
- "bkarow": "⤍",
- "blacklozenge": "⧫",
- "blacksquare": "▪",
- "blacktriangle": "▴",
- "blacktriangledown": "▾",
- "blacktriangleleft": "◂",
- "blacktriangleright": "▸",
- "blank": "␣",
- "blk12": "▒",
- "blk14": "░",
- "blk34": "▓",
- "block": "█",
- "bne": "=⃥",
- "bnequiv": "≡⃥",
- "bNot": "⫭",
- "bnot": "⌐",
- "Bopf": "𝔹",
- "bopf": "𝕓",
- "bot": "⊥",
- "bottom": "⊥",
- "bowtie": "⋈",
- "boxbox": "⧉",
- "boxdl": "┐",
- "boxdL": "╕",
- "boxDl": "╖",
- "boxDL": "╗",
- "boxdr": "┌",
- "boxdR": "╒",
- "boxDr": "╓",
- "boxDR": "╔",
- "boxh": "─",
- "boxH": "═",
- "boxhd": "┬",
- "boxHd": "╤",
- "boxhD": "╥",
- "boxHD": "╦",
- "boxhu": "┴",
- "boxHu": "╧",
- "boxhU": "╨",
- "boxHU": "╩",
- "boxminus": "⊟",
- "boxplus": "⊞",
- "boxtimes": "⊠",
- "boxul": "┘",
- "boxuL": "╛",
- "boxUl": "╜",
- "boxUL": "╝",
- "boxur": "└",
- "boxuR": "╘",
- "boxUr": "╙",
- "boxUR": "╚",
- "boxv": "│",
- "boxV": "║",
- "boxvh": "┼",
- "boxvH": "╪",
- "boxVh": "╫",
- "boxVH": "╬",
- "boxvl": "┤",
- "boxvL": "╡",
- "boxVl": "╢",
- "boxVL": "╣",
- "boxvr": "├",
- "boxvR": "╞",
- "boxVr": "╟",
- "boxVR": "╠",
- "bprime": "‵",
- "breve": "˘",
- "Breve": "˘",
- "brvbar": "¦",
- "bscr": "𝒷",
- "Bscr": "ℬ",
- "bsemi": "⁏",
- "bsim": "∽",
- "bsime": "⋍",
- "bsolb": "⧅",
- "bsol": "\\",
- "bsolhsub": "⟈",
- "bull": "•",
- "bullet": "•",
- "bump": "≎",
- "bumpE": "⪮",
- "bumpe": "≏",
- "Bumpeq": "≎",
- "bumpeq": "≏",
- "Cacute": "Ć",
- "cacute": "ć",
- "capand": "⩄",
- "capbrcup": "⩉",
- "capcap": "⩋",
- "cap": "∩",
- "Cap": "⋒",
- "capcup": "⩇",
- "capdot": "⩀",
- "CapitalDifferentialD": "ⅅ",
- "caps": "∩︀",
- "caret": "⁁",
- "caron": "ˇ",
- "Cayleys": "ℭ",
- "ccaps": "⩍",
- "Ccaron": "Č",
- "ccaron": "č",
- "Ccedil": "Ç",
- "ccedil": "ç",
- "Ccirc": "Ĉ",
- "ccirc": "ĉ",
- "Cconint": "∰",
- "ccups": "⩌",
- "ccupssm": "⩐",
- "Cdot": "Ċ",
- "cdot": "ċ",
- "cedil": "¸",
- "Cedilla": "¸",
- "cemptyv": "⦲",
- "cent": "¢",
- "centerdot": "·",
- "CenterDot": "·",
- "cfr": "𝔠",
- "Cfr": "ℭ",
- "CHcy": "Ч",
- "chcy": "ч",
- "check": "✓",
- "checkmark": "✓",
- "Chi": "Χ",
- "chi": "χ",
- "circ": "ˆ",
- "circeq": "≗",
- "circlearrowleft": "↺",
- "circlearrowright": "↻",
- "circledast": "⊛",
- "circledcirc": "⊚",
- "circleddash": "⊝",
- "CircleDot": "⊙",
- "circledR": "®",
- "circledS": "Ⓢ",
- "CircleMinus": "⊖",
- "CirclePlus": "⊕",
- "CircleTimes": "⊗",
- "cir": "○",
- "cirE": "⧃",
- "cire": "≗",
- "cirfnint": "⨐",
- "cirmid": "⫯",
- "cirscir": "⧂",
- "ClockwiseContourIntegral": "∲",
- "CloseCurlyDoubleQuote": "”",
- "CloseCurlyQuote": "’",
- "clubs": "♣",
- "clubsuit": "♣",
- "colon": ":",
- "Colon": "∷",
- "Colone": "⩴",
- "colone": "≔",
- "coloneq": "≔",
- "comma": ",",
- "commat": "@",
- "comp": "∁",
- "compfn": "∘",
- "complement": "∁",
- "complexes": "ℂ",
- "cong": "≅",
- "congdot": "⩭",
- "Congruent": "≡",
- "conint": "∮",
- "Conint": "∯",
- "ContourIntegral": "∮",
- "copf": "𝕔",
- "Copf": "ℂ",
- "coprod": "∐",
- "Coproduct": "∐",
- "copy": "©",
- "COPY": "©",
- "copysr": "℗",
- "CounterClockwiseContourIntegral": "∳",
- "crarr": "↵",
- "cross": "✗",
- "Cross": "⨯",
- "Cscr": "𝒞",
- "cscr": "𝒸",
- "csub": "⫏",
- "csube": "⫑",
- "csup": "⫐",
- "csupe": "⫒",
- "ctdot": "⋯",
- "cudarrl": "⤸",
- "cudarrr": "⤵",
- "cuepr": "⋞",
- "cuesc": "⋟",
- "cularr": "↶",
- "cularrp": "⤽",
- "cupbrcap": "⩈",
- "cupcap": "⩆",
- "CupCap": "≍",
- "cup": "∪",
- "Cup": "⋓",
- "cupcup": "⩊",
- "cupdot": "⊍",
- "cupor": "⩅",
- "cups": "∪︀",
- "curarr": "↷",
- "curarrm": "⤼",
- "curlyeqprec": "⋞",
- "curlyeqsucc": "⋟",
- "curlyvee": "⋎",
- "curlywedge": "⋏",
- "curren": "¤",
- "curvearrowleft": "↶",
- "curvearrowright": "↷",
- "cuvee": "⋎",
- "cuwed": "⋏",
- "cwconint": "∲",
- "cwint": "∱",
- "cylcty": "⌭",
- "dagger": "†",
- "Dagger": "‡",
- "daleth": "ℸ",
- "darr": "↓",
- "Darr": "↡",
- "dArr": "⇓",
- "dash": "‐",
- "Dashv": "⫤",
- "dashv": "⊣",
- "dbkarow": "⤏",
- "dblac": "˝",
- "Dcaron": "Ď",
- "dcaron": "ď",
- "Dcy": "Д",
- "dcy": "д",
- "ddagger": "‡",
- "ddarr": "⇊",
- "DD": "ⅅ",
- "dd": "ⅆ",
- "DDotrahd": "⤑",
- "ddotseq": "⩷",
- "deg": "°",
- "Del": "∇",
- "Delta": "Δ",
- "delta": "δ",
- "demptyv": "⦱",
- "dfisht": "⥿",
- "Dfr": "𝔇",
- "dfr": "𝔡",
- "dHar": "⥥",
- "dharl": "⇃",
- "dharr": "⇂",
- "DiacriticalAcute": "´",
- "DiacriticalDot": "˙",
- "DiacriticalDoubleAcute": "˝",
- "DiacriticalGrave": "`",
- "DiacriticalTilde": "˜",
- "diam": "⋄",
- "diamond": "⋄",
- "Diamond": "⋄",
- "diamondsuit": "♦",
- "diams": "♦",
- "die": "¨",
- "DifferentialD": "ⅆ",
- "digamma": "ϝ",
- "disin": "⋲",
- "div": "÷",
- "divide": "÷",
- "divideontimes": "⋇",
- "divonx": "⋇",
- "DJcy": "Ђ",
- "djcy": "ђ",
- "dlcorn": "⌞",
- "dlcrop": "⌍",
- "dollar": "$",
- "Dopf": "𝔻",
- "dopf": "𝕕",
- "Dot": "¨",
- "dot": "˙",
- "DotDot": "⃜",
- "doteq": "≐",
- "doteqdot": "≑",
- "DotEqual": "≐",
- "dotminus": "∸",
- "dotplus": "∔",
- "dotsquare": "⊡",
- "doublebarwedge": "⌆",
- "DoubleContourIntegral": "∯",
- "DoubleDot": "¨",
- "DoubleDownArrow": "⇓",
- "DoubleLeftArrow": "⇐",
- "DoubleLeftRightArrow": "⇔",
- "DoubleLeftTee": "⫤",
- "DoubleLongLeftArrow": "⟸",
- "DoubleLongLeftRightArrow": "⟺",
- "DoubleLongRightArrow": "⟹",
- "DoubleRightArrow": "⇒",
- "DoubleRightTee": "⊨",
- "DoubleUpArrow": "⇑",
- "DoubleUpDownArrow": "⇕",
- "DoubleVerticalBar": "∥",
- "DownArrowBar": "⤓",
- "downarrow": "↓",
- "DownArrow": "↓",
- "Downarrow": "⇓",
- "DownArrowUpArrow": "⇵",
- "DownBreve": "̑",
- "downdownarrows": "⇊",
- "downharpoonleft": "⇃",
- "downharpoonright": "⇂",
- "DownLeftRightVector": "⥐",
- "DownLeftTeeVector": "⥞",
- "DownLeftVectorBar": "⥖",
- "DownLeftVector": "↽",
- "DownRightTeeVector": "⥟",
- "DownRightVectorBar": "⥗",
- "DownRightVector": "⇁",
- "DownTeeArrow": "↧",
- "DownTee": "⊤",
- "drbkarow": "⤐",
- "drcorn": "⌟",
- "drcrop": "⌌",
- "Dscr": "𝒟",
- "dscr": "𝒹",
- "DScy": "Ѕ",
- "dscy": "ѕ",
- "dsol": "⧶",
- "Dstrok": "Đ",
- "dstrok": "đ",
- "dtdot": "⋱",
- "dtri": "▿",
- "dtrif": "▾",
- "duarr": "⇵",
- "duhar": "⥯",
- "dwangle": "⦦",
- "DZcy": "Џ",
- "dzcy": "џ",
- "dzigrarr": "⟿",
- "Eacute": "É",
- "eacute": "é",
- "easter": "⩮",
- "Ecaron": "Ě",
- "ecaron": "ě",
- "Ecirc": "Ê",
- "ecirc": "ê",
- "ecir": "≖",
- "ecolon": "≕",
- "Ecy": "Э",
- "ecy": "э",
- "eDDot": "⩷",
- "Edot": "Ė",
- "edot": "ė",
- "eDot": "≑",
- "ee": "ⅇ",
- "efDot": "≒",
- "Efr": "𝔈",
- "efr": "𝔢",
- "eg": "⪚",
- "Egrave": "È",
- "egrave": "è",
- "egs": "⪖",
- "egsdot": "⪘",
- "el": "⪙",
- "Element": "∈",
- "elinters": "⏧",
- "ell": "ℓ",
- "els": "⪕",
- "elsdot": "⪗",
- "Emacr": "Ē",
- "emacr": "ē",
- "empty": "∅",
- "emptyset": "∅",
- "EmptySmallSquare": "◻",
- "emptyv": "∅",
- "EmptyVerySmallSquare": "▫",
- "emsp13": " ",
- "emsp14": " ",
- "emsp": " ",
- "ENG": "Ŋ",
- "eng": "ŋ",
- "ensp": " ",
- "Eogon": "Ę",
- "eogon": "ę",
- "Eopf": "𝔼",
- "eopf": "𝕖",
- "epar": "⋕",
- "eparsl": "⧣",
- "eplus": "⩱",
- "epsi": "ε",
- "Epsilon": "Ε",
- "epsilon": "ε",
- "epsiv": "ϵ",
- "eqcirc": "≖",
- "eqcolon": "≕",
- "eqsim": "≂",
- "eqslantgtr": "⪖",
- "eqslantless": "⪕",
- "Equal": "⩵",
- "equals": "=",
- "EqualTilde": "≂",
- "equest": "≟",
- "Equilibrium": "⇌",
- "equiv": "≡",
- "equivDD": "⩸",
- "eqvparsl": "⧥",
- "erarr": "⥱",
- "erDot": "≓",
- "escr": "ℯ",
- "Escr": "ℰ",
- "esdot": "≐",
- "Esim": "⩳",
- "esim": "≂",
- "Eta": "Η",
- "eta": "η",
- "ETH": "Ð",
- "eth": "ð",
- "Euml": "Ë",
- "euml": "ë",
- "euro": "€",
- "excl": "!",
- "exist": "∃",
- "Exists": "∃",
- "expectation": "ℰ",
- "exponentiale": "ⅇ",
- "ExponentialE": "ⅇ",
- "fallingdotseq": "≒",
- "Fcy": "Ф",
- "fcy": "ф",
- "female": "♀",
- "ffilig": "ffi",
- "fflig": "ff",
- "ffllig": "ffl",
- "Ffr": "𝔉",
- "ffr": "𝔣",
- "filig": "fi",
- "FilledSmallSquare": "◼",
- "FilledVerySmallSquare": "▪",
- "fjlig": "fj",
- "flat": "♭",
- "fllig": "fl",
- "fltns": "▱",
- "fnof": "ƒ",
- "Fopf": "𝔽",
- "fopf": "𝕗",
- "forall": "∀",
- "ForAll": "∀",
- "fork": "⋔",
- "forkv": "⫙",
- "Fouriertrf": "ℱ",
- "fpartint": "⨍",
- "frac12": "½",
- "frac13": "⅓",
- "frac14": "¼",
- "frac15": "⅕",
- "frac16": "⅙",
- "frac18": "⅛",
- "frac23": "⅔",
- "frac25": "⅖",
- "frac34": "¾",
- "frac35": "⅗",
- "frac38": "⅜",
- "frac45": "⅘",
- "frac56": "⅚",
- "frac58": "⅝",
- "frac78": "⅞",
- "frasl": "⁄",
- "frown": "⌢",
- "fscr": "𝒻",
- "Fscr": "ℱ",
- "gacute": "ǵ",
- "Gamma": "Γ",
- "gamma": "γ",
- "Gammad": "Ϝ",
- "gammad": "ϝ",
- "gap": "⪆",
- "Gbreve": "Ğ",
- "gbreve": "ğ",
- "Gcedil": "Ģ",
- "Gcirc": "Ĝ",
- "gcirc": "ĝ",
- "Gcy": "Г",
- "gcy": "г",
- "Gdot": "Ġ",
- "gdot": "ġ",
- "ge": "≥",
- "gE": "≧",
- "gEl": "⪌",
- "gel": "⋛",
- "geq": "≥",
- "geqq": "≧",
- "geqslant": "⩾",
- "gescc": "⪩",
- "ges": "⩾",
- "gesdot": "⪀",
- "gesdoto": "⪂",
- "gesdotol": "⪄",
- "gesl": "⋛︀",
- "gesles": "⪔",
- "Gfr": "𝔊",
- "gfr": "𝔤",
- "gg": "≫",
- "Gg": "⋙",
- "ggg": "⋙",
- "gimel": "ℷ",
- "GJcy": "Ѓ",
- "gjcy": "ѓ",
- "gla": "⪥",
- "gl": "≷",
- "glE": "⪒",
- "glj": "⪤",
- "gnap": "⪊",
- "gnapprox": "⪊",
- "gne": "⪈",
- "gnE": "≩",
- "gneq": "⪈",
- "gneqq": "≩",
- "gnsim": "⋧",
- "Gopf": "𝔾",
- "gopf": "𝕘",
- "grave": "`",
- "GreaterEqual": "≥",
- "GreaterEqualLess": "⋛",
- "GreaterFullEqual": "≧",
- "GreaterGreater": "⪢",
- "GreaterLess": "≷",
- "GreaterSlantEqual": "⩾",
- "GreaterTilde": "≳",
- "Gscr": "𝒢",
- "gscr": "ℊ",
- "gsim": "≳",
- "gsime": "⪎",
- "gsiml": "⪐",
- "gtcc": "⪧",
- "gtcir": "⩺",
- "gt": ">",
- "GT": ">",
- "Gt": "≫",
- "gtdot": "⋗",
- "gtlPar": "⦕",
- "gtquest": "⩼",
- "gtrapprox": "⪆",
- "gtrarr": "⥸",
- "gtrdot": "⋗",
- "gtreqless": "⋛",
- "gtreqqless": "⪌",
- "gtrless": "≷",
- "gtrsim": "≳",
- "gvertneqq": "≩︀",
- "gvnE": "≩︀",
- "Hacek": "ˇ",
- "hairsp": " ",
- "half": "½",
- "hamilt": "ℋ",
- "HARDcy": "Ъ",
- "hardcy": "ъ",
- "harrcir": "⥈",
- "harr": "↔",
- "hArr": "⇔",
- "harrw": "↭",
- "Hat": "^",
- "hbar": "ℏ",
- "Hcirc": "Ĥ",
- "hcirc": "ĥ",
- "hearts": "♥",
- "heartsuit": "♥",
- "hellip": "…",
- "hercon": "⊹",
- "hfr": "𝔥",
- "Hfr": "ℌ",
- "HilbertSpace": "ℋ",
- "hksearow": "⤥",
- "hkswarow": "⤦",
- "hoarr": "⇿",
- "homtht": "∻",
- "hookleftarrow": "↩",
- "hookrightarrow": "↪",
- "hopf": "𝕙",
- "Hopf": "ℍ",
- "horbar": "―",
- "HorizontalLine": "─",
- "hscr": "𝒽",
- "Hscr": "ℋ",
- "hslash": "ℏ",
- "Hstrok": "Ħ",
- "hstrok": "ħ",
- "HumpDownHump": "≎",
- "HumpEqual": "≏",
- "hybull": "⁃",
- "hyphen": "‐",
- "Iacute": "Í",
- "iacute": "í",
- "ic": "",
- "Icirc": "Î",
- "icirc": "î",
- "Icy": "И",
- "icy": "и",
- "Idot": "İ",
- "IEcy": "Е",
- "iecy": "е",
- "iexcl": "¡",
- "iff": "⇔",
- "ifr": "𝔦",
- "Ifr": "ℑ",
- "Igrave": "Ì",
- "igrave": "ì",
- "ii": "ⅈ",
- "iiiint": "⨌",
- "iiint": "∭",
- "iinfin": "⧜",
- "iiota": "℩",
- "IJlig": "IJ",
- "ijlig": "ij",
- "Imacr": "Ī",
- "imacr": "ī",
- "image": "ℑ",
- "ImaginaryI": "ⅈ",
- "imagline": "ℐ",
- "imagpart": "ℑ",
- "imath": "ı",
- "Im": "ℑ",
- "imof": "⊷",
- "imped": "Ƶ",
- "Implies": "⇒",
- "incare": "℅",
- "in": "∈",
- "infin": "∞",
- "infintie": "⧝",
- "inodot": "ı",
- "intcal": "⊺",
- "int": "∫",
- "Int": "∬",
- "integers": "ℤ",
- "Integral": "∫",
- "intercal": "⊺",
- "Intersection": "⋂",
- "intlarhk": "⨗",
- "intprod": "⨼",
- "InvisibleComma": "",
- "InvisibleTimes": "",
- "IOcy": "Ё",
- "iocy": "ё",
- "Iogon": "Į",
- "iogon": "į",
- "Iopf": "𝕀",
- "iopf": "𝕚",
- "Iota": "Ι",
- "iota": "ι",
- "iprod": "⨼",
- "iquest": "¿",
- "iscr": "𝒾",
- "Iscr": "ℐ",
- "isin": "∈",
- "isindot": "⋵",
- "isinE": "⋹",
- "isins": "⋴",
- "isinsv": "⋳",
- "isinv": "∈",
- "it": "",
- "Itilde": "Ĩ",
- "itilde": "ĩ",
- "Iukcy": "І",
- "iukcy": "і",
- "Iuml": "Ï",
- "iuml": "ï",
- "Jcirc": "Ĵ",
- "jcirc": "ĵ",
- "Jcy": "Й",
- "jcy": "й",
- "Jfr": "𝔍",
- "jfr": "𝔧",
- "jmath": "ȷ",
- "Jopf": "𝕁",
- "jopf": "𝕛",
- "Jscr": "𝒥",
- "jscr": "𝒿",
- "Jsercy": "Ј",
- "jsercy": "ј",
- "Jukcy": "Є",
- "jukcy": "є",
- "Kappa": "Κ",
- "kappa": "κ",
- "kappav": "ϰ",
- "Kcedil": "Ķ",
- "kcedil": "ķ",
- "Kcy": "К",
- "kcy": "к",
- "Kfr": "𝔎",
- "kfr": "𝔨",
- "kgreen": "ĸ",
- "KHcy": "Х",
- "khcy": "х",
- "KJcy": "Ќ",
- "kjcy": "ќ",
- "Kopf": "𝕂",
- "kopf": "𝕜",
- "Kscr": "𝒦",
- "kscr": "𝓀",
- "lAarr": "⇚",
- "Lacute": "Ĺ",
- "lacute": "ĺ",
- "laemptyv": "⦴",
- "lagran": "ℒ",
- "Lambda": "Λ",
- "lambda": "λ",
- "lang": "⟨",
- "Lang": "⟪",
- "langd": "⦑",
- "langle": "⟨",
- "lap": "⪅",
- "Laplacetrf": "ℒ",
- "laquo": "«",
- "larrb": "⇤",
- "larrbfs": "⤟",
- "larr": "←",
- "Larr": "↞",
- "lArr": "⇐",
- "larrfs": "⤝",
- "larrhk": "↩",
- "larrlp": "↫",
- "larrpl": "⤹",
- "larrsim": "⥳",
- "larrtl": "↢",
- "latail": "⤙",
- "lAtail": "⤛",
- "lat": "⪫",
- "late": "⪭",
- "lates": "⪭︀",
- "lbarr": "⤌",
- "lBarr": "⤎",
- "lbbrk": "❲",
- "lbrace": "{",
- "lbrack": "[",
- "lbrke": "⦋",
- "lbrksld": "⦏",
- "lbrkslu": "⦍",
- "Lcaron": "Ľ",
- "lcaron": "ľ",
- "Lcedil": "Ļ",
- "lcedil": "ļ",
- "lceil": "⌈",
- "lcub": "{",
- "Lcy": "Л",
- "lcy": "л",
- "ldca": "⤶",
- "ldquo": "“",
- "ldquor": "„",
- "ldrdhar": "⥧",
- "ldrushar": "⥋",
- "ldsh": "↲",
- "le": "≤",
- "lE": "≦",
- "LeftAngleBracket": "⟨",
- "LeftArrowBar": "⇤",
- "leftarrow": "←",
- "LeftArrow": "←",
- "Leftarrow": "⇐",
- "LeftArrowRightArrow": "⇆",
- "leftarrowtail": "↢",
- "LeftCeiling": "⌈",
- "LeftDoubleBracket": "⟦",
- "LeftDownTeeVector": "⥡",
- "LeftDownVectorBar": "⥙",
- "LeftDownVector": "⇃",
- "LeftFloor": "⌊",
- "leftharpoondown": "↽",
- "leftharpoonup": "↼",
- "leftleftarrows": "⇇",
- "leftrightarrow": "↔",
- "LeftRightArrow": "↔",
- "Leftrightarrow": "⇔",
- "leftrightarrows": "⇆",
- "leftrightharpoons": "⇋",
- "leftrightsquigarrow": "↭",
- "LeftRightVector": "⥎",
- "LeftTeeArrow": "↤",
- "LeftTee": "⊣",
- "LeftTeeVector": "⥚",
- "leftthreetimes": "⋋",
- "LeftTriangleBar": "⧏",
- "LeftTriangle": "⊲",
- "LeftTriangleEqual": "⊴",
- "LeftUpDownVector": "⥑",
- "LeftUpTeeVector": "⥠",
- "LeftUpVectorBar": "⥘",
- "LeftUpVector": "↿",
- "LeftVectorBar": "⥒",
- "LeftVector": "↼",
- "lEg": "⪋",
- "leg": "⋚",
- "leq": "≤",
- "leqq": "≦",
- "leqslant": "⩽",
- "lescc": "⪨",
- "les": "⩽",
- "lesdot": "⩿",
- "lesdoto": "⪁",
- "lesdotor": "⪃",
- "lesg": "⋚︀",
- "lesges": "⪓",
- "lessapprox": "⪅",
- "lessdot": "⋖",
- "lesseqgtr": "⋚",
- "lesseqqgtr": "⪋",
- "LessEqualGreater": "⋚",
- "LessFullEqual": "≦",
- "LessGreater": "≶",
- "lessgtr": "≶",
- "LessLess": "⪡",
- "lesssim": "≲",
- "LessSlantEqual": "⩽",
- "LessTilde": "≲",
- "lfisht": "⥼",
- "lfloor": "⌊",
- "Lfr": "𝔏",
- "lfr": "𝔩",
- "lg": "≶",
- "lgE": "⪑",
- "lHar": "⥢",
- "lhard": "↽",
- "lharu": "↼",
- "lharul": "⥪",
- "lhblk": "▄",
- "LJcy": "Љ",
- "ljcy": "љ",
- "llarr": "⇇",
- "ll": "≪",
- "Ll": "⋘",
- "llcorner": "⌞",
- "Lleftarrow": "⇚",
- "llhard": "⥫",
- "lltri": "◺",
- "Lmidot": "Ŀ",
- "lmidot": "ŀ",
- "lmoustache": "⎰",
- "lmoust": "⎰",
- "lnap": "⪉",
- "lnapprox": "⪉",
- "lne": "⪇",
- "lnE": "≨",
- "lneq": "⪇",
- "lneqq": "≨",
- "lnsim": "⋦",
- "loang": "⟬",
- "loarr": "⇽",
- "lobrk": "⟦",
- "longleftarrow": "⟵",
- "LongLeftArrow": "⟵",
- "Longleftarrow": "⟸",
- "longleftrightarrow": "⟷",
- "LongLeftRightArrow": "⟷",
- "Longleftrightarrow": "⟺",
- "longmapsto": "⟼",
- "longrightarrow": "⟶",
- "LongRightArrow": "⟶",
- "Longrightarrow": "⟹",
- "looparrowleft": "↫",
- "looparrowright": "↬",
- "lopar": "⦅",
- "Lopf": "𝕃",
- "lopf": "𝕝",
- "loplus": "⨭",
- "lotimes": "⨴",
- "lowast": "∗",
- "lowbar": "_",
- "LowerLeftArrow": "↙",
- "LowerRightArrow": "↘",
- "loz": "◊",
- "lozenge": "◊",
- "lozf": "⧫",
- "lpar": "(",
- "lparlt": "⦓",
- "lrarr": "⇆",
- "lrcorner": "⌟",
- "lrhar": "⇋",
- "lrhard": "⥭",
- "lrm": "",
- "lrtri": "⊿",
- "lsaquo": "‹",
- "lscr": "𝓁",
- "Lscr": "ℒ",
- "lsh": "↰",
- "Lsh": "↰",
- "lsim": "≲",
- "lsime": "⪍",
- "lsimg": "⪏",
- "lsqb": "[",
- "lsquo": "‘",
- "lsquor": "‚",
- "Lstrok": "Ł",
- "lstrok": "ł",
- "ltcc": "⪦",
- "ltcir": "⩹",
- "lt": "<",
- "LT": "<",
- "Lt": "≪",
- "ltdot": "⋖",
- "lthree": "⋋",
- "ltimes": "⋉",
- "ltlarr": "⥶",
- "ltquest": "⩻",
- "ltri": "◃",
- "ltrie": "⊴",
- "ltrif": "◂",
- "ltrPar": "⦖",
- "lurdshar": "⥊",
- "luruhar": "⥦",
- "lvertneqq": "≨︀",
- "lvnE": "≨︀",
- "macr": "¯",
- "male": "♂",
- "malt": "✠",
- "maltese": "✠",
- "Map": "⤅",
- "map": "↦",
- "mapsto": "↦",
- "mapstodown": "↧",
- "mapstoleft": "↤",
- "mapstoup": "↥",
- "marker": "▮",
- "mcomma": "⨩",
- "Mcy": "М",
- "mcy": "м",
- "mdash": "—",
- "mDDot": "∺",
- "measuredangle": "∡",
- "MediumSpace": " ",
- "Mellintrf": "ℳ",
- "Mfr": "𝔐",
- "mfr": "𝔪",
- "mho": "℧",
- "micro": "µ",
- "midast": "*",
- "midcir": "⫰",
- "mid": "∣",
- "middot": "·",
- "minusb": "⊟",
- "minus": "−",
- "minusd": "∸",
- "minusdu": "⨪",
- "MinusPlus": "∓",
- "mlcp": "⫛",
- "mldr": "…",
- "mnplus": "∓",
- "models": "⊧",
- "Mopf": "𝕄",
- "mopf": "𝕞",
- "mp": "∓",
- "mscr": "𝓂",
- "Mscr": "ℳ",
- "mstpos": "∾",
- "Mu": "Μ",
- "mu": "μ",
- "multimap": "⊸",
- "mumap": "⊸",
- "nabla": "∇",
- "Nacute": "Ń",
- "nacute": "ń",
- "nang": "∠⃒",
- "nap": "≉",
- "napE": "⩰̸",
- "napid": "≋̸",
- "napos": "ʼn",
- "napprox": "≉",
- "natural": "♮",
- "naturals": "ℕ",
- "natur": "♮",
- "nbsp": " ",
- "nbump": "≎̸",
- "nbumpe": "≏̸",
- "ncap": "⩃",
- "Ncaron": "Ň",
- "ncaron": "ň",
- "Ncedil": "Ņ",
- "ncedil": "ņ",
- "ncong": "≇",
- "ncongdot": "⩭̸",
- "ncup": "⩂",
- "Ncy": "Н",
- "ncy": "н",
- "ndash": "–",
- "nearhk": "⤤",
- "nearr": "↗",
- "neArr": "⇗",
- "nearrow": "↗",
- "ne": "≠",
- "nedot": "≐̸",
- "NegativeMediumSpace": "",
- "NegativeThickSpace": "",
- "NegativeThinSpace": "",
- "NegativeVeryThinSpace": "",
- "nequiv": "≢",
- "nesear": "⤨",
- "nesim": "≂̸",
- "NestedGreaterGreater": "≫",
- "NestedLessLess": "≪",
- "NewLine": "\n",
- "nexist": "∄",
- "nexists": "∄",
- "Nfr": "𝔑",
- "nfr": "𝔫",
- "ngE": "≧̸",
- "nge": "≱",
- "ngeq": "≱",
- "ngeqq": "≧̸",
- "ngeqslant": "⩾̸",
- "nges": "⩾̸",
- "nGg": "⋙̸",
- "ngsim": "≵",
- "nGt": "≫⃒",
- "ngt": "≯",
- "ngtr": "≯",
- "nGtv": "≫̸",
- "nharr": "↮",
- "nhArr": "⇎",
- "nhpar": "⫲",
- "ni": "∋",
- "nis": "⋼",
- "nisd": "⋺",
- "niv": "∋",
- "NJcy": "Њ",
- "njcy": "њ",
- "nlarr": "↚",
- "nlArr": "⇍",
- "nldr": "‥",
- "nlE": "≦̸",
- "nle": "≰",
- "nleftarrow": "↚",
- "nLeftarrow": "⇍",
- "nleftrightarrow": "↮",
- "nLeftrightarrow": "⇎",
- "nleq": "≰",
- "nleqq": "≦̸",
- "nleqslant": "⩽̸",
- "nles": "⩽̸",
- "nless": "≮",
- "nLl": "⋘̸",
- "nlsim": "≴",
- "nLt": "≪⃒",
- "nlt": "≮",
- "nltri": "⋪",
- "nltrie": "⋬",
- "nLtv": "≪̸",
- "nmid": "∤",
- "NoBreak": "",
- "NonBreakingSpace": " ",
- "nopf": "𝕟",
- "Nopf": "ℕ",
- "Not": "⫬",
- "not": "¬",
- "NotCongruent": "≢",
- "NotCupCap": "≭",
- "NotDoubleVerticalBar": "∦",
- "NotElement": "∉",
- "NotEqual": "≠",
- "NotEqualTilde": "≂̸",
- "NotExists": "∄",
- "NotGreater": "≯",
- "NotGreaterEqual": "≱",
- "NotGreaterFullEqual": "≧̸",
- "NotGreaterGreater": "≫̸",
- "NotGreaterLess": "≹",
- "NotGreaterSlantEqual": "⩾̸",
- "NotGreaterTilde": "≵",
- "NotHumpDownHump": "≎̸",
- "NotHumpEqual": "≏̸",
- "notin": "∉",
- "notindot": "⋵̸",
- "notinE": "⋹̸",
- "notinva": "∉",
- "notinvb": "⋷",
- "notinvc": "⋶",
- "NotLeftTriangleBar": "⧏̸",
- "NotLeftTriangle": "⋪",
- "NotLeftTriangleEqual": "⋬",
- "NotLess": "≮",
- "NotLessEqual": "≰",
- "NotLessGreater": "≸",
- "NotLessLess": "≪̸",
- "NotLessSlantEqual": "⩽̸",
- "NotLessTilde": "≴",
- "NotNestedGreaterGreater": "⪢̸",
- "NotNestedLessLess": "⪡̸",
- "notni": "∌",
- "notniva": "∌",
- "notnivb": "⋾",
- "notnivc": "⋽",
- "NotPrecedes": "⊀",
- "NotPrecedesEqual": "⪯̸",
- "NotPrecedesSlantEqual": "⋠",
- "NotReverseElement": "∌",
- "NotRightTriangleBar": "⧐̸",
- "NotRightTriangle": "⋫",
- "NotRightTriangleEqual": "⋭",
- "NotSquareSubset": "⊏̸",
- "NotSquareSubsetEqual": "⋢",
- "NotSquareSuperset": "⊐̸",
- "NotSquareSupersetEqual": "⋣",
- "NotSubset": "⊂⃒",
- "NotSubsetEqual": "⊈",
- "NotSucceeds": "⊁",
- "NotSucceedsEqual": "⪰̸",
- "NotSucceedsSlantEqual": "⋡",
- "NotSucceedsTilde": "≿̸",
- "NotSuperset": "⊃⃒",
- "NotSupersetEqual": "⊉",
- "NotTilde": "≁",
- "NotTildeEqual": "≄",
- "NotTildeFullEqual": "≇",
- "NotTildeTilde": "≉",
- "NotVerticalBar": "∤",
- "nparallel": "∦",
- "npar": "∦",
- "nparsl": "⫽⃥",
- "npart": "∂̸",
- "npolint": "⨔",
- "npr": "⊀",
- "nprcue": "⋠",
- "nprec": "⊀",
- "npreceq": "⪯̸",
- "npre": "⪯̸",
- "nrarrc": "⤳̸",
- "nrarr": "↛",
- "nrArr": "⇏",
- "nrarrw": "↝̸",
- "nrightarrow": "↛",
- "nRightarrow": "⇏",
- "nrtri": "⋫",
- "nrtrie": "⋭",
- "nsc": "⊁",
- "nsccue": "⋡",
- "nsce": "⪰̸",
- "Nscr": "𝒩",
- "nscr": "𝓃",
- "nshortmid": "∤",
- "nshortparallel": "∦",
- "nsim": "≁",
- "nsime": "≄",
- "nsimeq": "≄",
- "nsmid": "∤",
- "nspar": "∦",
- "nsqsube": "⋢",
- "nsqsupe": "⋣",
- "nsub": "⊄",
- "nsubE": "⫅̸",
- "nsube": "⊈",
- "nsubset": "⊂⃒",
- "nsubseteq": "⊈",
- "nsubseteqq": "⫅̸",
- "nsucc": "⊁",
- "nsucceq": "⪰̸",
- "nsup": "⊅",
- "nsupE": "⫆̸",
- "nsupe": "⊉",
- "nsupset": "⊃⃒",
- "nsupseteq": "⊉",
- "nsupseteqq": "⫆̸",
- "ntgl": "≹",
- "Ntilde": "Ñ",
- "ntilde": "ñ",
- "ntlg": "≸",
- "ntriangleleft": "⋪",
- "ntrianglelefteq": "⋬",
- "ntriangleright": "⋫",
- "ntrianglerighteq": "⋭",
- "Nu": "Ν",
- "nu": "ν",
- "num": "#",
- "numero": "№",
- "numsp": " ",
- "nvap": "≍⃒",
- "nvdash": "⊬",
- "nvDash": "⊭",
- "nVdash": "⊮",
- "nVDash": "⊯",
- "nvge": "≥⃒",
- "nvgt": ">⃒",
- "nvHarr": "⤄",
- "nvinfin": "⧞",
- "nvlArr": "⤂",
- "nvle": "≤⃒",
- "nvlt": "<⃒",
- "nvltrie": "⊴⃒",
- "nvrArr": "⤃",
- "nvrtrie": "⊵⃒",
- "nvsim": "∼⃒",
- "nwarhk": "⤣",
- "nwarr": "↖",
- "nwArr": "⇖",
- "nwarrow": "↖",
- "nwnear": "⤧",
- "Oacute": "Ó",
- "oacute": "ó",
- "oast": "⊛",
- "Ocirc": "Ô",
- "ocirc": "ô",
- "ocir": "⊚",
- "Ocy": "О",
- "ocy": "о",
- "odash": "⊝",
- "Odblac": "Ő",
- "odblac": "ő",
- "odiv": "⨸",
- "odot": "⊙",
- "odsold": "⦼",
- "OElig": "Œ",
- "oelig": "œ",
- "ofcir": "⦿",
- "Ofr": "𝔒",
- "ofr": "𝔬",
- "ogon": "˛",
- "Ograve": "Ò",
- "ograve": "ò",
- "ogt": "⧁",
- "ohbar": "⦵",
- "ohm": "Ω",
- "oint": "∮",
- "olarr": "↺",
- "olcir": "⦾",
- "olcross": "⦻",
- "oline": "‾",
- "olt": "⧀",
- "Omacr": "Ō",
- "omacr": "ō",
- "Omega": "Ω",
- "omega": "ω",
- "Omicron": "Ο",
- "omicron": "ο",
- "omid": "⦶",
- "ominus": "⊖",
- "Oopf": "𝕆",
- "oopf": "𝕠",
- "opar": "⦷",
- "OpenCurlyDoubleQuote": "“",
- "OpenCurlyQuote": "‘",
- "operp": "⦹",
- "oplus": "⊕",
- "orarr": "↻",
- "Or": "⩔",
- "or": "∨",
- "ord": "⩝",
- "order": "ℴ",
- "orderof": "ℴ",
- "ordf": "ª",
- "ordm": "º",
- "origof": "⊶",
- "oror": "⩖",
- "orslope": "⩗",
- "orv": "⩛",
- "oS": "Ⓢ",
- "Oscr": "𝒪",
- "oscr": "ℴ",
- "Oslash": "Ø",
- "oslash": "ø",
- "osol": "⊘",
- "Otilde": "Õ",
- "otilde": "õ",
- "otimesas": "⨶",
- "Otimes": "⨷",
- "otimes": "⊗",
- "Ouml": "Ö",
- "ouml": "ö",
- "ovbar": "⌽",
- "OverBar": "‾",
- "OverBrace": "⏞",
- "OverBracket": "⎴",
- "OverParenthesis": "⏜",
- "para": "¶",
- "parallel": "∥",
- "par": "∥",
- "parsim": "⫳",
- "parsl": "⫽",
- "part": "∂",
- "PartialD": "∂",
- "Pcy": "П",
- "pcy": "п",
- "percnt": "%",
- "period": ".",
- "permil": "‰",
- "perp": "⊥",
- "pertenk": "‱",
- "Pfr": "𝔓",
- "pfr": "𝔭",
- "Phi": "Φ",
- "phi": "φ",
- "phiv": "ϕ",
- "phmmat": "ℳ",
- "phone": "☎",
- "Pi": "Π",
- "pi": "π",
- "pitchfork": "⋔",
- "piv": "ϖ",
- "planck": "ℏ",
- "planckh": "ℎ",
- "plankv": "ℏ",
- "plusacir": "⨣",
- "plusb": "⊞",
- "pluscir": "⨢",
- "plus": "+",
- "plusdo": "∔",
- "plusdu": "⨥",
- "pluse": "⩲",
- "PlusMinus": "±",
- "plusmn": "±",
- "plussim": "⨦",
- "plustwo": "⨧",
- "pm": "±",
- "Poincareplane": "ℌ",
- "pointint": "⨕",
- "popf": "𝕡",
- "Popf": "ℙ",
- "pound": "£",
- "prap": "⪷",
- "Pr": "⪻",
- "pr": "≺",
- "prcue": "≼",
- "precapprox": "⪷",
- "prec": "≺",
- "preccurlyeq": "≼",
- "Precedes": "≺",
- "PrecedesEqual": "⪯",
- "PrecedesSlantEqual": "≼",
- "PrecedesTilde": "≾",
- "preceq": "⪯",
- "precnapprox": "⪹",
- "precneqq": "⪵",
- "precnsim": "⋨",
- "pre": "⪯",
- "prE": "⪳",
- "precsim": "≾",
- "prime": "′",
- "Prime": "″",
- "primes": "ℙ",
- "prnap": "⪹",
- "prnE": "⪵",
- "prnsim": "⋨",
- "prod": "∏",
- "Product": "∏",
- "profalar": "⌮",
- "profline": "⌒",
- "profsurf": "⌓",
- "prop": "∝",
- "Proportional": "∝",
- "Proportion": "∷",
- "propto": "∝",
- "prsim": "≾",
- "prurel": "⊰",
- "Pscr": "𝒫",
- "pscr": "𝓅",
- "Psi": "Ψ",
- "psi": "ψ",
- "puncsp": " ",
- "Qfr": "𝔔",
- "qfr": "𝔮",
- "qint": "⨌",
- "qopf": "𝕢",
- "Qopf": "ℚ",
- "qprime": "⁗",
- "Qscr": "𝒬",
- "qscr": "𝓆",
- "quaternions": "ℍ",
- "quatint": "⨖",
- "quest": "?",
- "questeq": "≟",
- "quot": "\"",
- "QUOT": "\"",
- "rAarr": "⇛",
- "race": "∽̱",
- "Racute": "Ŕ",
- "racute": "ŕ",
- "radic": "√",
- "raemptyv": "⦳",
- "rang": "⟩",
- "Rang": "⟫",
- "rangd": "⦒",
- "range": "⦥",
- "rangle": "⟩",
- "raquo": "»",
- "rarrap": "⥵",
- "rarrb": "⇥",
- "rarrbfs": "⤠",
- "rarrc": "⤳",
- "rarr": "→",
- "Rarr": "↠",
- "rArr": "⇒",
- "rarrfs": "⤞",
- "rarrhk": "↪",
- "rarrlp": "↬",
- "rarrpl": "⥅",
- "rarrsim": "⥴",
- "Rarrtl": "⤖",
- "rarrtl": "↣",
- "rarrw": "↝",
- "ratail": "⤚",
- "rAtail": "⤜",
- "ratio": "∶",
- "rationals": "ℚ",
- "rbarr": "⤍",
- "rBarr": "⤏",
- "RBarr": "⤐",
- "rbbrk": "❳",
- "rbrace": "}",
- "rbrack": "]",
- "rbrke": "⦌",
- "rbrksld": "⦎",
- "rbrkslu": "⦐",
- "Rcaron": "Ř",
- "rcaron": "ř",
- "Rcedil": "Ŗ",
- "rcedil": "ŗ",
- "rceil": "⌉",
- "rcub": "}",
- "Rcy": "Р",
- "rcy": "р",
- "rdca": "⤷",
- "rdldhar": "⥩",
- "rdquo": "”",
- "rdquor": "”",
- "rdsh": "↳",
- "real": "ℜ",
- "realine": "ℛ",
- "realpart": "ℜ",
- "reals": "ℝ",
- "Re": "ℜ",
- "rect": "▭",
- "reg": "®",
- "REG": "®",
- "ReverseElement": "∋",
- "ReverseEquilibrium": "⇋",
- "ReverseUpEquilibrium": "⥯",
- "rfisht": "⥽",
- "rfloor": "⌋",
- "rfr": "𝔯",
- "Rfr": "ℜ",
- "rHar": "⥤",
- "rhard": "⇁",
- "rharu": "⇀",
- "rharul": "⥬",
- "Rho": "Ρ",
- "rho": "ρ",
- "rhov": "ϱ",
- "RightAngleBracket": "⟩",
- "RightArrowBar": "⇥",
- "rightarrow": "→",
- "RightArrow": "→",
- "Rightarrow": "⇒",
- "RightArrowLeftArrow": "⇄",
- "rightarrowtail": "↣",
- "RightCeiling": "⌉",
- "RightDoubleBracket": "⟧",
- "RightDownTeeVector": "⥝",
- "RightDownVectorBar": "⥕",
- "RightDownVector": "⇂",
- "RightFloor": "⌋",
- "rightharpoondown": "⇁",
- "rightharpoonup": "⇀",
- "rightleftarrows": "⇄",
- "rightleftharpoons": "⇌",
- "rightrightarrows": "⇉",
- "rightsquigarrow": "↝",
- "RightTeeArrow": "↦",
- "RightTee": "⊢",
- "RightTeeVector": "⥛",
- "rightthreetimes": "⋌",
- "RightTriangleBar": "⧐",
- "RightTriangle": "⊳",
- "RightTriangleEqual": "⊵",
- "RightUpDownVector": "⥏",
- "RightUpTeeVector": "⥜",
- "RightUpVectorBar": "⥔",
- "RightUpVector": "↾",
- "RightVectorBar": "⥓",
- "RightVector": "⇀",
- "ring": "˚",
- "risingdotseq": "≓",
- "rlarr": "⇄",
- "rlhar": "⇌",
- "rlm": "",
- "rmoustache": "⎱",
- "rmoust": "⎱",
- "rnmid": "⫮",
- "roang": "⟭",
- "roarr": "⇾",
- "robrk": "⟧",
- "ropar": "⦆",
- "ropf": "𝕣",
- "Ropf": "ℝ",
- "roplus": "⨮",
- "rotimes": "⨵",
- "RoundImplies": "⥰",
- "rpar": ")",
- "rpargt": "⦔",
- "rppolint": "⨒",
- "rrarr": "⇉",
- "Rrightarrow": "⇛",
- "rsaquo": "›",
- "rscr": "𝓇",
- "Rscr": "ℛ",
- "rsh": "↱",
- "Rsh": "↱",
- "rsqb": "]",
- "rsquo": "’",
- "rsquor": "’",
- "rthree": "⋌",
- "rtimes": "⋊",
- "rtri": "▹",
- "rtrie": "⊵",
- "rtrif": "▸",
- "rtriltri": "⧎",
- "RuleDelayed": "⧴",
- "ruluhar": "⥨",
- "rx": "℞",
- "Sacute": "Ś",
- "sacute": "ś",
- "sbquo": "‚",
- "scap": "⪸",
- "Scaron": "Š",
- "scaron": "š",
- "Sc": "⪼",
- "sc": "≻",
- "sccue": "≽",
- "sce": "⪰",
- "scE": "⪴",
- "Scedil": "Ş",
- "scedil": "ş",
- "Scirc": "Ŝ",
- "scirc": "ŝ",
- "scnap": "⪺",
- "scnE": "⪶",
- "scnsim": "⋩",
- "scpolint": "⨓",
- "scsim": "≿",
- "Scy": "С",
- "scy": "с",
- "sdotb": "⊡",
- "sdot": "⋅",
- "sdote": "⩦",
- "searhk": "⤥",
- "searr": "↘",
- "seArr": "⇘",
- "searrow": "↘",
- "sect": "§",
- "semi": ";",
- "seswar": "⤩",
- "setminus": "∖",
- "setmn": "∖",
- "sext": "✶",
- "Sfr": "𝔖",
- "sfr": "𝔰",
- "sfrown": "⌢",
- "sharp": "♯",
- "SHCHcy": "Щ",
- "shchcy": "щ",
- "SHcy": "Ш",
- "shcy": "ш",
- "ShortDownArrow": "↓",
- "ShortLeftArrow": "←",
- "shortmid": "∣",
- "shortparallel": "∥",
- "ShortRightArrow": "→",
- "ShortUpArrow": "↑",
- "shy": "",
- "Sigma": "Σ",
- "sigma": "σ",
- "sigmaf": "ς",
- "sigmav": "ς",
- "sim": "∼",
- "simdot": "⩪",
- "sime": "≃",
- "simeq": "≃",
- "simg": "⪞",
- "simgE": "⪠",
- "siml": "⪝",
- "simlE": "⪟",
- "simne": "≆",
- "simplus": "⨤",
- "simrarr": "⥲",
- "slarr": "←",
- "SmallCircle": "∘",
- "smallsetminus": "∖",
- "smashp": "⨳",
- "smeparsl": "⧤",
- "smid": "∣",
- "smile": "⌣",
- "smt": "⪪",
- "smte": "⪬",
- "smtes": "⪬︀",
- "SOFTcy": "Ь",
- "softcy": "ь",
- "solbar": "⌿",
- "solb": "⧄",
- "sol": "/",
- "Sopf": "𝕊",
- "sopf": "𝕤",
- "spades": "♠",
- "spadesuit": "♠",
- "spar": "∥",
- "sqcap": "⊓",
- "sqcaps": "⊓︀",
- "sqcup": "⊔",
- "sqcups": "⊔︀",
- "Sqrt": "√",
- "sqsub": "⊏",
- "sqsube": "⊑",
- "sqsubset": "⊏",
- "sqsubseteq": "⊑",
- "sqsup": "⊐",
- "sqsupe": "⊒",
- "sqsupset": "⊐",
- "sqsupseteq": "⊒",
- "square": "□",
- "Square": "□",
- "SquareIntersection": "⊓",
- "SquareSubset": "⊏",
- "SquareSubsetEqual": "⊑",
- "SquareSuperset": "⊐",
- "SquareSupersetEqual": "⊒",
- "SquareUnion": "⊔",
- "squarf": "▪",
- "squ": "□",
- "squf": "▪",
- "srarr": "→",
- "Sscr": "𝒮",
- "sscr": "𝓈",
- "ssetmn": "∖",
- "ssmile": "⌣",
- "sstarf": "⋆",
- "Star": "⋆",
- "star": "☆",
- "starf": "★",
- "straightepsilon": "ϵ",
- "straightphi": "ϕ",
- "strns": "¯",
- "sub": "⊂",
- "Sub": "⋐",
- "subdot": "⪽",
- "subE": "⫅",
- "sube": "⊆",
- "subedot": "⫃",
- "submult": "⫁",
- "subnE": "⫋",
- "subne": "⊊",
- "subplus": "⪿",
- "subrarr": "⥹",
- "subset": "⊂",
- "Subset": "⋐",
- "subseteq": "⊆",
- "subseteqq": "⫅",
- "SubsetEqual": "⊆",
- "subsetneq": "⊊",
- "subsetneqq": "⫋",
- "subsim": "⫇",
- "subsub": "⫕",
- "subsup": "⫓",
- "succapprox": "⪸",
- "succ": "≻",
- "succcurlyeq": "≽",
- "Succeeds": "≻",
- "SucceedsEqual": "⪰",
- "SucceedsSlantEqual": "≽",
- "SucceedsTilde": "≿",
- "succeq": "⪰",
- "succnapprox": "⪺",
- "succneqq": "⪶",
- "succnsim": "⋩",
- "succsim": "≿",
- "SuchThat": "∋",
- "sum": "∑",
- "Sum": "∑",
- "sung": "♪",
- "sup1": "¹",
- "sup2": "²",
- "sup3": "³",
- "sup": "⊃",
- "Sup": "⋑",
- "supdot": "⪾",
- "supdsub": "⫘",
- "supE": "⫆",
- "supe": "⊇",
- "supedot": "⫄",
- "Superset": "⊃",
- "SupersetEqual": "⊇",
- "suphsol": "⟉",
- "suphsub": "⫗",
- "suplarr": "⥻",
- "supmult": "⫂",
- "supnE": "⫌",
- "supne": "⊋",
- "supplus": "⫀",
- "supset": "⊃",
- "Supset": "⋑",
- "supseteq": "⊇",
- "supseteqq": "⫆",
- "supsetneq": "⊋",
- "supsetneqq": "⫌",
- "supsim": "⫈",
- "supsub": "⫔",
- "supsup": "⫖",
- "swarhk": "⤦",
- "swarr": "↙",
- "swArr": "⇙",
- "swarrow": "↙",
- "swnwar": "⤪",
- "szlig": "ß",
- "Tab": "\t",
- "target": "⌖",
- "Tau": "Τ",
- "tau": "τ",
- "tbrk": "⎴",
- "Tcaron": "Ť",
- "tcaron": "ť",
- "Tcedil": "Ţ",
- "tcedil": "ţ",
- "Tcy": "Т",
- "tcy": "т",
- "tdot": "⃛",
- "telrec": "⌕",
- "Tfr": "𝔗",
- "tfr": "𝔱",
- "there4": "∴",
- "therefore": "∴",
- "Therefore": "∴",
- "Theta": "Θ",
- "theta": "θ",
- "thetasym": "ϑ",
- "thetav": "ϑ",
- "thickapprox": "≈",
- "thicksim": "∼",
- "ThickSpace": " ",
- "ThinSpace": " ",
- "thinsp": " ",
- "thkap": "≈",
- "thksim": "∼",
- "THORN": "Þ",
- "thorn": "þ",
- "tilde": "˜",
- "Tilde": "∼",
- "TildeEqual": "≃",
- "TildeFullEqual": "≅",
- "TildeTilde": "≈",
- "timesbar": "⨱",
- "timesb": "⊠",
- "times": "×",
- "timesd": "⨰",
- "tint": "∭",
- "toea": "⤨",
- "topbot": "⌶",
- "topcir": "⫱",
- "top": "⊤",
- "Topf": "𝕋",
- "topf": "𝕥",
- "topfork": "⫚",
- "tosa": "⤩",
- "tprime": "‴",
- "trade": "™",
- "TRADE": "™",
- "triangle": "▵",
- "triangledown": "▿",
- "triangleleft": "◃",
- "trianglelefteq": "⊴",
- "triangleq": "≜",
- "triangleright": "▹",
- "trianglerighteq": "⊵",
- "tridot": "◬",
- "trie": "≜",
- "triminus": "⨺",
- "TripleDot": "⃛",
- "triplus": "⨹",
- "trisb": "⧍",
- "tritime": "⨻",
- "trpezium": "⏢",
- "Tscr": "𝒯",
- "tscr": "𝓉",
- "TScy": "Ц",
- "tscy": "ц",
- "TSHcy": "Ћ",
- "tshcy": "ћ",
- "Tstrok": "Ŧ",
- "tstrok": "ŧ",
- "twixt": "≬",
- "twoheadleftarrow": "↞",
- "twoheadrightarrow": "↠",
- "Uacute": "Ú",
- "uacute": "ú",
- "uarr": "↑",
- "Uarr": "↟",
- "uArr": "⇑",
- "Uarrocir": "⥉",
- "Ubrcy": "Ў",
- "ubrcy": "ў",
- "Ubreve": "Ŭ",
- "ubreve": "ŭ",
- "Ucirc": "Û",
- "ucirc": "û",
- "Ucy": "У",
- "ucy": "у",
- "udarr": "⇅",
- "Udblac": "Ű",
- "udblac": "ű",
- "udhar": "⥮",
- "ufisht": "⥾",
- "Ufr": "𝔘",
- "ufr": "𝔲",
- "Ugrave": "Ù",
- "ugrave": "ù",
- "uHar": "⥣",
- "uharl": "↿",
- "uharr": "↾",
- "uhblk": "▀",
- "ulcorn": "⌜",
- "ulcorner": "⌜",
- "ulcrop": "⌏",
- "ultri": "◸",
- "Umacr": "Ū",
- "umacr": "ū",
- "uml": "¨",
- "UnderBar": "_",
- "UnderBrace": "⏟",
- "UnderBracket": "⎵",
- "UnderParenthesis": "⏝",
- "Union": "⋃",
- "UnionPlus": "⊎",
- "Uogon": "Ų",
- "uogon": "ų",
- "Uopf": "𝕌",
- "uopf": "𝕦",
- "UpArrowBar": "⤒",
- "uparrow": "↑",
- "UpArrow": "↑",
- "Uparrow": "⇑",
- "UpArrowDownArrow": "⇅",
- "updownarrow": "↕",
- "UpDownArrow": "↕",
- "Updownarrow": "⇕",
- "UpEquilibrium": "⥮",
- "upharpoonleft": "↿",
- "upharpoonright": "↾",
- "uplus": "⊎",
- "UpperLeftArrow": "↖",
- "UpperRightArrow": "↗",
- "upsi": "υ",
- "Upsi": "ϒ",
- "upsih": "ϒ",
- "Upsilon": "Υ",
- "upsilon": "υ",
- "UpTeeArrow": "↥",
- "UpTee": "⊥",
- "upuparrows": "⇈",
- "urcorn": "⌝",
- "urcorner": "⌝",
- "urcrop": "⌎",
- "Uring": "Ů",
- "uring": "ů",
- "urtri": "◹",
- "Uscr": "𝒰",
- "uscr": "𝓊",
- "utdot": "⋰",
- "Utilde": "Ũ",
- "utilde": "ũ",
- "utri": "▵",
- "utrif": "▴",
- "uuarr": "⇈",
- "Uuml": "Ü",
- "uuml": "ü",
- "uwangle": "⦧",
- "vangrt": "⦜",
- "varepsilon": "ϵ",
- "varkappa": "ϰ",
- "varnothing": "∅",
- "varphi": "ϕ",
- "varpi": "ϖ",
- "varpropto": "∝",
- "varr": "↕",
- "vArr": "⇕",
- "varrho": "ϱ",
- "varsigma": "ς",
- "varsubsetneq": "⊊︀",
- "varsubsetneqq": "⫋︀",
- "varsupsetneq": "⊋︀",
- "varsupsetneqq": "⫌︀",
- "vartheta": "ϑ",
- "vartriangleleft": "⊲",
- "vartriangleright": "⊳",
- "vBar": "⫨",
- "Vbar": "⫫",
- "vBarv": "⫩",
- "Vcy": "В",
- "vcy": "в",
- "vdash": "⊢",
- "vDash": "⊨",
- "Vdash": "⊩",
- "VDash": "⊫",
- "Vdashl": "⫦",
- "veebar": "⊻",
- "vee": "∨",
- "Vee": "⋁",
- "veeeq": "≚",
- "vellip": "⋮",
- "verbar": "|",
- "Verbar": "‖",
- "vert": "|",
- "Vert": "‖",
- "VerticalBar": "∣",
- "VerticalLine": "|",
- "VerticalSeparator": "❘",
- "VerticalTilde": "≀",
- "VeryThinSpace": " ",
- "Vfr": "𝔙",
- "vfr": "𝔳",
- "vltri": "⊲",
- "vnsub": "⊂⃒",
- "vnsup": "⊃⃒",
- "Vopf": "𝕍",
- "vopf": "𝕧",
- "vprop": "∝",
- "vrtri": "⊳",
- "Vscr": "𝒱",
- "vscr": "𝓋",
- "vsubnE": "⫋︀",
- "vsubne": "⊊︀",
- "vsupnE": "⫌︀",
- "vsupne": "⊋︀",
- "Vvdash": "⊪",
- "vzigzag": "⦚",
- "Wcirc": "Ŵ",
- "wcirc": "ŵ",
- "wedbar": "⩟",
- "wedge": "∧",
- "Wedge": "⋀",
- "wedgeq": "≙",
- "weierp": "℘",
- "Wfr": "𝔚",
- "wfr": "𝔴",
- "Wopf": "𝕎",
- "wopf": "𝕨",
- "wp": "℘",
- "wr": "≀",
- "wreath": "≀",
- "Wscr": "𝒲",
- "wscr": "𝓌",
- "xcap": "⋂",
- "xcirc": "◯",
- "xcup": "⋃",
- "xdtri": "▽",
- "Xfr": "𝔛",
- "xfr": "𝔵",
- "xharr": "⟷",
- "xhArr": "⟺",
- "Xi": "Ξ",
- "xi": "ξ",
- "xlarr": "⟵",
- "xlArr": "⟸",
- "xmap": "⟼",
- "xnis": "⋻",
- "xodot": "⨀",
- "Xopf": "𝕏",
- "xopf": "𝕩",
- "xoplus": "⨁",
- "xotime": "⨂",
- "xrarr": "⟶",
- "xrArr": "⟹",
- "Xscr": "𝒳",
- "xscr": "𝓍",
- "xsqcup": "⨆",
- "xuplus": "⨄",
- "xutri": "△",
- "xvee": "⋁",
- "xwedge": "⋀",
- "Yacute": "Ý",
- "yacute": "ý",
- "YAcy": "Я",
- "yacy": "я",
- "Ycirc": "Ŷ",
- "ycirc": "ŷ",
- "Ycy": "Ы",
- "ycy": "ы",
- "yen": "¥",
- "Yfr": "𝔜",
- "yfr": "𝔶",
- "YIcy": "Ї",
- "yicy": "ї",
- "Yopf": "𝕐",
- "yopf": "𝕪",
- "Yscr": "𝒴",
- "yscr": "𝓎",
- "YUcy": "Ю",
- "yucy": "ю",
- "yuml": "ÿ",
- "Yuml": "Ÿ",
- "Zacute": "Ź",
- "zacute": "ź",
- "Zcaron": "Ž",
- "zcaron": "ž",
- "Zcy": "З",
- "zcy": "з",
- "Zdot": "Ż",
- "zdot": "ż",
- "zeetrf": "ℨ",
- "ZeroWidthSpace": "",
- "Zeta": "Ζ",
- "zeta": "ζ",
- "zfr": "𝔷",
- "Zfr": "ℨ",
- "ZHcy": "Ж",
- "zhcy": "ж",
- "zigrarr": "⇝",
- "zopf": "𝕫",
- "Zopf": "ℤ",
- "Zscr": "𝒵",
- "zscr": "𝓏",
- "zwj": "",
- "zwnj": ""
- };
- /***/ }),
- /* 25 */
- /***/ (function(module, exports) {
- // removed by extract-text-webpack-plugin
- /***/ }),
- /* 26 */
- /***/ (function(module, exports) {
- // removed by extract-text-webpack-plugin
- /***/ }),
- /* 27 */
- /***/ (function(module, exports) {
- // removed by extract-text-webpack-plugin
- /***/ }),
- /* 28 */
- /***/ (function(module, exports) {
- // removed by extract-text-webpack-plugin
- /***/ }),
- /* 29 */,
- /* 30 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- ////////////////////////////////////////////////////////////////////////////////
- // Helpers
- // Merge objects
- //
- function assign(obj /*from1, from2, from3, ...*/) {
- var sources = Array.prototype.slice.call(arguments, 1);
- sources.forEach(function (source) {
- if (!source) { return; }
- Object.keys(source).forEach(function (key) {
- obj[key] = source[key];
- });
- });
- return obj;
- }
- function _class(obj) { return Object.prototype.toString.call(obj); }
- function isString(obj) { return _class(obj) === '[object String]'; }
- function isObject(obj) { return _class(obj) === '[object Object]'; }
- function isRegExp(obj) { return _class(obj) === '[object RegExp]'; }
- function isFunction(obj) { return _class(obj) === '[object Function]'; }
- function escapeRE(str) { return str.replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&'); }
- ////////////////////////////////////////////////////////////////////////////////
- var defaultOptions = {
- fuzzyLink: true,
- fuzzyEmail: true,
- fuzzyIP: false
- };
- function isOptionsObj(obj) {
- return Object.keys(obj || {}).reduce(function (acc, k) {
- return acc || defaultOptions.hasOwnProperty(k);
- }, false);
- }
- var defaultSchemas = {
- 'http:': {
- validate: function (text, pos, self) {
- var tail = text.slice(pos);
- if (!self.re.http) {
- // compile lazily, because "host"-containing variables can change on tlds update.
- self.re.http = new RegExp(
- '^\\/\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'
- );
- }
- if (self.re.http.test(tail)) {
- return tail.match(self.re.http)[0].length;
- }
- return 0;
- }
- },
- 'https:': 'http:',
- 'ftp:': 'http:',
- '//': {
- validate: function (text, pos, self) {
- var tail = text.slice(pos);
- if (!self.re.no_http) {
- // compile lazily, because "host"-containing variables can change on tlds update.
- self.re.no_http = new RegExp(
- '^' +
- self.re.src_auth +
- // Don't allow single-level domains, because of false positives like '//test'
- // with code comments
- '(?:localhost|(?:(?:' + self.re.src_domain + ')\\.)+' + self.re.src_domain_root + ')' +
- self.re.src_port +
- self.re.src_host_terminator +
- self.re.src_path,
- 'i'
- );
- }
- if (self.re.no_http.test(tail)) {
- // should not be `://` & `///`, that protects from errors in protocol name
- if (pos >= 3 && text[pos - 3] === ':') { return 0; }
- if (pos >= 3 && text[pos - 3] === '/') { return 0; }
- return tail.match(self.re.no_http)[0].length;
- }
- return 0;
- }
- },
- 'mailto:': {
- validate: function (text, pos, self) {
- var tail = text.slice(pos);
- if (!self.re.mailto) {
- self.re.mailto = new RegExp(
- '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'
- );
- }
- if (self.re.mailto.test(tail)) {
- return tail.match(self.re.mailto)[0].length;
- }
- return 0;
- }
- }
- };
- /*eslint-disable max-len*/
- // RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js)
- var tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]';
- // DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead
- var tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|');
- /*eslint-enable max-len*/
- ////////////////////////////////////////////////////////////////////////////////
- function resetScanCache(self) {
- self.__index__ = -1;
- self.__text_cache__ = '';
- }
- function createValidator(re) {
- return function (text, pos) {
- var tail = text.slice(pos);
- if (re.test(tail)) {
- return tail.match(re)[0].length;
- }
- return 0;
- };
- }
- function createNormalizer() {
- return function (match, self) {
- self.normalize(match);
- };
- }
- // Schemas compiler. Build regexps.
- //
- function compile(self) {
- // Load & clone RE patterns.
- var re = self.re = __webpack_require__(31)(self.__opts__);
- // Define dynamic patterns
- var tlds = self.__tlds__.slice();
- self.onCompile();
- if (!self.__tlds_replaced__) {
- tlds.push(tlds_2ch_src_re);
- }
- tlds.push(re.src_xn);
- re.src_tlds = tlds.join('|');
- function untpl(tpl) { return tpl.replace('%TLDS%', re.src_tlds); }
- re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i');
- re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i');
- re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i');
- re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i');
- //
- // Compile each schema
- //
- var aliases = [];
- self.__compiled__ = {}; // Reset compiled data
- function schemaError(name, val) {
- throw new Error('(LinkifyIt) Invalid schema "' + name + '": ' + val);
- }
- Object.keys(self.__schemas__).forEach(function (name) {
- var val = self.__schemas__[name];
- // skip disabled methods
- if (val === null) { return; }
- var compiled = { validate: null, link: null };
- self.__compiled__[name] = compiled;
- if (isObject(val)) {
- if (isRegExp(val.validate)) {
- compiled.validate = createValidator(val.validate);
- } else if (isFunction(val.validate)) {
- compiled.validate = val.validate;
- } else {
- schemaError(name, val);
- }
- if (isFunction(val.normalize)) {
- compiled.normalize = val.normalize;
- } else if (!val.normalize) {
- compiled.normalize = createNormalizer();
- } else {
- schemaError(name, val);
- }
- return;
- }
- if (isString(val)) {
- aliases.push(name);
- return;
- }
- schemaError(name, val);
- });
- //
- // Compile postponed aliases
- //
- aliases.forEach(function (alias) {
- if (!self.__compiled__[self.__schemas__[alias]]) {
- // Silently fail on missed schemas to avoid errons on disable.
- // schemaError(alias, self.__schemas__[alias]);
- return;
- }
- self.__compiled__[alias].validate =
- self.__compiled__[self.__schemas__[alias]].validate;
- self.__compiled__[alias].normalize =
- self.__compiled__[self.__schemas__[alias]].normalize;
- });
- //
- // Fake record for guessed links
- //
- self.__compiled__[''] = { validate: null, normalize: createNormalizer() };
- //
- // Build schema condition
- //
- var slist = Object.keys(self.__compiled__)
- .filter(function (name) {
- // Filter disabled & fake schemas
- return name.length > 0 && self.__compiled__[name];
- })
- .map(escapeRE)
- .join('|');
- // (?!_) cause 1.5x slowdown
- self.re.schema_test = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i');
- self.re.schema_search = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig');
- self.re.pretest = RegExp(
- '(' + self.re.schema_test.source + ')|' +
- '(' + self.re.host_fuzzy_test.source + ')|' +
- '@',
- 'i');
- //
- // Cleanup
- //
- resetScanCache(self);
- }
- /**
- * class Match
- *
- * Match result. Single element of array, returned by [[LinkifyIt#match]]
- **/
- function Match(self, shift) {
- var start = self.__index__,
- end = self.__last_index__,
- text = self.__text_cache__.slice(start, end);
- /**
- * Match#schema -> String
- *
- * Prefix (protocol) for matched string.
- **/
- this.schema = self.__schema__.toLowerCase();
- /**
- * Match#index -> Number
- *
- * First position of matched string.
- **/
- this.index = start + shift;
- /**
- * Match#lastIndex -> Number
- *
- * Next position after matched string.
- **/
- this.lastIndex = end + shift;
- /**
- * Match#raw -> String
- *
- * Matched string.
- **/
- this.raw = text;
- /**
- * Match#text -> String
- *
- * Notmalized text of matched string.
- **/
- this.text = text;
- /**
- * Match#url -> String
- *
- * Normalized url of matched string.
- **/
- this.url = text;
- }
- function createMatch(self, shift) {
- var match = new Match(self, shift);
- self.__compiled__[match.schema].normalize(match, self);
- return match;
- }
- /**
- * class LinkifyIt
- **/
- /**
- * new LinkifyIt(schemas, options)
- * - schemas (Object): Optional. Additional schemas to validate (prefix/validator)
- * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }
- *
- * Creates new linkifier instance with optional additional schemas.
- * Can be called without `new` keyword for convenience.
- *
- * By default understands:
- *
- * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links
- * - "fuzzy" links and emails (example.com, foo@bar.com).
- *
- * `schemas` is an object, where each key/value describes protocol/rule:
- *
- * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:`
- * for example). `linkify-it` makes shure that prefix is not preceeded with
- * alphanumeric char and symbols. Only whitespaces and punctuation allowed.
- * - __value__ - rule to check tail after link prefix
- * - _String_ - just alias to existing rule
- * - _Object_
- * - _validate_ - validator function (should return matched length on success),
- * or `RegExp`.
- * - _normalize_ - optional function to normalize text & url of matched result
- * (for example, for @twitter mentions).
- *
- * `options`:
- *
- * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`.
- * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts
- * like version numbers. Default `false`.
- * - __fuzzyEmail__ - recognize emails without `mailto:` prefix.
- *
- **/
- function LinkifyIt(schemas, options) {
- if (!(this instanceof LinkifyIt)) {
- return new LinkifyIt(schemas, options);
- }
- if (!options) {
- if (isOptionsObj(schemas)) {
- options = schemas;
- schemas = {};
- }
- }
- this.__opts__ = assign({}, defaultOptions, options);
- // Cache last tested result. Used to skip repeating steps on next `match` call.
- this.__index__ = -1;
- this.__last_index__ = -1; // Next scan position
- this.__schema__ = '';
- this.__text_cache__ = '';
- this.__schemas__ = assign({}, defaultSchemas, schemas);
- this.__compiled__ = {};
- this.__tlds__ = tlds_default;
- this.__tlds_replaced__ = false;
- this.re = {};
- compile(this);
- }
- /** chainable
- * LinkifyIt#add(schema, definition)
- * - schema (String): rule name (fixed pattern prefix)
- * - definition (String|RegExp|Object): schema definition
- *
- * Add new rule definition. See constructor description for details.
- **/
- LinkifyIt.prototype.add = function add(schema, definition) {
- this.__schemas__[schema] = definition;
- compile(this);
- return this;
- };
- /** chainable
- * LinkifyIt#set(options)
- * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false }
- *
- * Set recognition options for links without schema.
- **/
- LinkifyIt.prototype.set = function set(options) {
- this.__opts__ = assign(this.__opts__, options);
- return this;
- };
- /**
- * LinkifyIt#test(text) -> Boolean
- *
- * Searches linkifiable pattern and returns `true` on success or `false` on fail.
- **/
- LinkifyIt.prototype.test = function test(text) {
- // Reset scan cache
- this.__text_cache__ = text;
- this.__index__ = -1;
- if (!text.length) { return false; }
- var m, ml, me, len, shift, next, re, tld_pos, at_pos;
- // try to scan for link with schema - that's the most simple rule
- if (this.re.schema_test.test(text)) {
- re = this.re.schema_search;
- re.lastIndex = 0;
- while ((m = re.exec(text)) !== null) {
- len = this.testSchemaAt(text, m[2], re.lastIndex);
- if (len) {
- this.__schema__ = m[2];
- this.__index__ = m.index + m[1].length;
- this.__last_index__ = m.index + m[0].length + len;
- break;
- }
- }
- }
- if (this.__opts__.fuzzyLink && this.__compiled__['http:']) {
- // guess schemaless links
- tld_pos = text.search(this.re.host_fuzzy_test);
- if (tld_pos >= 0) {
- // if tld is located after found link - no need to check fuzzy pattern
- if (this.__index__ < 0 || tld_pos < this.__index__) {
- if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) {
- shift = ml.index + ml[1].length;
- if (this.__index__ < 0 || shift < this.__index__) {
- this.__schema__ = '';
- this.__index__ = shift;
- this.__last_index__ = ml.index + ml[0].length;
- }
- }
- }
- }
- }
- if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) {
- // guess schemaless emails
- at_pos = text.indexOf('@');
- if (at_pos >= 0) {
- // We can't skip this check, because this cases are possible:
- // 192.168.1.1@gmail.com, my.in@example.com
- if ((me = text.match(this.re.email_fuzzy)) !== null) {
- shift = me.index + me[1].length;
- next = me.index + me[0].length;
- if (this.__index__ < 0 || shift < this.__index__ ||
- (shift === this.__index__ && next > this.__last_index__)) {
- this.__schema__ = 'mailto:';
- this.__index__ = shift;
- this.__last_index__ = next;
- }
- }
- }
- }
- return this.__index__ >= 0;
- };
- /**
- * LinkifyIt#pretest(text) -> Boolean
- *
- * Very quick check, that can give false positives. Returns true if link MAY BE
- * can exists. Can be used for speed optimization, when you need to check that
- * link NOT exists.
- **/
- LinkifyIt.prototype.pretest = function pretest(text) {
- return this.re.pretest.test(text);
- };
- /**
- * LinkifyIt#testSchemaAt(text, name, position) -> Number
- * - text (String): text to scan
- * - name (String): rule (schema) name
- * - position (Number): text offset to check from
- *
- * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly
- * at given position. Returns length of found pattern (0 on fail).
- **/
- LinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) {
- // If not supported schema check requested - terminate
- if (!this.__compiled__[schema.toLowerCase()]) {
- return 0;
- }
- return this.__compiled__[schema.toLowerCase()].validate(text, pos, this);
- };
- /**
- * LinkifyIt#match(text) -> Array|null
- *
- * Returns array of found link descriptions or `null` on fail. We strongly
- * recommend to use [[LinkifyIt#test]] first, for best speed.
- *
- * ##### Result match description
- *
- * - __schema__ - link schema, can be empty for fuzzy links, or `//` for
- * protocol-neutral links.
- * - __index__ - offset of matched text
- * - __lastIndex__ - index of next char after mathch end
- * - __raw__ - matched text
- * - __text__ - normalized text
- * - __url__ - link, generated from matched text
- **/
- LinkifyIt.prototype.match = function match(text) {
- var shift = 0, result = [];
- // Try to take previous element from cache, if .test() called before
- if (this.__index__ >= 0 && this.__text_cache__ === text) {
- result.push(createMatch(this, shift));
- shift = this.__last_index__;
- }
- // Cut head if cache was used
- var tail = shift ? text.slice(shift) : text;
- // Scan string until end reached
- while (this.test(tail)) {
- result.push(createMatch(this, shift));
- tail = tail.slice(this.__last_index__);
- shift += this.__last_index__;
- }
- if (result.length) {
- return result;
- }
- return null;
- };
- /** chainable
- * LinkifyIt#tlds(list [, keepOld]) -> this
- * - list (Array): list of tlds
- * - keepOld (Boolean): merge with current list if `true` (`false` by default)
- *
- * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix)
- * to avoid false positives. By default this algorythm used:
- *
- * - hostname with any 2-letter root zones are ok.
- * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф
- * are ok.
- * - encoded (`xn--...`) root zones are ok.
- *
- * If list is replaced, then exact match for 2-chars root zones will be checked.
- **/
- LinkifyIt.prototype.tlds = function tlds(list, keepOld) {
- list = Array.isArray(list) ? list : [ list ];
- if (!keepOld) {
- this.__tlds__ = list.slice();
- this.__tlds_replaced__ = true;
- compile(this);
- return this;
- }
- this.__tlds__ = this.__tlds__.concat(list)
- .sort()
- .filter(function (el, idx, arr) {
- return el !== arr[idx - 1];
- })
- .reverse();
- compile(this);
- return this;
- };
- /**
- * LinkifyIt#normalize(match)
- *
- * Default normalizer (if schema does not define it's own).
- **/
- LinkifyIt.prototype.normalize = function normalize(match) {
- // Do minimal possible changes by default. Need to collect feedback prior
- // to move forward https://github.com/markdown-it/linkify-it/issues/1
- if (!match.schema) { match.url = 'http://' + match.url; }
- if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) {
- match.url = 'mailto:' + match.url;
- }
- };
- /**
- * LinkifyIt#onCompile()
- *
- * Override to modify basic RegExp-s.
- **/
- LinkifyIt.prototype.onCompile = function onCompile() {
- };
- module.exports = LinkifyIt;
- /***/ }),
- /* 31 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports = function (opts) {
- var re = {};
- // Use direct extract instead of `regenerate` to reduse browserified size
- re.src_Any = __webpack_require__(18).source;
- re.src_Cc = __webpack_require__(16).source;
- re.src_Z = __webpack_require__(17).source;
- re.src_P = __webpack_require__(5).source;
- // \p{\Z\P\Cc\CF} (white spaces + control + format + punctuation)
- re.src_ZPCc = [ re.src_Z, re.src_P, re.src_Cc ].join('|');
- // \p{\Z\Cc} (white spaces + control)
- re.src_ZCc = [ re.src_Z, re.src_Cc ].join('|');
- // Experimental. List of chars, completely prohibited in links
- // because can separate it from other part of text
- var text_separators = '[><\uff5c]';
- // All possible word characters (everything without punctuation, spaces & controls)
- // Defined via punctuation & spaces to save space
- // Should be something like \p{\L\N\S\M} (\w but without `_`)
- re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')';
- // The same as abothe but without [0-9]
- // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')';
- ////////////////////////////////////////////////////////////////////////////////
- re.src_ip4 =
- '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)';
- // Prohibit any of "@/[]()" in user/pass to avoid wrong domain fetch.
- re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\[\\]()]).)+@)?';
- re.src_port =
- '(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?';
- re.src_host_terminator =
- '(?=$|' + text_separators + '|' + re.src_ZPCc + ')(?!-|_|:\\d|\\.-|\\.(?!$|' + re.src_ZPCc + '))';
- re.src_path =
- '(?:' +
- '[/?#]' +
- '(?:' +
- '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\]{}.,"\'?!\\-]).|' +
- '\\[(?:(?!' + re.src_ZCc + '|\\]).)*\\]|' +
- '\\((?:(?!' + re.src_ZCc + '|[)]).)*\\)|' +
- '\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\}|' +
- '\\"(?:(?!' + re.src_ZCc + '|["]).)+\\"|' +
- "\\'(?:(?!" + re.src_ZCc + "|[']).)+\\'|" +
- "\\'(?=" + re.src_pseudo_letter + '|[-]).|' + // allow `I'm_king` if no pair found
- '\\.{2,3}[a-zA-Z0-9%/]|' + // github has ... in commit range links. Restrict to
- // - english
- // - percent-encoded
- // - parts of file path
- // until more examples found.
- '\\.(?!' + re.src_ZCc + '|[.]).|' +
- (opts && opts['---'] ?
- '\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate
- :
- '\\-+|'
- ) +
- '\\,(?!' + re.src_ZCc + ').|' + // allow `,,,` in paths
- '\\!(?!' + re.src_ZCc + '|[!]).|' +
- '\\?(?!' + re.src_ZCc + '|[?]).' +
- ')+' +
- '|\\/' +
- ')?';
- re.src_email_name =
- '[\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]+';
- re.src_xn =
- 'xn--[a-z0-9\\-]{1,59}';
- // More to read about domain names
- // http://serverfault.com/questions/638260/
- re.src_domain_root =
- // Allow letters & digits (http://test1)
- '(?:' +
- re.src_xn +
- '|' +
- re.src_pseudo_letter + '{1,63}' +
- ')';
- re.src_domain =
- '(?:' +
- re.src_xn +
- '|' +
- '(?:' + re.src_pseudo_letter + ')' +
- '|' +
- // don't allow `--` in domain names, because:
- // - that can conflict with markdown — / –
- // - nobody use those anyway
- '(?:' + re.src_pseudo_letter + '(?:-(?!-)|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' +
- ')';
- re.src_host =
- '(?:' +
- // Don't need IP check, because digits are already allowed in normal domain names
- // src_ip4 +
- // '|' +
- '(?:(?:(?:' + re.src_domain + ')\\.)*' + re.src_domain/*_root*/ + ')' +
- ')';
- re.tpl_host_fuzzy =
- '(?:' +
- re.src_ip4 +
- '|' +
- '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))' +
- ')';
- re.tpl_host_no_ip_fuzzy =
- '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))';
- re.src_host_strict =
- re.src_host + re.src_host_terminator;
- re.tpl_host_fuzzy_strict =
- re.tpl_host_fuzzy + re.src_host_terminator;
- re.src_host_port_strict =
- re.src_host + re.src_port + re.src_host_terminator;
- re.tpl_host_port_fuzzy_strict =
- re.tpl_host_fuzzy + re.src_port + re.src_host_terminator;
- re.tpl_host_port_no_ip_fuzzy_strict =
- re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator;
- ////////////////////////////////////////////////////////////////////////////////
- // Main rules
- // Rude test fuzzy links by host, for quick deny
- re.tpl_host_fuzzy_test =
- 'localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))';
- re.tpl_email_fuzzy =
- '(^|' + text_separators + '|\\(|' + re.src_ZCc + ')(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')';
- re.tpl_link_fuzzy =
- // Fuzzy link can't be prepended with .:/\- and non punctuation.
- // but can start with > (markdown blockquote)
- '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' +
- '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')';
- re.tpl_link_no_ip_fuzzy =
- // Fuzzy link can't be prepended with .:/\- and non punctuation.
- // but can start with > (markdown blockquote)
- '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' +
- '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')';
- return re;
- };
- /***/ }),
- /* 32 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // List of valid html blocks names, accorting to commonmark spec
- // http://jgm.github.io/CommonMark/spec.html#html-blocks
- module.exports = [
- 'address',
- 'article',
- 'aside',
- 'base',
- 'basefont',
- 'blockquote',
- 'body',
- 'caption',
- 'center',
- 'col',
- 'colgroup',
- 'dd',
- 'details',
- 'dialog',
- 'dir',
- 'div',
- 'dl',
- 'dt',
- 'fieldset',
- 'figcaption',
- 'figure',
- 'footer',
- 'form',
- 'frame',
- 'frameset',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'head',
- 'header',
- 'hr',
- 'html',
- 'iframe',
- 'legend',
- 'li',
- 'link',
- 'main',
- 'menu',
- 'menuitem',
- 'meta',
- 'nav',
- 'noframes',
- 'ol',
- 'optgroup',
- 'option',
- 'p',
- 'param',
- 'pre',
- 'section',
- 'source',
- 'title',
- 'summary',
- 'table',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'title',
- 'tr',
- 'track',
- 'ul'
- ];
- /***/ }),
- /* 33 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Just a shortcut for bulk export
- exports.parseLinkLabel = __webpack_require__(35);
- exports.parseLinkDestination = __webpack_require__(34);
- exports.parseLinkTitle = __webpack_require__(36);
- /***/ }),
- /* 34 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Parse link destination
- //
- var isSpace = __webpack_require__(0).isSpace;
- var unescapeAll = __webpack_require__(0).unescapeAll;
- module.exports = function parseLinkDestination(str, pos, max) {
- var code, level,
- lines = 0,
- start = pos,
- result = {
- ok: false,
- pos: 0,
- lines: 0,
- str: ''
- };
- if (str.charCodeAt(pos) === 0x3C /* < */) {
- pos++;
- while (pos < max) {
- code = str.charCodeAt(pos);
- if (code === 0x0A /* \n */ || isSpace(code)) { return result; }
- if (code === 0x3E /* > */) {
- result.pos = pos + 1;
- result.str = unescapeAll(str.slice(start + 1, pos));
- result.ok = true;
- return result;
- }
- if (code === 0x5C /* \ */ && pos + 1 < max) {
- pos += 2;
- continue;
- }
- pos++;
- }
- // no closing '>'
- return result;
- }
- // this should be ... } else { ... branch
- level = 0;
- while (pos < max) {
- code = str.charCodeAt(pos);
- if (code === 0x20) { break; }
- // ascii control characters
- if (code < 0x20 || code === 0x7F) { break; }
- if (code === 0x5C /* \ */ && pos + 1 < max) {
- pos += 2;
- continue;
- }
- if (code === 0x28 /* ( */) {
- level++;
- if (level > 1) { break; }
- }
- if (code === 0x29 /* ) */) {
- level--;
- if (level < 0) { break; }
- }
- pos++;
- }
- if (start === pos) { return result; }
- result.str = unescapeAll(str.slice(start, pos));
- result.lines = lines;
- result.pos = pos;
- result.ok = true;
- return result;
- };
- /***/ }),
- /* 35 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Parse link label
- //
- // this function assumes that first character ("[") already matches;
- // returns the end of the label
- //
- module.exports = function parseLinkLabel(state, start, disableNested) {
- var level, found, marker, prevPos,
- labelEnd = -1,
- max = state.posMax,
- oldPos = state.pos;
- state.pos = start + 1;
- level = 1;
- while (state.pos < max) {
- marker = state.src.charCodeAt(state.pos);
- if (marker === 0x5D /* ] */) {
- level--;
- if (level === 0) {
- found = true;
- break;
- }
- }
- prevPos = state.pos;
- state.md.inline.skipToken(state);
- if (marker === 0x5B /* [ */) {
- if (prevPos === state.pos - 1) {
- // increase level if we find text `[`, which is not a part of any token
- level++;
- } else if (disableNested) {
- state.pos = oldPos;
- return -1;
- }
- }
- }
- if (found) {
- labelEnd = state.pos;
- }
- // restore old state
- state.pos = oldPos;
- return labelEnd;
- };
- /***/ }),
- /* 36 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Parse link title
- //
- var unescapeAll = __webpack_require__(0).unescapeAll;
- module.exports = function parseLinkTitle(str, pos, max) {
- var code,
- marker,
- lines = 0,
- start = pos,
- result = {
- ok: false,
- pos: 0,
- lines: 0,
- str: ''
- };
- if (pos >= max) { return result; }
- marker = str.charCodeAt(pos);
- if (marker !== 0x22 /* " */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { return result; }
- pos++;
- // if opening marker is "(", switch it to closing marker ")"
- if (marker === 0x28) { marker = 0x29; }
- while (pos < max) {
- code = str.charCodeAt(pos);
- if (code === marker) {
- result.pos = pos + 1;
- result.lines = lines;
- result.str = unescapeAll(str.slice(start + 1, pos));
- result.ok = true;
- return result;
- } else if (code === 0x0A) {
- lines++;
- } else if (code === 0x5C /* \ */ && pos + 1 < max) {
- pos++;
- if (str.charCodeAt(pos) === 0x0A) {
- lines++;
- }
- }
- pos++;
- }
- return result;
- };
- /***/ }),
- /* 37 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Main parser class
- var utils = __webpack_require__(0);
- var helpers = __webpack_require__(33);
- var Renderer = __webpack_require__(44);
- var ParserCore = __webpack_require__(39);
- var ParserBlock = __webpack_require__(38);
- var ParserInline = __webpack_require__(40);
- var LinkifyIt = __webpack_require__(30);
- var mdurl = __webpack_require__(15);
- var punycode = __webpack_require__(81);
- var config = {
- 'default': __webpack_require__(42),
- zero: __webpack_require__(43),
- commonmark: __webpack_require__(41)
- };
- ////////////////////////////////////////////////////////////////////////////////
- //
- // This validator can prohibit more than really needed to prevent XSS. It's a
- // tradeoff to keep code simple and to be secure by default.
- //
- // If you need different setup - override validator method as you wish. Or
- // replace it with dummy function and use external sanitizer.
- //
- var BAD_PROTO_RE = /^(vbscript|javascript|file|data):/;
- var GOOD_DATA_RE = /^data:image\/(gif|png|jpeg|webp);/;
- function validateLink(url) {
- // url should be normalized at this point, and existing entities are decoded
- var str = url.trim().toLowerCase();
- return BAD_PROTO_RE.test(str) ? (GOOD_DATA_RE.test(str) ? true : false) : true;
- }
- ////////////////////////////////////////////////////////////////////////////////
- var RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ];
- function normalizeLink(url) {
- var parsed = mdurl.parse(url, true);
- if (parsed.hostname) {
- // Encode hostnames in urls like:
- // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`
- //
- // We don't encode unknown schemas, because it's likely that we encode
- // something we shouldn't (e.g. `skype:name` treated as `skype:host`)
- //
- if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {
- try {
- parsed.hostname = punycode.toASCII(parsed.hostname);
- } catch (er) { /**/ }
- }
- }
- return mdurl.encode(mdurl.format(parsed));
- }
- function normalizeLinkText(url) {
- var parsed = mdurl.parse(url, true);
- if (parsed.hostname) {
- // Encode hostnames in urls like:
- // `http://host/`, `https://host/`, `mailto:user@host`, `//host/`
- //
- // We don't encode unknown schemas, because it's likely that we encode
- // something we shouldn't (e.g. `skype:name` treated as `skype:host`)
- //
- if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) {
- try {
- parsed.hostname = punycode.toUnicode(parsed.hostname);
- } catch (er) { /**/ }
- }
- }
- return mdurl.decode(mdurl.format(parsed));
- }
- /**
- * class MarkdownIt
- *
- * Main parser/renderer class.
- *
- * ##### Usage
- *
- * ```javascript
- * // node.js, "classic" way:
- * var MarkdownIt = require('markdown-it'),
- * md = new MarkdownIt();
- * var result = md.render('# markdown-it rulezz!');
- *
- * // node.js, the same, but with sugar:
- * var md = require('markdown-it')();
- * var result = md.render('# markdown-it rulezz!');
- *
- * // browser without AMD, added to "window" on script load
- * // Note, there are no dash.
- * var md = window.markdownit();
- * var result = md.render('# markdown-it rulezz!');
- * ```
- *
- * Single line rendering, without paragraph wrap:
- *
- * ```javascript
- * var md = require('markdown-it')();
- * var result = md.renderInline('__markdown-it__ rulezz!');
- * ```
- **/
- /**
- * new MarkdownIt([presetName, options])
- * - presetName (String): optional, `commonmark` / `zero`
- * - options (Object)
- *
- * Creates parser instanse with given config. Can be called without `new`.
- *
- * ##### presetName
- *
- * MarkdownIt provides named presets as a convenience to quickly
- * enable/disable active syntax rules and options for common use cases.
- *
- * - ["commonmark"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.js) -
- * configures parser to strict [CommonMark](http://commonmark.org/) mode.
- * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.js) -
- * similar to GFM, used when no preset name given. Enables all available rules,
- * but still without html, typographer & autolinker.
- * - ["zero"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js) -
- * all rules disabled. Useful to quickly setup your config via `.enable()`.
- * For example, when you need only `bold` and `italic` markup and nothing else.
- *
- * ##### options:
- *
- * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful!
- * That's not safe! You may need external sanitizer to protect output from XSS.
- * It's better to extend features via plugins, instead of enabling HTML.
- * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags
- * (`<br />`). This is needed only for full CommonMark compatibility. In real
- * world you will need HTML output.
- * - __breaks__ - `false`. Set `true` to convert `\n` in paragraphs into `<br>`.
- * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks.
- * Can be useful for external highlighters.
- * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links.
- * - __typographer__ - `false`. Set `true` to enable [some language-neutral
- * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js) +
- * quotes beautification (smartquotes).
- * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement
- * pairs, when typographer enabled and smartquotes on. For example, you can
- * use `'«»„“'` for Russian, `'„“‚‘'` for German, and
- * `['«\xA0', '\xA0»', '‹\xA0', '\xA0›']` for French (including nbsp).
- * - __highlight__ - `null`. Highlighter function for fenced code blocks.
- * Highlighter `function (str, lang)` should return escaped HTML. It can also
- * return empty string if the source was not changed and should be escaped
- * externaly. If result starts with <pre... internal wrapper is skipped.
- *
- * ##### Example
- *
- * ```javascript
- * // commonmark mode
- * var md = require('markdown-it')('commonmark');
- *
- * // default mode
- * var md = require('markdown-it')();
- *
- * // enable everything
- * var md = require('markdown-it')({
- * html: true,
- * linkify: true,
- * typographer: true
- * });
- * ```
- *
- * ##### Syntax highlighting
- *
- * ```js
- * var hljs = require('highlight.js') // https://highlightjs.org/
- *
- * var md = require('markdown-it')({
- * highlight: function (str, lang) {
- * if (lang && hljs.getLanguage(lang)) {
- * try {
- * return hljs.highlight(lang, str, true).value;
- * } catch (__) {}
- * }
- *
- * return ''; // use external default escaping
- * }
- * });
- * ```
- *
- * Or with full wrapper override (if you need assign class to `<pre>`):
- *
- * ```javascript
- * var hljs = require('highlight.js') // https://highlightjs.org/
- *
- * // Actual default values
- * var md = require('markdown-it')({
- * highlight: function (str, lang) {
- * if (lang && hljs.getLanguage(lang)) {
- * try {
- * return '<pre class="hljs"><code>' +
- * hljs.highlight(lang, str, true).value +
- * '</code></pre>';
- * } catch (__) {}
- * }
- *
- * return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>';
- * }
- * });
- * ```
- *
- **/
- function MarkdownIt(presetName, options) {
- if (!(this instanceof MarkdownIt)) {
- return new MarkdownIt(presetName, options);
- }
- if (!options) {
- if (!utils.isString(presetName)) {
- options = presetName || {};
- presetName = 'default';
- }
- }
- /**
- * MarkdownIt#inline -> ParserInline
- *
- * Instance of [[ParserInline]]. You may need it to add new rules when
- * writing plugins. For simple rules control use [[MarkdownIt.disable]] and
- * [[MarkdownIt.enable]].
- **/
- this.inline = new ParserInline();
- /**
- * MarkdownIt#block -> ParserBlock
- *
- * Instance of [[ParserBlock]]. You may need it to add new rules when
- * writing plugins. For simple rules control use [[MarkdownIt.disable]] and
- * [[MarkdownIt.enable]].
- **/
- this.block = new ParserBlock();
- /**
- * MarkdownIt#core -> Core
- *
- * Instance of [[Core]] chain executor. You may need it to add new rules when
- * writing plugins. For simple rules control use [[MarkdownIt.disable]] and
- * [[MarkdownIt.enable]].
- **/
- this.core = new ParserCore();
- /**
- * MarkdownIt#renderer -> Renderer
- *
- * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering
- * rules for new token types, generated by plugins.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')();
- *
- * function myToken(tokens, idx, options, env, self) {
- * //...
- * return result;
- * };
- *
- * md.renderer.rules['my_token'] = myToken
- * ```
- *
- * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js).
- **/
- this.renderer = new Renderer();
- /**
- * MarkdownIt#linkify -> LinkifyIt
- *
- * [linkify-it](https://github.com/markdown-it/linkify-it) instance.
- * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.js)
- * rule.
- **/
- this.linkify = new LinkifyIt();
- /**
- * MarkdownIt#validateLink(url) -> Boolean
- *
- * Link validation function. CommonMark allows too much in links. By default
- * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas
- * except some embedded image types.
- *
- * You can change this behaviour:
- *
- * ```javascript
- * var md = require('markdown-it')();
- * // enable everything
- * md.validateLink = function () { return true; }
- * ```
- **/
- this.validateLink = validateLink;
- /**
- * MarkdownIt#normalizeLink(url) -> String
- *
- * Function used to encode link url to a machine-readable format,
- * which includes url-encoding, punycode, etc.
- **/
- this.normalizeLink = normalizeLink;
- /**
- * MarkdownIt#normalizeLinkText(url) -> String
- *
- * Function used to decode link url to a human-readable format`
- **/
- this.normalizeLinkText = normalizeLinkText;
- // Expose utils & helpers for easy acces from plugins
- /**
- * MarkdownIt#utils -> utils
- *
- * Assorted utility functions, useful to write plugins. See details
- * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).
- **/
- this.utils = utils;
- /**
- * MarkdownIt#helpers -> helpers
- *
- * Link components parser functions, useful to write plugins. See details
- * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).
- **/
- this.helpers = utils.assign({}, helpers);
- this.options = {};
- this.configure(presetName);
- if (options) { this.set(options); }
- }
- /** chainable
- * MarkdownIt.set(options)
- *
- * Set parser options (in the same format as in constructor). Probably, you
- * will never need it, but you can change options after constructor call.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')()
- * .set({ html: true, breaks: true })
- * .set({ typographer, true });
- * ```
- *
- * __Note:__ To achieve the best possible performance, don't modify a
- * `markdown-it` instance options on the fly. If you need multiple configurations
- * it's best to create multiple instances and initialize each with separate
- * config.
- **/
- MarkdownIt.prototype.set = function (options) {
- utils.assign(this.options, options);
- return this;
- };
- /** chainable, internal
- * MarkdownIt.configure(presets)
- *
- * Batch load of all options and compenent settings. This is internal method,
- * and you probably will not need it. But if you with - see available presets
- * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets)
- *
- * We strongly recommend to use presets instead of direct config loads. That
- * will give better compatibility with next versions.
- **/
- MarkdownIt.prototype.configure = function (presets) {
- var self = this, presetName;
- if (utils.isString(presets)) {
- presetName = presets;
- presets = config[presetName];
- if (!presets) { throw new Error('Wrong `markdown-it` preset "' + presetName + '", check name'); }
- }
- if (!presets) { throw new Error('Wrong `markdown-it` preset, can\'t be empty'); }
- if (presets.options) { self.set(presets.options); }
- if (presets.components) {
- Object.keys(presets.components).forEach(function (name) {
- if (presets.components[name].rules) {
- self[name].ruler.enableOnly(presets.components[name].rules);
- }
- if (presets.components[name].rules2) {
- self[name].ruler2.enableOnly(presets.components[name].rules2);
- }
- });
- }
- return this;
- };
- /** chainable
- * MarkdownIt.enable(list, ignoreInvalid)
- * - list (String|Array): rule name or list of rule names to enable
- * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.
- *
- * Enable list or rules. It will automatically find appropriate components,
- * containing rules with given names. If rule not found, and `ignoreInvalid`
- * not set - throws exception.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')()
- * .enable(['sub', 'sup'])
- * .disable('smartquotes');
- * ```
- **/
- MarkdownIt.prototype.enable = function (list, ignoreInvalid) {
- var result = [];
- if (!Array.isArray(list)) { list = [ list ]; }
- [ 'core', 'block', 'inline' ].forEach(function (chain) {
- result = result.concat(this[chain].ruler.enable(list, true));
- }, this);
- result = result.concat(this.inline.ruler2.enable(list, true));
- var missed = list.filter(function (name) { return result.indexOf(name) < 0; });
- if (missed.length && !ignoreInvalid) {
- throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed);
- }
- return this;
- };
- /** chainable
- * MarkdownIt.disable(list, ignoreInvalid)
- * - list (String|Array): rule name or list of rule names to disable.
- * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found.
- *
- * The same as [[MarkdownIt.enable]], but turn specified rules off.
- **/
- MarkdownIt.prototype.disable = function (list, ignoreInvalid) {
- var result = [];
- if (!Array.isArray(list)) { list = [ list ]; }
- [ 'core', 'block', 'inline' ].forEach(function (chain) {
- result = result.concat(this[chain].ruler.disable(list, true));
- }, this);
- result = result.concat(this.inline.ruler2.disable(list, true));
- var missed = list.filter(function (name) { return result.indexOf(name) < 0; });
- if (missed.length && !ignoreInvalid) {
- throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed);
- }
- return this;
- };
- /** chainable
- * MarkdownIt.use(plugin, params)
- *
- * Load specified plugin with given params into current parser instance.
- * It's just a sugar to call `plugin(md, params)` with curring.
- *
- * ##### Example
- *
- * ```javascript
- * var iterator = require('markdown-it-for-inline');
- * var md = require('markdown-it')()
- * .use(iterator, 'foo_replace', 'text', function (tokens, idx) {
- * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');
- * });
- * ```
- **/
- MarkdownIt.prototype.use = function (plugin /*, params, ... */) {
- var args = [ this ].concat(Array.prototype.slice.call(arguments, 1));
- plugin.apply(plugin, args);
- return this;
- };
- /** internal
- * MarkdownIt.parse(src, env) -> Array
- * - src (String): source string
- * - env (Object): environment sandbox
- *
- * Parse input string and returns list of block tokens (special token type
- * "inline" will contain list of inline tokens). You should not call this
- * method directly, until you write custom renderer (for example, to produce
- * AST).
- *
- * `env` is used to pass data between "distributed" rules and return additional
- * metadata like reference info, needed for the renderer. It also can be used to
- * inject data in specific cases. Usually, you will be ok to pass `{}`,
- * and then pass updated object to renderer.
- **/
- MarkdownIt.prototype.parse = function (src, env) {
- if (typeof src !== 'string') {
- throw new Error('Input data should be a String');
- }
- var state = new this.core.State(src, this, env);
- this.core.process(state);
- return state.tokens;
- };
- /**
- * MarkdownIt.render(src [, env]) -> String
- * - src (String): source string
- * - env (Object): environment sandbox
- *
- * Render markdown string into html. It does all magic for you :).
- *
- * `env` can be used to inject additional metadata (`{}` by default).
- * But you will not need it with high probability. See also comment
- * in [[MarkdownIt.parse]].
- **/
- MarkdownIt.prototype.render = function (src, env) {
- env = env || {};
- return this.renderer.render(this.parse(src, env), this.options, env);
- };
- /** internal
- * MarkdownIt.parseInline(src, env) -> Array
- * - src (String): source string
- * - env (Object): environment sandbox
- *
- * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the
- * block tokens list with the single `inline` element, containing parsed inline
- * tokens in `children` property. Also updates `env` object.
- **/
- MarkdownIt.prototype.parseInline = function (src, env) {
- var state = new this.core.State(src, this, env);
- state.inlineMode = true;
- this.core.process(state);
- return state.tokens;
- };
- /**
- * MarkdownIt.renderInline(src [, env]) -> String
- * - src (String): source string
- * - env (Object): environment sandbox
- *
- * Similar to [[MarkdownIt.render]] but for single paragraph content. Result
- * will NOT be wrapped into `<p>` tags.
- **/
- MarkdownIt.prototype.renderInline = function (src, env) {
- env = env || {};
- return this.renderer.render(this.parseInline(src, env), this.options, env);
- };
- module.exports = MarkdownIt;
- /***/ }),
- /* 38 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /** internal
- * class ParserBlock
- *
- * Block-level tokenizer.
- **/
- var Ruler = __webpack_require__(3);
- var _rules = [
- // First 2 params - rule name & source. Secondary array - list of rules,
- // which can be terminated by this one.
- [ 'table', __webpack_require__(56), [ 'paragraph', 'reference' ] ],
- [ 'code', __webpack_require__(46) ],
- [ 'fence', __webpack_require__(47), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],
- [ 'blockquote', __webpack_require__(45), [ 'paragraph', 'reference', 'list' ] ],
- [ 'hr', __webpack_require__(49), [ 'paragraph', 'reference', 'blockquote', 'list' ] ],
- [ 'list', __webpack_require__(52), [ 'paragraph', 'reference', 'blockquote' ] ],
- [ 'reference', __webpack_require__(54) ],
- [ 'heading', __webpack_require__(48), [ 'paragraph', 'reference', 'blockquote' ] ],
- [ 'lheading', __webpack_require__(51) ],
- [ 'html_block', __webpack_require__(50), [ 'paragraph', 'reference', 'blockquote' ] ],
- [ 'paragraph', __webpack_require__(53) ]
- ];
- /**
- * new ParserBlock()
- **/
- function ParserBlock() {
- /**
- * ParserBlock#ruler -> Ruler
- *
- * [[Ruler]] instance. Keep configuration of block rules.
- **/
- this.ruler = new Ruler();
- for (var i = 0; i < _rules.length; i++) {
- this.ruler.push(_rules[i][0], _rules[i][1], { alt: (_rules[i][2] || []).slice() });
- }
- }
- // Generate tokens for input range
- //
- ParserBlock.prototype.tokenize = function (state, startLine, endLine) {
- var ok, i,
- rules = this.ruler.getRules(''),
- len = rules.length,
- line = startLine,
- hasEmptyLines = false,
- maxNesting = state.md.options.maxNesting;
- while (line < endLine) {
- state.line = line = state.skipEmptyLines(line);
- if (line >= endLine) { break; }
- // Termination condition for nested calls.
- // Nested calls currently used for blockquotes & lists
- if (state.sCount[line] < state.blkIndent) { break; }
- // If nesting level exceeded - skip tail to the end. That's not ordinary
- // situation and we should not care about content.
- if (state.level >= maxNesting) {
- state.line = endLine;
- break;
- }
- // Try all possible rules.
- // On success, rule should:
- //
- // - update `state.line`
- // - update `state.tokens`
- // - return true
- for (i = 0; i < len; i++) {
- ok = rules[i](state, line, endLine, false);
- if (ok) { break; }
- }
- // set state.tight iff we had an empty line before current tag
- // i.e. latest empty line should not count
- state.tight = !hasEmptyLines;
- // paragraph might "eat" one newline after it in nested lists
- if (state.isEmpty(state.line - 1)) {
- hasEmptyLines = true;
- }
- line = state.line;
- if (line < endLine && state.isEmpty(line)) {
- hasEmptyLines = true;
- line++;
- state.line = line;
- }
- }
- };
- /**
- * ParserBlock.parse(str, md, env, outTokens)
- *
- * Process input string and push block tokens into `outTokens`
- **/
- ParserBlock.prototype.parse = function (src, md, env, outTokens) {
- var state;
- if (!src) { return; }
- state = new this.State(src, md, env, outTokens);
- this.tokenize(state, state.line, state.lineMax);
- };
- ParserBlock.prototype.State = __webpack_require__(55);
- module.exports = ParserBlock;
- /***/ }),
- /* 39 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /** internal
- * class Core
- *
- * Top-level rules executor. Glues block/inline parsers and does intermediate
- * transformations.
- **/
- var Ruler = __webpack_require__(3);
- var _rules = [
- [ 'normalize', __webpack_require__(60) ],
- [ 'block', __webpack_require__(57) ],
- [ 'inline', __webpack_require__(58) ],
- [ 'linkify', __webpack_require__(59) ],
- [ 'replacements', __webpack_require__(61) ],
- [ 'smartquotes', __webpack_require__(62) ]
- ];
- /**
- * new Core()
- **/
- function Core() {
- /**
- * Core#ruler -> Ruler
- *
- * [[Ruler]] instance. Keep configuration of core rules.
- **/
- this.ruler = new Ruler();
- for (var i = 0; i < _rules.length; i++) {
- this.ruler.push(_rules[i][0], _rules[i][1]);
- }
- }
- /**
- * Core.process(state)
- *
- * Executes core chain rules.
- **/
- Core.prototype.process = function (state) {
- var i, l, rules;
- rules = this.ruler.getRules('');
- for (i = 0, l = rules.length; i < l; i++) {
- rules[i](state);
- }
- };
- Core.prototype.State = __webpack_require__(63);
- module.exports = Core;
- /***/ }),
- /* 40 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /** internal
- * class ParserInline
- *
- * Tokenizes paragraph content.
- **/
- var Ruler = __webpack_require__(3);
- ////////////////////////////////////////////////////////////////////////////////
- // Parser rules
- var _rules = [
- [ 'text', __webpack_require__(74) ],
- [ 'newline', __webpack_require__(72) ],
- [ 'escape', __webpack_require__(68) ],
- [ 'backticks', __webpack_require__(65) ],
- [ 'strikethrough', __webpack_require__(14).tokenize ],
- [ 'emphasis', __webpack_require__(13).tokenize ],
- [ 'link', __webpack_require__(71) ],
- [ 'image', __webpack_require__(70) ],
- [ 'autolink', __webpack_require__(64) ],
- [ 'html_inline', __webpack_require__(69) ],
- [ 'entity', __webpack_require__(67) ]
- ];
- var _rules2 = [
- [ 'balance_pairs', __webpack_require__(66) ],
- [ 'strikethrough', __webpack_require__(14).postProcess ],
- [ 'emphasis', __webpack_require__(13).postProcess ],
- [ 'text_collapse', __webpack_require__(75) ]
- ];
- /**
- * new ParserInline()
- **/
- function ParserInline() {
- var i;
- /**
- * ParserInline#ruler -> Ruler
- *
- * [[Ruler]] instance. Keep configuration of inline rules.
- **/
- this.ruler = new Ruler();
- for (i = 0; i < _rules.length; i++) {
- this.ruler.push(_rules[i][0], _rules[i][1]);
- }
- /**
- * ParserInline#ruler2 -> Ruler
- *
- * [[Ruler]] instance. Second ruler used for post-processing
- * (e.g. in emphasis-like rules).
- **/
- this.ruler2 = new Ruler();
- for (i = 0; i < _rules2.length; i++) {
- this.ruler2.push(_rules2[i][0], _rules2[i][1]);
- }
- }
- // Skip single token by running all rules in validation mode;
- // returns `true` if any rule reported success
- //
- ParserInline.prototype.skipToken = function (state) {
- var ok, i, pos = state.pos,
- rules = this.ruler.getRules(''),
- len = rules.length,
- maxNesting = state.md.options.maxNesting,
- cache = state.cache;
- if (typeof cache[pos] !== 'undefined') {
- state.pos = cache[pos];
- return;
- }
- if (state.level < maxNesting) {
- for (i = 0; i < len; i++) {
- // Increment state.level and decrement it later to limit recursion.
- // It's harmless to do here, because no tokens are created. But ideally,
- // we'd need a separate private state variable for this purpose.
- //
- state.level++;
- ok = rules[i](state, true);
- state.level--;
- if (ok) { break; }
- }
- } else {
- // Too much nesting, just skip until the end of the paragraph.
- //
- // NOTE: this will cause links to behave incorrectly in the following case,
- // when an amount of `[` is exactly equal to `maxNesting + 1`:
- //
- // [[[[[[[[[[[[[[[[[[[[[foo]()
- //
- // TODO: remove this workaround when CM standard will allow nested links
- // (we can replace it by preventing links from being parsed in
- // validation mode)
- //
- state.pos = state.posMax;
- }
- if (!ok) { state.pos++; }
- cache[pos] = state.pos;
- };
- // Generate tokens for input range
- //
- ParserInline.prototype.tokenize = function (state) {
- var ok, i,
- rules = this.ruler.getRules(''),
- len = rules.length,
- end = state.posMax,
- maxNesting = state.md.options.maxNesting;
- while (state.pos < end) {
- // Try all possible rules.
- // On success, rule should:
- //
- // - update `state.pos`
- // - update `state.tokens`
- // - return true
- if (state.level < maxNesting) {
- for (i = 0; i < len; i++) {
- ok = rules[i](state, false);
- if (ok) { break; }
- }
- }
- if (ok) {
- if (state.pos >= end) { break; }
- continue;
- }
- state.pending += state.src[state.pos++];
- }
- if (state.pending) {
- state.pushPending();
- }
- };
- /**
- * ParserInline.parse(str, md, env, outTokens)
- *
- * Process input string and push inline tokens into `outTokens`
- **/
- ParserInline.prototype.parse = function (str, md, env, outTokens) {
- var i, rules, len;
- var state = new this.State(str, md, env, outTokens);
- this.tokenize(state);
- rules = this.ruler2.getRules('');
- len = rules.length;
- for (i = 0; i < len; i++) {
- rules[i](state);
- }
- };
- ParserInline.prototype.State = __webpack_require__(73);
- module.exports = ParserInline;
- /***/ }),
- /* 41 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Commonmark default options
- module.exports = {
- options: {
- html: true, // Enable HTML tags in source
- xhtmlOut: true, // Use '/' to close single tags (<br />)
- breaks: false, // Convert '\n' in paragraphs into <br>
- langPrefix: 'language-', // CSS language prefix for fenced blocks
- linkify: false, // autoconvert URL-like texts to links
- // Enable some language-neutral replacements + quotes beautification
- typographer: false,
- // Double + single quotes replacement pairs, when typographer enabled,
- // and smartquotes on. Could be either a String or an Array.
- //
- // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
- // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
- quotes: '\u201c\u201d\u2018\u2019', /* “”‘’ */
- // Highlighter function. Should return escaped HTML,
- // or '' if the source string is not changed and should be escaped externaly.
- // If result starts with <pre... internal wrapper is skipped.
- //
- // function (/*str, lang*/) { return ''; }
- //
- highlight: null,
- maxNesting: 20 // Internal protection, recursion limit
- },
- components: {
- core: {
- rules: [
- 'normalize',
- 'block',
- 'inline'
- ]
- },
- block: {
- rules: [
- 'blockquote',
- 'code',
- 'fence',
- 'heading',
- 'hr',
- 'html_block',
- 'lheading',
- 'list',
- 'reference',
- 'paragraph'
- ]
- },
- inline: {
- rules: [
- 'autolink',
- 'backticks',
- 'emphasis',
- 'entity',
- 'escape',
- 'html_inline',
- 'image',
- 'link',
- 'newline',
- 'text'
- ],
- rules2: [
- 'balance_pairs',
- 'emphasis',
- 'text_collapse'
- ]
- }
- }
- };
- /***/ }),
- /* 42 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // markdown-it default options
- module.exports = {
- options: {
- html: false, // Enable HTML tags in source
- xhtmlOut: false, // Use '/' to close single tags (<br />)
- breaks: false, // Convert '\n' in paragraphs into <br>
- langPrefix: 'language-', // CSS language prefix for fenced blocks
- linkify: false, // autoconvert URL-like texts to links
- // Enable some language-neutral replacements + quotes beautification
- typographer: false,
- // Double + single quotes replacement pairs, when typographer enabled,
- // and smartquotes on. Could be either a String or an Array.
- //
- // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
- // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
- quotes: '\u201c\u201d\u2018\u2019', /* “”‘’ */
- // Highlighter function. Should return escaped HTML,
- // or '' if the source string is not changed and should be escaped externaly.
- // If result starts with <pre... internal wrapper is skipped.
- //
- // function (/*str, lang*/) { return ''; }
- //
- highlight: null,
- maxNesting: 100 // Internal protection, recursion limit
- },
- components: {
- core: {},
- block: {},
- inline: {}
- }
- };
- /***/ }),
- /* 43 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // "Zero" preset, with nothing enabled. Useful for manual configuring of simple
- // modes. For example, to parse bold/italic only.
- module.exports = {
- options: {
- html: false, // Enable HTML tags in source
- xhtmlOut: false, // Use '/' to close single tags (<br />)
- breaks: false, // Convert '\n' in paragraphs into <br>
- langPrefix: 'language-', // CSS language prefix for fenced blocks
- linkify: false, // autoconvert URL-like texts to links
- // Enable some language-neutral replacements + quotes beautification
- typographer: false,
- // Double + single quotes replacement pairs, when typographer enabled,
- // and smartquotes on. Could be either a String or an Array.
- //
- // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
- // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
- quotes: '\u201c\u201d\u2018\u2019', /* “”‘’ */
- // Highlighter function. Should return escaped HTML,
- // or '' if the source string is not changed and should be escaped externaly.
- // If result starts with <pre... internal wrapper is skipped.
- //
- // function (/*str, lang*/) { return ''; }
- //
- highlight: null,
- maxNesting: 20 // Internal protection, recursion limit
- },
- components: {
- core: {
- rules: [
- 'normalize',
- 'block',
- 'inline'
- ]
- },
- block: {
- rules: [
- 'paragraph'
- ]
- },
- inline: {
- rules: [
- 'text'
- ],
- rules2: [
- 'balance_pairs',
- 'text_collapse'
- ]
- }
- }
- };
- /***/ }),
- /* 44 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /**
- * class Renderer
- *
- * Generates HTML from parsed token stream. Each instance has independent
- * copy of rules. Those can be rewritten with ease. Also, you can add new
- * rules if you create plugin and adds new token types.
- **/
- var assign = __webpack_require__(0).assign;
- var unescapeAll = __webpack_require__(0).unescapeAll;
- var escapeHtml = __webpack_require__(0).escapeHtml;
- ////////////////////////////////////////////////////////////////////////////////
- var default_rules = {};
- default_rules.code_inline = function (tokens, idx, options, env, slf) {
- var token = tokens[idx];
- return '<code' + slf.renderAttrs(token) + '>' +
- escapeHtml(tokens[idx].content) +
- '</code>';
- };
- default_rules.code_block = function (tokens, idx, options, env, slf) {
- var token = tokens[idx];
- return '<pre' + slf.renderAttrs(token) + '><code>' +
- escapeHtml(tokens[idx].content) +
- '</code></pre>\n';
- };
- default_rules.fence = function (tokens, idx, options, env, slf) {
- var token = tokens[idx],
- info = token.info ? unescapeAll(token.info).trim() : '',
- langName = '',
- highlighted, i, tmpAttrs, tmpToken;
- if (info) {
- langName = info.split(/\s+/g)[0];
- }
- if (options.highlight) {
- highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);
- } else {
- highlighted = escapeHtml(token.content);
- }
- if (highlighted.indexOf('<pre') === 0) {
- return highlighted + '\n';
- }
- // If language exists, inject class gently, without mudofying original token.
- // May be, one day we will add .clone() for token and simplify this part, but
- // now we prefer to keep things local.
- if (info) {
- i = token.attrIndex('class');
- tmpAttrs = token.attrs ? token.attrs.slice() : [];
- if (i < 0) {
- tmpAttrs.push([ 'class', options.langPrefix + langName ]);
- } else {
- tmpAttrs[i][1] += ' ' + options.langPrefix + langName;
- }
- // Fake token just to render attributes
- tmpToken = {
- attrs: tmpAttrs
- };
- return '<pre><code' + slf.renderAttrs(tmpToken) + '>'
- + highlighted
- + '</code></pre>\n';
- }
- return '<pre><code' + slf.renderAttrs(token) + '>'
- + highlighted
- + '</code></pre>\n';
- };
- default_rules.image = function (tokens, idx, options, env, slf) {
- var token = tokens[idx];
- // "alt" attr MUST be set, even if empty. Because it's mandatory and
- // should be placed on proper position for tests.
- //
- // Replace content with actual value
- token.attrs[token.attrIndex('alt')][1] =
- slf.renderInlineAsText(token.children, options, env);
- return slf.renderToken(tokens, idx, options);
- };
- default_rules.hardbreak = function (tokens, idx, options /*, env */) {
- return options.xhtmlOut ? '<br />\n' : '<br>\n';
- };
- default_rules.softbreak = function (tokens, idx, options /*, env */) {
- return options.breaks ? (options.xhtmlOut ? '<br />\n' : '<br>\n') : '\n';
- };
- default_rules.text = function (tokens, idx /*, options, env */) {
- return escapeHtml(tokens[idx].content);
- };
- default_rules.html_block = function (tokens, idx /*, options, env */) {
- return tokens[idx].content;
- };
- default_rules.html_inline = function (tokens, idx /*, options, env */) {
- return tokens[idx].content;
- };
- /**
- * new Renderer()
- *
- * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults.
- **/
- function Renderer() {
- /**
- * Renderer#rules -> Object
- *
- * Contains render rules for tokens. Can be updated and extended.
- *
- * ##### Example
- *
- * ```javascript
- * var md = require('markdown-it')();
- *
- * md.renderer.rules.strong_open = function () { return '<b>'; };
- * md.renderer.rules.strong_close = function () { return '</b>'; };
- *
- * var result = md.renderInline(...);
- * ```
- *
- * Each rule is called as independed static function with fixed signature:
- *
- * ```javascript
- * function my_token_render(tokens, idx, options, env, renderer) {
- * // ...
- * return renderedHTML;
- * }
- * ```
- *
- * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.js)
- * for more details and examples.
- **/
- this.rules = assign({}, default_rules);
- }
- /**
- * Renderer.renderAttrs(token) -> String
- *
- * Render token attributes to string.
- **/
- Renderer.prototype.renderAttrs = function renderAttrs(token) {
- var i, l, result;
- if (!token.attrs) { return ''; }
- result = '';
- for (i = 0, l = token.attrs.length; i < l; i++) {
- result += ' ' + escapeHtml(token.attrs[i][0]) + '="' + escapeHtml(token.attrs[i][1]) + '"';
- }
- return result;
- };
- /**
- * Renderer.renderToken(tokens, idx, options) -> String
- * - tokens (Array): list of tokens
- * - idx (Numbed): token index to render
- * - options (Object): params of parser instance
- *
- * Default token renderer. Can be overriden by custom function
- * in [[Renderer#rules]].
- **/
- Renderer.prototype.renderToken = function renderToken(tokens, idx, options) {
- var nextToken,
- result = '',
- needLf = false,
- token = tokens[idx];
- // Tight list paragraphs
- if (token.hidden) {
- return '';
- }
- // Insert a newline between hidden paragraph and subsequent opening
- // block-level tag.
- //
- // For example, here we should insert a newline before blockquote:
- // - a
- // >
- //
- if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) {
- result += '\n';
- }
- // Add token name, e.g. `<img`
- result += (token.nesting === -1 ? '</' : '<') + token.tag;
- // Encode attributes, e.g. `<img src="foo"`
- result += this.renderAttrs(token);
- // Add a slash for self-closing tags, e.g. `<img src="foo" /`
- if (token.nesting === 0 && options.xhtmlOut) {
- result += ' /';
- }
- // Check if we need to add a newline after this tag
- if (token.block) {
- needLf = true;
- if (token.nesting === 1) {
- if (idx + 1 < tokens.length) {
- nextToken = tokens[idx + 1];
- if (nextToken.type === 'inline' || nextToken.hidden) {
- // Block-level tag containing an inline tag.
- //
- needLf = false;
- } else if (nextToken.nesting === -1 && nextToken.tag === token.tag) {
- // Opening tag + closing tag of the same type. E.g. `<li></li>`.
- //
- needLf = false;
- }
- }
- }
- }
- result += needLf ? '>\n' : '>';
- return result;
- };
- /**
- * Renderer.renderInline(tokens, options, env) -> String
- * - tokens (Array): list on block tokens to renter
- * - options (Object): params of parser instance
- * - env (Object): additional data from parsed input (references, for example)
- *
- * The same as [[Renderer.render]], but for single token of `inline` type.
- **/
- Renderer.prototype.renderInline = function (tokens, options, env) {
- var type,
- result = '',
- rules = this.rules;
- for (var i = 0, len = tokens.length; i < len; i++) {
- type = tokens[i].type;
- if (typeof rules[type] !== 'undefined') {
- result += rules[type](tokens, i, options, env, this);
- } else {
- result += this.renderToken(tokens, i, options);
- }
- }
- return result;
- };
- /** internal
- * Renderer.renderInlineAsText(tokens, options, env) -> String
- * - tokens (Array): list on block tokens to renter
- * - options (Object): params of parser instance
- * - env (Object): additional data from parsed input (references, for example)
- *
- * Special kludge for image `alt` attributes to conform CommonMark spec.
- * Don't try to use it! Spec requires to show `alt` content with stripped markup,
- * instead of simple escaping.
- **/
- Renderer.prototype.renderInlineAsText = function (tokens, options, env) {
- var result = '';
- for (var i = 0, len = tokens.length; i < len; i++) {
- if (tokens[i].type === 'text') {
- result += tokens[i].content;
- } else if (tokens[i].type === 'image') {
- result += this.renderInlineAsText(tokens[i].children, options, env);
- }
- }
- return result;
- };
- /**
- * Renderer.render(tokens, options, env) -> String
- * - tokens (Array): list on block tokens to renter
- * - options (Object): params of parser instance
- * - env (Object): additional data from parsed input (references, for example)
- *
- * Takes token stream and generates HTML. Probably, you will never need to call
- * this method directly.
- **/
- Renderer.prototype.render = function (tokens, options, env) {
- var i, len, type,
- result = '',
- rules = this.rules;
- for (i = 0, len = tokens.length; i < len; i++) {
- type = tokens[i].type;
- if (type === 'inline') {
- result += this.renderInline(tokens[i].children, options, env);
- } else if (typeof rules[type] !== 'undefined') {
- result += rules[tokens[i].type](tokens, i, options, env, this);
- } else {
- result += this.renderToken(tokens, i, options, env);
- }
- }
- return result;
- };
- module.exports = Renderer;
- /***/ }),
- /* 45 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Block quotes
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function blockquote(state, startLine, endLine, silent) {
- var adjustTab,
- ch,
- i,
- initial,
- isOutdented,
- l,
- lastLineEmpty,
- lines,
- nextLine,
- offset,
- oldBMarks,
- oldBSCount,
- oldIndent,
- oldParentType,
- oldSCount,
- oldTShift,
- spaceAfterMarker,
- terminate,
- terminatorRules,
- token,
- oldLineMax = state.lineMax,
- pos = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine];
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- // check the block quote marker
- if (state.src.charCodeAt(pos++) !== 0x3E/* > */) { return false; }
- // we know that it's going to be a valid blockquote,
- // so no point trying to find the end of it in silent mode
- if (silent) { return true; }
- // skip spaces after ">" and re-calculate offset
- initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);
- // skip one optional space after '>'
- if (state.src.charCodeAt(pos) === 0x20 /* space */) {
- // ' > test '
- // ^ -- position start of line here:
- pos++;
- initial++;
- offset++;
- adjustTab = false;
- spaceAfterMarker = true;
- } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {
- spaceAfterMarker = true;
- if ((state.bsCount[startLine] + offset) % 4 === 3) {
- // ' >\t test '
- // ^ -- position start of line here (tab has width===1)
- pos++;
- initial++;
- offset++;
- adjustTab = false;
- } else {
- // ' >\t test '
- // ^ -- position start of line here + shift bsCount slightly
- // to make extra space appear
- adjustTab = true;
- }
- } else {
- spaceAfterMarker = false;
- }
- oldBMarks = [ state.bMarks[startLine] ];
- state.bMarks[startLine] = pos;
- while (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (isSpace(ch)) {
- if (ch === 0x09) {
- offset += 4 - (offset + state.bsCount[startLine] + (adjustTab ? 1 : 0)) % 4;
- } else {
- offset++;
- }
- } else {
- break;
- }
- pos++;
- }
- oldBSCount = [ state.bsCount[startLine] ];
- state.bsCount[startLine] = state.sCount[startLine] + 1 + (spaceAfterMarker ? 1 : 0);
- lastLineEmpty = pos >= max;
- oldSCount = [ state.sCount[startLine] ];
- state.sCount[startLine] = offset - initial;
- oldTShift = [ state.tShift[startLine] ];
- state.tShift[startLine] = pos - state.bMarks[startLine];
- terminatorRules = state.md.block.ruler.getRules('blockquote');
- oldParentType = state.parentType;
- state.parentType = 'blockquote';
- // Search the end of the block
- //
- // Block ends with either:
- // 1. an empty line outside:
- // ```
- // > test
- //
- // ```
- // 2. an empty line inside:
- // ```
- // >
- // test
- // ```
- // 3. another tag:
- // ```
- // > test
- // - - -
- // ```
- for (nextLine = startLine + 1; nextLine < endLine; nextLine++) {
- // check if it's outdented, i.e. it's inside list item and indented
- // less than said list item:
- //
- // ```
- // 1. anything
- // > current blockquote
- // 2. checking this line
- // ```
- isOutdented = state.sCount[nextLine] < state.blkIndent;
- pos = state.bMarks[nextLine] + state.tShift[nextLine];
- max = state.eMarks[nextLine];
- if (pos >= max) {
- // Case 1: line is not inside the blockquote, and this line is empty.
- break;
- }
- if (state.src.charCodeAt(pos++) === 0x3E/* > */ && !isOutdented) {
- // This line is inside the blockquote.
- // skip spaces after ">" and re-calculate offset
- initial = offset = state.sCount[nextLine] + pos - (state.bMarks[nextLine] + state.tShift[nextLine]);
- // skip one optional space after '>'
- if (state.src.charCodeAt(pos) === 0x20 /* space */) {
- // ' > test '
- // ^ -- position start of line here:
- pos++;
- initial++;
- offset++;
- adjustTab = false;
- spaceAfterMarker = true;
- } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) {
- spaceAfterMarker = true;
- if ((state.bsCount[nextLine] + offset) % 4 === 3) {
- // ' >\t test '
- // ^ -- position start of line here (tab has width===1)
- pos++;
- initial++;
- offset++;
- adjustTab = false;
- } else {
- // ' >\t test '
- // ^ -- position start of line here + shift bsCount slightly
- // to make extra space appear
- adjustTab = true;
- }
- } else {
- spaceAfterMarker = false;
- }
- oldBMarks.push(state.bMarks[nextLine]);
- state.bMarks[nextLine] = pos;
- while (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (isSpace(ch)) {
- if (ch === 0x09) {
- offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;
- } else {
- offset++;
- }
- } else {
- break;
- }
- pos++;
- }
- lastLineEmpty = pos >= max;
- oldBSCount.push(state.bsCount[nextLine]);
- state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0);
- oldSCount.push(state.sCount[nextLine]);
- state.sCount[nextLine] = offset - initial;
- oldTShift.push(state.tShift[nextLine]);
- state.tShift[nextLine] = pos - state.bMarks[nextLine];
- continue;
- }
- // Case 2: line is not inside the blockquote, and the last line was empty.
- if (lastLineEmpty) { break; }
- // Case 3: another tag found.
- terminate = false;
- for (i = 0, l = terminatorRules.length; i < l; i++) {
- if (terminatorRules[i](state, nextLine, endLine, true)) {
- terminate = true;
- break;
- }
- }
- if (terminate) {
- // Quirk to enforce "hard termination mode" for paragraphs;
- // normally if you call `tokenize(state, startLine, nextLine)`,
- // paragraphs will look below nextLine for paragraph continuation,
- // but if blockquote is terminated by another tag, they shouldn't
- state.lineMax = nextLine;
- if (state.blkIndent !== 0) {
- // state.blkIndent was non-zero, we now set it to zero,
- // so we need to re-calculate all offsets to appear as
- // if indent wasn't changed
- oldBMarks.push(state.bMarks[nextLine]);
- oldBSCount.push(state.bsCount[nextLine]);
- oldTShift.push(state.tShift[nextLine]);
- oldSCount.push(state.sCount[nextLine]);
- state.sCount[nextLine] -= state.blkIndent;
- }
- break;
- }
- if (isOutdented) break;
- oldBMarks.push(state.bMarks[nextLine]);
- oldBSCount.push(state.bsCount[nextLine]);
- oldTShift.push(state.tShift[nextLine]);
- oldSCount.push(state.sCount[nextLine]);
- // A negative indentation means that this is a paragraph continuation
- //
- state.sCount[nextLine] = -1;
- }
- oldIndent = state.blkIndent;
- state.blkIndent = 0;
- token = state.push('blockquote_open', 'blockquote', 1);
- token.markup = '>';
- token.map = lines = [ startLine, 0 ];
- state.md.block.tokenize(state, startLine, nextLine);
- token = state.push('blockquote_close', 'blockquote', -1);
- token.markup = '>';
- state.lineMax = oldLineMax;
- state.parentType = oldParentType;
- lines[1] = state.line;
- // Restore original tShift; this might not be necessary since the parser
- // has already been here, but just to make sure we can do that.
- for (i = 0; i < oldTShift.length; i++) {
- state.bMarks[i + startLine] = oldBMarks[i];
- state.tShift[i + startLine] = oldTShift[i];
- state.sCount[i + startLine] = oldSCount[i];
- state.bsCount[i + startLine] = oldBSCount[i];
- }
- state.blkIndent = oldIndent;
- return true;
- };
- /***/ }),
- /* 46 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Code block (4 spaces padded)
- module.exports = function code(state, startLine, endLine/*, silent*/) {
- var nextLine, last, token;
- if (state.sCount[startLine] - state.blkIndent < 4) { return false; }
- last = nextLine = startLine + 1;
- while (nextLine < endLine) {
- if (state.isEmpty(nextLine)) {
- nextLine++;
- continue;
- }
- if (state.sCount[nextLine] - state.blkIndent >= 4) {
- nextLine++;
- last = nextLine;
- continue;
- }
- break;
- }
- state.line = last;
- token = state.push('code_block', 'code', 0);
- token.content = state.getLines(startLine, last, 4 + state.blkIndent, true);
- token.map = [ startLine, state.line ];
- return true;
- };
- /***/ }),
- /* 47 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // fences (``` lang, ~~~ lang)
- module.exports = function fence(state, startLine, endLine, silent) {
- var marker, len, params, nextLine, mem, token, markup,
- haveEndMarker = false,
- pos = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine];
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- if (pos + 3 > max) { return false; }
- marker = state.src.charCodeAt(pos);
- if (marker !== 0x7E/* ~ */ && marker !== 0x60 /* ` */) {
- return false;
- }
- // scan marker length
- mem = pos;
- pos = state.skipChars(pos, marker);
- len = pos - mem;
- if (len < 3) { return false; }
- markup = state.src.slice(mem, pos);
- params = state.src.slice(pos, max);
- if (params.indexOf(String.fromCharCode(marker)) >= 0) { return false; }
- // Since start is found, we can report success here in validation mode
- if (silent) { return true; }
- // search end of block
- nextLine = startLine;
- for (;;) {
- nextLine++;
- if (nextLine >= endLine) {
- // unclosed block should be autoclosed by end of document.
- // also block seems to be autoclosed by end of parent
- break;
- }
- pos = mem = state.bMarks[nextLine] + state.tShift[nextLine];
- max = state.eMarks[nextLine];
- if (pos < max && state.sCount[nextLine] < state.blkIndent) {
- // non-empty line with negative indent should stop the list:
- // - ```
- // test
- break;
- }
- if (state.src.charCodeAt(pos) !== marker) { continue; }
- if (state.sCount[nextLine] - state.blkIndent >= 4) {
- // closing fence should be indented less than 4 spaces
- continue;
- }
- pos = state.skipChars(pos, marker);
- // closing code fence must be at least as long as the opening one
- if (pos - mem < len) { continue; }
- // make sure tail has spaces only
- pos = state.skipSpaces(pos);
- if (pos < max) { continue; }
- haveEndMarker = true;
- // found!
- break;
- }
- // If a fence has heading spaces, they should be removed from its inner block
- len = state.sCount[startLine];
- state.line = nextLine + (haveEndMarker ? 1 : 0);
- token = state.push('fence', 'code', 0);
- token.info = params;
- token.content = state.getLines(startLine + 1, nextLine, len, true);
- token.markup = markup;
- token.map = [ startLine, state.line ];
- return true;
- };
- /***/ }),
- /* 48 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // heading (#, ##, ...)
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function heading(state, startLine, endLine, silent) {
- var ch, level, tmp, token,
- pos = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine];
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- ch = state.src.charCodeAt(pos);
- if (ch !== 0x23/* # */ || pos >= max) { return false; }
- // count heading level
- level = 1;
- ch = state.src.charCodeAt(++pos);
- while (ch === 0x23/* # */ && pos < max && level <= 6) {
- level++;
- ch = state.src.charCodeAt(++pos);
- }
- if (level > 6 || (pos < max && !isSpace(ch))) { return false; }
- if (silent) { return true; }
- // Let's cut tails like ' ### ' from the end of string
- max = state.skipSpacesBack(max, pos);
- tmp = state.skipCharsBack(max, 0x23, pos); // #
- if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) {
- max = tmp;
- }
- state.line = startLine + 1;
- token = state.push('heading_open', 'h' + String(level), 1);
- token.markup = '########'.slice(0, level);
- token.map = [ startLine, state.line ];
- token = state.push('inline', '', 0);
- token.content = state.src.slice(pos, max).trim();
- token.map = [ startLine, state.line ];
- token.children = [];
- token = state.push('heading_close', 'h' + String(level), -1);
- token.markup = '########'.slice(0, level);
- return true;
- };
- /***/ }),
- /* 49 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Horizontal rule
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function hr(state, startLine, endLine, silent) {
- var marker, cnt, ch, token,
- pos = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine];
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- marker = state.src.charCodeAt(pos++);
- // Check hr marker
- if (marker !== 0x2A/* * */ &&
- marker !== 0x2D/* - */ &&
- marker !== 0x5F/* _ */) {
- return false;
- }
- // markers can be mixed with spaces, but there should be at least 3 of them
- cnt = 1;
- while (pos < max) {
- ch = state.src.charCodeAt(pos++);
- if (ch !== marker && !isSpace(ch)) { return false; }
- if (ch === marker) { cnt++; }
- }
- if (cnt < 3) { return false; }
- if (silent) { return true; }
- state.line = startLine + 1;
- token = state.push('hr', 'hr', 0);
- token.map = [ startLine, state.line ];
- token.markup = Array(cnt + 1).join(String.fromCharCode(marker));
- return true;
- };
- /***/ }),
- /* 50 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // HTML block
- var block_names = __webpack_require__(32);
- var HTML_OPEN_CLOSE_TAG_RE = __webpack_require__(12).HTML_OPEN_CLOSE_TAG_RE;
- // An array of opening and corresponding closing sequences for html tags,
- // last argument defines whether it can terminate a paragraph or not
- //
- var HTML_SEQUENCES = [
- [ /^<(script|pre|style)(?=(\s|>|$))/i, /<\/(script|pre|style)>/i, true ],
- [ /^<!--/, /-->/, true ],
- [ /^<\?/, /\?>/, true ],
- [ /^<![A-Z]/, />/, true ],
- [ /^<!\[CDATA\[/, /\]\]>/, true ],
- [ new RegExp('^</?(' + block_names.join('|') + ')(?=(\\s|/?>|$))', 'i'), /^$/, true ],
- [ new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\s*$'), /^$/, false ]
- ];
- module.exports = function html_block(state, startLine, endLine, silent) {
- var i, nextLine, token, lineText,
- pos = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine];
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- if (!state.md.options.html) { return false; }
- if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }
- lineText = state.src.slice(pos, max);
- for (i = 0; i < HTML_SEQUENCES.length; i++) {
- if (HTML_SEQUENCES[i][0].test(lineText)) { break; }
- }
- if (i === HTML_SEQUENCES.length) { return false; }
- if (silent) {
- // true if this sequence can be a terminator, false otherwise
- return HTML_SEQUENCES[i][2];
- }
- nextLine = startLine + 1;
- // If we are here - we detected HTML block.
- // Let's roll down till block end.
- if (!HTML_SEQUENCES[i][1].test(lineText)) {
- for (; nextLine < endLine; nextLine++) {
- if (state.sCount[nextLine] < state.blkIndent) { break; }
- pos = state.bMarks[nextLine] + state.tShift[nextLine];
- max = state.eMarks[nextLine];
- lineText = state.src.slice(pos, max);
- if (HTML_SEQUENCES[i][1].test(lineText)) {
- if (lineText.length !== 0) { nextLine++; }
- break;
- }
- }
- }
- state.line = nextLine;
- token = state.push('html_block', '', 0);
- token.map = [ startLine, nextLine ];
- token.content = state.getLines(startLine, nextLine, state.blkIndent, true);
- return true;
- };
- /***/ }),
- /* 51 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // lheading (---, ===)
- module.exports = function lheading(state, startLine, endLine/*, silent*/) {
- var content, terminate, i, l, token, pos, max, level, marker,
- nextLine = startLine + 1, oldParentType,
- terminatorRules = state.md.block.ruler.getRules('paragraph');
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- oldParentType = state.parentType;
- state.parentType = 'paragraph'; // use paragraph to match terminatorRules
- // jump line-by-line until empty one or EOF
- for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {
- // this would be a code block normally, but after paragraph
- // it's considered a lazy continuation regardless of what's there
- if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }
- //
- // Check for underline in setext header
- //
- if (state.sCount[nextLine] >= state.blkIndent) {
- pos = state.bMarks[nextLine] + state.tShift[nextLine];
- max = state.eMarks[nextLine];
- if (pos < max) {
- marker = state.src.charCodeAt(pos);
- if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {
- pos = state.skipChars(pos, marker);
- pos = state.skipSpaces(pos);
- if (pos >= max) {
- level = (marker === 0x3D/* = */ ? 1 : 2);
- break;
- }
- }
- }
- }
- // quirk for blockquotes, this line should already be checked by that rule
- if (state.sCount[nextLine] < 0) { continue; }
- // Some tags can terminate paragraph without empty line.
- terminate = false;
- for (i = 0, l = terminatorRules.length; i < l; i++) {
- if (terminatorRules[i](state, nextLine, endLine, true)) {
- terminate = true;
- break;
- }
- }
- if (terminate) { break; }
- }
- if (!level) {
- // Didn't find valid underline
- return false;
- }
- content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();
- state.line = nextLine + 1;
- token = state.push('heading_open', 'h' + String(level), 1);
- token.markup = String.fromCharCode(marker);
- token.map = [ startLine, state.line ];
- token = state.push('inline', '', 0);
- token.content = content;
- token.map = [ startLine, state.line - 1 ];
- token.children = [];
- token = state.push('heading_close', 'h' + String(level), -1);
- token.markup = String.fromCharCode(marker);
- state.parentType = oldParentType;
- return true;
- };
- /***/ }),
- /* 52 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Lists
- var isSpace = __webpack_require__(0).isSpace;
- // Search `[-+*][\n ]`, returns next pos arter marker on success
- // or -1 on fail.
- function skipBulletListMarker(state, startLine) {
- var marker, pos, max, ch;
- pos = state.bMarks[startLine] + state.tShift[startLine];
- max = state.eMarks[startLine];
- marker = state.src.charCodeAt(pos++);
- // Check bullet
- if (marker !== 0x2A/* * */ &&
- marker !== 0x2D/* - */ &&
- marker !== 0x2B/* + */) {
- return -1;
- }
- if (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (!isSpace(ch)) {
- // " -test " - is not a list item
- return -1;
- }
- }
- return pos;
- }
- // Search `\d+[.)][\n ]`, returns next pos arter marker on success
- // or -1 on fail.
- function skipOrderedListMarker(state, startLine) {
- var ch,
- start = state.bMarks[startLine] + state.tShift[startLine],
- pos = start,
- max = state.eMarks[startLine];
- // List marker should have at least 2 chars (digit + dot)
- if (pos + 1 >= max) { return -1; }
- ch = state.src.charCodeAt(pos++);
- if (ch < 0x30/* 0 */ || ch > 0x39/* 9 */) { return -1; }
- for (;;) {
- // EOL -> fail
- if (pos >= max) { return -1; }
- ch = state.src.charCodeAt(pos++);
- if (ch >= 0x30/* 0 */ && ch <= 0x39/* 9 */) {
- // List marker should have no more than 9 digits
- // (prevents integer overflow in browsers)
- if (pos - start >= 10) { return -1; }
- continue;
- }
- // found valid marker
- if (ch === 0x29/* ) */ || ch === 0x2e/* . */) {
- break;
- }
- return -1;
- }
- if (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (!isSpace(ch)) {
- // " 1.test " - is not a list item
- return -1;
- }
- }
- return pos;
- }
- function markTightParagraphs(state, idx) {
- var i, l,
- level = state.level + 2;
- for (i = idx + 2, l = state.tokens.length - 2; i < l; i++) {
- if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') {
- state.tokens[i + 2].hidden = true;
- state.tokens[i].hidden = true;
- i += 2;
- }
- }
- }
- module.exports = function list(state, startLine, endLine, silent) {
- var ch,
- contentStart,
- i,
- indent,
- indentAfterMarker,
- initial,
- isOrdered,
- itemLines,
- l,
- listLines,
- listTokIdx,
- markerCharCode,
- markerValue,
- max,
- nextLine,
- offset,
- oldIndent,
- oldLIndent,
- oldParentType,
- oldTShift,
- oldTight,
- pos,
- posAfterMarker,
- prevEmptyEnd,
- start,
- terminate,
- terminatorRules,
- token,
- isTerminatingParagraph = false,
- tight = true;
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- // limit conditions when list can interrupt
- // a paragraph (validation mode only)
- if (silent && state.parentType === 'paragraph') {
- // Next list item should still terminate previous list item;
- //
- // This code can fail if plugins use blkIndent as well as lists,
- // but I hope the spec gets fixed long before that happens.
- //
- if (state.tShift[startLine] >= state.blkIndent) {
- isTerminatingParagraph = true;
- }
- }
- // Detect list type and position after marker
- if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0) {
- isOrdered = true;
- start = state.bMarks[startLine] + state.tShift[startLine];
- markerValue = Number(state.src.substr(start, posAfterMarker - start - 1));
- // If we're starting a new ordered list right after
- // a paragraph, it should start with 1.
- if (isTerminatingParagraph && markerValue !== 1) return false;
- } else if ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0) {
- isOrdered = false;
- } else {
- return false;
- }
- // If we're starting a new unordered list right after
- // a paragraph, first line should not be empty.
- if (isTerminatingParagraph) {
- if (state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]) return false;
- }
- // We should terminate list on style change. Remember first one to compare.
- markerCharCode = state.src.charCodeAt(posAfterMarker - 1);
- // For validation mode we can terminate immediately
- if (silent) { return true; }
- // Start list
- listTokIdx = state.tokens.length;
- if (isOrdered) {
- token = state.push('ordered_list_open', 'ol', 1);
- if (markerValue !== 1) {
- token.attrs = [ [ 'start', markerValue ] ];
- }
- } else {
- token = state.push('bullet_list_open', 'ul', 1);
- }
- token.map = listLines = [ startLine, 0 ];
- token.markup = String.fromCharCode(markerCharCode);
- //
- // Iterate list items
- //
- nextLine = startLine;
- prevEmptyEnd = false;
- terminatorRules = state.md.block.ruler.getRules('list');
- oldParentType = state.parentType;
- state.parentType = 'list';
- while (nextLine < endLine) {
- pos = posAfterMarker;
- max = state.eMarks[nextLine];
- initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine]);
- while (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (isSpace(ch)) {
- if (ch === 0x09) {
- offset += 4 - (offset + state.bsCount[nextLine]) % 4;
- } else {
- offset++;
- }
- } else {
- break;
- }
- pos++;
- }
- contentStart = pos;
- if (contentStart >= max) {
- // trimming space in "- \n 3" case, indent is 1 here
- indentAfterMarker = 1;
- } else {
- indentAfterMarker = offset - initial;
- }
- // If we have more than 4 spaces, the indent is 1
- // (the rest is just indented code block)
- if (indentAfterMarker > 4) { indentAfterMarker = 1; }
- // " - test"
- // ^^^^^ - calculating total length of this thing
- indent = initial + indentAfterMarker;
- // Run subparser & write tokens
- token = state.push('list_item_open', 'li', 1);
- token.markup = String.fromCharCode(markerCharCode);
- token.map = itemLines = [ startLine, 0 ];
- oldIndent = state.blkIndent;
- oldTight = state.tight;
- oldTShift = state.tShift[startLine];
- oldLIndent = state.sCount[startLine];
- state.blkIndent = indent;
- state.tight = true;
- state.tShift[startLine] = contentStart - state.bMarks[startLine];
- state.sCount[startLine] = offset;
- if (contentStart >= max && state.isEmpty(startLine + 1)) {
- // workaround for this case
- // (list item is empty, list terminates before "foo"):
- // ~~~~~~~~
- // -
- //
- // foo
- // ~~~~~~~~
- state.line = Math.min(state.line + 2, endLine);
- } else {
- state.md.block.tokenize(state, startLine, endLine, true);
- }
- // If any of list item is tight, mark list as tight
- if (!state.tight || prevEmptyEnd) {
- tight = false;
- }
- // Item become loose if finish with empty line,
- // but we should filter last element, because it means list finish
- prevEmptyEnd = (state.line - startLine) > 1 && state.isEmpty(state.line - 1);
- state.blkIndent = oldIndent;
- state.tShift[startLine] = oldTShift;
- state.sCount[startLine] = oldLIndent;
- state.tight = oldTight;
- token = state.push('list_item_close', 'li', -1);
- token.markup = String.fromCharCode(markerCharCode);
- nextLine = startLine = state.line;
- itemLines[1] = nextLine;
- contentStart = state.bMarks[startLine];
- if (nextLine >= endLine) { break; }
- //
- // Try to check if list is terminated or continued.
- //
- if (state.sCount[nextLine] < state.blkIndent) { break; }
- // fail if terminating block found
- terminate = false;
- for (i = 0, l = terminatorRules.length; i < l; i++) {
- if (terminatorRules[i](state, nextLine, endLine, true)) {
- terminate = true;
- break;
- }
- }
- if (terminate) { break; }
- // fail if list has another type
- if (isOrdered) {
- posAfterMarker = skipOrderedListMarker(state, nextLine);
- if (posAfterMarker < 0) { break; }
- } else {
- posAfterMarker = skipBulletListMarker(state, nextLine);
- if (posAfterMarker < 0) { break; }
- }
- if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { break; }
- }
- // Finilize list
- if (isOrdered) {
- token = state.push('ordered_list_close', 'ol', -1);
- } else {
- token = state.push('bullet_list_close', 'ul', -1);
- }
- token.markup = String.fromCharCode(markerCharCode);
- listLines[1] = nextLine;
- state.line = nextLine;
- state.parentType = oldParentType;
- // mark paragraphs tight if needed
- if (tight) {
- markTightParagraphs(state, listTokIdx);
- }
- return true;
- };
- /***/ }),
- /* 53 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Paragraph
- module.exports = function paragraph(state, startLine/*, endLine*/) {
- var content, terminate, i, l, token, oldParentType,
- nextLine = startLine + 1,
- terminatorRules = state.md.block.ruler.getRules('paragraph'),
- endLine = state.lineMax;
- oldParentType = state.parentType;
- state.parentType = 'paragraph';
- // jump line-by-line until empty one or EOF
- for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {
- // this would be a code block normally, but after paragraph
- // it's considered a lazy continuation regardless of what's there
- if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }
- // quirk for blockquotes, this line should already be checked by that rule
- if (state.sCount[nextLine] < 0) { continue; }
- // Some tags can terminate paragraph without empty line.
- terminate = false;
- for (i = 0, l = terminatorRules.length; i < l; i++) {
- if (terminatorRules[i](state, nextLine, endLine, true)) {
- terminate = true;
- break;
- }
- }
- if (terminate) { break; }
- }
- content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();
- state.line = nextLine;
- token = state.push('paragraph_open', 'p', 1);
- token.map = [ startLine, state.line ];
- token = state.push('inline', '', 0);
- token.content = content;
- token.map = [ startLine, state.line ];
- token.children = [];
- token = state.push('paragraph_close', 'p', -1);
- state.parentType = oldParentType;
- return true;
- };
- /***/ }),
- /* 54 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var normalizeReference = __webpack_require__(0).normalizeReference;
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function reference(state, startLine, _endLine, silent) {
- var ch,
- destEndPos,
- destEndLineNo,
- endLine,
- href,
- i,
- l,
- label,
- labelEnd,
- oldParentType,
- res,
- start,
- str,
- terminate,
- terminatorRules,
- title,
- lines = 0,
- pos = state.bMarks[startLine] + state.tShift[startLine],
- max = state.eMarks[startLine],
- nextLine = startLine + 1;
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- if (state.src.charCodeAt(pos) !== 0x5B/* [ */) { return false; }
- // Simple check to quickly interrupt scan on [link](url) at the start of line.
- // Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54
- while (++pos < max) {
- if (state.src.charCodeAt(pos) === 0x5D /* ] */ &&
- state.src.charCodeAt(pos - 1) !== 0x5C/* \ */) {
- if (pos + 1 === max) { return false; }
- if (state.src.charCodeAt(pos + 1) !== 0x3A/* : */) { return false; }
- break;
- }
- }
- endLine = state.lineMax;
- // jump line-by-line until empty one or EOF
- terminatorRules = state.md.block.ruler.getRules('reference');
- oldParentType = state.parentType;
- state.parentType = 'reference';
- for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {
- // this would be a code block normally, but after paragraph
- // it's considered a lazy continuation regardless of what's there
- if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }
- // quirk for blockquotes, this line should already be checked by that rule
- if (state.sCount[nextLine] < 0) { continue; }
- // Some tags can terminate paragraph without empty line.
- terminate = false;
- for (i = 0, l = terminatorRules.length; i < l; i++) {
- if (terminatorRules[i](state, nextLine, endLine, true)) {
- terminate = true;
- break;
- }
- }
- if (terminate) { break; }
- }
- str = state.getLines(startLine, nextLine, state.blkIndent, false).trim();
- max = str.length;
- for (pos = 1; pos < max; pos++) {
- ch = str.charCodeAt(pos);
- if (ch === 0x5B /* [ */) {
- return false;
- } else if (ch === 0x5D /* ] */) {
- labelEnd = pos;
- break;
- } else if (ch === 0x0A /* \n */) {
- lines++;
- } else if (ch === 0x5C /* \ */) {
- pos++;
- if (pos < max && str.charCodeAt(pos) === 0x0A) {
- lines++;
- }
- }
- }
- if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return false; }
- // [label]: destination 'title'
- // ^^^ skip optional whitespace here
- for (pos = labelEnd + 2; pos < max; pos++) {
- ch = str.charCodeAt(pos);
- if (ch === 0x0A) {
- lines++;
- } else if (isSpace(ch)) {
- /*eslint no-empty:0*/
- } else {
- break;
- }
- }
- // [label]: destination 'title'
- // ^^^^^^^^^^^ parse this
- res = state.md.helpers.parseLinkDestination(str, pos, max);
- if (!res.ok) { return false; }
- href = state.md.normalizeLink(res.str);
- if (!state.md.validateLink(href)) { return false; }
- pos = res.pos;
- lines += res.lines;
- // save cursor state, we could require to rollback later
- destEndPos = pos;
- destEndLineNo = lines;
- // [label]: destination 'title'
- // ^^^ skipping those spaces
- start = pos;
- for (; pos < max; pos++) {
- ch = str.charCodeAt(pos);
- if (ch === 0x0A) {
- lines++;
- } else if (isSpace(ch)) {
- /*eslint no-empty:0*/
- } else {
- break;
- }
- }
- // [label]: destination 'title'
- // ^^^^^^^ parse this
- res = state.md.helpers.parseLinkTitle(str, pos, max);
- if (pos < max && start !== pos && res.ok) {
- title = res.str;
- pos = res.pos;
- lines += res.lines;
- } else {
- title = '';
- pos = destEndPos;
- lines = destEndLineNo;
- }
- // skip trailing spaces until the rest of the line
- while (pos < max) {
- ch = str.charCodeAt(pos);
- if (!isSpace(ch)) { break; }
- pos++;
- }
- if (pos < max && str.charCodeAt(pos) !== 0x0A) {
- if (title) {
- // garbage at the end of the line after title,
- // but it could still be a valid reference if we roll back
- title = '';
- pos = destEndPos;
- lines = destEndLineNo;
- while (pos < max) {
- ch = str.charCodeAt(pos);
- if (!isSpace(ch)) { break; }
- pos++;
- }
- }
- }
- if (pos < max && str.charCodeAt(pos) !== 0x0A) {
- // garbage at the end of the line
- return false;
- }
- label = normalizeReference(str.slice(1, labelEnd));
- if (!label) {
- // CommonMark 0.20 disallows empty labels
- return false;
- }
- // Reference can not terminate anything. This check is for safety only.
- /*istanbul ignore if*/
- if (silent) { return true; }
- if (typeof state.env.references === 'undefined') {
- state.env.references = {};
- }
- if (typeof state.env.references[label] === 'undefined') {
- state.env.references[label] = { title: title, href: href };
- }
- state.parentType = oldParentType;
- state.line = startLine + lines + 1;
- return true;
- };
- /***/ }),
- /* 55 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Parser state class
- var Token = __webpack_require__(4);
- var isSpace = __webpack_require__(0).isSpace;
- function StateBlock(src, md, env, tokens) {
- var ch, s, start, pos, len, indent, offset, indent_found;
- this.src = src;
- // link to parser instance
- this.md = md;
- this.env = env;
- //
- // Internal state vartiables
- //
- this.tokens = tokens;
- this.bMarks = []; // line begin offsets for fast jumps
- this.eMarks = []; // line end offsets for fast jumps
- this.tShift = []; // offsets of the first non-space characters (tabs not expanded)
- this.sCount = []; // indents for each line (tabs expanded)
- // An amount of virtual spaces (tabs expanded) between beginning
- // of each line (bMarks) and real beginning of that line.
- //
- // It exists only as a hack because blockquotes override bMarks
- // losing information in the process.
- //
- // It's used only when expanding tabs, you can think about it as
- // an initial tab length, e.g. bsCount=21 applied to string `\t123`
- // means first tab should be expanded to 4-21%4 === 3 spaces.
- //
- this.bsCount = [];
- // block parser variables
- this.blkIndent = 0; // required block content indent
- // (for example, if we are in list)
- this.line = 0; // line index in src
- this.lineMax = 0; // lines count
- this.tight = false; // loose/tight mode for lists
- this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any)
- // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'
- // used in lists to determine if they interrupt a paragraph
- this.parentType = 'root';
- this.level = 0;
- // renderer
- this.result = '';
- // Create caches
- // Generate markers.
- s = this.src;
- indent_found = false;
- for (start = pos = indent = offset = 0, len = s.length; pos < len; pos++) {
- ch = s.charCodeAt(pos);
- if (!indent_found) {
- if (isSpace(ch)) {
- indent++;
- if (ch === 0x09) {
- offset += 4 - offset % 4;
- } else {
- offset++;
- }
- continue;
- } else {
- indent_found = true;
- }
- }
- if (ch === 0x0A || pos === len - 1) {
- if (ch !== 0x0A) { pos++; }
- this.bMarks.push(start);
- this.eMarks.push(pos);
- this.tShift.push(indent);
- this.sCount.push(offset);
- this.bsCount.push(0);
- indent_found = false;
- indent = 0;
- offset = 0;
- start = pos + 1;
- }
- }
- // Push fake entry to simplify cache bounds checks
- this.bMarks.push(s.length);
- this.eMarks.push(s.length);
- this.tShift.push(0);
- this.sCount.push(0);
- this.bsCount.push(0);
- this.lineMax = this.bMarks.length - 1; // don't count last fake line
- }
- // Push new token to "stream".
- //
- StateBlock.prototype.push = function (type, tag, nesting) {
- var token = new Token(type, tag, nesting);
- token.block = true;
- if (nesting < 0) { this.level--; }
- token.level = this.level;
- if (nesting > 0) { this.level++; }
- this.tokens.push(token);
- return token;
- };
- StateBlock.prototype.isEmpty = function isEmpty(line) {
- return this.bMarks[line] + this.tShift[line] >= this.eMarks[line];
- };
- StateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) {
- for (var max = this.lineMax; from < max; from++) {
- if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) {
- break;
- }
- }
- return from;
- };
- // Skip spaces from given position.
- StateBlock.prototype.skipSpaces = function skipSpaces(pos) {
- var ch;
- for (var max = this.src.length; pos < max; pos++) {
- ch = this.src.charCodeAt(pos);
- if (!isSpace(ch)) { break; }
- }
- return pos;
- };
- // Skip spaces from given position in reverse.
- StateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) {
- if (pos <= min) { return pos; }
- while (pos > min) {
- if (!isSpace(this.src.charCodeAt(--pos))) { return pos + 1; }
- }
- return pos;
- };
- // Skip char codes from given position
- StateBlock.prototype.skipChars = function skipChars(pos, code) {
- for (var max = this.src.length; pos < max; pos++) {
- if (this.src.charCodeAt(pos) !== code) { break; }
- }
- return pos;
- };
- // Skip char codes reverse from given position - 1
- StateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) {
- if (pos <= min) { return pos; }
- while (pos > min) {
- if (code !== this.src.charCodeAt(--pos)) { return pos + 1; }
- }
- return pos;
- };
- // cut lines range from source.
- StateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) {
- var i, lineIndent, ch, first, last, queue, lineStart,
- line = begin;
- if (begin >= end) {
- return '';
- }
- queue = new Array(end - begin);
- for (i = 0; line < end; line++, i++) {
- lineIndent = 0;
- lineStart = first = this.bMarks[line];
- if (line + 1 < end || keepLastLF) {
- // No need for bounds check because we have fake entry on tail.
- last = this.eMarks[line] + 1;
- } else {
- last = this.eMarks[line];
- }
- while (first < last && lineIndent < indent) {
- ch = this.src.charCodeAt(first);
- if (isSpace(ch)) {
- if (ch === 0x09) {
- lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;
- } else {
- lineIndent++;
- }
- } else if (first - lineStart < this.tShift[line]) {
- // patched tShift masked characters to look like spaces (blockquotes, list markers)
- lineIndent++;
- } else {
- break;
- }
- first++;
- }
- if (lineIndent > indent) {
- // partially expanding tabs in code blocks, e.g '\t\tfoobar'
- // with indent=2 becomes ' \tfoobar'
- queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last);
- } else {
- queue[i] = this.src.slice(first, last);
- }
- }
- return queue.join('');
- };
- // re-export Token class to use in block rules
- StateBlock.prototype.Token = Token;
- module.exports = StateBlock;
- /***/ }),
- /* 56 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // GFM table, non-standard
- var isSpace = __webpack_require__(0).isSpace;
- function getLine(state, line) {
- var pos = state.bMarks[line] + state.blkIndent,
- max = state.eMarks[line];
- return state.src.substr(pos, max - pos);
- }
- function escapedSplit(str) {
- var result = [],
- pos = 0,
- max = str.length,
- ch,
- escapes = 0,
- lastPos = 0,
- backTicked = false,
- lastBackTick = 0;
- ch = str.charCodeAt(pos);
- while (pos < max) {
- if (ch === 0x60/* ` */) {
- if (backTicked) {
- // make \` close code sequence, but not open it;
- // the reason is: `\` is correct code block
- backTicked = false;
- lastBackTick = pos;
- } else if (escapes % 2 === 0) {
- backTicked = true;
- lastBackTick = pos;
- }
- } else if (ch === 0x7c/* | */ && (escapes % 2 === 0) && !backTicked) {
- result.push(str.substring(lastPos, pos));
- lastPos = pos + 1;
- }
- if (ch === 0x5c/* \ */) {
- escapes++;
- } else {
- escapes = 0;
- }
- pos++;
- // If there was an un-closed backtick, go back to just after
- // the last backtick, but as if it was a normal character
- if (pos === max && backTicked) {
- backTicked = false;
- pos = lastBackTick + 1;
- }
- ch = str.charCodeAt(pos);
- }
- result.push(str.substring(lastPos));
- return result;
- }
- module.exports = function table(state, startLine, endLine, silent) {
- var ch, lineText, pos, i, nextLine, columns, columnCount, token,
- aligns, t, tableLines, tbodyLines;
- // should have at least two lines
- if (startLine + 2 > endLine) { return false; }
- nextLine = startLine + 1;
- if (state.sCount[nextLine] < state.blkIndent) { return false; }
- // if it's indented more than 3 spaces, it should be a code block
- if (state.sCount[nextLine] - state.blkIndent >= 4) { return false; }
- // first character of the second line should be '|', '-', ':',
- // and no other characters are allowed but spaces;
- // basically, this is the equivalent of /^[-:|][-:|\s]*$/ regexp
- pos = state.bMarks[nextLine] + state.tShift[nextLine];
- if (pos >= state.eMarks[nextLine]) { return false; }
- ch = state.src.charCodeAt(pos++);
- if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */) { return false; }
- while (pos < state.eMarks[nextLine]) {
- ch = state.src.charCodeAt(pos);
- if (ch !== 0x7C/* | */ && ch !== 0x2D/* - */ && ch !== 0x3A/* : */ && !isSpace(ch)) { return false; }
- pos++;
- }
- lineText = getLine(state, startLine + 1);
- columns = lineText.split('|');
- aligns = [];
- for (i = 0; i < columns.length; i++) {
- t = columns[i].trim();
- if (!t) {
- // allow empty columns before and after table, but not in between columns;
- // e.g. allow ` |---| `, disallow ` ---||--- `
- if (i === 0 || i === columns.length - 1) {
- continue;
- } else {
- return false;
- }
- }
- if (!/^:?-+:?$/.test(t)) { return false; }
- if (t.charCodeAt(t.length - 1) === 0x3A/* : */) {
- aligns.push(t.charCodeAt(0) === 0x3A/* : */ ? 'center' : 'right');
- } else if (t.charCodeAt(0) === 0x3A/* : */) {
- aligns.push('left');
- } else {
- aligns.push('');
- }
- }
- lineText = getLine(state, startLine).trim();
- if (lineText.indexOf('|') === -1) { return false; }
- if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }
- columns = escapedSplit(lineText.replace(/^\||\|$/g, ''));
- // header row will define an amount of columns in the entire table,
- // and align row shouldn't be smaller than that (the rest of the rows can)
- columnCount = columns.length;
- if (columnCount > aligns.length) { return false; }
- if (silent) { return true; }
- token = state.push('table_open', 'table', 1);
- token.map = tableLines = [ startLine, 0 ];
- token = state.push('thead_open', 'thead', 1);
- token.map = [ startLine, startLine + 1 ];
- token = state.push('tr_open', 'tr', 1);
- token.map = [ startLine, startLine + 1 ];
- for (i = 0; i < columns.length; i++) {
- token = state.push('th_open', 'th', 1);
- token.map = [ startLine, startLine + 1 ];
- if (aligns[i]) {
- token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];
- }
- token = state.push('inline', '', 0);
- token.content = columns[i].trim();
- token.map = [ startLine, startLine + 1 ];
- token.children = [];
- token = state.push('th_close', 'th', -1);
- }
- token = state.push('tr_close', 'tr', -1);
- token = state.push('thead_close', 'thead', -1);
- token = state.push('tbody_open', 'tbody', 1);
- token.map = tbodyLines = [ startLine + 2, 0 ];
- for (nextLine = startLine + 2; nextLine < endLine; nextLine++) {
- if (state.sCount[nextLine] < state.blkIndent) { break; }
- lineText = getLine(state, nextLine).trim();
- if (lineText.indexOf('|') === -1) { break; }
- if (state.sCount[nextLine] - state.blkIndent >= 4) { break; }
- columns = escapedSplit(lineText.replace(/^\||\|$/g, ''));
- token = state.push('tr_open', 'tr', 1);
- for (i = 0; i < columnCount; i++) {
- token = state.push('td_open', 'td', 1);
- if (aligns[i]) {
- token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ];
- }
- token = state.push('inline', '', 0);
- token.content = columns[i] ? columns[i].trim() : '';
- token.children = [];
- token = state.push('td_close', 'td', -1);
- }
- token = state.push('tr_close', 'tr', -1);
- }
- token = state.push('tbody_close', 'tbody', -1);
- token = state.push('table_close', 'table', -1);
- tableLines[1] = tbodyLines[1] = nextLine;
- state.line = nextLine;
- return true;
- };
- /***/ }),
- /* 57 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports = function block(state) {
- var token;
- if (state.inlineMode) {
- token = new state.Token('inline', '', 0);
- token.content = state.src;
- token.map = [ 0, 1 ];
- token.children = [];
- state.tokens.push(token);
- } else {
- state.md.block.parse(state.src, state.md, state.env, state.tokens);
- }
- };
- /***/ }),
- /* 58 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports = function inline(state) {
- var tokens = state.tokens, tok, i, l;
- // Parse inlines
- for (i = 0, l = tokens.length; i < l; i++) {
- tok = tokens[i];
- if (tok.type === 'inline') {
- state.md.inline.parse(tok.content, state.md, state.env, tok.children);
- }
- }
- };
- /***/ }),
- /* 59 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Replace link-like texts with link nodes.
- //
- // Currently restricted by `md.validateLink()` to http/https/ftp
- //
- var arrayReplaceAt = __webpack_require__(0).arrayReplaceAt;
- function isLinkOpen(str) {
- return /^<a[>\s]/i.test(str);
- }
- function isLinkClose(str) {
- return /^<\/a\s*>/i.test(str);
- }
- module.exports = function linkify(state) {
- var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos,
- level, htmlLinkLevel, url, fullUrl, urlText,
- blockTokens = state.tokens,
- links;
- if (!state.md.options.linkify) { return; }
- for (j = 0, l = blockTokens.length; j < l; j++) {
- if (blockTokens[j].type !== 'inline' ||
- !state.md.linkify.pretest(blockTokens[j].content)) {
- continue;
- }
- tokens = blockTokens[j].children;
- htmlLinkLevel = 0;
- // We scan from the end, to keep position when new tags added.
- // Use reversed logic in links start/end match
- for (i = tokens.length - 1; i >= 0; i--) {
- currentToken = tokens[i];
- // Skip content of markdown links
- if (currentToken.type === 'link_close') {
- i--;
- while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') {
- i--;
- }
- continue;
- }
- // Skip content of html tag links
- if (currentToken.type === 'html_inline') {
- if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) {
- htmlLinkLevel--;
- }
- if (isLinkClose(currentToken.content)) {
- htmlLinkLevel++;
- }
- }
- if (htmlLinkLevel > 0) { continue; }
- if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) {
- text = currentToken.content;
- links = state.md.linkify.match(text);
- // Now split string to nodes
- nodes = [];
- level = currentToken.level;
- lastPos = 0;
- for (ln = 0; ln < links.length; ln++) {
- url = links[ln].url;
- fullUrl = state.md.normalizeLink(url);
- if (!state.md.validateLink(fullUrl)) { continue; }
- urlText = links[ln].text;
- // Linkifier might send raw hostnames like "example.com", where url
- // starts with domain name. So we prepend http:// in those cases,
- // and remove it afterwards.
- //
- if (!links[ln].schema) {
- urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\/\//, '');
- } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) {
- urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, '');
- } else {
- urlText = state.md.normalizeLinkText(urlText);
- }
- pos = links[ln].index;
- if (pos > lastPos) {
- token = new state.Token('text', '', 0);
- token.content = text.slice(lastPos, pos);
- token.level = level;
- nodes.push(token);
- }
- token = new state.Token('link_open', 'a', 1);
- token.attrs = [ [ 'href', fullUrl ] ];
- token.level = level++;
- token.markup = 'linkify';
- token.info = 'auto';
- nodes.push(token);
- token = new state.Token('text', '', 0);
- token.content = urlText;
- token.level = level;
- nodes.push(token);
- token = new state.Token('link_close', 'a', -1);
- token.level = --level;
- token.markup = 'linkify';
- token.info = 'auto';
- nodes.push(token);
- lastPos = links[ln].lastIndex;
- }
- if (lastPos < text.length) {
- token = new state.Token('text', '', 0);
- token.content = text.slice(lastPos);
- token.level = level;
- nodes.push(token);
- }
- // replace current node
- blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes);
- }
- }
- }
- };
- /***/ }),
- /* 60 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Normalize input string
- var NEWLINES_RE = /\r[\n\u0085]?|[\u2424\u2028\u0085]/g;
- var NULL_RE = /\u0000/g;
- module.exports = function inline(state) {
- var str;
- // Normalize newlines
- str = state.src.replace(NEWLINES_RE, '\n');
- // Replace NULL characters
- str = str.replace(NULL_RE, '\uFFFD');
- state.src = str;
- };
- /***/ }),
- /* 61 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Simple typographyc replacements
- //
- // (c) (C) → ©
- // (tm) (TM) → ™
- // (r) (R) → ®
- // +- → ±
- // (p) (P) -> §
- // ... → … (also ?.... → ?.., !.... → !..)
- // ???????? → ???, !!!!! → !!!, `,,` → `,`
- // -- → –, --- → —
- //
- // TODO:
- // - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾
- // - miltiplication 2 x 4 -> 2 × 4
- var RARE_RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/;
- // Workaround for phantomjs - need regex without /g flag,
- // or root check will fail every second time
- var SCOPED_ABBR_TEST_RE = /\((c|tm|r|p)\)/i;
- var SCOPED_ABBR_RE = /\((c|tm|r|p)\)/ig;
- var SCOPED_ABBR = {
- c: '©',
- r: '®',
- p: '§',
- tm: '™'
- };
- function replaceFn(match, name) {
- return SCOPED_ABBR[name.toLowerCase()];
- }
- function replace_scoped(inlineTokens) {
- var i, token, inside_autolink = 0;
- for (i = inlineTokens.length - 1; i >= 0; i--) {
- token = inlineTokens[i];
- if (token.type === 'text' && !inside_autolink) {
- token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn);
- }
- if (token.type === 'link_open' && token.info === 'auto') {
- inside_autolink--;
- }
- if (token.type === 'link_close' && token.info === 'auto') {
- inside_autolink++;
- }
- }
- }
- function replace_rare(inlineTokens) {
- var i, token, inside_autolink = 0;
- for (i = inlineTokens.length - 1; i >= 0; i--) {
- token = inlineTokens[i];
- if (token.type === 'text' && !inside_autolink) {
- if (RARE_RE.test(token.content)) {
- token.content = token.content
- .replace(/\+-/g, '±')
- // .., ..., ....... -> …
- // but ?..... & !..... -> ?.. & !..
- .replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..')
- .replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',')
- // em-dash
- .replace(/(^|[^-])---([^-]|$)/mg, '$1\u2014$2')
- // en-dash
- .replace(/(^|\s)--(\s|$)/mg, '$1\u2013$2')
- .replace(/(^|[^-\s])--([^-\s]|$)/mg, '$1\u2013$2');
- }
- }
- if (token.type === 'link_open' && token.info === 'auto') {
- inside_autolink--;
- }
- if (token.type === 'link_close' && token.info === 'auto') {
- inside_autolink++;
- }
- }
- }
- module.exports = function replace(state) {
- var blkIdx;
- if (!state.md.options.typographer) { return; }
- for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {
- if (state.tokens[blkIdx].type !== 'inline') { continue; }
- if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) {
- replace_scoped(state.tokens[blkIdx].children);
- }
- if (RARE_RE.test(state.tokens[blkIdx].content)) {
- replace_rare(state.tokens[blkIdx].children);
- }
- }
- };
- /***/ }),
- /* 62 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Convert straight quotation marks to typographic ones
- //
- var isWhiteSpace = __webpack_require__(0).isWhiteSpace;
- var isPunctChar = __webpack_require__(0).isPunctChar;
- var isMdAsciiPunct = __webpack_require__(0).isMdAsciiPunct;
- var QUOTE_TEST_RE = /['"]/;
- var QUOTE_RE = /['"]/g;
- var APOSTROPHE = '\u2019'; /* ’ */
- function replaceAt(str, index, ch) {
- return str.substr(0, index) + ch + str.substr(index + 1);
- }
- function process_inlines(tokens, state) {
- var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar,
- isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace,
- canOpen, canClose, j, isSingle, stack, openQuote, closeQuote;
- stack = [];
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- thisLevel = tokens[i].level;
- for (j = stack.length - 1; j >= 0; j--) {
- if (stack[j].level <= thisLevel) { break; }
- }
- stack.length = j + 1;
- if (token.type !== 'text') { continue; }
- text = token.content;
- pos = 0;
- max = text.length;
- /*eslint no-labels:0,block-scoped-var:0*/
- OUTER:
- while (pos < max) {
- QUOTE_RE.lastIndex = pos;
- t = QUOTE_RE.exec(text);
- if (!t) { break; }
- canOpen = canClose = true;
- pos = t.index + 1;
- isSingle = (t[0] === "'");
- // Find previous character,
- // default to space if it's the beginning of the line
- //
- lastChar = 0x20;
- if (t.index - 1 >= 0) {
- lastChar = text.charCodeAt(t.index - 1);
- } else {
- for (j = i - 1; j >= 0; j--) {
- if (tokens[j].type !== 'text') { continue; }
- lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1);
- break;
- }
- }
- // Find next character,
- // default to space if it's the end of the line
- //
- nextChar = 0x20;
- if (pos < max) {
- nextChar = text.charCodeAt(pos);
- } else {
- for (j = i + 1; j < tokens.length; j++) {
- if (tokens[j].type !== 'text') { continue; }
- nextChar = tokens[j].content.charCodeAt(0);
- break;
- }
- }
- isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));
- isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));
- isLastWhiteSpace = isWhiteSpace(lastChar);
- isNextWhiteSpace = isWhiteSpace(nextChar);
- if (isNextWhiteSpace) {
- canOpen = false;
- } else if (isNextPunctChar) {
- if (!(isLastWhiteSpace || isLastPunctChar)) {
- canOpen = false;
- }
- }
- if (isLastWhiteSpace) {
- canClose = false;
- } else if (isLastPunctChar) {
- if (!(isNextWhiteSpace || isNextPunctChar)) {
- canClose = false;
- }
- }
- if (nextChar === 0x22 /* " */ && t[0] === '"') {
- if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) {
- // special case: 1"" - count first quote as an inch
- canClose = canOpen = false;
- }
- }
- if (canOpen && canClose) {
- // treat this as the middle of the word
- canOpen = false;
- canClose = isNextPunctChar;
- }
- if (!canOpen && !canClose) {
- // middle of word
- if (isSingle) {
- token.content = replaceAt(token.content, t.index, APOSTROPHE);
- }
- continue;
- }
- if (canClose) {
- // this could be a closing quote, rewind the stack to get a match
- for (j = stack.length - 1; j >= 0; j--) {
- item = stack[j];
- if (stack[j].level < thisLevel) { break; }
- if (item.single === isSingle && stack[j].level === thisLevel) {
- item = stack[j];
- if (isSingle) {
- openQuote = state.md.options.quotes[2];
- closeQuote = state.md.options.quotes[3];
- } else {
- openQuote = state.md.options.quotes[0];
- closeQuote = state.md.options.quotes[1];
- }
- // replace token.content *before* tokens[item.token].content,
- // because, if they are pointing at the same token, replaceAt
- // could mess up indices when quote length != 1
- token.content = replaceAt(token.content, t.index, closeQuote);
- tokens[item.token].content = replaceAt(
- tokens[item.token].content, item.pos, openQuote);
- pos += closeQuote.length - 1;
- if (item.token === i) { pos += openQuote.length - 1; }
- text = token.content;
- max = text.length;
- stack.length = j;
- continue OUTER;
- }
- }
- }
- if (canOpen) {
- stack.push({
- token: i,
- pos: t.index,
- single: isSingle,
- level: thisLevel
- });
- } else if (canClose && isSingle) {
- token.content = replaceAt(token.content, t.index, APOSTROPHE);
- }
- }
- }
- }
- module.exports = function smartquotes(state) {
- /*eslint max-depth:0*/
- var blkIdx;
- if (!state.md.options.typographer) { return; }
- for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) {
- if (state.tokens[blkIdx].type !== 'inline' ||
- !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) {
- continue;
- }
- process_inlines(state.tokens[blkIdx].children, state);
- }
- };
- /***/ }),
- /* 63 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Core state object
- //
- var Token = __webpack_require__(4);
- function StateCore(src, md, env) {
- this.src = src;
- this.env = env;
- this.tokens = [];
- this.inlineMode = false;
- this.md = md; // link to parser instance
- }
- // re-export Token class to use in core rules
- StateCore.prototype.Token = Token;
- module.exports = StateCore;
- /***/ }),
- /* 64 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process autolinks '<protocol:...>'
- /*eslint max-len:0*/
- var EMAIL_RE = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/;
- var AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;
- module.exports = function autolink(state, silent) {
- var tail, linkMatch, emailMatch, url, fullUrl, token,
- pos = state.pos;
- if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; }
- tail = state.src.slice(pos);
- if (tail.indexOf('>') < 0) { return false; }
- if (AUTOLINK_RE.test(tail)) {
- linkMatch = tail.match(AUTOLINK_RE);
- url = linkMatch[0].slice(1, -1);
- fullUrl = state.md.normalizeLink(url);
- if (!state.md.validateLink(fullUrl)) { return false; }
- if (!silent) {
- token = state.push('link_open', 'a', 1);
- token.attrs = [ [ 'href', fullUrl ] ];
- token.markup = 'autolink';
- token.info = 'auto';
- token = state.push('text', '', 0);
- token.content = state.md.normalizeLinkText(url);
- token = state.push('link_close', 'a', -1);
- token.markup = 'autolink';
- token.info = 'auto';
- }
- state.pos += linkMatch[0].length;
- return true;
- }
- if (EMAIL_RE.test(tail)) {
- emailMatch = tail.match(EMAIL_RE);
- url = emailMatch[0].slice(1, -1);
- fullUrl = state.md.normalizeLink('mailto:' + url);
- if (!state.md.validateLink(fullUrl)) { return false; }
- if (!silent) {
- token = state.push('link_open', 'a', 1);
- token.attrs = [ [ 'href', fullUrl ] ];
- token.markup = 'autolink';
- token.info = 'auto';
- token = state.push('text', '', 0);
- token.content = state.md.normalizeLinkText(url);
- token = state.push('link_close', 'a', -1);
- token.markup = 'autolink';
- token.info = 'auto';
- }
- state.pos += emailMatch[0].length;
- return true;
- }
- return false;
- };
- /***/ }),
- /* 65 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Parse backticks
- module.exports = function backtick(state, silent) {
- var start, max, marker, matchStart, matchEnd, token,
- pos = state.pos,
- ch = state.src.charCodeAt(pos);
- if (ch !== 0x60/* ` */) { return false; }
- start = pos;
- pos++;
- max = state.posMax;
- while (pos < max && state.src.charCodeAt(pos) === 0x60/* ` */) { pos++; }
- marker = state.src.slice(start, pos);
- matchStart = matchEnd = pos;
- while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) {
- matchEnd = matchStart + 1;
- while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60/* ` */) { matchEnd++; }
- if (matchEnd - matchStart === marker.length) {
- if (!silent) {
- token = state.push('code_inline', 'code', 0);
- token.markup = marker;
- token.content = state.src.slice(pos, matchStart)
- .replace(/[ \n]+/g, ' ')
- .trim();
- }
- state.pos = matchEnd;
- return true;
- }
- }
- if (!silent) { state.pending += marker; }
- state.pos += marker.length;
- return true;
- };
- /***/ }),
- /* 66 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // For each opening emphasis-like marker find a matching closing one
- //
- module.exports = function link_pairs(state) {
- var i, j, lastDelim, currDelim,
- delimiters = state.delimiters,
- max = state.delimiters.length;
- for (i = 0; i < max; i++) {
- lastDelim = delimiters[i];
- if (!lastDelim.close) { continue; }
- j = i - lastDelim.jump - 1;
- while (j >= 0) {
- currDelim = delimiters[j];
- if (currDelim.open &&
- currDelim.marker === lastDelim.marker &&
- currDelim.end < 0 &&
- currDelim.level === lastDelim.level) {
- // typeofs are for backward compatibility with plugins
- var odd_match = (currDelim.close || lastDelim.open) &&
- typeof currDelim.length !== 'undefined' &&
- typeof lastDelim.length !== 'undefined' &&
- (currDelim.length + lastDelim.length) % 3 === 0;
- if (!odd_match) {
- lastDelim.jump = i - j;
- lastDelim.open = false;
- currDelim.end = i;
- currDelim.jump = 0;
- break;
- }
- }
- j -= currDelim.jump + 1;
- }
- }
- };
- /***/ }),
- /* 67 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process html entity - {, ¯, ", ...
- var entities = __webpack_require__(11);
- var has = __webpack_require__(0).has;
- var isValidEntityCode = __webpack_require__(0).isValidEntityCode;
- var fromCodePoint = __webpack_require__(0).fromCodePoint;
- var DIGITAL_RE = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i;
- var NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i;
- module.exports = function entity(state, silent) {
- var ch, code, match, pos = state.pos, max = state.posMax;
- if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; }
- if (pos + 1 < max) {
- ch = state.src.charCodeAt(pos + 1);
- if (ch === 0x23 /* # */) {
- match = state.src.slice(pos).match(DIGITAL_RE);
- if (match) {
- if (!silent) {
- code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10);
- state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD);
- }
- state.pos += match[0].length;
- return true;
- }
- } else {
- match = state.src.slice(pos).match(NAMED_RE);
- if (match) {
- if (has(entities, match[1])) {
- if (!silent) { state.pending += entities[match[1]]; }
- state.pos += match[0].length;
- return true;
- }
- }
- }
- }
- if (!silent) { state.pending += '&'; }
- state.pos++;
- return true;
- };
- /***/ }),
- /* 68 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Proceess escaped chars and hardbreaks
- var isSpace = __webpack_require__(0).isSpace;
- var ESCAPED = [];
- for (var i = 0; i < 256; i++) { ESCAPED.push(0); }
- '\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-'
- .split('').forEach(function (ch) { ESCAPED[ch.charCodeAt(0)] = 1; });
- module.exports = function escape(state, silent) {
- var ch, pos = state.pos, max = state.posMax;
- if (state.src.charCodeAt(pos) !== 0x5C/* \ */) { return false; }
- pos++;
- if (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (ch < 256 && ESCAPED[ch] !== 0) {
- if (!silent) { state.pending += state.src[pos]; }
- state.pos += 2;
- return true;
- }
- if (ch === 0x0A) {
- if (!silent) {
- state.push('hardbreak', 'br', 0);
- }
- pos++;
- // skip leading whitespaces from next line
- while (pos < max) {
- ch = state.src.charCodeAt(pos);
- if (!isSpace(ch)) { break; }
- pos++;
- }
- state.pos = pos;
- return true;
- }
- }
- if (!silent) { state.pending += '\\'; }
- state.pos++;
- return true;
- };
- /***/ }),
- /* 69 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process html tags
- var HTML_TAG_RE = __webpack_require__(12).HTML_TAG_RE;
- function isLetter(ch) {
- /*eslint no-bitwise:0*/
- var lc = ch | 0x20; // to lower case
- return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);
- }
- module.exports = function html_inline(state, silent) {
- var ch, match, max, token,
- pos = state.pos;
- if (!state.md.options.html) { return false; }
- // Check start
- max = state.posMax;
- if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||
- pos + 2 >= max) {
- return false;
- }
- // Quick fail on second char
- ch = state.src.charCodeAt(pos + 1);
- if (ch !== 0x21/* ! */ &&
- ch !== 0x3F/* ? */ &&
- ch !== 0x2F/* / */ &&
- !isLetter(ch)) {
- return false;
- }
- match = state.src.slice(pos).match(HTML_TAG_RE);
- if (!match) { return false; }
- if (!silent) {
- token = state.push('html_inline', '', 0);
- token.content = state.src.slice(pos, pos + match[0].length);
- }
- state.pos += match[0].length;
- return true;
- };
- /***/ }),
- /* 70 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process ![image](<src> "title")
- var normalizeReference = __webpack_require__(0).normalizeReference;
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function image(state, silent) {
- var attrs,
- code,
- content,
- label,
- labelEnd,
- labelStart,
- pos,
- ref,
- res,
- title,
- token,
- tokens,
- start,
- href = '',
- oldPos = state.pos,
- max = state.posMax;
- if (state.src.charCodeAt(state.pos) !== 0x21/* ! */) { return false; }
- if (state.src.charCodeAt(state.pos + 1) !== 0x5B/* [ */) { return false; }
- labelStart = state.pos + 2;
- labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false);
- // parser failed to find ']', so it's not a valid link
- if (labelEnd < 0) { return false; }
- pos = labelEnd + 1;
- if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {
- //
- // Inline link
- //
- // [link]( <href> "title" )
- // ^^ skipping these spaces
- pos++;
- for (; pos < max; pos++) {
- code = state.src.charCodeAt(pos);
- if (!isSpace(code) && code !== 0x0A) { break; }
- }
- if (pos >= max) { return false; }
- // [link]( <href> "title" )
- // ^^^^^^ parsing link destination
- start = pos;
- res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);
- if (res.ok) {
- href = state.md.normalizeLink(res.str);
- if (state.md.validateLink(href)) {
- pos = res.pos;
- } else {
- href = '';
- }
- }
- // [link]( <href> "title" )
- // ^^ skipping these spaces
- start = pos;
- for (; pos < max; pos++) {
- code = state.src.charCodeAt(pos);
- if (!isSpace(code) && code !== 0x0A) { break; }
- }
- // [link]( <href> "title" )
- // ^^^^^^^ parsing link title
- res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);
- if (pos < max && start !== pos && res.ok) {
- title = res.str;
- pos = res.pos;
- // [link]( <href> "title" )
- // ^^ skipping these spaces
- for (; pos < max; pos++) {
- code = state.src.charCodeAt(pos);
- if (!isSpace(code) && code !== 0x0A) { break; }
- }
- } else {
- title = '';
- }
- if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {
- state.pos = oldPos;
- return false;
- }
- pos++;
- } else {
- //
- // Link reference
- //
- if (typeof state.env.references === 'undefined') { return false; }
- if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {
- start = pos + 1;
- pos = state.md.helpers.parseLinkLabel(state, pos);
- if (pos >= 0) {
- label = state.src.slice(start, pos++);
- } else {
- pos = labelEnd + 1;
- }
- } else {
- pos = labelEnd + 1;
- }
- // covers label === '' and label === undefined
- // (collapsed reference link and shortcut reference link respectively)
- if (!label) { label = state.src.slice(labelStart, labelEnd); }
- ref = state.env.references[normalizeReference(label)];
- if (!ref) {
- state.pos = oldPos;
- return false;
- }
- href = ref.href;
- title = ref.title;
- }
- //
- // We found the end of the link, and know for a fact it's a valid link;
- // so all that's left to do is to call tokenizer.
- //
- if (!silent) {
- content = state.src.slice(labelStart, labelEnd);
- state.md.inline.parse(
- content,
- state.md,
- state.env,
- tokens = []
- );
- token = state.push('image', 'img', 0);
- token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ];
- token.children = tokens;
- token.content = content;
- if (title) {
- attrs.push([ 'title', title ]);
- }
- }
- state.pos = pos;
- state.posMax = max;
- return true;
- };
- /***/ }),
- /* 71 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Process [link](<to> "stuff")
- var normalizeReference = __webpack_require__(0).normalizeReference;
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function link(state, silent) {
- var attrs,
- code,
- label,
- labelEnd,
- labelStart,
- pos,
- res,
- ref,
- title,
- token,
- href = '',
- oldPos = state.pos,
- max = state.posMax,
- start = state.pos,
- parseReference = true;
- if (state.src.charCodeAt(state.pos) !== 0x5B/* [ */) { return false; }
- labelStart = state.pos + 1;
- labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true);
- // parser failed to find ']', so it's not a valid link
- if (labelEnd < 0) { return false; }
- pos = labelEnd + 1;
- if (pos < max && state.src.charCodeAt(pos) === 0x28/* ( */) {
- //
- // Inline link
- //
- // might have found a valid shortcut link, disable reference parsing
- parseReference = false;
- // [link]( <href> "title" )
- // ^^ skipping these spaces
- pos++;
- for (; pos < max; pos++) {
- code = state.src.charCodeAt(pos);
- if (!isSpace(code) && code !== 0x0A) { break; }
- }
- if (pos >= max) { return false; }
- // [link]( <href> "title" )
- // ^^^^^^ parsing link destination
- start = pos;
- res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax);
- if (res.ok) {
- href = state.md.normalizeLink(res.str);
- if (state.md.validateLink(href)) {
- pos = res.pos;
- } else {
- href = '';
- }
- }
- // [link]( <href> "title" )
- // ^^ skipping these spaces
- start = pos;
- for (; pos < max; pos++) {
- code = state.src.charCodeAt(pos);
- if (!isSpace(code) && code !== 0x0A) { break; }
- }
- // [link]( <href> "title" )
- // ^^^^^^^ parsing link title
- res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax);
- if (pos < max && start !== pos && res.ok) {
- title = res.str;
- pos = res.pos;
- // [link]( <href> "title" )
- // ^^ skipping these spaces
- for (; pos < max; pos++) {
- code = state.src.charCodeAt(pos);
- if (!isSpace(code) && code !== 0x0A) { break; }
- }
- } else {
- title = '';
- }
- if (pos >= max || state.src.charCodeAt(pos) !== 0x29/* ) */) {
- // parsing a valid shortcut link failed, fallback to reference
- parseReference = true;
- }
- pos++;
- }
- if (parseReference) {
- //
- // Link reference
- //
- if (typeof state.env.references === 'undefined') { return false; }
- if (pos < max && state.src.charCodeAt(pos) === 0x5B/* [ */) {
- start = pos + 1;
- pos = state.md.helpers.parseLinkLabel(state, pos);
- if (pos >= 0) {
- label = state.src.slice(start, pos++);
- } else {
- pos = labelEnd + 1;
- }
- } else {
- pos = labelEnd + 1;
- }
- // covers label === '' and label === undefined
- // (collapsed reference link and shortcut reference link respectively)
- if (!label) { label = state.src.slice(labelStart, labelEnd); }
- ref = state.env.references[normalizeReference(label)];
- if (!ref) {
- state.pos = oldPos;
- return false;
- }
- href = ref.href;
- title = ref.title;
- }
- //
- // We found the end of the link, and know for a fact it's a valid link;
- // so all that's left to do is to call tokenizer.
- //
- if (!silent) {
- state.pos = labelStart;
- state.posMax = labelEnd;
- token = state.push('link_open', 'a', 1);
- token.attrs = attrs = [ [ 'href', href ] ];
- if (title) {
- attrs.push([ 'title', title ]);
- }
- state.md.inline.tokenize(state);
- token = state.push('link_close', 'a', -1);
- }
- state.pos = pos;
- state.posMax = max;
- return true;
- };
- /***/ }),
- /* 72 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Proceess '\n'
- var isSpace = __webpack_require__(0).isSpace;
- module.exports = function newline(state, silent) {
- var pmax, max, pos = state.pos;
- if (state.src.charCodeAt(pos) !== 0x0A/* \n */) { return false; }
- pmax = state.pending.length - 1;
- max = state.posMax;
- // ' \n' -> hardbreak
- // Lookup in pending chars is bad practice! Don't copy to other rules!
- // Pending string is stored in concat mode, indexed lookups will cause
- // convertion to flat mode.
- if (!silent) {
- if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) {
- if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) {
- state.pending = state.pending.replace(/ +$/, '');
- state.push('hardbreak', 'br', 0);
- } else {
- state.pending = state.pending.slice(0, -1);
- state.push('softbreak', 'br', 0);
- }
- } else {
- state.push('softbreak', 'br', 0);
- }
- }
- pos++;
- // skip heading spaces for next line
- while (pos < max && isSpace(state.src.charCodeAt(pos))) { pos++; }
- state.pos = pos;
- return true;
- };
- /***/ }),
- /* 73 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Inline parser state
- var Token = __webpack_require__(4);
- var isWhiteSpace = __webpack_require__(0).isWhiteSpace;
- var isPunctChar = __webpack_require__(0).isPunctChar;
- var isMdAsciiPunct = __webpack_require__(0).isMdAsciiPunct;
- function StateInline(src, md, env, outTokens) {
- this.src = src;
- this.env = env;
- this.md = md;
- this.tokens = outTokens;
- this.pos = 0;
- this.posMax = this.src.length;
- this.level = 0;
- this.pending = '';
- this.pendingLevel = 0;
- this.cache = {}; // Stores { start: end } pairs. Useful for backtrack
- // optimization of pairs parse (emphasis, strikes).
- this.delimiters = []; // Emphasis-like delimiters
- }
- // Flush pending text
- //
- StateInline.prototype.pushPending = function () {
- var token = new Token('text', '', 0);
- token.content = this.pending;
- token.level = this.pendingLevel;
- this.tokens.push(token);
- this.pending = '';
- return token;
- };
- // Push new token to "stream".
- // If pending text exists - flush it as text token
- //
- StateInline.prototype.push = function (type, tag, nesting) {
- if (this.pending) {
- this.pushPending();
- }
- var token = new Token(type, tag, nesting);
- if (nesting < 0) { this.level--; }
- token.level = this.level;
- if (nesting > 0) { this.level++; }
- this.pendingLevel = this.level;
- this.tokens.push(token);
- return token;
- };
- // Scan a sequence of emphasis-like markers, and determine whether
- // it can start an emphasis sequence or end an emphasis sequence.
- //
- // - start - position to scan from (it should point at a valid marker);
- // - canSplitWord - determine if these markers can be found inside a word
- //
- StateInline.prototype.scanDelims = function (start, canSplitWord) {
- var pos = start, lastChar, nextChar, count, can_open, can_close,
- isLastWhiteSpace, isLastPunctChar,
- isNextWhiteSpace, isNextPunctChar,
- left_flanking = true,
- right_flanking = true,
- max = this.posMax,
- marker = this.src.charCodeAt(start);
- // treat beginning of the line as a whitespace
- lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20;
- while (pos < max && this.src.charCodeAt(pos) === marker) { pos++; }
- count = pos - start;
- // treat end of the line as a whitespace
- nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20;
- isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar));
- isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar));
- isLastWhiteSpace = isWhiteSpace(lastChar);
- isNextWhiteSpace = isWhiteSpace(nextChar);
- if (isNextWhiteSpace) {
- left_flanking = false;
- } else if (isNextPunctChar) {
- if (!(isLastWhiteSpace || isLastPunctChar)) {
- left_flanking = false;
- }
- }
- if (isLastWhiteSpace) {
- right_flanking = false;
- } else if (isLastPunctChar) {
- if (!(isNextWhiteSpace || isNextPunctChar)) {
- right_flanking = false;
- }
- }
- if (!canSplitWord) {
- can_open = left_flanking && (!right_flanking || isLastPunctChar);
- can_close = right_flanking && (!left_flanking || isNextPunctChar);
- } else {
- can_open = left_flanking;
- can_close = right_flanking;
- }
- return {
- can_open: can_open,
- can_close: can_close,
- length: count
- };
- };
- // re-export Token class to use in block rules
- StateInline.prototype.Token = Token;
- module.exports = StateInline;
- /***/ }),
- /* 74 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Skip text characters for text token, place those to pending buffer
- // and increment current pos
- // Rule to skip pure text
- // '{}$%@~+=:' reserved for extentions
- // !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~
- // !!!! Don't confuse with "Markdown ASCII Punctuation" chars
- // http://spec.commonmark.org/0.15/#ascii-punctuation-character
- function isTerminatorChar(ch) {
- switch (ch) {
- case 0x0A/* \n */:
- case 0x21/* ! */:
- case 0x23/* # */:
- case 0x24/* $ */:
- case 0x25/* % */:
- case 0x26/* & */:
- case 0x2A/* * */:
- case 0x2B/* + */:
- case 0x2D/* - */:
- case 0x3A/* : */:
- case 0x3C/* < */:
- case 0x3D/* = */:
- case 0x3E/* > */:
- case 0x40/* @ */:
- case 0x5B/* [ */:
- case 0x5C/* \ */:
- case 0x5D/* ] */:
- case 0x5E/* ^ */:
- case 0x5F/* _ */:
- case 0x60/* ` */:
- case 0x7B/* { */:
- case 0x7D/* } */:
- case 0x7E/* ~ */:
- return true;
- default:
- return false;
- }
- }
- module.exports = function text(state, silent) {
- var pos = state.pos;
- while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) {
- pos++;
- }
- if (pos === state.pos) { return false; }
- if (!silent) { state.pending += state.src.slice(state.pos, pos); }
- state.pos = pos;
- return true;
- };
- // Alternative implementation, for memory.
- //
- // It costs 10% of performance, but allows extend terminators list, if place it
- // to `ParcerInline` property. Probably, will switch to it sometime, such
- // flexibility required.
- /*
- var TERMINATOR_RE = /[\n!#$%&*+\-:<=>@[\\\]^_`{}~]/;
- module.exports = function text(state, silent) {
- var pos = state.pos,
- idx = state.src.slice(pos).search(TERMINATOR_RE);
- // first char is terminator -> empty text
- if (idx === 0) { return false; }
- // no terminator -> text till end of string
- if (idx < 0) {
- if (!silent) { state.pending += state.src.slice(pos); }
- state.pos = state.src.length;
- return true;
- }
- if (!silent) { state.pending += state.src.slice(pos, pos + idx); }
- state.pos += idx;
- return true;
- };*/
- /***/ }),
- /* 75 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Merge adjacent text nodes into one, and re-calculate all token levels
- //
- module.exports = function text_collapse(state) {
- var curr, last,
- level = 0,
- tokens = state.tokens,
- max = state.tokens.length;
- for (curr = last = 0; curr < max; curr++) {
- // re-calculate levels
- level += tokens[curr].nesting;
- tokens[curr].level = level;
- if (tokens[curr].type === 'text' &&
- curr + 1 < max &&
- tokens[curr + 1].type === 'text') {
- // collapse two adjacent text nodes
- tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content;
- } else {
- if (curr !== last) { tokens[last] = tokens[curr]; }
- last++;
- }
- }
- if (curr !== last) {
- tokens.length = last;
- }
- };
- /***/ }),
- /* 76 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* eslint-disable no-bitwise */
- var decodeCache = {};
- function getDecodeCache(exclude) {
- var i, ch, cache = decodeCache[exclude];
- if (cache) { return cache; }
- cache = decodeCache[exclude] = [];
- for (i = 0; i < 128; i++) {
- ch = String.fromCharCode(i);
- cache.push(ch);
- }
- for (i = 0; i < exclude.length; i++) {
- ch = exclude.charCodeAt(i);
- cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2);
- }
- return cache;
- }
- // Decode percent-encoded string.
- //
- function decode(string, exclude) {
- var cache;
- if (typeof exclude !== 'string') {
- exclude = decode.defaultChars;
- }
- cache = getDecodeCache(exclude);
- return string.replace(/(%[a-f0-9]{2})+/gi, function(seq) {
- var i, l, b1, b2, b3, b4, chr,
- result = '';
- for (i = 0, l = seq.length; i < l; i += 3) {
- b1 = parseInt(seq.slice(i + 1, i + 3), 16);
- if (b1 < 0x80) {
- result += cache[b1];
- continue;
- }
- if ((b1 & 0xE0) === 0xC0 && (i + 3 < l)) {
- // 110xxxxx 10xxxxxx
- b2 = parseInt(seq.slice(i + 4, i + 6), 16);
- if ((b2 & 0xC0) === 0x80) {
- chr = ((b1 << 6) & 0x7C0) | (b2 & 0x3F);
- if (chr < 0x80) {
- result += '\ufffd\ufffd';
- } else {
- result += String.fromCharCode(chr);
- }
- i += 3;
- continue;
- }
- }
- if ((b1 & 0xF0) === 0xE0 && (i + 6 < l)) {
- // 1110xxxx 10xxxxxx 10xxxxxx
- b2 = parseInt(seq.slice(i + 4, i + 6), 16);
- b3 = parseInt(seq.slice(i + 7, i + 9), 16);
- if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
- chr = ((b1 << 12) & 0xF000) | ((b2 << 6) & 0xFC0) | (b3 & 0x3F);
- if (chr < 0x800 || (chr >= 0xD800 && chr <= 0xDFFF)) {
- result += '\ufffd\ufffd\ufffd';
- } else {
- result += String.fromCharCode(chr);
- }
- i += 6;
- continue;
- }
- }
- if ((b1 & 0xF8) === 0xF0 && (i + 9 < l)) {
- // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx
- b2 = parseInt(seq.slice(i + 4, i + 6), 16);
- b3 = parseInt(seq.slice(i + 7, i + 9), 16);
- b4 = parseInt(seq.slice(i + 10, i + 12), 16);
- if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) {
- chr = ((b1 << 18) & 0x1C0000) | ((b2 << 12) & 0x3F000) | ((b3 << 6) & 0xFC0) | (b4 & 0x3F);
- if (chr < 0x10000 || chr > 0x10FFFF) {
- result += '\ufffd\ufffd\ufffd\ufffd';
- } else {
- chr -= 0x10000;
- result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF));
- }
- i += 9;
- continue;
- }
- }
- result += '\ufffd';
- }
- return result;
- });
- }
- decode.defaultChars = ';/?:@&=+$,#';
- decode.componentChars = '';
- module.exports = decode;
- /***/ }),
- /* 77 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- var encodeCache = {};
- // Create a lookup array where anything but characters in `chars` string
- // and alphanumeric chars is percent-encoded.
- //
- function getEncodeCache(exclude) {
- var i, ch, cache = encodeCache[exclude];
- if (cache) { return cache; }
- cache = encodeCache[exclude] = [];
- for (i = 0; i < 128; i++) {
- ch = String.fromCharCode(i);
- if (/^[0-9a-z]$/i.test(ch)) {
- // always allow unencoded alphanumeric characters
- cache.push(ch);
- } else {
- cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2));
- }
- }
- for (i = 0; i < exclude.length; i++) {
- cache[exclude.charCodeAt(i)] = exclude[i];
- }
- return cache;
- }
- // Encode unsafe characters with percent-encoding, skipping already
- // encoded sequences.
- //
- // - string - string to encode
- // - exclude - list of characters to ignore (in addition to a-zA-Z0-9)
- // - keepEscaped - don't encode '%' in a correct escape sequence (default: true)
- //
- function encode(string, exclude, keepEscaped) {
- var i, l, code, nextCode, cache,
- result = '';
- if (typeof exclude !== 'string') {
- // encode(string, keepEscaped)
- keepEscaped = exclude;
- exclude = encode.defaultChars;
- }
- if (typeof keepEscaped === 'undefined') {
- keepEscaped = true;
- }
- cache = getEncodeCache(exclude);
- for (i = 0, l = string.length; i < l; i++) {
- code = string.charCodeAt(i);
- if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) {
- if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) {
- result += string.slice(i, i + 3);
- i += 2;
- continue;
- }
- }
- if (code < 128) {
- result += cache[code];
- continue;
- }
- if (code >= 0xD800 && code <= 0xDFFF) {
- if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) {
- nextCode = string.charCodeAt(i + 1);
- if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) {
- result += encodeURIComponent(string[i] + string[i + 1]);
- i++;
- continue;
- }
- }
- result += '%EF%BF%BD';
- continue;
- }
- result += encodeURIComponent(string[i]);
- }
- return result;
- }
- encode.defaultChars = ";/?:@&=+$,-_.!~*'()#";
- encode.componentChars = "-_.!~*'()";
- module.exports = encode;
- /***/ }),
- /* 78 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- module.exports = function format(url) {
- var result = '';
- result += url.protocol || '';
- result += url.slashes ? '//' : '';
- result += url.auth ? url.auth + '@' : '';
- if (url.hostname && url.hostname.indexOf(':') !== -1) {
- // ipv6 address
- result += '[' + url.hostname + ']';
- } else {
- result += url.hostname || '';
- }
- result += url.port ? ':' + url.port : '';
- result += url.pathname || '';
- result += url.search || '';
- result += url.hash || '';
- return result;
- };
- /***/ }),
- /* 79 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- // Copyright Joyent, Inc. and other Node contributors.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a
- // copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to permit
- // persons to whom the Software is furnished to do so, subject to the
- // following conditions:
- //
- // The above copyright notice and this permission notice shall be included
- // in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- // Changes from joyent/node:
- //
- // 1. No leading slash in paths,
- // e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/`
- //
- // 2. Backslashes are not replaced with slashes,
- // so `http:\\example.org\` is treated like a relative path
- //
- // 3. Trailing colon is treated like a part of the path,
- // i.e. in `http://example.org:foo` pathname is `:foo`
- //
- // 4. Nothing is URL-encoded in the resulting object,
- // (in joyent/node some chars in auth and paths are encoded)
- //
- // 5. `url.parse()` does not have `parseQueryString` argument
- //
- // 6. Removed extraneous result properties: `host`, `path`, `query`, etc.,
- // which can be constructed using other parts of the url.
- //
- function Url() {
- this.protocol = null;
- this.slashes = null;
- this.auth = null;
- this.port = null;
- this.hostname = null;
- this.hash = null;
- this.search = null;
- this.pathname = null;
- }
- // Reference: RFC 3986, RFC 1808, RFC 2396
- // define these here so at least they only have to be
- // compiled once on the first module load.
- var protocolPattern = /^([a-z0-9.+-]+:)/i,
- portPattern = /:[0-9]*$/,
- // Special case for a simple path URL
- simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
- // RFC 2396: characters reserved for delimiting URLs.
- // We actually just auto-escape these.
- delims = [ '<', '>', '"', '`', ' ', '\r', '\n', '\t' ],
- // RFC 2396: characters not allowed for various reasons.
- unwise = [ '{', '}', '|', '\\', '^', '`' ].concat(delims),
- // Allowed by RFCs, but cause of XSS attacks. Always escape these.
- autoEscape = [ '\'' ].concat(unwise),
- // Characters that are never ever allowed in a hostname.
- // Note that any invalid chars are also handled, but these
- // are the ones that are *expected* to be seen, so we fast-path
- // them.
- nonHostChars = [ '%', '/', '?', ';', '#' ].concat(autoEscape),
- hostEndingChars = [ '/', '?', '#' ],
- hostnameMaxLen = 255,
- hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
- hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
- // protocols that can allow "unsafe" and "unwise" chars.
- /* eslint-disable no-script-url */
- // protocols that never have a hostname.
- hostlessProtocol = {
- 'javascript': true,
- 'javascript:': true
- },
- // protocols that always contain a // bit.
- slashedProtocol = {
- 'http': true,
- 'https': true,
- 'ftp': true,
- 'gopher': true,
- 'file': true,
- 'http:': true,
- 'https:': true,
- 'ftp:': true,
- 'gopher:': true,
- 'file:': true
- };
- /* eslint-enable no-script-url */
- function urlParse(url, slashesDenoteHost) {
- if (url && url instanceof Url) { return url; }
- var u = new Url();
- u.parse(url, slashesDenoteHost);
- return u;
- }
- Url.prototype.parse = function(url, slashesDenoteHost) {
- var i, l, lowerProto, hec, slashes,
- rest = url;
- // trim before proceeding.
- // This is to support parse stuff like " http://foo.com \n"
- rest = rest.trim();
- if (!slashesDenoteHost && url.split('#').length === 1) {
- // Try fast path regexp
- var simplePath = simplePathPattern.exec(rest);
- if (simplePath) {
- this.pathname = simplePath[1];
- if (simplePath[2]) {
- this.search = simplePath[2];
- }
- return this;
- }
- }
- var proto = protocolPattern.exec(rest);
- if (proto) {
- proto = proto[0];
- lowerProto = proto.toLowerCase();
- this.protocol = proto;
- rest = rest.substr(proto.length);
- }
- // figure out if it's got a host
- // user@server is *always* interpreted as a hostname, and url
- // resolution will treat //foo/bar as host=foo,path=bar because that's
- // how the browser resolves relative URLs.
- if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
- slashes = rest.substr(0, 2) === '//';
- if (slashes && !(proto && hostlessProtocol[proto])) {
- rest = rest.substr(2);
- this.slashes = true;
- }
- }
- if (!hostlessProtocol[proto] &&
- (slashes || (proto && !slashedProtocol[proto]))) {
- // there's a hostname.
- // the first instance of /, ?, ;, or # ends the host.
- //
- // If there is an @ in the hostname, then non-host chars *are* allowed
- // to the left of the last @ sign, unless some host-ending character
- // comes *before* the @-sign.
- // URLs are obnoxious.
- //
- // ex:
- // http://a@b@c/ => user:a@b host:c
- // http://a@b?@c => user:a host:c path:/?@c
- // v0.12 TODO(isaacs): This is not quite how Chrome does things.
- // Review our test case against browsers more comprehensively.
- // find the first instance of any hostEndingChars
- var hostEnd = -1;
- for (i = 0; i < hostEndingChars.length; i++) {
- hec = rest.indexOf(hostEndingChars[i]);
- if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {
- hostEnd = hec;
- }
- }
- // at this point, either we have an explicit point where the
- // auth portion cannot go past, or the last @ char is the decider.
- var auth, atSign;
- if (hostEnd === -1) {
- // atSign can be anywhere.
- atSign = rest.lastIndexOf('@');
- } else {
- // atSign must be in auth portion.
- // http://a@b/c@d => host:b auth:a path:/c@d
- atSign = rest.lastIndexOf('@', hostEnd);
- }
- // Now we have a portion which is definitely the auth.
- // Pull that off.
- if (atSign !== -1) {
- auth = rest.slice(0, atSign);
- rest = rest.slice(atSign + 1);
- this.auth = auth;
- }
- // the host is the remaining to the left of the first non-host char
- hostEnd = -1;
- for (i = 0; i < nonHostChars.length; i++) {
- hec = rest.indexOf(nonHostChars[i]);
- if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) {
- hostEnd = hec;
- }
- }
- // if we still have not hit it, then the entire thing is a host.
- if (hostEnd === -1) {
- hostEnd = rest.length;
- }
- if (rest[hostEnd - 1] === ':') { hostEnd--; }
- var host = rest.slice(0, hostEnd);
- rest = rest.slice(hostEnd);
- // pull out port.
- this.parseHost(host);
- // we've indicated that there is a hostname,
- // so even if it's empty, it has to be present.
- this.hostname = this.hostname || '';
- // if hostname begins with [ and ends with ]
- // assume that it's an IPv6 address.
- var ipv6Hostname = this.hostname[0] === '[' &&
- this.hostname[this.hostname.length - 1] === ']';
- // validate a little.
- if (!ipv6Hostname) {
- var hostparts = this.hostname.split(/\./);
- for (i = 0, l = hostparts.length; i < l; i++) {
- var part = hostparts[i];
- if (!part) { continue; }
- if (!part.match(hostnamePartPattern)) {
- var newpart = '';
- for (var j = 0, k = part.length; j < k; j++) {
- if (part.charCodeAt(j) > 127) {
- // we replace non-ASCII char with a temporary placeholder
- // we need this to make sure size of hostname is not
- // broken by replacing non-ASCII by nothing
- newpart += 'x';
- } else {
- newpart += part[j];
- }
- }
- // we test again with ASCII char only
- if (!newpart.match(hostnamePartPattern)) {
- var validParts = hostparts.slice(0, i);
- var notHost = hostparts.slice(i + 1);
- var bit = part.match(hostnamePartStart);
- if (bit) {
- validParts.push(bit[1]);
- notHost.unshift(bit[2]);
- }
- if (notHost.length) {
- rest = notHost.join('.') + rest;
- }
- this.hostname = validParts.join('.');
- break;
- }
- }
- }
- }
- if (this.hostname.length > hostnameMaxLen) {
- this.hostname = '';
- }
- // strip [ and ] from the hostname
- // the host field still retains them, though
- if (ipv6Hostname) {
- this.hostname = this.hostname.substr(1, this.hostname.length - 2);
- }
- }
- // chop off from the tail first.
- var hash = rest.indexOf('#');
- if (hash !== -1) {
- // got a fragment string.
- this.hash = rest.substr(hash);
- rest = rest.slice(0, hash);
- }
- var qm = rest.indexOf('?');
- if (qm !== -1) {
- this.search = rest.substr(qm);
- rest = rest.slice(0, qm);
- }
- if (rest) { this.pathname = rest; }
- if (slashedProtocol[lowerProto] &&
- this.hostname && !this.pathname) {
- this.pathname = '';
- }
- return this;
- };
- Url.prototype.parseHost = function(host) {
- var port = portPattern.exec(host);
- if (port) {
- port = port[0];
- if (port !== ':') {
- this.port = port.substr(1);
- }
- host = host.substr(0, host.length - port.length);
- }
- if (host) { this.hostname = host; }
- };
- module.exports = urlParse;
- /***/ }),
- /* 80 */
- /***/ (function(module, exports) {
- // shim for using process in browser
- var process = module.exports = {};
- // cached from whatever global is present so that test runners that stub it
- // don't break things. But we need to wrap it in a try catch in case it is
- // wrapped in strict mode code which doesn't define any globals. It's inside a
- // function because try/catches deoptimize in certain engines.
- var cachedSetTimeout;
- var cachedClearTimeout;
- function defaultSetTimout() {
- throw new Error('setTimeout has not been defined');
- }
- function defaultClearTimeout () {
- throw new Error('clearTimeout has not been defined');
- }
- (function () {
- try {
- if (typeof setTimeout === 'function') {
- cachedSetTimeout = setTimeout;
- } else {
- cachedSetTimeout = defaultSetTimout;
- }
- } catch (e) {
- cachedSetTimeout = defaultSetTimout;
- }
- try {
- if (typeof clearTimeout === 'function') {
- cachedClearTimeout = clearTimeout;
- } else {
- cachedClearTimeout = defaultClearTimeout;
- }
- } catch (e) {
- cachedClearTimeout = defaultClearTimeout;
- }
- } ())
- function runTimeout(fun) {
- if (cachedSetTimeout === setTimeout) {
- //normal enviroments in sane situations
- return setTimeout(fun, 0);
- }
- // if setTimeout wasn't available but was latter defined
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
- cachedSetTimeout = setTimeout;
- return setTimeout(fun, 0);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedSetTimeout(fun, 0);
- } catch(e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedSetTimeout.call(null, fun, 0);
- } catch(e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
- return cachedSetTimeout.call(this, fun, 0);
- }
- }
- }
- function runClearTimeout(marker) {
- if (cachedClearTimeout === clearTimeout) {
- //normal enviroments in sane situations
- return clearTimeout(marker);
- }
- // if clearTimeout wasn't available but was latter defined
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
- cachedClearTimeout = clearTimeout;
- return clearTimeout(marker);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedClearTimeout(marker);
- } catch (e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedClearTimeout.call(null, marker);
- } catch (e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
- // Some versions of I.E. have different rules for clearTimeout vs setTimeout
- return cachedClearTimeout.call(this, marker);
- }
- }
- }
- var queue = [];
- var draining = false;
- var currentQueue;
- var queueIndex = -1;
- function cleanUpNextTick() {
- if (!draining || !currentQueue) {
- return;
- }
- draining = false;
- if (currentQueue.length) {
- queue = currentQueue.concat(queue);
- } else {
- queueIndex = -1;
- }
- if (queue.length) {
- drainQueue();
- }
- }
- function drainQueue() {
- if (draining) {
- return;
- }
- var timeout = runTimeout(cleanUpNextTick);
- draining = true;
- var len = queue.length;
- while(len) {
- currentQueue = queue;
- queue = [];
- while (++queueIndex < len) {
- if (currentQueue) {
- currentQueue[queueIndex].run();
- }
- }
- queueIndex = -1;
- len = queue.length;
- }
- currentQueue = null;
- draining = false;
- runClearTimeout(timeout);
- }
- process.nextTick = function (fun) {
- var args = new Array(arguments.length - 1);
- if (arguments.length > 1) {
- for (var i = 1; i < arguments.length; i++) {
- args[i - 1] = arguments[i];
- }
- }
- queue.push(new Item(fun, args));
- if (queue.length === 1 && !draining) {
- runTimeout(drainQueue);
- }
- };
- // v8 likes predictible objects
- function Item(fun, array) {
- this.fun = fun;
- this.array = array;
- }
- Item.prototype.run = function () {
- this.fun.apply(null, this.array);
- };
- process.title = 'browser';
- process.browser = true;
- process.env = {};
- process.argv = [];
- process.version = ''; // empty string to avoid regexp issues
- process.versions = {};
- function noop() {}
- process.on = noop;
- process.addListener = noop;
- process.once = noop;
- process.off = noop;
- process.removeListener = noop;
- process.removeAllListeners = noop;
- process.emit = noop;
- process.binding = function (name) {
- throw new Error('process.binding is not supported');
- };
- process.cwd = function () { return '/' };
- process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
- };
- process.umask = function() { return 0; };
- /***/ }),
- /* 81 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */
- ;(function(root) {
- /** Detect free variables */
- var freeExports = typeof exports == 'object' && exports &&
- !exports.nodeType && exports;
- var freeModule = typeof module == 'object' && module &&
- !module.nodeType && module;
- var freeGlobal = typeof global == 'object' && global;
- if (
- freeGlobal.global === freeGlobal ||
- freeGlobal.window === freeGlobal ||
- freeGlobal.self === freeGlobal
- ) {
- root = freeGlobal;
- }
- /**
- * The `punycode` object.
- * @name punycode
- * @type Object
- */
- var punycode,
- /** Highest positive signed 32-bit float value */
- maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
- /** Bootstring parameters */
- base = 36,
- tMin = 1,
- tMax = 26,
- skew = 38,
- damp = 700,
- initialBias = 72,
- initialN = 128, // 0x80
- delimiter = '-', // '\x2D'
- /** Regular expressions */
- regexPunycode = /^xn--/,
- regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
- regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
- /** Error messages */
- errors = {
- 'overflow': 'Overflow: input needs wider integers to process',
- 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
- 'invalid-input': 'Invalid input'
- },
- /** Convenience shortcuts */
- baseMinusTMin = base - tMin,
- floor = Math.floor,
- stringFromCharCode = String.fromCharCode,
- /** Temporary variable */
- key;
- /*--------------------------------------------------------------------------*/
- /**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
- function error(type) {
- throw new RangeError(errors[type]);
- }
- /**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
- function map(array, fn) {
- var length = array.length;
- var result = [];
- while (length--) {
- result[length] = fn(array[length]);
- }
- return result;
- }
- /**
- * A simple `Array#map`-like wrapper to work with domain name strings or email
- * addresses.
- * @private
- * @param {String} domain The domain name or email address.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {Array} A new string of characters returned by the callback
- * function.
- */
- function mapDomain(string, fn) {
- var parts = string.split('@');
- var result = '';
- if (parts.length > 1) {
- // In email addresses, only the domain name should be punycoded. Leave
- // the local part (i.e. everything up to `@`) intact.
- result = parts[0] + '@';
- string = parts[1];
- }
- // Avoid `split(regex)` for IE8 compatibility. See #17.
- string = string.replace(regexSeparators, '\x2E');
- var labels = string.split('.');
- var encoded = map(labels, fn).join('.');
- return result + encoded;
- }
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see <https://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
- function ucs2decode(string) {
- var output = [],
- counter = 0,
- length = string.length,
- value,
- extra;
- while (counter < length) {
- value = string.charCodeAt(counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
- // high surrogate, and there is a next character
- extra = string.charCodeAt(counter++);
- if ((extra & 0xFC00) == 0xDC00) { // low surrogate
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
- // unmatched surrogate; only append this code unit, in case the next
- // code unit is the high surrogate of a surrogate pair
- output.push(value);
- counter--;
- }
- } else {
- output.push(value);
- }
- }
- return output;
- }
- /**
- * Creates a string based on an array of numeric code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of numeric code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
- function ucs2encode(array) {
- return map(array, function(value) {
- var output = '';
- if (value > 0xFFFF) {
- value -= 0x10000;
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
- value = 0xDC00 | value & 0x3FF;
- }
- output += stringFromCharCode(value);
- return output;
- }).join('');
- }
- /**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic numeric code point value.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
- function basicToDigit(codePoint) {
- if (codePoint - 48 < 10) {
- return codePoint - 22;
- }
- if (codePoint - 65 < 26) {
- return codePoint - 65;
- }
- if (codePoint - 97 < 26) {
- return codePoint - 97;
- }
- return base;
- }
- /**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if `flag` is non-zero and `digit` has no uppercase form.
- */
- function digitToBasic(digit, flag) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
- }
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * https://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
- function adapt(delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor(delta / baseMinusTMin);
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- }
- /**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII-only symbols.
- * @returns {String} The resulting string of Unicode symbols.
- */
- function decode(input) {
- // Don't use UCS-2
- var output = [],
- inputLength = input.length,
- out,
- i = 0,
- n = initialN,
- bias = initialBias,
- basic,
- j,
- index,
- oldi,
- w,
- k,
- digit,
- t,
- /** Cached calculation results */
- baseMinusT;
- // Handle the basic code points: let `basic` be the number of input code
- // points before the last delimiter, or `0` if there is none, then copy
- // the first basic code points to the output.
- basic = input.lastIndexOf(delimiter);
- if (basic < 0) {
- basic = 0;
- }
- for (j = 0; j < basic; ++j) {
- // if it's not a basic code point
- if (input.charCodeAt(j) >= 0x80) {
- error('not-basic');
- }
- output.push(input.charCodeAt(j));
- }
- // Main decoding loop: start just after the last delimiter if any basic code
- // points were copied; start at the beginning otherwise.
- for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
- // `index` is the index of the next character to be consumed.
- // Decode a generalized variable-length integer into `delta`,
- // which gets added to `i`. The overflow checking is easier
- // if we increase `i` as we go, then subtract off its starting
- // value at the end to obtain `delta`.
- for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
- if (index >= inputLength) {
- error('invalid-input');
- }
- digit = basicToDigit(input.charCodeAt(index++));
- if (digit >= base || digit > floor((maxInt - i) / w)) {
- error('overflow');
- }
- i += digit * w;
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
- if (digit < t) {
- break;
- }
- baseMinusT = base - t;
- if (w > floor(maxInt / baseMinusT)) {
- error('overflow');
- }
- w *= baseMinusT;
- }
- out = output.length + 1;
- bias = adapt(i - oldi, out, oldi == 0);
- // `i` was supposed to wrap around from `out` to `0`,
- // incrementing `n` each time, so we'll fix that now:
- if (floor(i / out) > maxInt - n) {
- error('overflow');
- }
- n += floor(i / out);
- i %= out;
- // Insert `n` at position `i` of the output
- output.splice(i++, 0, n);
- }
- return ucs2encode(output);
- }
- /**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- * @memberOf punycode
- * @param {String} input The string of Unicode symbols.
- * @returns {String} The resulting Punycode string of ASCII-only symbols.
- */
- function encode(input) {
- var n,
- delta,
- handledCPCount,
- basicLength,
- bias,
- j,
- m,
- q,
- k,
- t,
- currentValue,
- output = [],
- /** `inputLength` will hold the number of code points in `input`. */
- inputLength,
- /** Cached calculation results */
- handledCPCountPlusOne,
- baseMinusT,
- qMinusT;
- // Convert the input in UCS-2 to Unicode
- input = ucs2decode(input);
- // Cache the length
- inputLength = input.length;
- // Initialize the state
- n = initialN;
- delta = 0;
- bias = initialBias;
- // Handle the basic code points
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
- handledCPCount = basicLength = output.length;
- // `handledCPCount` is the number of code points that have been handled;
- // `basicLength` is the number of basic code points.
- // Finish the basic string - if it is not empty - with a delimiter
- if (basicLength) {
- output.push(delimiter);
- }
- // Main encoding loop:
- while (handledCPCount < inputLength) {
- // All non-basic code points < n have been handled already. Find the next
- // larger one:
- for (m = maxInt, j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
- // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
- // but guard against overflow
- handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- error('overflow');
- }
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < n && ++delta > maxInt) {
- error('overflow');
- }
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer
- for (q = delta, k = base; /* no condition */; k += base) {
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
- if (q < t) {
- break;
- }
- qMinusT = q - t;
- baseMinusT = base - t;
- output.push(
- stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
- );
- q = floor(qMinusT / baseMinusT);
- }
- output.push(stringFromCharCode(digitToBasic(q, 0)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
- ++delta;
- ++n;
- }
- return output.join('');
- }
- /**
- * Converts a Punycode string representing a domain name or an email address
- * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
- * it doesn't matter if you call it on a string that has already been
- * converted to Unicode.
- * @memberOf punycode
- * @param {String} input The Punycoded domain name or email address to
- * convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
- function toUnicode(input) {
- return mapDomain(input, function(string) {
- return regexPunycode.test(string)
- ? decode(string.slice(4).toLowerCase())
- : string;
- });
- }
- /**
- * Converts a Unicode string representing a domain name or an email address to
- * Punycode. Only the non-ASCII parts of the domain name will be converted,
- * i.e. it doesn't matter if you call it with a domain that's already in
- * ASCII.
- * @memberOf punycode
- * @param {String} input The domain name or email address to convert, as a
- * Unicode string.
- * @returns {String} The Punycode representation of the given domain name or
- * email address.
- */
- function toASCII(input) {
- return mapDomain(input, function(string) {
- return regexNonASCII.test(string)
- ? 'xn--' + encode(string)
- : string;
- });
- }
- /*--------------------------------------------------------------------------*/
- /** Define the public API */
- punycode = {
- /**
- * A string representing the current Punycode.js version number.
- * @memberOf punycode
- * @type String
- */
- 'version': '1.4.1',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- * @see <https://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode
- * @type Object
- */
- 'ucs2': {
- 'decode': ucs2decode,
- 'encode': ucs2encode
- },
- 'decode': decode,
- 'encode': encode,
- 'toASCII': toASCII,
- 'toUnicode': toUnicode
- };
- /** Expose `punycode` */
- // Some AMD build optimizers, like r.js, check for specific condition patterns
- // like the following:
- if (
- true
- ) {
- !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {
- return punycode;
- }.call(exports, __webpack_require__, exports, module),
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
- } else if (freeExports && freeModule) {
- if (module.exports == freeExports) {
- // in Node.js, io.js, or RingoJS v0.8.0+
- freeModule.exports = punycode;
- } else {
- // in Narwhal or RingoJS v0.7.0-
- for (key in punycode) {
- punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
- }
- }
- } else {
- // in Rhino or a web browser
- root.punycode = punycode;
- }
- }(this));
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(86)(module), __webpack_require__(6)))
- /***/ }),
- /* 82 */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
- "use strict";
- if (global.setImmediate) {
- return;
- }
- var nextHandle = 1; // Spec says greater than zero
- var tasksByHandle = {};
- var currentlyRunningATask = false;
- var doc = global.document;
- var registerImmediate;
- function setImmediate(callback) {
- // Callback can either be a function or a string
- if (typeof callback !== "function") {
- callback = new Function("" + callback);
- }
- // Copy function arguments
- var args = new Array(arguments.length - 1);
- for (var i = 0; i < args.length; i++) {
- args[i] = arguments[i + 1];
- }
- // Store and register the task
- var task = { callback: callback, args: args };
- tasksByHandle[nextHandle] = task;
- registerImmediate(nextHandle);
- return nextHandle++;
- }
- function clearImmediate(handle) {
- delete tasksByHandle[handle];
- }
- function run(task) {
- var callback = task.callback;
- var args = task.args;
- switch (args.length) {
- case 0:
- callback();
- break;
- case 1:
- callback(args[0]);
- break;
- case 2:
- callback(args[0], args[1]);
- break;
- case 3:
- callback(args[0], args[1], args[2]);
- break;
- default:
- callback.apply(undefined, args);
- break;
- }
- }
- function runIfPresent(handle) {
- // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
- // So if we're currently running a task, we'll need to delay this invocation.
- if (currentlyRunningATask) {
- // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
- // "too much recursion" error.
- setTimeout(runIfPresent, 0, handle);
- } else {
- var task = tasksByHandle[handle];
- if (task) {
- currentlyRunningATask = true;
- try {
- run(task);
- } finally {
- clearImmediate(handle);
- currentlyRunningATask = false;
- }
- }
- }
- }
- function installNextTickImplementation() {
- registerImmediate = function(handle) {
- process.nextTick(function () { runIfPresent(handle); });
- };
- }
- function canUsePostMessage() {
- // The test against `importScripts` prevents this implementation from being installed inside a web worker,
- // where `global.postMessage` means something completely different and can't be used for this purpose.
- if (global.postMessage && !global.importScripts) {
- var postMessageIsAsynchronous = true;
- var oldOnMessage = global.onmessage;
- global.onmessage = function() {
- postMessageIsAsynchronous = false;
- };
- global.postMessage("", "*");
- global.onmessage = oldOnMessage;
- return postMessageIsAsynchronous;
- }
- }
- function installPostMessageImplementation() {
- // Installs an event handler on `global` for the `message` event: see
- // * https://developer.mozilla.org/en/DOM/window.postMessage
- // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
- var messagePrefix = "setImmediate$" + Math.random() + "$";
- var onGlobalMessage = function(event) {
- if (event.source === global &&
- typeof event.data === "string" &&
- event.data.indexOf(messagePrefix) === 0) {
- runIfPresent(+event.data.slice(messagePrefix.length));
- }
- };
- if (global.addEventListener) {
- global.addEventListener("message", onGlobalMessage, false);
- } else {
- global.attachEvent("onmessage", onGlobalMessage);
- }
- registerImmediate = function(handle) {
- global.postMessage(messagePrefix + handle, "*");
- };
- }
- function installMessageChannelImplementation() {
- var channel = new MessageChannel();
- channel.port1.onmessage = function(event) {
- var handle = event.data;
- runIfPresent(handle);
- };
- registerImmediate = function(handle) {
- channel.port2.postMessage(handle);
- };
- }
- function installReadyStateChangeImplementation() {
- var html = doc.documentElement;
- registerImmediate = function(handle) {
- // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
- // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
- var script = doc.createElement("script");
- script.onreadystatechange = function () {
- runIfPresent(handle);
- script.onreadystatechange = null;
- html.removeChild(script);
- script = null;
- };
- html.appendChild(script);
- };
- }
- function installSetTimeoutImplementation() {
- registerImmediate = function(handle) {
- setTimeout(runIfPresent, 0, handle);
- };
- }
- // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
- var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
- attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
- // Don't get fooled by e.g. browserify environments.
- if ({}.toString.call(global.process) === "[object process]") {
- // For Node.js before 0.9
- installNextTickImplementation();
- } else if (canUsePostMessage()) {
- // For non-IE10 modern browsers
- installPostMessageImplementation();
- } else if (global.MessageChannel) {
- // For web workers, where supported
- installMessageChannelImplementation();
- } else if (doc && "onreadystatechange" in doc.createElement("script")) {
- // For IE 6–8
- installReadyStateChangeImplementation();
- } else {
- // For older browsers
- installSetTimeoutImplementation();
- }
- attachTo.setImmediate = setImmediate;
- attachTo.clearImmediate = clearImmediate;
- }(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(6), __webpack_require__(80)))
- /***/ }),
- /* 83 */
- /***/ (function(module, exports, __webpack_require__) {
- var apply = Function.prototype.apply;
- // DOM APIs, for completeness
- exports.setTimeout = function() {
- return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
- };
- exports.setInterval = function() {
- return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
- };
- exports.clearTimeout =
- exports.clearInterval = function(timeout) {
- if (timeout) {
- timeout.close();
- }
- };
- function Timeout(id, clearFn) {
- this._id = id;
- this._clearFn = clearFn;
- }
- Timeout.prototype.unref = Timeout.prototype.ref = function() {};
- Timeout.prototype.close = function() {
- this._clearFn.call(window, this._id);
- };
- // Does not start the time, just sets up the members needed.
- exports.enroll = function(item, msecs) {
- clearTimeout(item._idleTimeoutId);
- item._idleTimeout = msecs;
- };
- exports.unenroll = function(item) {
- clearTimeout(item._idleTimeoutId);
- item._idleTimeout = -1;
- };
- exports._unrefActive = exports.active = function(item) {
- clearTimeout(item._idleTimeoutId);
- var msecs = item._idleTimeout;
- if (msecs >= 0) {
- item._idleTimeoutId = setTimeout(function onTimeout() {
- if (item._onTimeout)
- item._onTimeout();
- }, msecs);
- }
- };
- // setimmediate attaches itself to the global object
- __webpack_require__(82);
- exports.setImmediate = setImmediate;
- exports.clearImmediate = clearImmediate;
- /***/ }),
- /* 84 */
- /***/ (function(module, exports) {
- module.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/
- /***/ }),
- /* 85 */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- exports.Any = __webpack_require__(18);
- exports.Cc = __webpack_require__(16);
- exports.Cf = __webpack_require__(84);
- exports.P = __webpack_require__(5);
- exports.Z = __webpack_require__(17);
- /***/ }),
- /* 86 */
- /***/ (function(module, exports) {
- module.exports = function(module) {
- if(!module.webpackPolyfill) {
- module.deprecate = function() {};
- module.paths = [];
- // module.parent = undefined by default
- if(!module.children) module.children = [];
- Object.defineProperty(module, "loaded", {
- enumerable: true,
- get: function() {
- return module.l;
- }
- });
- Object.defineProperty(module, "id", {
- enumerable: true,
- get: function() {
- return module.i;
- }
- });
- module.webpackPolyfill = 1;
- }
- return module;
- };
- /***/ }),
- /* 87 */
- /***/ (function(module, exports, __webpack_require__) {
- __webpack_require__(19);
- module.exports = __webpack_require__(20);
- /***/ })
- /******/ ]);
- //# sourceMappingURL=main.js.map
|