1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984 |
- ;(function () {
-
- UEDITOR_CONFIG = window.UEDITOR_CONFIG || {}
- var baidu = window.baidu || {}
- window.baidu = baidu
- window.UE = baidu.editor = window.UE || {}
- UE.plugins = {}
- UE.commands = {}
- UE.instants = {}
- UE.I18N = {}
- UE._customizeUI = {}
- UE.version = '1.4.3'
- var dom = (UE.dom = {})
-
-
-
- var browser = (UE.browser = (function () {
- var agent = navigator.userAgent.toLowerCase(),
- opera = window.opera,
- browser = {
-
- ie: /(msie\s|trident.*rv:)([\w.]+)/.test(agent),
-
- opera: !!opera && opera.version,
-
- webkit: agent.indexOf(' applewebkit/') > -1,
-
- mac: agent.indexOf('macintosh') > -1,
-
- quirks: document.compatMode == 'BackCompat'
- }
-
- browser.gecko =
- navigator.product == 'Gecko' &&
- !browser.webkit &&
- !browser.opera &&
- !browser.ie
- var version = 0
-
- if (browser.ie) {
- var v1 = agent.match(/(?:msie\s([\w.]+))/)
- var v2 = agent.match(/(?:trident.*rv:([\w.]+))/)
- if (v1 && v2 && v1[1] && v2[1]) {
- version = Math.max(v1[1] * 1, v2[1] * 1)
- } else if (v1 && v1[1]) {
- version = v1[1] * 1
- } else if (v2 && v2[1]) {
- version = v2[1] * 1
- } else {
- version = 0
- }
- browser.ie11Compat = document.documentMode == 11
-
- browser.ie9Compat = document.documentMode == 9
-
- browser.ie8 = !!document.documentMode
-
- browser.ie8Compat = document.documentMode == 8
-
- browser.ie7Compat =
- (version == 7 && !document.documentMode) || document.documentMode == 7
-
- browser.ie6Compat = version < 7 || browser.quirks
- browser.ie9above = version > 8
- browser.ie9below = version < 9
- browser.ie11above = version > 10
- browser.ie11below = version < 11
- }
-
- if (browser.gecko) {
- var geckoRelease = agent.match(/rv:([\d\.]+)/)
- if (geckoRelease) {
- geckoRelease = geckoRelease[1].split('.')
- version =
- geckoRelease[0] * 10000 +
- (geckoRelease[1] || 0) * 100 +
- (geckoRelease[2] || 0) * 1
- }
- }
-
- if (/chrome\/(\d+\.\d)/i.test(agent)) {
- browser.chrome = +RegExp['\x241']
- }
-
- if (
- /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) &&
- !/chrome/i.test(agent)
- ) {
- browser.safari = +(RegExp['\x241'] || RegExp['\x242'])
- }
-
- if (browser.opera) version = parseFloat(opera.version())
-
- if (browser.webkit)
- version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1])
-
- browser.version = version
-
- browser.isCompatible =
- !browser.mobile &&
- ((browser.ie && version >= 6) ||
- (browser.gecko && version >= 10801) ||
- (browser.opera && version >= 9.5) ||
- (browser.air && version >= 1) ||
- (browser.webkit && version >= 522) ||
- false)
- return browser
- })())
-
- var ie = browser.ie,
- webkit = browser.webkit,
- gecko = browser.gecko,
- opera = browser.opera
-
-
-
- var utils = (UE.utils = {
-
-
- each: function (obj, iterator, context) {
- if (obj == null) return
- if (obj.length === +obj.length) {
- for (var i = 0, l = obj.length; i < l; i++) {
- if (iterator.call(context, obj[i], i, obj) === false) return false
- }
- } else {
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- if (iterator.call(context, obj[key], key, obj) === false)
- return false
- }
- }
- }
- },
-
- makeInstance: function (obj) {
- var noop = new Function()
- noop.prototype = obj
- obj = new noop()
- noop.prototype = null
- return obj
- },
-
-
- extend: function (t, s, b) {
- if (s) {
- for (var k in s) {
- if (!b || !t.hasOwnProperty(k)) {
- t[k] = s[k]
- }
- }
- }
- return t
- },
-
- extend2: function (t) {
- var a = arguments
- for (var i = 1; i < a.length; i++) {
- var x = a[i]
- for (var k in x) {
- if (!t.hasOwnProperty(k)) {
- t[k] = x[k]
- }
- }
- }
- return t
- },
-
- inherits: function (subClass, superClass) {
- var oldP = subClass.prototype,
- newP = utils.makeInstance(superClass.prototype)
- utils.extend(newP, oldP, true)
- subClass.prototype = newP
- return (newP.constructor = subClass)
- },
-
- bind: function (fn, context) {
- return function () {
- return fn.apply(context, arguments)
- }
- },
-
-
- defer: function (fn, delay, exclusion) {
- var timerID
- return function () {
- if (exclusion) {
- clearTimeout(timerID)
- }
- timerID = setTimeout(fn, delay)
- }
- },
-
-
- indexOf: function (array, item, start) {
- var index = -1
- start = this.isNumber(start) ? start : 0
- this.each(array, function (v, i) {
- if (i >= start && v === item) {
- index = i
- return false
- }
- })
- return index
- },
-
- removeItem: function (array, item) {
- for (var i = 0, l = array.length; i < l; i++) {
- if (array[i] === item) {
- array.splice(i, 1)
- i--
- }
- }
- },
-
- trim: function (str) {
- return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '')
- },
-
-
- listToMap: function (list) {
- if (!list) return {}
- list = utils.isArray(list) ? list : list.split(',')
- for (var i = 0, ci, obj = {}; (ci = list[i++]); ) {
- obj[ci.toUpperCase()] = obj[ci] = 1
- }
- return obj
- },
-
- unhtml: function (str, reg) {
- return str
- ? str.replace(
- reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,
- function (a, b) {
- if (b) {
- return a
- } else {
- return {
- '<': '<',
- '&': '&',
- '"': '"',
- '>': '>',
- "'": '''
- }[a]
- }
- }
- )
- : ''
- },
-
- unhtmlForUrl: function (str, reg) {
- return str
- ? str.replace(reg || /[<">']/g, function (a) {
- return {
- '<': '<',
- '&': '&',
- '"': '"',
- '>': '>',
- "'": '''
- }[a]
- })
- : ''
- },
-
- html: function (str) {
- return str
- ? str.replace(/&((g|l|quo)t|amp|#39|nbsp);/g, function (m) {
- return {
- '<': '<',
- '&': '&',
- '"': '"',
- '>': '>',
- ''': "'",
- ' ': ' '
- }[m]
- })
- : ''
- },
-
- cssStyleToDomStyle: (function () {
- var test = document.createElement('div').style,
- cache = {
- float:
- test.cssFloat != undefined
- ? 'cssFloat'
- : test.styleFloat != undefined
- ? 'styleFloat'
- : 'float'
- }
- return function (cssName) {
- return (
- cache[cssName] ||
- (cache[cssName] = cssName
- .toLowerCase()
- .replace(/-./g, function (match) {
- return match.charAt(1).toUpperCase()
- }))
- )
- }
- })(),
-
-
- loadFile: (function () {
- var tmpList = []
- function getItem(doc, obj) {
- try {
- for (var i = 0, ci; (ci = tmpList[i++]); ) {
- if (ci.doc === doc && ci.url == (obj.src || obj.href)) {
- return ci
- }
- }
- } catch (e) {
- return null
- }
- }
- return function (doc, obj, fn) {
- var item = getItem(doc, obj)
- if (item) {
- if (item.ready) {
- fn && fn()
- } else {
- item.funs.push(fn)
- }
- return
- }
- tmpList.push({
- doc: doc,
- url: obj.src || obj.href,
- funs: [fn]
- })
- if (!doc.body) {
- var html = []
- for (var p in obj) {
- if (p == 'tag') continue
- html.push(p + '="' + obj[p] + '"')
- }
- doc.write(
- '<' + obj.tag + ' ' + html.join(' ') + ' ></' + obj.tag + '>'
- )
- return
- }
- if (obj.id && doc.getElementById(obj.id)) {
- return
- }
- var element = doc.createElement(obj.tag)
- delete obj.tag
- for (var p in obj) {
- element.setAttribute(p, obj[p])
- }
- element.onload = element.onreadystatechange = function () {
- if (!this.readyState || /loaded|complete/.test(this.readyState)) {
- item = getItem(doc, obj)
- if (item.funs.length > 0) {
- item.ready = 1
- for (var fi; (fi = item.funs.pop()); ) {
- fi()
- }
- }
- element.onload = element.onreadystatechange = null
- }
- }
- element.onerror = function () {
- throw Error(
- 'The load ' +
- (obj.href || obj.src) +
- ' fails,check the url settings of file ueditor.config.js '
- )
- }
- doc.getElementsByTagName('head')[0].appendChild(element)
- }
- })(),
-
- isEmptyObject: function (obj) {
- if (obj == null) return true
- if (this.isArray(obj) || this.isString(obj)) return obj.length === 0
- for (var key in obj) if (obj.hasOwnProperty(key)) return false
- return true
- },
-
- fixColor: function (name, value) {
- if (/color/i.test(name) && /rgba?/.test(value)) {
- var array = value.split(',')
- if (array.length > 3) return ''
- value = '#'
- for (var i = 0, color; (color = array[i++]); ) {
- color = parseInt(color.replace(/[^\d]/gi, ''), 10).toString(16)
- value += color.length == 1 ? '0' + color : color
- }
- value = value.toUpperCase()
- }
- return value
- },
-
- optCss: function (val) {
- var padding, margin, border
- val = val.replace(
- /(padding|margin|border)\-([^:]+):([^;]+);?/gi,
- function (str, key, name, val) {
- if (val.split(' ').length == 1) {
- switch (key) {
- case 'padding':
- !padding && (padding = {})
- padding[name] = val
- return ''
- case 'margin':
- !margin && (margin = {})
- margin[name] = val
- return ''
- case 'border':
- return val == 'initial' ? '' : str
- }
- }
- return str
- }
- )
- function opt(obj, name) {
- if (!obj) {
- return ''
- }
- var t = obj.top,
- b = obj.bottom,
- l = obj.left,
- r = obj.right,
- val = ''
- if (!t || !l || !b || !r) {
- for (var p in obj) {
- val += ';' + name + '-' + p + ':' + obj[p] + ';'
- }
- } else {
- val +=
- ';' +
- name +
- ':' +
- (t == b && b == l && l == r
- ? t
- : t == b && l == r
- ? t + ' ' + l
- : l == r
- ? t + ' ' + l + ' ' + b
- : t + ' ' + r + ' ' + b + ' ' + l) +
- ';'
- }
- return val
- }
- val += opt(padding, 'padding') + opt(margin, 'margin')
- return val
- .replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, '')
- .replace(/;([ \n\r\t]+)|\1;/g, ';')
- .replace(/(&((l|g)t|quot|#39))?;{2,}/g, function (a, b) {
- return b ? b + ';;' : ';'
- })
- },
-
-
- clone: function (source, target) {
- var tmp
- target = target || {}
- for (var i in source) {
- if (source.hasOwnProperty(i)) {
- tmp = source[i]
- if (typeof tmp == 'object') {
- target[i] = utils.isArray(tmp) ? [] : {}
- utils.clone(source[i], target[i])
- } else {
- target[i] = tmp
- }
- }
- }
- return target
- },
-
- transUnitToPx: function (val) {
- if (!/(pt|cm)/.test(val)) {
- return val
- }
- var unit
- val.replace(/([\d.]+)(\w+)/, function (str, v, u) {
- val = v
- unit = u
- })
- switch (unit) {
- case 'cm':
- val = parseFloat(val) * 25
- break
- case 'pt':
- val = Math.round((parseFloat(val) * 96) / 72)
- }
- return val + (val ? 'px' : '')
- },
-
- domReady: (function () {
- var fnArr = []
- function doReady(doc) {
-
- doc.isReady = true
- for (var ci; (ci = fnArr.pop()); ci()) {}
- }
- return function (onready, win) {
- win = win || window
- var doc = win.document
- onready && fnArr.push(onready)
- if (doc.readyState === 'complete') {
- doReady(doc)
- } else {
- doc.isReady && doReady(doc)
- if (browser.ie && browser.version != 11) {
- ;(function () {
- if (doc.isReady) return
- try {
- doc.documentElement.doScroll('left')
- } catch (error) {
- setTimeout(arguments.callee, 0)
- return
- }
- doReady(doc)
- })()
- win.attachEvent('onload', function () {
- doReady(doc)
- })
- } else {
- doc.addEventListener(
- 'DOMContentLoaded',
- function () {
- doc.removeEventListener(
- 'DOMContentLoaded',
- arguments.callee,
- false
- )
- doReady(doc)
- },
- false
- )
- win.addEventListener(
- 'load',
- function () {
- doReady(doc)
- },
- false
- )
- }
- }
- }
- })(),
-
- cssRule:
- browser.ie && browser.version != 11
- ? function (key, style, doc) {
- var indexList, index
- if (
- style === undefined ||
- (style && style.nodeType && style.nodeType == 9)
- ) {
-
- doc =
- style && style.nodeType && style.nodeType == 9
- ? style
- : doc || document
- indexList = doc.indexList || (doc.indexList = {})
- index = indexList[key]
- if (index !== undefined) {
- return doc.styleSheets[index].cssText
- }
- return undefined
- }
- doc = doc || document
- indexList = doc.indexList || (doc.indexList = {})
- index = indexList[key]
-
- if (style === '') {
- if (index !== undefined) {
- doc.styleSheets[index].cssText = ''
- delete indexList[key]
- return true
- }
- return false
- }
-
- if (index !== undefined) {
- sheetStyle = doc.styleSheets[index]
- } else {
- sheetStyle = doc.createStyleSheet(
- '',
- (index = doc.styleSheets.length)
- )
- indexList[key] = index
- }
- sheetStyle.cssText = style
- }
- : function (key, style, doc) {
- var head, node
- if (
- style === undefined ||
- (style && style.nodeType && style.nodeType == 9)
- ) {
-
- doc =
- style && style.nodeType && style.nodeType == 9
- ? style
- : doc || document
- node = doc.getElementById(key)
- return node ? node.innerHTML : undefined
- }
- doc = doc || document
- node = doc.getElementById(key)
-
- if (style === '') {
- if (node) {
- node.parentNode.removeChild(node)
- return true
- }
- return false
- }
-
- if (node) {
- node.innerHTML = style
- } else {
- node = doc.createElement('style')
- node.id = key
- node.innerHTML = style
- doc.getElementsByTagName('head')[0].appendChild(node)
- }
- },
- sort: function (array, compareFn) {
- compareFn =
- compareFn ||
- function (item1, item2) {
- return item1.localeCompare(item2)
- }
- for (var i = 0, len = array.length; i < len; i++) {
- for (var j = i, length = array.length; j < length; j++) {
- if (compareFn(array[i], array[j]) > 0) {
- var t = array[i]
- array[i] = array[j]
- array[j] = t
- }
- }
- }
- return array
- },
- serializeParam: function (json) {
- var strArr = []
- for (var i in json) {
-
- if (i == 'method' || i == 'timeout' || i == 'async') continue
-
- if (
- !(
- (typeof json[i]).toLowerCase() == 'function' ||
- (typeof json[i]).toLowerCase() == 'object'
- )
- ) {
- strArr.push(encodeURIComponent(i) + '=' + encodeURIComponent(json[i]))
- } else if (utils.isArray(json[i])) {
-
- for (var j = 0; j < json[i].length; j++) {
- strArr.push(
- encodeURIComponent(i) + '[]=' + encodeURIComponent(json[i][j])
- )
- }
- }
- }
- return strArr.join('&')
- },
- formatUrl: function (url) {
- var u = url.replace(/&&/g, '&')
- u = u.replace(/\?&/g, '?')
- u = u.replace(/&$/g, '')
- u = u.replace(/&#/g, '#')
- u = u.replace(/&+/g, '&')
- return u
- },
- isCrossDomainUrl: function (url) {
- var a = document.createElement('a')
- a.href = url
- if (browser.ie) {
- a.href = a.href
- }
- return !(
- a.protocol == location.protocol &&
- a.hostname == location.hostname &&
- (a.port == location.port ||
- (a.port == '80' && location.port == '') ||
- (a.port == '' && location.port == '80'))
- )
- },
- clearEmptyAttrs: function (obj) {
- for (var p in obj) {
- if (obj[p] === '') {
- delete obj[p]
- }
- }
- return obj
- },
- str2json: function (s) {
- if (!utils.isString(s)) return null
- if (window.JSON) {
- return JSON.parse(s)
- } else {
- return new Function('return ' + utils.trim(s || ''))()
- }
- },
- json2str: (function () {
- if (window.JSON) {
- return JSON.stringify
- } else {
- var escapeMap = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"': '\\"',
- '\\': '\\\\'
- }
- function encodeString(source) {
- if (/["\\\x00-\x1f]/.test(source)) {
- source = source.replace(/["\\\x00-\x1f]/g, function (match) {
- var c = escapeMap[match]
- if (c) {
- return c
- }
- c = match.charCodeAt()
- return (
- '\\u00' +
- Math.floor(c / 16).toString(16) +
- (c % 16).toString(16)
- )
- })
- }
- return '"' + source + '"'
- }
- function encodeArray(source) {
- var result = ['['],
- l = source.length,
- preComma,
- i,
- item
- for (i = 0; i < l; i++) {
- item = source[i]
- switch (typeof item) {
- case 'undefined':
- case 'function':
- case 'unknown':
- break
- default:
- if (preComma) {
- result.push(',')
- }
- result.push(utils.json2str(item))
- preComma = 1
- }
- }
- result.push(']')
- return result.join('')
- }
- function pad(source) {
- return source < 10 ? '0' + source : source
- }
- function encodeDate(source) {
- return (
- '"' +
- source.getFullYear() +
- '-' +
- pad(source.getMonth() + 1) +
- '-' +
- pad(source.getDate()) +
- 'T' +
- pad(source.getHours()) +
- ':' +
- pad(source.getMinutes()) +
- ':' +
- pad(source.getSeconds()) +
- '"'
- )
- }
- return function (value) {
- switch (typeof value) {
- case 'undefined':
- return 'undefined'
- case 'number':
- return isFinite(value) ? String(value) : 'null'
- case 'string':
- return encodeString(value)
- case 'boolean':
- return String(value)
- default:
- if (value === null) {
- return 'null'
- } else if (utils.isArray(value)) {
- return encodeArray(value)
- } else if (utils.isDate(value)) {
- return encodeDate(value)
- } else {
- var result = ['{'],
- encode = utils.json2str,
- preComma,
- item
- for (var key in value) {
- if (Object.prototype.hasOwnProperty.call(value, key)) {
- item = value[key]
- switch (typeof item) {
- case 'undefined':
- case 'unknown':
- case 'function':
- break
- default:
- if (preComma) {
- result.push(',')
- }
- preComma = 1
- result.push(encode(key) + ':' + encode(item))
- }
- }
- }
- result.push('}')
- return result.join('')
- }
- }
- }
- }
- })()
- })
-
-
-
-
-
-
- utils.each(
- ['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Date'],
- function (v) {
- UE.utils['is' + v] = function (obj) {
- return Object.prototype.toString.apply(obj) == '[object ' + v + ']'
- }
- }
- )
-
-
-
-
-
- var EventBase = (UE.EventBase = function () {})
- EventBase.prototype = {
-
- addListener: function (types, listener) {
- types = utils.trim(types).split(/\s+/)
- for (var i = 0, ti; (ti = types[i++]); ) {
- getListener(this, ti, true).push(listener)
- }
- },
- on: function (types, listener) {
- return this.addListener(types, listener)
- },
- off: function (types, listener) {
- return this.removeListener(types, listener)
- },
- trigger: function () {
- return this.fireEvent.apply(this, arguments)
- },
-
- removeListener: function (types, listener) {
- types = utils.trim(types).split(/\s+/)
- for (var i = 0, ti; (ti = types[i++]); ) {
- utils.removeItem(getListener(this, ti) || [], listener)
- }
- },
-
-
- fireEvent: function () {
- var types = arguments[0]
- types = utils.trim(types).split(' ')
- for (var i = 0, ti; (ti = types[i++]); ) {
- var listeners = getListener(this, ti),
- r,
- t,
- k
- if (listeners) {
- k = listeners.length
- while (k--) {
- if (!listeners[k]) continue
- t = listeners[k].apply(this, arguments)
- if (t === true) {
- return t
- }
- if (t !== undefined) {
- r = t
- }
- }
- }
- if ((t = this['on' + ti.toLowerCase()])) {
- r = t.apply(this, arguments)
- }
- }
- return r
- }
- }
-
- function getListener(obj, type, force) {
- var allListeners
- type = type.toLowerCase()
- return (
- (allListeners =
- obj.__allListeners || (force && (obj.__allListeners = {}))) &&
- (allListeners[type] || (force && (allListeners[type] = [])))
- )
- }
-
-
-
-
-
- var dtd = (dom.dtd = (function () {
- function _(s) {
- for (var k in s) {
- s[k.toUpperCase()] = s[k]
- }
- return s
- }
- var X = utils.extend2
- var A = _({ isindex: 1, fieldset: 1 }),
- B = _({ input: 1, button: 1, select: 1, textarea: 1, label: 1 }),
- C = X(_({ a: 1 }), B),
- D = X({ iframe: 1 }, C),
- E = _({
- hr: 1,
- ul: 1,
- menu: 1,
- div: 1,
- blockquote: 1,
- noscript: 1,
- table: 1,
- center: 1,
- address: 1,
- dir: 1,
- pre: 1,
- h5: 1,
- dl: 1,
- h4: 1,
- noframes: 1,
- h6: 1,
- ol: 1,
- h1: 1,
- h3: 1,
- h2: 1
- }),
- F = _({ ins: 1, del: 1, script: 1, style: 1 }),
- G = X(
- _({
- b: 1,
- acronym: 1,
- bdo: 1,
- var: 1,
- '#': 1,
- abbr: 1,
- code: 1,
- br: 1,
- i: 1,
- cite: 1,
- kbd: 1,
- u: 1,
- strike: 1,
- s: 1,
- tt: 1,
- strong: 1,
- q: 1,
- samp: 1,
- em: 1,
- dfn: 1,
- span: 1
- }),
- F
- ),
- H = X(
- _({
- sub: 1,
- img: 1,
- embed: 1,
- object: 1,
- sup: 1,
- basefont: 1,
- map: 1,
- applet: 1,
- font: 1,
- big: 1,
- small: 1
- }),
- G
- ),
- I = X(_({ p: 1 }), H),
- J = X(_({ iframe: 1 }), H, B),
- K = _({
- img: 1,
- embed: 1,
- noscript: 1,
- br: 1,
- kbd: 1,
- center: 1,
- button: 1,
- basefont: 1,
- h5: 1,
- h4: 1,
- samp: 1,
- h6: 1,
- ol: 1,
- h1: 1,
- h3: 1,
- h2: 1,
- form: 1,
- font: 1,
- '#': 1,
- select: 1,
- menu: 1,
- ins: 1,
- abbr: 1,
- label: 1,
- code: 1,
- table: 1,
- script: 1,
- cite: 1,
- input: 1,
- iframe: 1,
- strong: 1,
- textarea: 1,
- noframes: 1,
- big: 1,
- small: 1,
- span: 1,
- hr: 1,
- sub: 1,
- bdo: 1,
- var: 1,
- div: 1,
- object: 1,
- sup: 1,
- strike: 1,
- dir: 1,
- map: 1,
- dl: 1,
- applet: 1,
- del: 1,
- isindex: 1,
- fieldset: 1,
- ul: 1,
- b: 1,
- acronym: 1,
- a: 1,
- blockquote: 1,
- i: 1,
- u: 1,
- s: 1,
- tt: 1,
- address: 1,
- q: 1,
- pre: 1,
- p: 1,
- em: 1,
- dfn: 1
- }),
- L = X(_({ a: 0 }), J),
- M = _({ tr: 1 }),
- N = _({ '#': 1 }),
- O = X(_({ param: 1 }), K),
- P = X(_({ form: 1 }), A, D, E, I),
- Q = _({ li: 1, ol: 1, ul: 1 }),
- R = _({ style: 1, script: 1 }),
- S = _({ base: 1, link: 1, meta: 1, title: 1 }),
- T = X(S, R),
- U = _({ head: 1, body: 1 }),
- V = _({ html: 1 })
- var block = _({
- address: 1,
- blockquote: 1,
- center: 1,
- dir: 1,
- div: 1,
- dl: 1,
- fieldset: 1,
- form: 1,
- h1: 1,
- h2: 1,
- h3: 1,
- h4: 1,
- h5: 1,
- h6: 1,
- hr: 1,
- isindex: 1,
- menu: 1,
- noframes: 1,
- ol: 1,
- p: 1,
- pre: 1,
- table: 1,
- ul: 1
- }),
- empty = _({
- area: 1,
- base: 1,
- basefont: 1,
- br: 1,
- col: 1,
- command: 1,
- dialog: 1,
- embed: 1,
- hr: 1,
- img: 1,
- input: 1,
- isindex: 1,
- keygen: 1,
- link: 1,
- meta: 1,
- param: 1,
- source: 1,
- track: 1,
- wbr: 1
- })
- return _({
-
-
- $nonBodyContent: X(V, U, S),
-
- $block: block,
-
- $inline: L,
- $inlineWithA: X(_({ a: 1 }), L),
- $body: X(_({ script: 1, style: 1 }), block),
- $cdata: _({ script: 1, style: 1 }),
-
- $empty: empty,
-
- $nonChild: _({ iframe: 1, textarea: 1 }),
-
- $listItem: _({ dd: 1, dt: 1, li: 1 }),
-
- $list: _({ ul: 1, ol: 1, dl: 1 }),
-
- $isNotEmpty: _({
- table: 1,
- ul: 1,
- ol: 1,
- dl: 1,
- iframe: 1,
- area: 1,
- base: 1,
- col: 1,
- hr: 1,
- img: 1,
- embed: 1,
- input: 1,
- link: 1,
- meta: 1,
- param: 1,
- h1: 1,
- h2: 1,
- h3: 1,
- h4: 1,
- h5: 1,
- h6: 1
- }),
-
- $removeEmpty: _({
- a: 1,
- abbr: 1,
- acronym: 1,
- address: 1,
- b: 1,
- bdo: 1,
- big: 1,
- cite: 1,
- code: 1,
- del: 1,
- dfn: 1,
- em: 1,
- font: 1,
- i: 1,
- ins: 1,
- label: 1,
- kbd: 1,
- q: 1,
- s: 1,
- samp: 1,
- small: 1,
- span: 1,
- strike: 1,
- strong: 1,
- sub: 1,
- sup: 1,
- tt: 1,
- u: 1,
- var: 1
- }),
- $removeEmptyBlock: _({ p: 1, div: 1 }),
-
- $tableContent: _({
- caption: 1,
- col: 1,
- colgroup: 1,
- tbody: 1,
- td: 1,
- tfoot: 1,
- th: 1,
- thead: 1,
- tr: 1,
- table: 1
- }),
-
- $notTransContent: _({ pre: 1, script: 1, style: 1, textarea: 1 }),
- html: U,
- head: T,
- style: N,
- script: N,
- body: P,
- base: {},
- link: {},
- meta: {},
- title: N,
- col: {},
- tr: _({ td: 1, th: 1 }),
- img: {},
- embed: {},
- colgroup: _({ thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1 }),
- noscript: P,
- td: P,
- br: {},
- th: P,
- center: P,
- kbd: L,
- button: X(I, E),
- basefont: {},
- h5: L,
- h4: L,
- samp: L,
- h6: L,
- ol: Q,
- h1: L,
- h3: L,
- option: N,
- h2: L,
- form: X(A, D, E, I),
- select: _({ optgroup: 1, option: 1 }),
- font: L,
- ins: L,
- menu: Q,
- abbr: L,
- label: L,
- table: _({
- thead: 1,
- col: 1,
- tbody: 1,
- tr: 1,
- colgroup: 1,
- caption: 1,
- tfoot: 1
- }),
- code: L,
- tfoot: M,
- cite: L,
- li: P,
- input: {},
- iframe: P,
- strong: L,
- textarea: N,
- noframes: P,
- big: L,
- small: L,
-
- span: _({
- '#': 1,
- br: 1,
- b: 1,
- strong: 1,
- u: 1,
- i: 1,
- em: 1,
- sub: 1,
- sup: 1,
- strike: 1,
- span: 1
- }),
- hr: L,
- dt: L,
- sub: L,
- optgroup: _({ option: 1 }),
- param: {},
- bdo: L,
- var: L,
- div: P,
- object: O,
- sup: L,
- dd: P,
- strike: L,
- area: {},
- dir: Q,
- map: X(_({ area: 1, form: 1, p: 1 }), A, F, E),
- applet: O,
- dl: _({ dt: 1, dd: 1 }),
- del: L,
- isindex: {},
- fieldset: X(_({ legend: 1 }), K),
- thead: M,
- ul: Q,
- acronym: L,
- b: L,
- a: X(_({ a: 1 }), J),
- blockquote: X(_({ td: 1, tr: 1, tbody: 1, li: 1 }), P),
- caption: L,
- i: L,
- u: L,
- tbody: M,
- s: L,
- address: X(D, I),
- tt: L,
- legend: L,
- q: L,
- pre: X(G, C),
- p: X(_({ a: 1 }), L),
- em: L,
- dfn: L
- })
- })())
-
-
-
- function getDomNode(node, start, ltr, startFromChild, fn, guard) {
- var tmpNode = startFromChild && node[start],
- parent
- !tmpNode && (tmpNode = node[ltr])
- while (!tmpNode && (parent = (parent || node).parentNode)) {
- if (parent.tagName == 'BODY' || (guard && !guard(parent))) {
- return null
- }
- tmpNode = parent[ltr]
- }
- if (tmpNode && fn && !fn(tmpNode)) {
- return getDomNode(tmpNode, start, ltr, false, fn)
- }
- return tmpNode
- }
- var attrFix =
- ie && browser.version < 9
- ? {
- tabindex: 'tabIndex',
- readonly: 'readOnly',
- for: 'htmlFor',
- class: 'className',
- maxlength: 'maxLength',
- cellspacing: 'cellSpacing',
- cellpadding: 'cellPadding',
- rowspan: 'rowSpan',
- colspan: 'colSpan',
- usemap: 'useMap',
- frameborder: 'frameBorder'
- }
- : {
- tabindex: 'tabIndex',
- readonly: 'readOnly'
- },
- styleBlock = utils.listToMap([
- '-webkit-box',
- '-moz-box',
- 'block',
- 'list-item',
- 'table',
- 'table-row-group',
- 'table-header-group',
- 'table-footer-group',
- 'table-row',
- 'table-column-group',
- 'table-column',
- 'table-cell',
- 'table-caption'
- ])
- var domUtils = (dom.domUtils = {
-
- NODE_ELEMENT: 1,
- NODE_DOCUMENT: 9,
- NODE_TEXT: 3,
- NODE_COMMENT: 8,
- NODE_DOCUMENT_FRAGMENT: 11,
-
- POSITION_IDENTICAL: 0,
- POSITION_DISCONNECTED: 1,
- POSITION_FOLLOWING: 2,
- POSITION_PRECEDING: 4,
- POSITION_IS_CONTAINED: 8,
- POSITION_CONTAINS: 16,
-
- fillChar: ie && browser.version == '6' ? '\ufeff' : '\u200B',
-
- keys: {
- 8: 1,
- 46: 1,
- 16: 1,
- 17: 1,
- 18: 1,
- 37: 1,
- 38: 1,
- 39: 1,
- 40: 1,
- 13: 1
- },
-
- getPosition: function (nodeA, nodeB) {
-
- if (nodeA === nodeB) {
-
- return 0
- }
- var node,
- parentsA = [nodeA],
- parentsB = [nodeB]
- node = nodeA
- while ((node = node.parentNode)) {
-
- if (node === nodeB) {
-
- return 10
- }
- parentsA.push(node)
- }
- node = nodeB
- while ((node = node.parentNode)) {
-
- if (node === nodeA) {
-
- return 20
- }
- parentsB.push(node)
- }
- parentsA.reverse()
- parentsB.reverse()
- if (parentsA[0] !== parentsB[0]) {
-
- return 1
- }
- var i = -1
- while ((i++, parentsA[i] === parentsB[i])) {}
- nodeA = parentsA[i]
- nodeB = parentsB[i]
- while ((nodeA = nodeA.nextSibling)) {
- if (nodeA === nodeB) {
-
- return 4
- }
- }
-
- return 2
- },
-
-
- getNodeIndex: function (node, ignoreTextNode) {
- var preNode = node,
- i = 0
- while ((preNode = preNode.previousSibling)) {
- if (ignoreTextNode && preNode.nodeType == 3) {
- if (preNode.nodeType != preNode.nextSibling.nodeType) {
- i++
- }
- continue
- }
- i++
- }
- return i
- },
-
- inDoc: function (node, doc) {
- return domUtils.getPosition(node, doc) == 10
- },
-
-
- findParent: function (node, filterFn, includeSelf) {
- if (node && !domUtils.isBody(node)) {
- node = includeSelf ? node : node.parentNode
- while (node) {
- if (!filterFn || filterFn(node) || domUtils.isBody(node)) {
- return filterFn && !filterFn(node) && domUtils.isBody(node)
- ? null
- : node
- }
- node = node.parentNode
- }
- }
- return null
- },
-
-
- findParentByTagName: function (node, tagNames, includeSelf, excludeFn) {
- tagNames = utils.listToMap(
- utils.isArray(tagNames) ? tagNames : [tagNames]
- )
- return domUtils.findParent(
- node,
- function (node) {
- return tagNames[node.tagName] && !(excludeFn && excludeFn(node))
- },
- includeSelf
- )
- },
-
-
- findParents: function (node, includeSelf, filterFn, closerFirst) {
- var parents =
- includeSelf && ((filterFn && filterFn(node)) || !filterFn) ? [node] : []
- while ((node = domUtils.findParent(node, filterFn))) {
- parents.push(node)
- }
- return closerFirst ? parents : parents.reverse()
- },
-
- insertAfter: function (node, newNode) {
- return node.nextSibling
- ? node.parentNode.insertBefore(newNode, node.nextSibling)
- : node.parentNode.appendChild(newNode)
- },
-
-
- remove: function (node, keepChildren) {
- var parent = node.parentNode,
- child
- if (parent) {
- if (keepChildren && node.hasChildNodes()) {
- while ((child = node.firstChild)) {
- parent.insertBefore(child, node)
- }
- }
- parent.removeChild(node)
- }
- return node
- },
-
-
- getNextDomNode: function (node, startFromChild, filterFn, guard) {
- return getDomNode(
- node,
- 'firstChild',
- 'nextSibling',
- startFromChild,
- filterFn,
- guard
- )
- },
- getPreDomNode: function (node, startFromChild, filterFn, guard) {
- return getDomNode(
- node,
- 'lastChild',
- 'previousSibling',
- startFromChild,
- filterFn,
- guard
- )
- },
-
- isBookmarkNode: function (node) {
- return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id)
- },
-
- getWindow: function (node) {
- var doc = node.ownerDocument || node
- return doc.defaultView || doc.parentWindow
- },
-
- getCommonAncestor: function (nodeA, nodeB) {
- if (nodeA === nodeB) return nodeA
- var parentsA = [nodeA],
- parentsB = [nodeB],
- parent = nodeA,
- i = -1
- while ((parent = parent.parentNode)) {
- if (parent === nodeB) {
- return parent
- }
- parentsA.push(parent)
- }
- parent = nodeB
- while ((parent = parent.parentNode)) {
- if (parent === nodeA) return parent
- parentsB.push(parent)
- }
- parentsA.reverse()
- parentsB.reverse()
- while ((i++, parentsA[i] === parentsB[i])) {}
- return i == 0 ? null : parentsA[i - 1]
- },
-
-
-
- clearEmptySibling: function (node, ignoreNext, ignorePre) {
- function clear(next, dir) {
- var tmpNode
- while (
- next &&
- !domUtils.isBookmarkNode(next) &&
- (domUtils.isEmptyInlineElement(next) ||
-
- !new RegExp('[^\t\n\r' + domUtils.fillChar + ']').test(
- next.nodeValue
- ))
- ) {
- tmpNode = next[dir]
- domUtils.remove(next)
- next = tmpNode
- }
- }
- !ignoreNext && clear(node.nextSibling, 'nextSibling')
- !ignorePre && clear(node.previousSibling, 'previousSibling')
- },
-
- split: function (node, offset) {
- var doc = node.ownerDocument
- if (browser.ie && offset == node.nodeValue.length) {
- var next = doc.createTextNode('')
- return domUtils.insertAfter(node, next)
- }
- var retval = node.splitText(offset)
-
- if (browser.ie8) {
- var tmpNode = doc.createTextNode('')
- domUtils.insertAfter(retval, tmpNode)
- domUtils.remove(tmpNode)
- }
- return retval
- },
-
- isWhitespace: function (node) {
- return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(
- node.nodeValue
- )
- },
-
- getXY: function (element) {
- var x = 0,
- y = 0
- while (element.offsetParent) {
- y += element.offsetTop
- x += element.offsetLeft
- element = element.offsetParent
- }
- return { x: x, y: y }
- },
-
-
- on: function (element, type, handler) {
- var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/),
- k = types.length
- if (k)
- while (k--) {
- type = types[k]
- if (element.addEventListener) {
- element.addEventListener(type, handler, false)
- } else {
- if (!handler._d) {
- handler._d = {
- els: []
- }
- }
- var key = type + handler.toString(),
- index = utils.indexOf(handler._d.els, element)
- if (!handler._d[key] || index == -1) {
- if (index == -1) {
- handler._d.els.push(element)
- }
- if (!handler._d[key]) {
- handler._d[key] = function (evt) {
- return handler.call(evt.srcElement, evt || window.event)
- }
- }
- element.attachEvent('on' + type, handler._d[key])
- }
- }
- }
- element = null
- },
-
-
- un: function (element, type, handler) {
- var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/),
- k = types.length
- if (k)
- while (k--) {
- type = types[k]
- if (element.removeEventListener) {
- element.removeEventListener(type, handler, false)
- } else {
- var key = type + handler.toString()
- try {
- element.detachEvent(
- 'on' + type,
- handler._d ? handler._d[key] : handler
- )
- } catch (e) {}
- if (handler._d && handler._d[key]) {
- var index = utils.indexOf(handler._d.els, element)
- if (index != -1) {
- handler._d.els.splice(index, 1)
- }
- handler._d.els.length == 0 && delete handler._d[key]
- }
- }
- }
- },
-
- isSameElement: function (nodeA, nodeB) {
- if (nodeA.tagName != nodeB.tagName) {
- return false
- }
- var thisAttrs = nodeA.attributes,
- otherAttrs = nodeB.attributes
- if (!ie && thisAttrs.length != otherAttrs.length) {
- return false
- }
- var attrA,
- attrB,
- al = 0,
- bl = 0
- for (var i = 0; (attrA = thisAttrs[i++]); ) {
- if (attrA.nodeName == 'style') {
- if (attrA.specified) {
- al++
- }
- if (domUtils.isSameStyle(nodeA, nodeB)) {
- continue
- } else {
- return false
- }
- }
- if (ie) {
- if (attrA.specified) {
- al++
- attrB = otherAttrs.getNamedItem(attrA.nodeName)
- } else {
- continue
- }
- } else {
- attrB = nodeB.attributes[attrA.nodeName]
- }
- if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) {
- return false
- }
- }
-
- if (ie) {
- for (i = 0; (attrB = otherAttrs[i++]); ) {
- if (attrB.specified) {
- bl++
- }
- }
- if (al != bl) {
- return false
- }
- }
- return true
- },
-
- isSameStyle: function (nodeA, nodeB) {
- var styleA = nodeA.style.cssText
- .replace(/( ?; ?)/g, ';')
- .replace(/( ?: ?)/g, ':'),
- styleB = nodeB.style.cssText
- .replace(/( ?; ?)/g, ';')
- .replace(/( ?: ?)/g, ':')
- if (browser.opera) {
- styleA = nodeA.style
- styleB = nodeB.style
- if (styleA.length != styleB.length) return false
- for (var p in styleA) {
- if (/^(\d+|csstext)$/i.test(p)) {
- continue
- }
- if (styleA[p] != styleB[p]) {
- return false
- }
- }
- return true
- }
- if (!styleA || !styleB) {
- return styleA == styleB
- }
- styleA = styleA.split(';')
- styleB = styleB.split(';')
- if (styleA.length != styleB.length) {
- return false
- }
- for (var i = 0, ci; (ci = styleA[i++]); ) {
- if (utils.indexOf(styleB, ci) == -1) {
- return false
- }
- }
- return true
- },
-
- isBlockElm: function (node) {
- return (
- node.nodeType == 1 &&
- (dtd.$block[node.tagName] ||
- styleBlock[domUtils.getComputedStyle(node, 'display')]) &&
- !dtd.$nonChild[node.tagName]
- )
- },
-
- isBody: function (node) {
- return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body'
- },
-
- breakParent: function (node, parent) {
- var tmpNode,
- parentClone = node,
- clone = node,
- leftNodes,
- rightNodes
- do {
- parentClone = parentClone.parentNode
- if (leftNodes) {
- tmpNode = parentClone.cloneNode(false)
- tmpNode.appendChild(leftNodes)
- leftNodes = tmpNode
- tmpNode = parentClone.cloneNode(false)
- tmpNode.appendChild(rightNodes)
- rightNodes = tmpNode
- } else {
- leftNodes = parentClone.cloneNode(false)
- rightNodes = leftNodes.cloneNode(false)
- }
- while ((tmpNode = clone.previousSibling)) {
- leftNodes.insertBefore(tmpNode, leftNodes.firstChild)
- }
- while ((tmpNode = clone.nextSibling)) {
- rightNodes.appendChild(tmpNode)
- }
- clone = parentClone
- } while (parent !== parentClone)
- tmpNode = parent.parentNode
- tmpNode.insertBefore(leftNodes, parent)
- tmpNode.insertBefore(rightNodes, parent)
- tmpNode.insertBefore(node, rightNodes)
- domUtils.remove(parent)
- return node
- },
-
- isEmptyInlineElement: function (node) {
- if (node.nodeType != 1 || !dtd.$removeEmpty[node.tagName]) {
- return 0
- }
- node = node.firstChild
- while (node) {
-
- if (domUtils.isBookmarkNode(node)) {
- return 0
- }
- if (
- (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node)) ||
- (node.nodeType == 3 && !domUtils.isWhitespace(node))
- ) {
- return 0
- }
- node = node.nextSibling
- }
- return 1
- },
-
- trimWhiteTextNode: function (node) {
- function remove(dir) {
- var child
- while (
- (child = node[dir]) &&
- child.nodeType == 3 &&
- domUtils.isWhitespace(child)
- ) {
- node.removeChild(child)
- }
- }
- remove('firstChild')
- remove('lastChild')
- },
-
- mergeChild: function (node, tagName, attrs) {
- var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase())
- for (var i = 0, ci; (ci = list[i++]); ) {
- if (!ci.parentNode || domUtils.isBookmarkNode(ci)) {
- continue
- }
-
- if (ci.tagName.toLowerCase() == 'span') {
- if (node === ci.parentNode) {
- domUtils.trimWhiteTextNode(node)
- if (node.childNodes.length == 1) {
- node.style.cssText = ci.style.cssText + ';' + node.style.cssText
- domUtils.remove(ci, true)
- continue
- }
- }
- ci.style.cssText = node.style.cssText + ';' + ci.style.cssText
- if (attrs) {
- var style = attrs.style
- if (style) {
- style = style.split(';')
- for (var j = 0, s; (s = style[j++]); ) {
- ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] =
- s.split(':')[1]
- }
- }
- }
- if (domUtils.isSameStyle(ci, node)) {
- domUtils.remove(ci, true)
- }
- continue
- }
- if (domUtils.isSameElement(node, ci)) {
- domUtils.remove(ci, true)
- }
- }
- },
-
- getElementsByTagName: function (node, name, filter) {
- if (filter && utils.isString(filter)) {
- var className = filter
- filter = function (node) {
- return domUtils.hasClass(node, className)
- }
- }
- name = utils
- .trim(name)
- .replace(/[ ]{2,}/g, ' ')
- .split(' ')
- var arr = []
- for (var n = 0, ni; (ni = name[n++]); ) {
- var list = node.getElementsByTagName(ni)
- for (var i = 0, ci; (ci = list[i++]); ) {
- if (!filter || filter(ci)) arr.push(ci)
- }
- }
- return arr
- },
-
- mergeToParent: function (node) {
- var parent = node.parentNode
- while (parent && dtd.$removeEmpty[parent.tagName]) {
- if (parent.tagName == node.tagName || parent.tagName == 'A') {
-
- domUtils.trimWhiteTextNode(parent)
-
- if (
- (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node)) ||
- (parent.tagName == 'A' && node.tagName == 'SPAN')
- ) {
- if (parent.childNodes.length > 1 || parent !== node.parentNode) {
- node.style.cssText =
- parent.style.cssText + ';' + node.style.cssText
- parent = parent.parentNode
- continue
- } else {
- parent.style.cssText += ';' + node.style.cssText
-
- if (parent.tagName == 'A') {
- parent.style.textDecoration = 'underline'
- }
- }
- }
- if (parent.tagName != 'A') {
- parent === node.parentNode && domUtils.remove(node, true)
- break
- }
- }
- parent = parent.parentNode
- }
- },
-
-
-
- mergeSibling: function (node, ignorePre, ignoreNext) {
- function merge(rtl, start, node) {
- var next
- if (
- (next = node[rtl]) &&
- !domUtils.isBookmarkNode(next) &&
- next.nodeType == 1 &&
- domUtils.isSameElement(node, next)
- ) {
- while (next.firstChild) {
- if (start == 'firstChild') {
- node.insertBefore(next.lastChild, node.firstChild)
- } else {
- node.appendChild(next.firstChild)
- }
- }
- domUtils.remove(next)
- }
- }
- !ignorePre && merge('previousSibling', 'firstChild', node)
- !ignoreNext && merge('nextSibling', 'lastChild', node)
- },
-
- unSelectable:
- (ie && browser.ie9below) || browser.opera
- ? function (node) {
-
- node.onselectstart = function () {
- return false
- }
- node.onclick =
- node.onkeyup =
- node.onkeydown =
- function () {
- return false
- }
- node.unselectable = 'on'
- node.setAttribute('unselectable', 'on')
- for (var i = 0, ci; (ci = node.all[i++]); ) {
- switch (ci.tagName.toLowerCase()) {
- case 'iframe':
- case 'textarea':
- case 'input':
- case 'select':
- break
- default:
- ci.unselectable = 'on'
- node.setAttribute('unselectable', 'on')
- }
- }
- }
- : function (node) {
- node.style.MozUserSelect =
- node.style.webkitUserSelect =
- node.style.msUserSelect =
- node.style.KhtmlUserSelect =
- 'none'
- },
-
-
- removeAttributes: function (node, attrNames) {
- attrNames = utils.isArray(attrNames)
- ? attrNames
- : utils
- .trim(attrNames)
- .replace(/[ ]{2,}/g, ' ')
- .split(' ')
- for (var i = 0, ci; (ci = attrNames[i++]); ) {
- ci = attrFix[ci] || ci
- switch (ci) {
- case 'className':
- node[ci] = ''
- break
- case 'style':
- node.style.cssText = ''
- var val = node.getAttributeNode('style')
- !browser.ie && val && node.removeAttributeNode(val)
- }
- node.removeAttribute(ci)
- }
- },
-
- createElement: function (doc, tag, attrs) {
- return domUtils.setAttributes(doc.createElement(tag), attrs)
- },
-
- setAttributes: function (node, attrs) {
- for (var attr in attrs) {
- if (attrs.hasOwnProperty(attr)) {
- var value = attrs[attr]
- switch (attr) {
- case 'class':
-
- node.className = value
- break
- case 'style':
- node.style.cssText = node.style.cssText + ';' + value
- break
- case 'innerHTML':
- node[attr] = value
- break
- case 'value':
- node.value = value
- break
- default:
- node.setAttribute(attrFix[attr] || attr, value)
- }
- }
- }
- return node
- },
-
- getComputedStyle: function (element, styleName) {
-
- var pros = 'width height top left'
- if (pros.indexOf(styleName) > -1) {
- return (
- element[
- 'offset' +
- styleName.replace(/^\w/, function (s) {
- return s.toUpperCase()
- })
- ] + 'px'
- )
- }
-
- if (element.nodeType == 3) {
- element = element.parentNode
- }
-
- if (
- browser.ie &&
- browser.version < 9 &&
- styleName == 'font-size' &&
- !element.style.fontSize &&
- !dtd.$empty[element.tagName] &&
- !dtd.$nonChild[element.tagName]
- ) {
- var span = element.ownerDocument.createElement('span')
- span.style.cssText = 'padding:0;border:0;font-family:simsun;'
- span.innerHTML = '.'
- element.appendChild(span)
- var result = span.offsetHeight
- element.removeChild(span)
- span = null
- return result + 'px'
- }
- try {
- var value =
- domUtils.getStyle(element, styleName) ||
- (window.getComputedStyle
- ? domUtils
- .getWindow(element)
- .getComputedStyle(element, '')
- .getPropertyValue(styleName)
- : (element.currentStyle || element.style)[
- utils.cssStyleToDomStyle(styleName)
- ])
- } catch (e) {
- return ''
- }
- return utils.transUnitToPx(utils.fixColor(styleName, value))
- },
-
-
- removeClasses: function (elm, classNames) {
- classNames = utils.isArray(classNames)
- ? classNames
- : utils
- .trim(classNames)
- .replace(/[ ]{2,}/g, ' ')
- .split(' ')
- for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) {
- cls = cls.replace(new RegExp('\\b' + ci + '\\b'), '')
- }
- cls = utils.trim(cls).replace(/[ ]{2,}/g, ' ')
- if (cls) {
- elm.className = cls
- } else {
- domUtils.removeAttributes(elm, ['class'])
- }
- },
-
-
- addClass: function (elm, classNames) {
- if (!elm) return
- classNames = utils
- .trim(classNames)
- .replace(/[ ]{2,}/g, ' ')
- .split(' ')
- for (var i = 0, ci, cls = elm.className; (ci = classNames[i++]); ) {
- if (!new RegExp('\\b' + ci + '\\b').test(cls)) {
- cls += ' ' + ci
- }
- }
- elm.className = utils.trim(cls)
- },
-
-
- hasClass: function (element, className) {
- if (utils.isRegExp(className)) {
- return className.test(element.className)
- }
- className = utils
- .trim(className)
- .replace(/[ ]{2,}/g, ' ')
- .split(' ')
- for (var i = 0, ci, cls = element.className; (ci = className[i++]); ) {
- if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) {
- return false
- }
- }
- return i - 1 == className.length
- },
-
- preventDefault: function (evt) {
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false)
- },
-
- removeStyle: function (element, name) {
- if (browser.ie) {
-
- if (name == 'color') {
- name = '(^|;)' + name
- }
- element.style.cssText = element.style.cssText.replace(
- new RegExp(name + '[^:]*:[^;]+;?', 'ig'),
- ''
- )
- } else {
- if (element.style.removeProperty) {
- element.style.removeProperty(name)
- } else {
- element.style.removeAttribute(utils.cssStyleToDomStyle(name))
- }
- }
- if (!element.style.cssText) {
- domUtils.removeAttributes(element, ['style'])
- }
- },
-
- getStyle: function (element, name) {
- var value = element.style[utils.cssStyleToDomStyle(name)]
- return utils.fixColor(name, value)
- },
-
- setStyle: function (element, name, value) {
- element.style[utils.cssStyleToDomStyle(name)] = value
- if (!utils.trim(element.style.cssText)) {
- this.removeAttributes(element, 'style')
- }
- },
-
- setStyles: function (element, styles) {
- for (var name in styles) {
- if (styles.hasOwnProperty(name)) {
- domUtils.setStyle(element, name, styles[name])
- }
- }
- },
-
- removeDirtyAttr: function (node) {
- for (
- var i = 0, ci, nodes = node.getElementsByTagName('*');
- (ci = nodes[i++]);
- ) {
- ci.removeAttribute('_moz_dirty')
- }
- node.removeAttribute('_moz_dirty')
- },
-
-
- getChildCount: function (node, fn) {
- var count = 0,
- first = node.firstChild
- fn =
- fn ||
- function () {
- return 1
- }
- while (first) {
- if (fn(first)) {
- count++
- }
- first = first.nextSibling
- }
- return count
- },
-
- isEmptyNode: function (node) {
- return (
- !node.firstChild ||
- domUtils.getChildCount(node, function (node) {
- return (
- !domUtils.isBr(node) &&
- !domUtils.isBookmarkNode(node) &&
- !domUtils.isWhitespace(node)
- )
- }) == 0
- )
- },
- clearSelectedArr: function (nodes) {
- var node
- while ((node = nodes.pop())) {
- domUtils.removeAttributes(node, ['class'])
- }
- },
-
- scrollToView: function (node, win, offsetTop) {
- var getViewPaneSize = function () {
- var doc = win.document,
- mode = doc.compatMode == 'CSS1Compat'
- return {
- width:
- (mode ? doc.documentElement.clientWidth : doc.body.clientWidth) ||
- 0,
- height:
- (mode
- ? doc.documentElement.clientHeight
- : doc.body.clientHeight) || 0
- }
- },
- getScrollPosition = function (win) {
- if ('pageXOffset' in win) {
- return {
- x: win.pageXOffset || 0,
- y: win.pageYOffset || 0
- }
- } else {
- var doc = win.document
- return {
- x: doc.documentElement.scrollLeft || doc.body.scrollLeft || 0,
- y: doc.documentElement.scrollTop || doc.body.scrollTop || 0
- }
- }
- }
- var winHeight = getViewPaneSize().height,
- offset = winHeight * -1 + offsetTop
- offset += node.offsetHeight || 0
- var elementPosition = domUtils.getXY(node)
- offset += elementPosition.y
- var currentScroll = getScrollPosition(win).y
-
- if (offset > currentScroll || offset < currentScroll - winHeight) {
- win.scrollTo(0, offset + (offset < 0 ? -20 : 20))
- }
- },
-
- isBr: function (node) {
- return node.nodeType == 1 && node.tagName == 'BR'
- },
-
- isFillChar: function (node, isInStart) {
- if (node.nodeType != 3) return false
- var text = node.nodeValue
- if (isInStart) {
- return new RegExp('^' + domUtils.fillChar).test(text)
- }
- return !text.replace(new RegExp(domUtils.fillChar, 'g'), '').length
- },
- isStartInblock: function (range) {
- var tmpRange = range.cloneRange(),
- flag = 0,
- start = tmpRange.startContainer,
- tmp
- if (start.nodeType == 1 && start.childNodes[tmpRange.startOffset]) {
- start = start.childNodes[tmpRange.startOffset]
- var pre = start.previousSibling
- while (pre && domUtils.isFillChar(pre)) {
- start = pre
- pre = pre.previousSibling
- }
- }
- if (this.isFillChar(start, true) && tmpRange.startOffset == 1) {
- tmpRange.setStartBefore(start)
- start = tmpRange.startContainer
- }
- while (start && domUtils.isFillChar(start)) {
- tmp = start
- start = start.previousSibling
- }
- if (tmp) {
- tmpRange.setStartBefore(tmp)
- start = tmpRange.startContainer
- }
- if (
- start.nodeType == 1 &&
- domUtils.isEmptyNode(start) &&
- tmpRange.startOffset == 1
- ) {
- tmpRange.setStart(start, 0).collapse(true)
- }
- while (!tmpRange.startOffset) {
- start = tmpRange.startContainer
- if (domUtils.isBlockElm(start) || domUtils.isBody(start)) {
- flag = 1
- break
- }
- var pre = tmpRange.startContainer.previousSibling,
- tmpNode
- if (!pre) {
- tmpRange.setStartBefore(tmpRange.startContainer)
- } else {
- while (pre && domUtils.isFillChar(pre)) {
- tmpNode = pre
- pre = pre.previousSibling
- }
- if (tmpNode) {
- tmpRange.setStartBefore(tmpNode)
- } else {
- tmpRange.setStartBefore(tmpRange.startContainer)
- }
- }
- }
- return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0
- },
-
-
- isEmptyBlock: function (node, reg) {
-
- if (!node) {
- return
- }
- if (node.nodeType != 1) return 0
- reg = reg || new RegExp('[ \xa0\t\r\n' + domUtils.fillChar + ']', 'g')
- if (
- node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length >
- 0
- ) {
- return 0
- }
- for (var n in dtd.$isNotEmpty) {
- if (node.getElementsByTagName(n).length) {
- return 0
- }
- }
- return 1
- },
-
- setViewportOffset: function (element, offset) {
- var left = parseInt(element.style.left) | 0
- var top = parseInt(element.style.top) | 0
- var rect = element.getBoundingClientRect()
- var offsetLeft = offset.left - rect.left
- var offsetTop = offset.top - rect.top
- if (offsetLeft) {
- element.style.left = left + offsetLeft + 'px'
- }
- if (offsetTop) {
- element.style.top = top + offsetTop + 'px'
- }
- },
-
- fillNode: function (doc, node) {
- var tmpNode = browser.ie
- ? doc.createTextNode(domUtils.fillChar)
- : doc.createElement('br')
- node.innerHTML = ''
- node.appendChild(tmpNode)
- },
-
-
- moveChild: function (src, tag, dir) {
- while (src.firstChild) {
- if (dir && tag.firstChild) {
- tag.insertBefore(src.lastChild, tag.firstChild)
- } else {
- tag.appendChild(src.firstChild)
- }
- }
- },
-
- hasNoAttributes: function (node) {
- return browser.ie
- ? /^<\w+\s*?>/.test(node.outerHTML)
- : node.attributes.length == 0
- },
-
- isCustomeNode: function (node) {
- return node.nodeType == 1 && node.getAttribute('_ue_custom_node_')
- },
-
- isTagNode: function (node, tagNames) {
- return (
- node.nodeType == 1 &&
- new RegExp('\\b' + node.tagName + '\\b', 'i').test(tagNames)
- )
- },
-
-
-
- filterNodeList: function (nodelist, filter, forAll) {
- var results = []
- if (!utils.isFunction(filter)) {
- var str = filter
- filter = function (n) {
- return (
- utils.indexOf(
- utils.isArray(str) ? str : str.split(' '),
- n.tagName.toLowerCase()
- ) != -1
- )
- }
- }
- utils.each(nodelist, function (n) {
- filter(n) && results.push(n)
- })
- return results.length == 0
- ? null
- : results.length == 1 || !forAll
- ? results[0]
- : results
- },
-
- isInNodeEndBoundary: function (rng, node) {
- var start = rng.startContainer
- if (start.nodeType == 3 && rng.startOffset != start.nodeValue.length) {
- return 0
- }
- if (start.nodeType == 1 && rng.startOffset != start.childNodes.length) {
- return 0
- }
- while (start !== node) {
- if (start.nextSibling) {
- return 0
- }
- start = start.parentNode
- }
- return 1
- },
- isBoundaryNode: function (node, dir) {
- var tmp
- while (!domUtils.isBody(node)) {
- tmp = node
- node = node.parentNode
- if (tmp !== node[dir]) {
- return false
- }
- }
- return true
- },
- fillHtml: browser.ie11below ? ' ' : '<br/>'
- })
- var fillCharReg = new RegExp(domUtils.fillChar, 'g')
-
-
-
-
- ;(function () {
- var guid = 0,
- fillChar = domUtils.fillChar,
- fillData
-
- function updateCollapse(range) {
- range.collapsed =
- range.startContainer &&
- range.endContainer &&
- range.startContainer === range.endContainer &&
- range.startOffset == range.endOffset
- }
- function selectOneNode(rng) {
- return (
- !rng.collapsed &&
- rng.startContainer.nodeType == 1 &&
- rng.startContainer === rng.endContainer &&
- rng.endOffset - rng.startOffset == 1
- )
- }
- function setEndPoint(toStart, node, offset, range) {
-
- if (
- node.nodeType == 1 &&
- (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])
- ) {
- offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1)
- node = node.parentNode
- }
- if (toStart) {
- range.startContainer = node
- range.startOffset = offset
- if (!range.endContainer) {
- range.collapse(true)
- }
- } else {
- range.endContainer = node
- range.endOffset = offset
- if (!range.startContainer) {
- range.collapse(false)
- }
- }
- updateCollapse(range)
- return range
- }
- function execContentsAction(range, action) {
-
-
- var start = range.startContainer,
- end = range.endContainer,
- startOffset = range.startOffset,
- endOffset = range.endOffset,
- doc = range.document,
- frag = doc.createDocumentFragment(),
- tmpStart,
- tmpEnd
- if (start.nodeType == 1) {
- start =
- start.childNodes[startOffset] ||
- (tmpStart = start.appendChild(doc.createTextNode('')))
- }
- if (end.nodeType == 1) {
- end =
- end.childNodes[endOffset] ||
- (tmpEnd = end.appendChild(doc.createTextNode('')))
- }
- if (start === end && start.nodeType == 3) {
- frag.appendChild(
- doc.createTextNode(
- start.substringData(startOffset, endOffset - startOffset)
- )
- )
-
- if (action) {
- start.deleteData(startOffset, endOffset - startOffset)
- range.collapse(true)
- }
- return frag
- }
- var current,
- currentLevel,
- clone = frag,
- startParents = domUtils.findParents(start, true),
- endParents = domUtils.findParents(end, true)
- for (var i = 0; startParents[i] == endParents[i]; ) {
- i++
- }
- for (var j = i, si; (si = startParents[j]); j++) {
- current = si.nextSibling
- if (si == start) {
- if (!tmpStart) {
- if (range.startContainer.nodeType == 3) {
- clone.appendChild(
- doc.createTextNode(start.nodeValue.slice(startOffset))
- )
-
- if (action) {
- start.deleteData(
- startOffset,
- start.nodeValue.length - startOffset
- )
- }
- } else {
- clone.appendChild(!action ? start.cloneNode(true) : start)
- }
- }
- } else {
- currentLevel = si.cloneNode(false)
- clone.appendChild(currentLevel)
- }
- while (current) {
- if (current === end || current === endParents[j]) {
- break
- }
- si = current.nextSibling
- clone.appendChild(!action ? current.cloneNode(true) : current)
- current = si
- }
- clone = currentLevel
- }
- clone = frag
- if (!startParents[i]) {
- clone.appendChild(startParents[i - 1].cloneNode(false))
- clone = clone.firstChild
- }
- for (var j = i, ei; (ei = endParents[j]); j++) {
- current = ei.previousSibling
- if (ei == end) {
- if (!tmpEnd && range.endContainer.nodeType == 3) {
- clone.appendChild(
- doc.createTextNode(end.substringData(0, endOffset))
- )
-
- if (action) {
- end.deleteData(0, endOffset)
- }
- }
- } else {
- currentLevel = ei.cloneNode(false)
- clone.appendChild(currentLevel)
- }
-
- if (j != i || !startParents[i]) {
- while (current) {
- if (current === start) {
- break
- }
- ei = current.previousSibling
- clone.insertBefore(
- !action ? current.cloneNode(true) : current,
- clone.firstChild
- )
- current = ei
- }
- }
- clone = currentLevel
- }
- if (action) {
- range
- .setStartBefore(
- !endParents[i]
- ? endParents[i - 1]
- : !startParents[i]
- ? startParents[i - 1]
- : endParents[i]
- )
- .collapse(true)
- }
- tmpStart && domUtils.remove(tmpStart)
- tmpEnd && domUtils.remove(tmpEnd)
- return frag
- }
-
-
-
-
-
-
-
- var Range = (dom.Range = function (document) {
- var me = this
- me.startContainer = me.startOffset = me.endContainer = me.endOffset = null
- me.document = document
- me.collapsed = true
- })
-
- function removeFillData(doc, excludeNode) {
- try {
- if (fillData && domUtils.inDoc(fillData, doc)) {
- if (!fillData.nodeValue.replace(fillCharReg, '').length) {
- var tmpNode = fillData.parentNode
- domUtils.remove(fillData)
- while (
- tmpNode &&
- domUtils.isEmptyInlineElement(tmpNode) &&
-
- (browser.safari
- ? !(
- domUtils.getPosition(tmpNode, excludeNode) &
- domUtils.POSITION_CONTAINS
- )
- : !tmpNode.contains(excludeNode))
- ) {
- fillData = tmpNode.parentNode
- domUtils.remove(tmpNode)
- tmpNode = fillData
- }
- } else {
- fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, '')
- }
- }
- } catch (e) {}
- }
-
- function mergeSibling(node, dir) {
- var tmpNode
- node = node[dir]
- while (node && domUtils.isFillChar(node)) {
- tmpNode = node[dir]
- domUtils.remove(node)
- node = tmpNode
- }
- }
- Range.prototype = {
-
- cloneContents: function () {
- return this.collapsed ? null : execContentsAction(this, 0)
- },
-
- deleteContents: function () {
- var txt
- if (!this.collapsed) {
- execContentsAction(this, 1)
- }
- if (browser.webkit) {
- txt = this.startContainer
- if (txt.nodeType == 3 && !txt.nodeValue.length) {
- this.setStartBefore(txt).collapse(true)
- domUtils.remove(txt)
- }
- }
- return this
- },
-
- extractContents: function () {
- return this.collapsed ? null : execContentsAction(this, 2)
- },
-
- setStart: function (node, offset) {
- return setEndPoint(true, node, offset, this)
- },
-
- setEnd: function (node, offset) {
- return setEndPoint(false, node, offset, this)
- },
-
- setStartAfter: function (node) {
- return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1)
- },
-
- setStartBefore: function (node) {
- return this.setStart(node.parentNode, domUtils.getNodeIndex(node))
- },
-
- setEndAfter: function (node) {
- return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1)
- },
-
- setEndBefore: function (node) {
- return this.setEnd(node.parentNode, domUtils.getNodeIndex(node))
- },
-
- setStartAtFirst: function (node) {
- return this.setStart(node, 0)
- },
-
- setStartAtLast: function (node) {
- return this.setStart(
- node,
- node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length
- )
- },
-
- setEndAtFirst: function (node) {
- return this.setEnd(node, 0)
- },
-
- setEndAtLast: function (node) {
- return this.setEnd(
- node,
- node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length
- )
- },
-
- selectNode: function (node) {
- return this.setStartBefore(node).setEndAfter(node)
- },
-
- selectNodeContents: function (node) {
- return this.setStart(node, 0).setEndAtLast(node)
- },
-
- cloneRange: function () {
- var me = this
- return new Range(me.document)
- .setStart(me.startContainer, me.startOffset)
- .setEnd(me.endContainer, me.endOffset)
- },
-
-
- collapse: function (toStart) {
- var me = this
- if (toStart) {
- me.endContainer = me.startContainer
- me.endOffset = me.startOffset
- } else {
- me.startContainer = me.endContainer
- me.startOffset = me.endOffset
- }
- me.collapsed = true
- return me
- },
-
-
- shrinkBoundary: function (ignoreEnd) {
- var me = this,
- child,
- collapsed = me.collapsed
- function check(node) {
- return (
- node.nodeType == 1 &&
- !domUtils.isBookmarkNode(node) &&
- !dtd.$empty[node.tagName] &&
- !dtd.$nonChild[node.tagName]
- )
- }
- while (
- me.startContainer.nodeType == 1 &&
- (child = me.startContainer.childNodes[me.startOffset]) &&
- check(child)
- ) {
- me.setStart(child, 0)
- }
- if (collapsed) {
- return me.collapse(true)
- }
- if (!ignoreEnd) {
- while (
- me.endContainer.nodeType == 1 &&
- me.endOffset > 0 &&
- (child = me.endContainer.childNodes[me.endOffset - 1]) &&
- check(child)
- ) {
- me.setEnd(child, child.childNodes.length)
- }
- }
- return me
- },
-
-
-
- getCommonAncestor: function (includeSelf, ignoreTextNode) {
- var me = this,
- start = me.startContainer,
- end = me.endContainer
- if (start === end) {
- if (includeSelf && selectOneNode(this)) {
- start = start.childNodes[me.startOffset]
- if (start.nodeType == 1) return start
- }
-
- return ignoreTextNode && start.nodeType == 3
- ? start.parentNode
- : start
- }
- return domUtils.getCommonAncestor(start, end)
- },
-
-
- trimBoundary: function (ignoreEnd) {
- this.txtToElmBoundary()
- var start = this.startContainer,
- offset = this.startOffset,
- collapsed = this.collapsed,
- end = this.endContainer
- if (start.nodeType == 3) {
- if (offset == 0) {
- this.setStartBefore(start)
- } else {
- if (offset >= start.nodeValue.length) {
- this.setStartAfter(start)
- } else {
- var textNode = domUtils.split(start, offset)
-
- if (start === end) {
- this.setEnd(textNode, this.endOffset - offset)
- } else if (start.parentNode === end) {
- this.endOffset += 1
- }
- this.setStartBefore(textNode)
- }
- }
- if (collapsed) {
- return this.collapse(true)
- }
- }
- if (!ignoreEnd) {
- offset = this.endOffset
- end = this.endContainer
- if (end.nodeType == 3) {
- if (offset == 0) {
- this.setEndBefore(end)
- } else {
- offset < end.nodeValue.length && domUtils.split(end, offset)
- this.setEndAfter(end)
- }
- }
- }
- return this
- },
-
-
- txtToElmBoundary: function (ignoreCollapsed) {
- function adjust(r, c) {
- var container = r[c + 'Container'],
- offset = r[c + 'Offset']
- if (container.nodeType == 3) {
- if (!offset) {
- r[
- 'set' +
- c.replace(/(\w)/, function (a) {
- return a.toUpperCase()
- }) +
- 'Before'
- ](container)
- } else if (offset >= container.nodeValue.length) {
- r[
- 'set' +
- c.replace(/(\w)/, function (a) {
- return a.toUpperCase()
- }) +
- 'After'
- ](container)
- }
- }
- }
- if (ignoreCollapsed || !this.collapsed) {
- adjust(this, 'start')
- adjust(this, 'end')
- }
- return this
- },
-
- insertNode: function (node) {
- var first = node,
- length = 1
- if (node.nodeType == 11) {
- first = node.firstChild
- length = node.childNodes.length
- }
- this.trimBoundary(true)
- var start = this.startContainer,
- offset = this.startOffset
- var nextNode = start.childNodes[offset]
- if (nextNode) {
- start.insertBefore(node, nextNode)
- } else {
- start.appendChild(node)
- }
- if (first.parentNode === this.endContainer) {
- this.endOffset = this.endOffset + length
- }
- return this.setStartBefore(first)
- },
-
-
- setCursor: function (toEnd, noFillData) {
- return this.collapse(!toEnd).select(noFillData)
- },
-
- createBookmark: function (serialize, same) {
- var endNode,
- startNode = this.document.createElement('span')
- startNode.style.cssText = 'display:none;line-height:0px;'
- startNode.appendChild(this.document.createTextNode('\u200D'))
- startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++)
- if (!this.collapsed) {
- endNode = startNode.cloneNode(true)
- endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++)
- }
- this.insertNode(startNode)
- if (endNode) {
- this.collapse().insertNode(endNode).setEndBefore(endNode)
- }
- this.setStartAfter(startNode)
- return {
- start: serialize ? startNode.id : startNode,
- end: endNode ? (serialize ? endNode.id : endNode) : null,
- id: serialize
- }
- },
-
- moveToBookmark: function (bookmark) {
- var start = bookmark.id
- ? this.document.getElementById(bookmark.start)
- : bookmark.start,
- end =
- bookmark.end && bookmark.id
- ? this.document.getElementById(bookmark.end)
- : bookmark.end
- this.setStartBefore(start)
- domUtils.remove(start)
- if (end) {
- this.setEndBefore(end)
- domUtils.remove(end)
- } else {
- this.collapse(true)
- }
- return this
- },
-
-
- enlarge: function (toBlock, stopFn) {
- var isBody = domUtils.isBody,
- pre,
- node,
- tmp = this.document.createTextNode('')
- if (toBlock) {
- node = this.startContainer
- if (node.nodeType == 1) {
- if (node.childNodes[this.startOffset]) {
- pre = node = node.childNodes[this.startOffset]
- } else {
- node.appendChild(tmp)
- pre = node = tmp
- }
- } else {
- pre = node
- }
- while (1) {
- if (domUtils.isBlockElm(node)) {
- node = pre
- while (
- (pre = node.previousSibling) &&
- !domUtils.isBlockElm(pre)
- ) {
- node = pre
- }
- this.setStartBefore(node)
- break
- }
- pre = node
- node = node.parentNode
- }
- node = this.endContainer
- if (node.nodeType == 1) {
- if ((pre = node.childNodes[this.endOffset])) {
- node.insertBefore(tmp, pre)
- } else {
- node.appendChild(tmp)
- }
- pre = node = tmp
- } else {
- pre = node
- }
- while (1) {
- if (domUtils.isBlockElm(node)) {
- node = pre
- while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) {
- node = pre
- }
- this.setEndAfter(node)
- break
- }
- pre = node
- node = node.parentNode
- }
- if (tmp.parentNode === this.endContainer) {
- this.endOffset--
- }
- domUtils.remove(tmp)
- }
-
- if (!this.collapsed) {
- while (this.startOffset == 0) {
- if (stopFn && stopFn(this.startContainer)) {
- break
- }
- if (isBody(this.startContainer)) {
- break
- }
- this.setStartBefore(this.startContainer)
- }
- while (
- this.endOffset ==
- (this.endContainer.nodeType == 1
- ? this.endContainer.childNodes.length
- : this.endContainer.nodeValue.length)
- ) {
- if (stopFn && stopFn(this.endContainer)) {
- break
- }
- if (isBody(this.endContainer)) {
- break
- }
- this.setEndAfter(this.endContainer)
- }
- }
- return this
- },
- enlargeToBlockElm: function (ignoreEnd) {
- while (!domUtils.isBlockElm(this.startContainer)) {
- this.setStartBefore(this.startContainer)
- }
- if (!ignoreEnd) {
- while (!domUtils.isBlockElm(this.endContainer)) {
- this.setEndAfter(this.endContainer)
- }
- }
- return this
- },
-
- adjustmentBoundary: function () {
- if (!this.collapsed) {
- while (
- !domUtils.isBody(this.startContainer) &&
- this.startOffset ==
- this.startContainer[
- this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'
- ].length &&
- this.startContainer[
- this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'
- ].length
- ) {
- this.setStartAfter(this.startContainer)
- }
- while (
- !domUtils.isBody(this.endContainer) &&
- !this.endOffset &&
- this.endContainer[
- this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'
- ].length
- ) {
- this.setEndBefore(this.endContainer)
- }
- }
- return this
- },
-
-
- applyInlineStyle: function (tagName, attrs, list) {
- if (this.collapsed) return this
- this.trimBoundary()
- .enlarge(false, function (node) {
- return node.nodeType == 1 && domUtils.isBlockElm(node)
- })
- .adjustmentBoundary()
- var bookmark = this.createBookmark(),
- end = bookmark.end,
- filterFn = function (node) {
- return node.nodeType == 1
- ? node.tagName.toLowerCase() != 'br'
- : !domUtils.isWhitespace(node)
- },
- current = domUtils.getNextDomNode(bookmark.start, false, filterFn),
- node,
- pre,
- range = this.cloneRange()
- while (
- current &&
- domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING
- ) {
- if (current.nodeType == 3 || dtd[tagName][current.tagName]) {
- range.setStartBefore(current)
- node = current
- while (
- node &&
- (node.nodeType == 3 || dtd[tagName][node.tagName]) &&
- node !== end
- ) {
- pre = node
- node = domUtils.getNextDomNode(
- node,
- node.nodeType == 1,
- null,
- function (parent) {
- return dtd[tagName][parent.tagName]
- }
- )
- }
- var frag = range.setEndAfter(pre).extractContents(),
- elm
- if (list && list.length > 0) {
- var level, top
- top = level = list[0].cloneNode(false)
- for (var i = 1, ci; (ci = list[i++]); ) {
- level.appendChild(ci.cloneNode(false))
- level = level.firstChild
- }
- elm = level
- } else {
- elm = range.document.createElement(tagName)
- }
- if (attrs) {
- domUtils.setAttributes(elm, attrs)
- }
- elm.appendChild(frag)
- range.insertNode(list ? top : elm)
-
- var aNode
- if (
- tagName == 'span' &&
- attrs.style &&
- /text\-decoration/.test(attrs.style) &&
- (aNode = domUtils.findParentByTagName(elm, 'a', true))
- ) {
- domUtils.setAttributes(aNode, attrs)
- domUtils.remove(elm, true)
- elm = aNode
- } else {
- domUtils.mergeSibling(elm)
- domUtils.clearEmptySibling(elm)
- }
-
- domUtils.mergeChild(elm, attrs)
- current = domUtils.getNextDomNode(elm, false, filterFn)
- domUtils.mergeToParent(elm)
- if (node === end) {
- break
- }
- } else {
- current = domUtils.getNextDomNode(current, true, filterFn)
- }
- }
- return this.moveToBookmark(bookmark)
- },
-
-
- removeInlineStyle: function (tagNames) {
- if (this.collapsed) return this
- tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]
- this.shrinkBoundary().adjustmentBoundary()
- var start = this.startContainer,
- end = this.endContainer
- while (1) {
- if (start.nodeType == 1) {
- if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) {
- break
- }
- if (start.tagName.toLowerCase() == 'body') {
- start = null
- break
- }
- }
- start = start.parentNode
- }
- while (1) {
- if (end.nodeType == 1) {
- if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) {
- break
- }
- if (end.tagName.toLowerCase() == 'body') {
- end = null
- break
- }
- }
- end = end.parentNode
- }
- var bookmark = this.createBookmark(),
- frag,
- tmpRange
- if (start) {
- tmpRange = this.cloneRange()
- .setEndBefore(bookmark.start)
- .setStartBefore(start)
- frag = tmpRange.extractContents()
- tmpRange.insertNode(frag)
- domUtils.clearEmptySibling(start, true)
- start.parentNode.insertBefore(bookmark.start, start)
- }
- if (end) {
- tmpRange = this.cloneRange()
- .setStartAfter(bookmark.end)
- .setEndAfter(end)
- frag = tmpRange.extractContents()
- tmpRange.insertNode(frag)
- domUtils.clearEmptySibling(end, false, true)
- end.parentNode.insertBefore(bookmark.end, end.nextSibling)
- }
- var current = domUtils.getNextDomNode(
- bookmark.start,
- false,
- function (node) {
- return node.nodeType == 1
- }
- ),
- next
- while (current && current !== bookmark.end) {
- next = domUtils.getNextDomNode(current, true, function (node) {
- return node.nodeType == 1
- })
- if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) {
- domUtils.remove(current, true)
- }
- current = next
- }
- return this.moveToBookmark(bookmark)
- },
-
- getClosedNode: function () {
- var node
- if (!this.collapsed) {
- var range = this.cloneRange().adjustmentBoundary().shrinkBoundary()
- if (selectOneNode(range)) {
- var child = range.startContainer.childNodes[range.startOffset]
- if (
- child &&
- child.nodeType == 1 &&
- (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])
- ) {
- node = child
- }
- }
- }
- return node
- },
-
-
- select: browser.ie
- ? function (noFillData, textRange) {
- var nativeRange
- if (!this.collapsed) this.shrinkBoundary()
- var node = this.getClosedNode()
- if (node && !textRange) {
- try {
- nativeRange = this.document.body.createControlRange()
- nativeRange.addElement(node)
- nativeRange.select()
- } catch (e) {}
- return this
- }
- var bookmark = this.createBookmark(),
- start = bookmark.start,
- end
- nativeRange = this.document.body.createTextRange()
- nativeRange.moveToElementText(start)
- nativeRange.moveStart('character', 1)
- if (!this.collapsed) {
- var nativeRangeEnd = this.document.body.createTextRange()
- end = bookmark.end
- nativeRangeEnd.moveToElementText(end)
- nativeRange.setEndPoint('EndToEnd', nativeRangeEnd)
- } else {
- if (!noFillData && this.startContainer.nodeType != 3) {
-
- var tmpText = this.document.createTextNode(fillChar),
- tmp = this.document.createElement('span')
- tmp.appendChild(this.document.createTextNode(fillChar))
- start.parentNode.insertBefore(tmp, start)
- start.parentNode.insertBefore(tmpText, start)
-
- removeFillData(this.document, tmpText)
- fillData = tmpText
- mergeSibling(tmp, 'previousSibling')
- mergeSibling(start, 'nextSibling')
- nativeRange.moveStart('character', -1)
- nativeRange.collapse(true)
- }
- }
- this.moveToBookmark(bookmark)
- tmp && domUtils.remove(tmp)
-
- try {
- nativeRange.select()
- } catch (e) {}
- return this
- }
- : function (notInsertFillData) {
- function checkOffset(rng) {
- function check(node, offset, dir) {
- if (node.nodeType == 3 && node.nodeValue.length < offset) {
- rng[dir + 'Offset'] = node.nodeValue.length
- }
- }
- check(rng.startContainer, rng.startOffset, 'start')
- check(rng.endContainer, rng.endOffset, 'end')
- }
- var win = domUtils.getWindow(this.document),
- sel = win.getSelection(),
- txtNode
-
-
- browser.gecko ? this.document.body.focus() : win.focus()
- if (sel) {
- sel.removeAllRanges()
-
-
- if (this.collapsed && !notInsertFillData) {
-
-
-
-
-
-
-
-
-
-
-
- var start = this.startContainer,
- child = start
- if (start.nodeType == 1) {
- child = start.childNodes[this.startOffset]
- }
- if (
- !(start.nodeType == 3 && this.startOffset) &&
- (child
- ? !child.previousSibling ||
- child.previousSibling.nodeType != 3
- : !start.lastChild || start.lastChild.nodeType != 3)
- ) {
- txtNode = this.document.createTextNode(fillChar)
-
- this.insertNode(txtNode)
- removeFillData(this.document, txtNode)
- mergeSibling(txtNode, 'previousSibling')
- mergeSibling(txtNode, 'nextSibling')
- fillData = txtNode
- this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true)
- }
- }
- var nativeRange = this.document.createRange()
- if (
- this.collapsed &&
- browser.opera &&
- this.startContainer.nodeType == 1
- ) {
- var child = this.startContainer.childNodes[this.startOffset]
- if (!child) {
-
- child = this.startContainer.lastChild
- if (child && domUtils.isBr(child)) {
- this.setStartBefore(child).collapse(true)
- }
- } else {
-
- while (child && domUtils.isBlockElm(child)) {
- if (child.nodeType == 1 && child.childNodes[0]) {
- child = child.childNodes[0]
- } else {
- break
- }
- }
- child && this.setStartBefore(child).collapse(true)
- }
- }
-
- checkOffset(this)
- nativeRange.setStart(this.startContainer, this.startOffset)
- nativeRange.setEnd(this.endContainer, this.endOffset)
- sel.addRange(nativeRange)
- }
- return this
- },
-
-
- scrollToView: function (win, offset) {
- win = win ? window : domUtils.getWindow(this.document)
- var me = this,
- span = me.document.createElement('span')
-
- span.innerHTML = ' '
- me.cloneRange().insertNode(span)
- domUtils.scrollToView(span, win, offset)
- domUtils.remove(span)
- return me
- },
-
- inFillChar: function () {
- var start = this.startContainer
- if (
- this.collapsed &&
- start.nodeType == 3 &&
- start.nodeValue.replace(new RegExp('^' + domUtils.fillChar), '')
- .length +
- 1 ==
- start.nodeValue.length
- ) {
- return true
- }
- return false
- },
-
- createAddress: function (ignoreEnd, ignoreTxt) {
- var addr = {},
- me = this
- function getAddress(isStart) {
- var node = isStart ? me.startContainer : me.endContainer
- var parents = domUtils.findParents(node, true, function (node) {
- return !domUtils.isBody(node)
- }),
- addrs = []
- for (var i = 0, ci; (ci = parents[i++]); ) {
- addrs.push(domUtils.getNodeIndex(ci, ignoreTxt))
- }
- var firstIndex = 0
- if (ignoreTxt) {
- if (node.nodeType == 3) {
- var tmpNode = node.previousSibling
- while (tmpNode && tmpNode.nodeType == 3) {
- firstIndex += tmpNode.nodeValue.replace(fillCharReg, '').length
- tmpNode = tmpNode.previousSibling
- }
- firstIndex += isStart ? me.startOffset : me.endOffset
- } else {
- node = node.childNodes[isStart ? me.startOffset : me.endOffset]
- if (node) {
- firstIndex = domUtils.getNodeIndex(node, ignoreTxt)
- } else {
- node = isStart ? me.startContainer : me.endContainer
- var first = node.firstChild
- while (first) {
- if (domUtils.isFillChar(first)) {
- first = first.nextSibling
- continue
- }
- firstIndex++
- if (first.nodeType == 3) {
- while (first && first.nodeType == 3) {
- first = first.nextSibling
- }
- } else {
- first = first.nextSibling
- }
- }
- }
- }
- } else {
- firstIndex = isStart
- ? domUtils.isFillChar(node)
- ? 0
- : me.startOffset
- : me.endOffset
- }
- if (firstIndex < 0) {
- firstIndex = 0
- }
- addrs.push(firstIndex)
- return addrs
- }
- addr.startAddress = getAddress(true)
- if (!ignoreEnd) {
- addr.endAddress = me.collapsed
- ? [].concat(addr.startAddress)
- : getAddress()
- }
- return addr
- },
-
- moveToAddress: function (addr, ignoreEnd) {
- var me = this
- function getNode(address, isStart) {
- var tmpNode = me.document.body,
- parentNode,
- offset
- for (var i = 0, ci, l = address.length; i < l; i++) {
- ci = address[i]
- parentNode = tmpNode
- tmpNode = tmpNode.childNodes[ci]
- if (!tmpNode) {
- offset = ci
- break
- }
- }
- if (isStart) {
- if (tmpNode) {
- me.setStartBefore(tmpNode)
- } else {
- me.setStart(parentNode, offset)
- }
- } else {
- if (tmpNode) {
- me.setEndBefore(tmpNode)
- } else {
- me.setEnd(parentNode, offset)
- }
- }
- }
- getNode(addr.startAddress, true)
- !ignoreEnd && addr.endAddress && getNode(addr.endAddress)
- return me
- },
-
- equals: function (rng) {
- for (var p in this) {
- if (this.hasOwnProperty(p)) {
- if (this[p] !== rng[p]) return false
- }
- }
- return true
- },
-
-
- traversal: function (doFn, filterFn) {
- if (this.collapsed) return this
- var bookmark = this.createBookmark(),
- end = bookmark.end,
- current = domUtils.getNextDomNode(bookmark.start, false, filterFn)
- while (
- current &&
- current !== end &&
- domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING
- ) {
- var tmpNode = domUtils.getNextDomNode(current, false, filterFn)
- doFn(current)
- current = tmpNode
- }
- return this.moveToBookmark(bookmark)
- }
- }
- })()
-
-
-
- ;(function () {
- function getBoundaryInformation(range, start) {
- var getIndex = domUtils.getNodeIndex
- range = range.duplicate()
- range.collapse(start)
- var parent = range.parentElement()
-
- if (!parent.hasChildNodes()) {
- return { container: parent, offset: 0 }
- }
- var siblings = parent.children,
- child,
- testRange = range.duplicate(),
- startIndex = 0,
- endIndex = siblings.length - 1,
- index = -1,
- distance
- while (startIndex <= endIndex) {
- index = Math.floor((startIndex + endIndex) / 2)
- child = siblings[index]
- testRange.moveToElementText(child)
- var position = testRange.compareEndPoints('StartToStart', range)
- if (position > 0) {
- endIndex = index - 1
- } else if (position < 0) {
- startIndex = index + 1
- } else {
-
- return { container: parent, offset: getIndex(child) }
- }
- }
- if (index == -1) {
- testRange.moveToElementText(parent)
- testRange.setEndPoint('StartToStart', range)
- distance = testRange.text.replace(/(\r\n|\r)/g, '\n').length
- siblings = parent.childNodes
- if (!distance) {
- child = siblings[siblings.length - 1]
- return { container: child, offset: child.nodeValue.length }
- }
- var i = siblings.length
- while (distance > 0) {
- distance -= siblings[--i].nodeValue.length
- }
- return { container: siblings[i], offset: -distance }
- }
- testRange.collapse(position > 0)
- testRange.setEndPoint(position > 0 ? 'StartToStart' : 'EndToStart', range)
- distance = testRange.text.replace(/(\r\n|\r)/g, '\n').length
- if (!distance) {
- return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName]
- ? {
- container: parent,
- offset: getIndex(child) + (position > 0 ? 0 : 1)
- }
- : {
- container: child,
- offset: position > 0 ? 0 : child.childNodes.length
- }
- }
- while (distance > 0) {
- try {
- var pre = child
- child = child[position > 0 ? 'previousSibling' : 'nextSibling']
- distance -= child.nodeValue.length
- } catch (e) {
- return { container: parent, offset: getIndex(pre) }
- }
- }
- return {
- container: child,
- offset: position > 0 ? -distance : child.nodeValue.length + distance
- }
- }
-
- function transformIERangeToRange(ieRange, range) {
- if (ieRange.item) {
- range.selectNode(ieRange.item(0))
- } else {
- var bi = getBoundaryInformation(ieRange, true)
- range.setStart(bi.container, bi.offset)
- if (ieRange.compareEndPoints('StartToEnd', ieRange) != 0) {
- bi = getBoundaryInformation(ieRange, false)
- range.setEnd(bi.container, bi.offset)
- }
- }
- return range
- }
-
- function _getIERange(sel) {
- var ieRange
-
- try {
- ieRange = sel.getNative().createRange()
- } catch (e) {
- return null
- }
- var el = ieRange.item ? ieRange.item(0) : ieRange.parentElement()
- if ((el.ownerDocument || el) === sel.document) {
- return ieRange
- }
- return null
- }
- var Selection = (dom.Selection = function (doc) {
- var me = this,
- iframe
- me.document = doc
- if (browser.ie9below) {
- iframe = domUtils.getWindow(doc).frameElement
- domUtils.on(iframe, 'beforedeactivate', function () {
- me._bakIERange = me.getIERange()
- })
- domUtils.on(iframe, 'activate', function () {
- try {
- if (!_getIERange(me) && me._bakIERange) {
- me._bakIERange.select()
- }
- } catch (ex) {}
- me._bakIERange = null
- })
- }
- iframe = doc = null
- })
- Selection.prototype = {
- rangeInBody: function (rng, txtRange) {
- var node =
- browser.ie9below || txtRange
- ? rng.item
- ? rng.item()
- : rng.parentElement()
- : rng.startContainer
- return (
- node === this.document.body || domUtils.inDoc(node, this.document)
- )
- },
-
- getNative: function () {
- var doc = this.document
- try {
- return !doc
- ? null
- : browser.ie9below
- ? doc.selection
- : domUtils.getWindow(doc).getSelection()
- } catch (e) {
- return null
- }
- },
-
- getIERange: function () {
- var ieRange = _getIERange(this)
- if (!ieRange) {
- if (this._bakIERange) {
- return this._bakIERange
- }
- }
- return ieRange
- },
-
- cache: function () {
- this.clear()
- this._cachedRange = this.getRange()
- this._cachedStartElement = this.getStart()
- this._cachedStartElementPath = this.getStartElementPath()
- },
-
- getStartElementPath: function () {
- if (this._cachedStartElementPath) {
- return this._cachedStartElementPath
- }
- var start = this.getStart()
- if (start) {
- return domUtils.findParents(start, true, null, true)
- }
- return []
- },
-
- clear: function () {
- this._cachedStartElementPath =
- this._cachedRange =
- this._cachedStartElement =
- null
- },
-
- isFocus: function () {
- try {
- if (browser.ie9below) {
- var nativeRange = _getIERange(this)
- return !!(nativeRange && this.rangeInBody(nativeRange))
- } else {
- return !!this.getNative().rangeCount
- }
- } catch (e) {
- return false
- }
- },
-
- getRange: function () {
- var me = this
- function optimze(range) {
- var child = me.document.body.firstChild,
- collapsed = range.collapsed
- while (child && child.firstChild) {
- range.setStart(child, 0)
- child = child.firstChild
- }
- if (!range.startContainer) {
- range.setStart(me.document.body, 0)
- }
- if (collapsed) {
- range.collapse(true)
- }
- }
- if (me._cachedRange != null) {
- return this._cachedRange
- }
- var range = new baidu.editor.dom.Range(me.document)
- if (browser.ie9below) {
- var nativeRange = me.getIERange()
- if (nativeRange) {
-
- try {
- transformIERangeToRange(nativeRange, range)
- } catch (e) {
- optimze(range)
- }
- } else {
- optimze(range)
- }
- } else {
- var sel = me.getNative()
- if (sel && sel.rangeCount) {
- var firstRange = sel.getRangeAt(0)
- var lastRange = sel.getRangeAt(sel.rangeCount - 1)
- range
- .setStart(firstRange.startContainer, firstRange.startOffset)
- .setEnd(lastRange.endContainer, lastRange.endOffset)
- if (
- range.collapsed &&
- domUtils.isBody(range.startContainer) &&
- !range.startOffset
- ) {
- optimze(range)
- }
- } else {
-
- if (
- this._bakRange &&
- domUtils.inDoc(this._bakRange.startContainer, this.document)
- ) {
- return this._bakRange
- }
- optimze(range)
- }
- }
- return (this._bakRange = range)
- },
-
- getStart: function () {
- if (this._cachedStartElement) {
- return this._cachedStartElement
- }
- var range = browser.ie9below ? this.getIERange() : this.getRange(),
- tmpRange,
- start,
- tmp,
- parent
- if (browser.ie9below) {
- if (!range) {
-
- return this.document.body.firstChild
- }
-
- if (range.item) {
- return range.item(0)
- }
- tmpRange = range.duplicate()
-
- tmpRange.text.length > 0 && tmpRange.moveStart('character', 1)
- tmpRange.collapse(1)
- start = tmpRange.parentElement()
- parent = tmp = range.parentElement()
- while ((tmp = tmp.parentNode)) {
- if (tmp == start) {
- start = parent
- break
- }
- }
- } else {
- range.shrinkBoundary()
- start = range.startContainer
- if (start.nodeType == 1 && start.hasChildNodes()) {
- start =
- start.childNodes[
- Math.min(start.childNodes.length - 1, range.startOffset)
- ]
- }
- if (start.nodeType == 3) {
- return start.parentNode
- }
- }
- return start
- },
-
- getText: function () {
- var nativeSel, nativeRange
- if (this.isFocus() && (nativeSel = this.getNative())) {
- nativeRange = browser.ie9below
- ? nativeSel.createRange()
- : nativeSel.getRangeAt(0)
- return browser.ie9below ? nativeRange.text : nativeRange.toString()
- }
- return ''
- },
-
- clearRange: function () {
- this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']()
- }
- }
- })()
-
-
-
-
- ;(function () {
- var uid = 0,
- _selectionChangeTimer
-
- function setValue(form, editor) {
- var textarea
- if (editor.textarea) {
- if (utils.isString(editor.textarea)) {
- for (
- var i = 0,
- ti,
- tis = domUtils.getElementsByTagName(form, 'textarea');
- (ti = tis[i++]);
- ) {
- if (ti.id == 'ueditor_textarea_' + editor.options.textarea) {
- textarea = ti
- break
- }
- }
- } else {
- textarea = editor.textarea
- }
- }
- if (!textarea) {
- form.appendChild(
- (textarea = domUtils.createElement(document, 'textarea', {
- name: editor.options.textarea,
- id: 'ueditor_textarea_' + editor.options.textarea,
- style: 'display:none'
- }))
- )
-
- editor.textarea = textarea
- }
- !textarea.getAttribute('name') &&
- textarea.setAttribute('name', editor.options.textarea)
- textarea.value = editor.hasContents()
- ? editor.options.allHtmlEnabled
- ? editor.getAllHtml()
- : editor.getContent(null, null, true)
- : ''
- }
- function loadPlugins(me) {
-
- for (var pi in UE.plugins) {
- UE.plugins[pi].call(me)
- }
- }
- function checkCurLang(I18N) {
- for (var lang in I18N) {
- return lang
- }
- }
- function langReadied(me) {
- me.langIsReady = true
- me.fireEvent('langReady')
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var Editor = (UE.Editor = function (options) {
- var me = this
- me.uid = uid++
- EventBase.call(me)
- me.commands = {}
- me.options = utils.extend(
- utils.clone(options || {}),
- UEDITOR_CONFIG,
- true
- )
- me.shortcutkeys = {}
- me.inputRules = []
- me.outputRules = []
-
- me.setOpt(Editor.defaultOptions(me))
-
- me.loadServerConfig()
- if (!utils.isEmptyObject(UE.I18N)) {
-
- me.options.lang = checkCurLang(UE.I18N)
- UE.plugin.load(me)
- langReadied(me)
- } else {
- utils.loadFile(
- document,
- {
- src:
- me.options.langPath +
- me.options.lang +
- '/' +
- me.options.lang +
- '.js',
- tag: 'script',
- type: 'text/javascript',
- defer: 'defer'
- },
- function () {
- UE.plugin.load(me)
- langReadied(me)
- }
- )
- }
- UE.instants['ueditorInstant' + me.uid] = me
- })
- Editor.prototype = {
- registerCommand: function (name, obj) {
- this.commands[name] = obj
- },
-
- ready: function (fn) {
- var me = this
- if (fn) {
- me.isReady ? fn.apply(me) : me.addListener('ready', fn)
- }
- },
-
-
- setOpt: function (key, val) {
- var obj = {}
- if (utils.isString(key)) {
- obj[key] = val
- } else {
- obj = key
- }
- utils.extend(this.options, obj, true)
- },
- getOpt: function (key) {
- return this.options[key]
- },
-
- destroy: function () {
- var me = this
- me.fireEvent('destroy')
- var container = me.container.parentNode
- var textarea = me.textarea
- if (!textarea) {
- textarea = document.createElement('textarea')
- container.parentNode.insertBefore(textarea, container)
- } else {
- textarea.style.display = ''
- }
- textarea.style.width = me.iframe.offsetWidth + 'px'
- textarea.style.height = me.iframe.offsetHeight + 'px'
- textarea.value = me.getContent()
- textarea.id = me.key
- container.innerHTML = ''
- domUtils.remove(container)
- var key = me.key
-
- for (var p in me) {
- if (me.hasOwnProperty(p)) {
- delete this[p]
- }
- }
- UE.delEditor(key)
- },
-
-
- render: function (container) {
- var me = this,
- options = me.options,
- getStyleValue = function (attr) {
- return parseInt(domUtils.getComputedStyle(container, attr))
- }
- if (utils.isString(container)) {
- container = document.getElementById(container)
- }
- if (container) {
- if (options.initialFrameWidth) {
- options.minFrameWidth = options.initialFrameWidth
- } else {
- options.minFrameWidth = options.initialFrameWidth =
- container.offsetWidth
- }
- if (options.initialFrameHeight) {
- options.minFrameHeight = options.initialFrameHeight
- } else {
- options.initialFrameHeight = options.minFrameHeight =
- container.offsetHeight
- }
- container.style.width = /%$/.test(options.initialFrameWidth)
- ? '100%'
- : options.initialFrameWidth -
- getStyleValue('padding-left') -
- getStyleValue('padding-right') +
- 'px'
- container.style.height = /%$/.test(options.initialFrameHeight)
- ? '100%'
- : options.initialFrameHeight -
- getStyleValue('padding-top') -
- getStyleValue('padding-bottom') +
- 'px'
- container.style.zIndex = options.zIndex
- var html =
- (ie && browser.version < 9 ? '' : '<!DOCTYPE html>') +
- "<html xmlns='http://www.w3.org/1999/xhtml' class='view' ><head>" +
- "<style type='text/css'>" +
-
- '.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\n' +
-
-
- 'body{margin:8px;font-family:sans-serif;font-size:16px;}' +
-
- 'p{margin:5px 0;}</style>' +
- (options.iframeCssUrl
- ? "<link rel='stylesheet' type='text/css' href='" +
- utils.unhtml(options.iframeCssUrl) +
- "'/>"
- : '') +
- (options.initialStyle
- ? '<style>' + options.initialStyle + '</style>'
- : '') +
- "</head><body class='view' ></body>" +
- "<script type='text/javascript' " +
- (ie ? "defer='defer'" : '') +
- " id='_initialScript'>" +
- "setTimeout(function(){editor = window.parent.UE.instants['ueditorInstant" +
- me.uid +
- "'];editor._setup(document);},0);" +
- "var _tmpScript = document.getElementById('_initialScript');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>"
- container.appendChild(
- domUtils.createElement(document, 'iframe', {
- id: 'ueditor_' + me.uid,
- width: '100%',
- height: '100%',
- frameborder: '0',
-
-
- src:
- 'javascript:void(function(){document.open();' +
- (options.customDomain && document.domain != location.hostname
- ? 'document.domain="' + document.domain + '";'
- : '') +
- 'document.write("' +
- html +
- '");document.close();}())'
- })
- )
- container.style.overflow = 'hidden'
-
- setTimeout(function () {
- if (/%$/.test(options.initialFrameWidth)) {
- options.minFrameWidth = options.initialFrameWidth =
- container.offsetWidth
-
-
- }
- if (/%$/.test(options.initialFrameHeight)) {
- options.minFrameHeight = options.initialFrameHeight =
- container.offsetHeight
- container.style.height = options.initialFrameHeight + 'px'
- }
- })
- }
- },
-
- _setup: function (doc) {
- var me = this,
- options = me.options
- if (ie) {
- doc.body.disabled = true
- doc.body.contentEditable = true
- doc.body.disabled = false
- } else {
- doc.body.contentEditable = true
- }
- doc.body.spellcheck = false
- me.document = doc
- me.window = doc.defaultView || doc.parentWindow
- me.iframe = me.window.frameElement
- me.body = doc.body
- me.selection = new dom.Selection(doc)
-
- var geckoSel
- if (browser.gecko && (geckoSel = this.selection.getNative())) {
- geckoSel.removeAllRanges()
- }
- this._initEvents()
-
- for (
- var form = this.iframe.parentNode;
- !domUtils.isBody(form);
- form = form.parentNode
- ) {
- if (form.tagName == 'FORM') {
- me.form = form
- if (me.options.autoSyncData) {
- domUtils.on(me.window, 'blur', function () {
- setValue(form, me)
- })
- } else {
- domUtils.on(form, 'submit', function () {
- setValue(this, me)
- })
- }
- break
- }
- }
- if (options.initialContent) {
- if (options.autoClearinitialContent) {
- var oldExecCommand = me.execCommand
- me.execCommand = function () {
- me.fireEvent('firstBeforeExecCommand')
- return oldExecCommand.apply(me, arguments)
- }
- this._setDefaultContent(options.initialContent)
- } else this.setContent(options.initialContent, false, true)
- }
-
- if (domUtils.isEmptyNode(me.body)) {
- me.body.innerHTML = '<p>' + (browser.ie ? '' : '<br/>') + '</p>'
- }
-
- if (options.focus) {
- setTimeout(function () {
- me.focus(me.options.focusInEnd)
-
- !me.options.autoClearinitialContent && me._selectionChange()
- }, 0)
- }
- if (!me.container) {
- me.container = this.iframe.parentNode
- }
- if (options.fullscreen && me.ui) {
- me.ui.setFullScreen(true)
- }
- try {
- me.document.execCommand('2D-position', false, false)
- } catch (e) {}
- try {
- me.document.execCommand('enableInlineTableEditing', false, false)
- } catch (e) {}
- try {
- me.document.execCommand('enableObjectResizing', false, false)
- } catch (e) {}
-
- me._bindshortcutKeys()
- me.isReady = 1
- me.fireEvent('ready')
- options.onready && options.onready.call(me)
- if (!browser.ie9below) {
- domUtils.on(me.window, ['blur', 'focus'], function (e) {
-
- if (e.type == 'blur') {
- me._bakRange = me.selection.getRange()
- try {
- me._bakNativeRange = me.selection.getNative().getRangeAt(0)
- me.selection.getNative().removeAllRanges()
- } catch (e) {
- me._bakNativeRange = null
- }
- } else {
- try {
- me._bakRange && me._bakRange.select()
- } catch (e) {}
- }
- })
- }
-
- if (browser.gecko && browser.version <= 10902) {
-
- me.body.contentEditable = false
- setTimeout(function () {
- me.body.contentEditable = true
- }, 100)
- setInterval(function () {
- me.body.style.height = me.iframe.offsetHeight - 20 + 'px'
- }, 100)
- }
- !options.isShow && me.setHide()
- options.readonly && me.setDisabled()
- },
-
-
- sync: function (formId) {
- var me = this,
- form = formId
- ? document.getElementById(formId)
- : domUtils.findParent(
- me.iframe.parentNode,
- function (node) {
- return node.tagName == 'FORM'
- },
- true
- )
- form && setValue(form, me)
- },
-
- setHeight: function (height, notSetHeight) {
- if (height !== parseInt(this.iframe.parentNode.style.height)) {
- this.iframe.parentNode.style.height = height + 'px'
- }
- !notSetHeight &&
- (this.options.minFrameHeight = this.options.initialFrameHeight =
- height)
- this.body.style.height = height + 'px'
- !notSetHeight && this.trigger('setHeight')
- },
-
-
- addshortcutkey: function (cmd, keys) {
- var obj = {}
- if (keys) {
- obj[cmd] = keys
- } else {
- obj = cmd
- }
- utils.extend(this.shortcutkeys, obj)
- },
-
- _bindshortcutKeys: function () {
- var me = this,
- shortcutkeys = this.shortcutkeys
- me.addListener('keydown', function (type, e) {
- var keyCode = e.keyCode || e.which
- for (var i in shortcutkeys) {
- var tmp = shortcutkeys[i].split(',')
- for (var t = 0, ti; (ti = tmp[t++]); ) {
- ti = ti.split(':')
- var key = ti[0],
- param = ti[1]
- if (
- /^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) ||
- /^(\d+)$/.test(key)
- ) {
- if (
- ((RegExp.$1 == 'ctrl' ? e.ctrlKey || e.metaKey : 0) &&
- (RegExp.$2 != '' ? e[RegExp.$2.slice(1) + 'Key'] : 1) &&
- keyCode == RegExp.$3) ||
- keyCode == RegExp.$1
- ) {
- if (me.queryCommandState(i, param) != -1)
- me.execCommand(i, param)
- domUtils.preventDefault(e)
- }
- }
- }
- }
- })
- },
-
-
- getContent: function (cmd, fn, notSetCursor, ignoreBlank, formatter) {
- var me = this
- if (cmd && utils.isFunction(cmd)) {
- fn = cmd
- cmd = ''
- }
- if (fn ? !fn() : !this.hasContents()) {
- return ''
- }
- me.fireEvent('beforegetcontent')
- var root = UE.htmlparser(me.body.innerHTML, ignoreBlank)
- me.filterOutputRule(root)
- me.fireEvent('aftergetcontent', cmd, root)
- return root.toHtml(formatter)
- },
-
- getAllHtml: function () {
- var me = this,
- headHtml = [],
- html = ''
- me.fireEvent('getAllHtml', headHtml)
- if (browser.ie && browser.version > 8) {
- var headHtmlForIE9 = ''
- utils.each(me.document.styleSheets, function (si) {
- headHtmlForIE9 += si.href
- ? '<link rel="stylesheet" type="text/css" href="' +
- si.href +
- '" />'
- : '<style>' + si.cssText + '</style>'
- })
- utils.each(me.document.getElementsByTagName('script'), function (si) {
- headHtmlForIE9 += si.outerHTML
- })
- }
- return (
- '<html><head>' +
- (me.options.charset
- ? '<meta http-equiv="Content-Type" content="text/html; charset=' +
- me.options.charset +
- '"/>'
- : '') +
- (headHtmlForIE9 ||
- me.document.getElementsByTagName('head')[0].innerHTML) +
- headHtml.join('\n') +
- '</head>' +
- '<body ' +
- (ie && browser.version < 9 ? 'class="view"' : '') +
- '>' +
- me.getContent(null, null, true) +
- '</body></html>'
- )
- },
-
- getPlainTxt: function () {
- var reg = new RegExp(domUtils.fillChar, 'g'),
- html = this.body.innerHTML.replace(/[\n\r]/g, '')
- html = html
- .replace(/<(p|div)[^>]*>(<br\/?>| )<\/\1>/gi, '\n')
- .replace(/<br\/?>/gi, '\n')
- .replace(/<[^>/]+>/g, '')
- .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) {
- return dtd.$block[c] ? '\n' : b ? b : ''
- })
-
- return html
- .replace(reg, '')
- .replace(/\u00a0/g, ' ')
- .replace(/ /g, ' ')
- },
-
- getContentTxt: function () {
- var reg = new RegExp(domUtils.fillChar, 'g')
-
- return this.body[browser.ie ? 'innerText' : 'textContent']
- .replace(reg, '')
- .replace(/\u00a0/g, ' ')
- },
-
-
- setContent: function (html, isAppendTo, notFireSelectionchange) {
- var me = this
- me.fireEvent('beforesetcontent', html)
- var root = UE.htmlparser(html)
- me.filterInputRule(root)
- html = root.toHtml()
- me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html
- function isCdataDiv(node) {
- return node.tagName == 'DIV' && node.getAttribute('cdata_tag')
- }
-
- if (me.options.enterTag == 'p') {
- var child = this.body.firstChild,
- tmpNode
- if (
- !child ||
- (child.nodeType == 1 &&
- (dtd.$cdata[child.tagName] ||
- isCdataDiv(child) ||
- domUtils.isCustomeNode(child)) &&
- child === this.body.lastChild)
- ) {
- this.body.innerHTML =
- '<p>' +
- (browser.ie ? ' ' : '<br/>') +
- '</p>' +
- this.body.innerHTML
- } else {
- var p = me.document.createElement('p')
- while (child) {
- while (
- child &&
- (child.nodeType == 3 ||
- (child.nodeType == 1 &&
- dtd.p[child.tagName] &&
- !dtd.$cdata[child.tagName]))
- ) {
- tmpNode = child.nextSibling
- p.appendChild(child)
- child = tmpNode
- }
- if (p.firstChild) {
- if (!child) {
- me.body.appendChild(p)
- break
- } else {
- child.parentNode.insertBefore(p, child)
- p = me.document.createElement('p')
- }
- }
- child = child.nextSibling
- }
- }
- }
- me.fireEvent('aftersetcontent')
- me.fireEvent('contentchange')
- !notFireSelectionchange && me._selectionChange()
-
- me._bakRange = me._bakIERange = me._bakNativeRange = null
-
- var geckoSel
- if (browser.gecko && (geckoSel = this.selection.getNative())) {
- geckoSel.removeAllRanges()
- }
- if (me.options.autoSyncData) {
- me.form && setValue(me.form, me)
- }
- },
-
-
- focus: function (toEnd) {
- try {
- var me = this,
- rng = me.selection.getRange()
- if (toEnd) {
- var node = me.body.lastChild
- if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) {
- if (domUtils.isEmptyBlock(node)) {
- rng.setStartAtFirst(node)
- } else {
- rng.setStartAtLast(node)
- }
- rng.collapse(true)
- }
- rng.setCursor(true)
- } else {
- if (
- !rng.collapsed &&
- domUtils.isBody(rng.startContainer) &&
- rng.startOffset == 0
- ) {
- var node = me.body.firstChild
- if (node && node.nodeType == 1 && !dtd.$empty[node.tagName]) {
- rng.setStartAtFirst(node).collapse(true)
- }
- }
- rng.select(true)
- }
- this.fireEvent('focus selectionchange')
- } catch (e) {}
- },
- isFocus: function () {
- return this.selection.isFocus()
- },
- blur: function () {
- var sel = this.selection.getNative()
- if (sel.empty && browser.ie) {
- var nativeRng = document.body.createTextRange()
- nativeRng.moveToElementText(document.body)
- nativeRng.collapse(true)
- nativeRng.select()
- sel.empty()
- } else {
- sel.removeAllRanges()
- }
-
- },
-
- _initEvents: function () {
- var me = this,
- doc = me.document,
- win = me.window
- me._proxyDomEvent = utils.bind(me._proxyDomEvent, me)
- domUtils.on(
- doc,
- [
- 'click',
- 'contextmenu',
- 'mousedown',
- 'keydown',
- 'keyup',
- 'keypress',
- 'mouseup',
- 'mouseover',
- 'mouseout',
- 'selectstart'
- ],
- me._proxyDomEvent
- )
- domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent)
- domUtils.on(me.body, 'drop', function (e) {
-
- if (browser.gecko && e.stopPropagation) {
- e.stopPropagation()
- }
- me.fireEvent('contentchange')
- })
- domUtils.on(doc, ['mouseup', 'keydown'], function (evt) {
-
- if (
- evt.type == 'keydown' &&
- (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)
- ) {
- return
- }
- if (evt.button == 2) return
- me._selectionChange(250, evt)
- })
- },
-
- _proxyDomEvent: function (evt) {
- if (
- this.fireEvent(
- 'before' + evt.type.replace(/^on/, '').toLowerCase()
- ) === false
- ) {
- return false
- }
- if (this.fireEvent(evt.type.replace(/^on/, ''), evt) === false) {
- return false
- }
- return this.fireEvent(
- 'after' + evt.type.replace(/^on/, '').toLowerCase()
- )
- },
-
- _selectionChange: function (delay, evt) {
- var me = this
-
-
-
-
- var hackForMouseUp = false
- var mouseX, mouseY
- if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') {
- var range = this.selection.getRange()
- if (!range.collapsed) {
- hackForMouseUp = true
- mouseX = evt.clientX
- mouseY = evt.clientY
- }
- }
- clearTimeout(_selectionChangeTimer)
- _selectionChangeTimer = setTimeout(function () {
- if (!me.selection || !me.selection.getNative()) {
- return
- }
-
-
- var ieRange
- if (hackForMouseUp && me.selection.getNative().type == 'None') {
- ieRange = me.document.body.createTextRange()
- try {
- ieRange.moveToPoint(mouseX, mouseY)
- } catch (ex) {
- ieRange = null
- }
- }
- var bakGetIERange
- if (ieRange) {
- bakGetIERange = me.selection.getIERange
- me.selection.getIERange = function () {
- return ieRange
- }
- }
- me.selection.cache()
- if (bakGetIERange) {
- me.selection.getIERange = bakGetIERange
- }
- if (me.selection._cachedRange && me.selection._cachedStartElement) {
- me.fireEvent('beforeselectionchange')
-
- me.fireEvent('selectionchange', !!evt)
- me.fireEvent('afterselectionchange')
- me.selection.clear()
- }
- }, delay || 50)
- },
-
- _callCmdFn: function (fnName, args) {
- var cmdName = args[0].toLowerCase(),
- cmd,
- cmdFn
- cmd = this.commands[cmdName] || UE.commands[cmdName]
- cmdFn = cmd && cmd[fnName]
-
- if ((!cmd || !cmdFn) && fnName == 'queryCommandState') {
- return 0
- } else if (cmdFn) {
- return cmdFn.apply(this, args)
- }
- },
-
- execCommand: function (cmdName) {
- cmdName = cmdName.toLowerCase()
- var me = this,
- result,
- cmd = me.commands[cmdName] || UE.commands[cmdName]
- if (!cmd || !cmd.execCommand) {
- return null
- }
- if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) {
- me.__hasEnterExecCommand = true
- if (me.queryCommandState.apply(me, arguments) != -1) {
- me.fireEvent('saveScene')
- me.fireEvent.apply(
- me,
- ['beforeexeccommand', cmdName].concat(arguments)
- )
- result = this._callCmdFn('execCommand', arguments)
-
-
- me.fireEvent.apply(
- me,
- ['afterexeccommand', cmdName].concat(arguments)
- )
- me.fireEvent('saveScene')
- }
- me.__hasEnterExecCommand = false
- } else {
- result = this._callCmdFn('execCommand', arguments)
- !me.__hasEnterExecCommand &&
- !cmd.ignoreContentChange &&
- !me._ignoreContentChange &&
- me.fireEvent('contentchange')
- }
- !me.__hasEnterExecCommand &&
- !cmd.ignoreContentChange &&
- !me._ignoreContentChange &&
- me._selectionChange()
- return result
- },
-
- queryCommandState: function (cmdName) {
- return this._callCmdFn('queryCommandState', arguments)
- },
-
- queryCommandValue: function (cmdName) {
- return this._callCmdFn('queryCommandValue', arguments)
- },
-
-
- hasContents: function (tags) {
- if (tags) {
- for (var i = 0, ci; (ci = tags[i++]); ) {
- if (this.document.getElementsByTagName(ci).length > 0) {
- return true
- }
- }
- }
- if (!domUtils.isEmptyBlock(this.body)) {
- return true
- }
-
- tags = ['div']
- for (i = 0; (ci = tags[i++]); ) {
- var nodes = domUtils.getElementsByTagName(this.document, ci)
- for (var n = 0, cn; (cn = nodes[n++]); ) {
- if (domUtils.isCustomeNode(cn)) {
- return true
- }
- }
- }
- return false
- },
-
- reset: function () {
- this.fireEvent('reset')
- },
-
- setEnabled: function () {
- var me = this,
- range
- if (me.body.contentEditable == 'false') {
- me.body.contentEditable = true
- range = me.selection.getRange()
-
- try {
- range.moveToBookmark(me.lastBk)
- delete me.lastBk
- } catch (e) {
- range.setStartAtFirst(me.body).collapse(true)
- }
- range.select(true)
- if (me.bkqueryCommandState) {
- me.queryCommandState = me.bkqueryCommandState
- delete me.bkqueryCommandState
- }
- if (me.bkqueryCommandValue) {
- me.queryCommandValue = me.bkqueryCommandValue
- delete me.bkqueryCommandValue
- }
- me.fireEvent('selectionchange')
- }
- },
- enable: function () {
- return this.setEnabled()
- },
-
-
-
- setDisabled: function (except) {
- var me = this
- except = except ? (utils.isArray(except) ? except : [except]) : []
- if (me.body.contentEditable == 'true') {
- if (!me.lastBk) {
- me.lastBk = me.selection.getRange().createBookmark(true)
- }
- me.body.contentEditable = false
- me.bkqueryCommandState = me.queryCommandState
- me.bkqueryCommandValue = me.queryCommandValue
- me.queryCommandState = function (type) {
- if (utils.indexOf(except, type) != -1) {
- return me.bkqueryCommandState.apply(me, arguments)
- }
- return -1
- }
- me.queryCommandValue = function (type) {
- if (utils.indexOf(except, type) != -1) {
- return me.bkqueryCommandValue.apply(me, arguments)
- }
- return null
- }
- me.fireEvent('selectionchange')
- }
- },
- disable: function (except) {
- return this.setDisabled(except)
- },
-
- _setDefaultContent: (function () {
- function clear() {
- var me = this
- if (me.document.getElementById('initContent')) {
- me.body.innerHTML = '<p>' + (ie ? '' : '<br/>') + '</p>'
- me.removeListener('firstBeforeExecCommand focus', clear)
- setTimeout(function () {
- me.focus()
- me._selectionChange()
- }, 0)
- }
- }
- return function (cont) {
- var me = this
- me.body.innerHTML = '<p id="initContent">' + cont + '</p>'
- me.addListener('firstBeforeExecCommand focus', clear)
- }
- })(),
-
- setShow: function () {
- var me = this,
- range = me.selection.getRange()
- if (me.container.style.display == 'none') {
-
- try {
- range.moveToBookmark(me.lastBk)
- delete me.lastBk
- } catch (e) {
- range.setStartAtFirst(me.body).collapse(true)
- }
-
- setTimeout(function () {
- range.select(true)
- }, 100)
- me.container.style.display = ''
- }
- },
- show: function () {
- return this.setShow()
- },
-
- setHide: function () {
- var me = this
- if (!me.lastBk) {
- me.lastBk = me.selection.getRange().createBookmark(true)
- }
- me.container.style.display = 'none'
- },
- hide: function () {
- return this.setHide()
- },
-
- getLang: function (path) {
-
- if (!this.options) {
- return ''
- }
- var lang = UE.I18N[this.options.lang]
- if (!lang) {
- throw Error('not import language file')
- }
- path = (path || '').split('.')
- for (var i = 0, ci; (ci = path[i++]); ) {
- lang = lang[ci]
- if (!lang) break
- }
- return lang
- },
-
-
- getContentLength: function (ingoneHtml, tagNames) {
- var count = this.getContent(false, false, true).length
- if (ingoneHtml) {
- tagNames = (tagNames || []).concat(['hr', 'img', 'iframe'])
- count = this.getContentTxt().replace(/[\t\r\n]+/g, '').length
- for (var i = 0, ci; (ci = tagNames[i++]); ) {
- count += this.document.getElementsByTagName(ci).length
- }
- }
- return count
- },
-
- addInputRule: function (rule) {
- this.inputRules.push(rule)
- },
-
- filterInputRule: function (root) {
- for (var i = 0, ci; (ci = this.inputRules[i++]); ) {
- ci.call(this, root)
- }
- },
-
- addOutputRule: function (rule) {
- this.outputRules.push(rule)
- },
-
- filterOutputRule: function (root) {
- for (var i = 0, ci; (ci = this.outputRules[i++]); ) {
- ci.call(this, root)
- }
- },
-
- getActionUrl: function (action) {
- var actionName = this.getOpt(action) || action,
- imageUrl = this.getOpt('imageUrl'),
- serverUrl = this.getOpt('serverUrl')
- if (!serverUrl && imageUrl) {
- serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2')
- }
- if (serverUrl) {
- serverUrl =
- serverUrl +
- (serverUrl.indexOf('?') == -1 ? '?' : '&') +
- 'action=' +
- (actionName || '')
- return utils.formatUrl(serverUrl)
- } else {
- return ''
- }
- }
- }
- utils.inherits(Editor, EventBase)
- })()
-
-
- UE.Editor.defaultOptions = function (editor) {
- var _url = editor.options.UEDITOR_HOME_URL
- return {
- isShow: true,
- initialContent: '',
- initialStyle: '',
- autoClearinitialContent: false,
- iframeCssUrl: _url + 'themes/iframe.css',
- textarea: 'editorValue',
- focus: false,
- focusInEnd: true,
- autoClearEmptyNode: true,
- fullscreen: false,
- readonly: false,
- zIndex: 999,
- imagePopup: true,
- enterTag: 'p',
- customDomain: false,
- lang: 'zh-cn',
- langPath: _url + 'lang/',
- theme: 'default',
- themePath: _url + 'themes/',
- allHtmlEnabled: false,
- scaleEnabled: false,
- tableNativeEditInFF: false,
- autoSyncData: true,
- fileNameFormat: '{time}{rand:6}'
- }
- }
-
- ;(function () {
- UE.Editor.prototype.loadServerConfig = function () {
- var me = this
- setTimeout(function () {
- try {
- me.options.imageUrl &&
- me.setOpt(
- 'serverUrl',
- me.options.imageUrl.replace(
- /^(.*[\/]).+([\.].+)$/,
- '$1controller$2'
- )
- )
- var configUrl = me.getActionUrl('config'),
- isJsonp = utils.isCrossDomainUrl(configUrl)
-
- me._serverConfigLoaded = false
- configUrl &&
- UE.ajax.request(configUrl, {
- method: 'GET',
- dataType: isJsonp ? 'jsonp' : '',
- onsuccess: function (r) {
- try {
- var config = isJsonp ? r : eval('(' + r.responseText + ')')
- utils.extend(me.options, config)
- me.fireEvent('serverConfigLoaded')
- me._serverConfigLoaded = true
- } catch (e) {
- showErrorMsg(me.getLang('loadconfigFormatError'))
- }
- },
- onerror: function () {
- showErrorMsg(me.getLang('loadconfigHttpError'))
- }
- })
- } catch (e) {
- showErrorMsg(me.getLang('loadconfigError'))
- }
- })
- function showErrorMsg(msg) {
- console && console.error(msg)
-
-
-
-
- }
- }
- UE.Editor.prototype.isServerConfigLoaded = function () {
- var me = this
- return me._serverConfigLoaded || false
- }
- UE.Editor.prototype.afterConfigReady = function (handler) {
- if (!handler || !utils.isFunction(handler)) return
- var me = this
- var readyHandler = function () {
- handler.apply(me, arguments)
- me.removeListener('serverConfigLoaded', readyHandler)
- }
- if (me.isServerConfigLoaded()) {
- handler.call(me, 'serverConfigLoaded')
- } else {
- me.addListener('serverConfigLoaded', readyHandler)
- }
- }
- })()
-
-
-
- UE.ajax = (function () {
-
- var fnStr = 'XMLHttpRequest()'
- try {
- new ActiveXObject('Msxml2.XMLHTTP')
- fnStr = "ActiveXObject('Msxml2.XMLHTTP')"
- } catch (e) {
- try {
- new ActiveXObject('Microsoft.XMLHTTP')
- fnStr = "ActiveXObject('Microsoft.XMLHTTP')"
- } catch (e) {}
- }
- var creatAjaxRequest = new Function('return new ' + fnStr)
-
- function json2str(json) {
- var strArr = []
- for (var i in json) {
-
- if (
- i == 'method' ||
- i == 'timeout' ||
- i == 'async' ||
- i == 'dataType' ||
- i == 'callback'
- )
- continue
-
- if (json[i] == undefined || json[i] == null) continue
-
- if (
- !(
- (typeof json[i]).toLowerCase() == 'function' ||
- (typeof json[i]).toLowerCase() == 'object'
- )
- ) {
- strArr.push(encodeURIComponent(i) + '=' + encodeURIComponent(json[i]))
- } else if (utils.isArray(json[i])) {
-
- for (var j = 0; j < json[i].length; j++) {
- strArr.push(
- encodeURIComponent(i) + '[]=' + encodeURIComponent(json[i][j])
- )
- }
- }
- }
- return strArr.join('&')
- }
- function doAjax(url, ajaxOptions) {
- var xhr = creatAjaxRequest(),
-
- timeIsOut = false,
-
- defaultAjaxOptions = {
- method: 'POST',
- timeout: 5000,
- async: true,
- data: {},
- onsuccess: function () {},
- onerror: function () {}
- }
- if (typeof url === 'object') {
- ajaxOptions = url
- url = ajaxOptions.url
- }
- if (!xhr || !url) return
- var ajaxOpts = ajaxOptions
- ? utils.extend(defaultAjaxOptions, ajaxOptions)
- : defaultAjaxOptions
- var submitStr = json2str(ajaxOpts)
-
- if (!utils.isEmptyObject(ajaxOpts.data)) {
- submitStr += (submitStr ? '&' : '') + json2str(ajaxOpts.data)
- }
-
- var timerID = setTimeout(function () {
- if (xhr.readyState != 4) {
- timeIsOut = true
- xhr.abort()
- clearTimeout(timerID)
- }
- }, ajaxOpts.timeout)
- var method = ajaxOpts.method.toUpperCase()
- var str =
- url +
- (url.indexOf('?') == -1 ? '?' : '&') +
- (method == 'POST' ? '' : submitStr + '&noCache=' + +new Date())
- xhr.open(method, str, ajaxOpts.async)
- xhr.onreadystatechange = function () {
- if (xhr.readyState == 4) {
- if (!timeIsOut && xhr.status == 200) {
- ajaxOpts.onsuccess(xhr)
- } else {
- ajaxOpts.onerror(xhr)
- }
- }
- }
- if (method == 'POST') {
- xhr.setRequestHeader(
- 'Content-Type',
- 'application/x-www-form-urlencoded'
- )
- xhr.send(submitStr)
- } else {
- xhr.send(null)
- }
- }
- function doJsonp(url, opts) {
- var successhandler = opts.onsuccess || function () {},
- scr = document.createElement('SCRIPT'),
- options = opts || {},
- charset = options['charset'],
- callbackField = options['jsonp'] || 'callback',
- callbackFnName,
- timeOut = options['timeOut'] || 0,
- timer,
- reg = new RegExp('(\\?|&)' + callbackField + '=([^&]*)'),
- matches
- if (utils.isFunction(successhandler)) {
- callbackFnName =
- 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36)
- window[callbackFnName] = getCallBack(0)
- } else if (utils.isString(successhandler)) {
- callbackFnName = successhandler
- } else {
- if ((matches = reg.exec(url))) {
- callbackFnName = matches[2]
- }
- }
- url = url.replace(reg, '\x241' + callbackField + '=' + callbackFnName)
- if (url.search(reg) < 0) {
- url +=
- (url.indexOf('?') < 0 ? '?' : '&') +
- callbackField +
- '=' +
- callbackFnName
- }
- var queryStr = json2str(opts)
-
- if (!utils.isEmptyObject(opts.data)) {
- queryStr += (queryStr ? '&' : '') + json2str(opts.data)
- }
- if (queryStr) {
- url = url.replace(/\?/, '?' + queryStr + '&')
- }
- scr.onerror = getCallBack(1)
- if (timeOut) {
- timer = setTimeout(getCallBack(1), timeOut)
- }
- createScriptTag(scr, url, charset)
- function createScriptTag(scr, url, charset) {
- scr.setAttribute('type', 'text/javascript')
- scr.setAttribute('defer', 'defer')
- charset && scr.setAttribute('charset', charset)
- scr.setAttribute('src', url)
- document.getElementsByTagName('head')[0].appendChild(scr)
- }
- function getCallBack(onTimeOut) {
- return function () {
- try {
- if (onTimeOut) {
- options.onerror && options.onerror()
- } else {
- try {
- clearTimeout(timer)
- successhandler.apply(window, arguments)
- } catch (e) {}
- }
- } catch (exception) {
- options.onerror && options.onerror.call(window, exception)
- } finally {
- options.oncomplete && options.oncomplete.apply(window, arguments)
- scr.parentNode && scr.parentNode.removeChild(scr)
- window[callbackFnName] = null
- try {
- delete window[callbackFnName]
- } catch (e) {}
- }
- }
- }
- }
- return {
-
-
- request: function (url, opts) {
- if (opts && opts.dataType == 'jsonp') {
- doJsonp(url, opts)
- } else {
- doAjax(url, opts)
- }
- },
- getJSONP: function (url, data, fn) {
- var opts = {
- data: data,
- oncomplete: fn
- }
- doJsonp(url, opts)
- }
- }
- })()
-
-
-
-
- var filterWord = (UE.filterWord = (function () {
-
- function isWordDocument(str) {
- return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test(
- str
- )
- }
-
- function transUnit(v) {
- v = v.replace(/[\d.]+\w+/g, function (m) {
- return utils.transUnitToPx(m)
- })
- return v
- }
- function filterPasteWord(str) {
- return (
- str
- .replace(/[\t\r\n]+/g, ' ')
- .replace(/<!--[\s\S]*?-->/gi, '')
-
- .replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi, function (str) {
-
- if (browser.opera) {
- return ''
- }
- try {
-
- if (/Bitmap/i.test(str)) {
- return ''
- }
- var width = str.match(/width:([ \d.]*p[tx])/i)[1],
- height = str.match(/height:([ \d.]*p[tx])/i)[1],
- src = str.match(/src=\s*"([^"]*)"/i)[1]
- return (
- '<img width="' +
- transUnit(width) +
- '" height="' +
- transUnit(height) +
- '" src="' +
- src +
- '" />'
- )
- } catch (e) {
- return ''
- }
- })
-
- .replace(/<\/?div[^>]*>/g, '')
-
- .replace(/v:\w+=(["']?)[^'"]+\1/g, '')
- .replace(
- /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,
- ''
- )
- .replace(
- /<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,
- '<p><strong>$1</strong></p>'
- )
-
- .replace(
- /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,
- function (str, name, marks, val) {
-
- return name == 'class' && val == 'MsoListParagraph' ? str : ''
- }
- )
-
- .replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi, function (a, b, c) {
- return c.replace(/[\t\r\n ]+/g, ' ')
- })
-
- .replace(
- /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,
- function (str, tag, tmp, style) {
- var n = [],
- s = style
- .replace(/^\s+|\s+$/, '')
- .replace(/'/g, "'")
- .replace(/"/gi, "'")
- .replace(/[\d.]+(cm|pt)/g, function (str) {
- return utils.transUnitToPx(str)
- })
- .split(/;\s*/g)
- for (var i = 0, v; (v = s[i]); i++) {
- var name,
- value,
- parts = v.split(':')
- if (parts.length == 2) {
- name = parts[0].toLowerCase()
- value = parts[1].toLowerCase()
- if (
- (/^(background)\w*/.test(name) &&
- value.replace(/(initial|\s)/g, '').length == 0) ||
- (/^(margin)\w*/.test(name) && /^0\w+$/.test(value))
- ) {
- continue
- }
- switch (name) {
- case 'mso-padding-alt':
- case 'mso-padding-top-alt':
- case 'mso-padding-right-alt':
- case 'mso-padding-bottom-alt':
- case 'mso-padding-left-alt':
- case 'mso-margin-alt':
- case 'mso-margin-top-alt':
- case 'mso-margin-right-alt':
- case 'mso-margin-bottom-alt':
- case 'mso-margin-left-alt':
-
-
- case 'mso-height':
- case 'mso-width':
- case 'mso-vertical-align-alt':
-
- if (!/<table/.test(tag))
- n[i] =
- name.replace(/^mso-|-alt$/g, '') +
- ':' +
- transUnit(value)
- continue
- case 'horiz-align':
- n[i] = 'text-align:' + value
- continue
- case 'vert-align':
- n[i] = 'vertical-align:' + value
- continue
- case 'font-color':
- case 'mso-foreground':
- n[i] = 'color:' + value
- continue
- case 'mso-background':
- case 'mso-highlight':
- n[i] = 'background:' + value
- continue
- case 'mso-default-height':
- n[i] = 'min-height:' + transUnit(value)
- continue
- case 'mso-default-width':
- n[i] = 'min-width:' + transUnit(value)
- continue
- case 'mso-padding-between-alt':
- n[i] =
- 'border-collapse:separate;border-spacing:' +
- transUnit(value)
- continue
- case 'text-line-through':
- if (value == 'single' || value == 'double') {
- n[i] = 'text-decoration:line-through'
- }
- continue
- case 'mso-zero-height':
- if (value == 'yes') {
- n[i] = 'display:none'
- }
- continue
-
-
- case 'margin':
- if (!/[1-9]/.test(value)) {
- continue
- }
- }
- if (
- /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test(
- name
- ) ||
- (/text\-indent|padding|margin/.test(name) &&
- /\-[\d.]+/.test(value))
- ) {
- continue
- }
- n[i] = name + ':' + parts[1]
- }
- }
- return (
- tag +
- (n.length
- ? ' style="' + n.join(';').replace(/;{2,}/g, ';') + '"'
- : '')
- )
- }
- )
- )
- }
- return function (html) {
- return isWordDocument(html) ? filterPasteWord(html) : html
- }
- })())
-
-
-
- ;(function () {
-
-
- var uNode = (UE.uNode = function (obj) {
- this.type = obj.type
- this.data = obj.data
- this.tagName = obj.tagName
- this.parentNode = obj.parentNode
- this.attrs = obj.attrs || {}
- this.children = obj.children
- })
- var notTransAttrs = {
- href: 1,
- src: 1,
- _src: 1,
- _href: 1,
- cdata_data: 1
- }
- var notTransTagName = {
- style: 1,
- script: 1
- }
- var indentChar = ' ',
- breakChar = '\n'
- function insertLine(arr, current, begin) {
- arr.push(breakChar)
- return current + (begin ? 1 : -1)
- }
- function insertIndent(arr, current) {
-
- for (var i = 0; i < current; i++) {
- arr.push(indentChar)
- }
- }
-
-
- uNode.createElement = function (html) {
- if (/[<>]/.test(html)) {
- return UE.htmlparser(html).children[0]
- } else {
- return new uNode({
- type: 'element',
- children: [],
- tagName: html
- })
- }
- }
- uNode.createText = function (data, noTrans) {
- return new UE.uNode({
- type: 'text',
- data: noTrans ? data : utils.unhtml(data || '')
- })
- }
- function nodeToHtml(node, arr, formatter, current) {
- switch (node.type) {
- case 'root':
- for (var i = 0, ci; (ci = node.children[i++]); ) {
-
- if (
- formatter &&
- ci.type == 'element' &&
- !dtd.$inlineWithA[ci.tagName] &&
- i > 1
- ) {
- insertLine(arr, current, true)
- insertIndent(arr, current)
- }
- nodeToHtml(ci, arr, formatter, current)
- }
- break
- case 'text':
- isText(node, arr)
- break
- case 'element':
- isElement(node, arr, formatter, current)
- break
- case 'comment':
- isComment(node, arr, formatter)
- }
- return arr
- }
- function isText(node, arr) {
- if (node.parentNode.tagName == 'pre') {
-
- arr.push(node.data)
- } else {
- arr.push(
- notTransTagName[node.parentNode.tagName]
- ? utils.html(node.data)
- : node.data.replace(/[ ]{2}/g, ' ')
- )
- }
- }
- function isElement(node, arr, formatter, current) {
- var attrhtml = ''
- if (node.attrs) {
- attrhtml = []
- var attrs = node.attrs
- for (var a in attrs) {
-
-
-
-
- attrhtml.push(
- a +
- (attrs[a] !== undefined
- ? '="' +
- (notTransAttrs[a]
- ? utils.html(attrs[a]).replace(/["]/g, function (a) {
- return '"'
- })
- : utils.unhtml(attrs[a])) +
- '"'
- : '')
- )
- }
- attrhtml = attrhtml.join(' ')
- }
- arr.push(
- '<' +
- node.tagName +
- (attrhtml ? ' ' + attrhtml : '') +
- (dtd.$empty[node.tagName] ? '/' : '') +
- '>'
- )
-
- if (
- formatter &&
- !dtd.$inlineWithA[node.tagName] &&
- node.tagName != 'pre'
- ) {
- if (node.children && node.children.length) {
- current = insertLine(arr, current, true)
- insertIndent(arr, current)
- }
- }
- if (node.children && node.children.length) {
- for (var i = 0, ci; (ci = node.children[i++]); ) {
- if (
- formatter &&
- ci.type == 'element' &&
- !dtd.$inlineWithA[ci.tagName] &&
- i > 1
- ) {
- insertLine(arr, current)
- insertIndent(arr, current)
- }
- nodeToHtml(ci, arr, formatter, current)
- }
- }
- if (!dtd.$empty[node.tagName]) {
- if (
- formatter &&
- !dtd.$inlineWithA[node.tagName] &&
- node.tagName != 'pre'
- ) {
- if (node.children && node.children.length) {
- current = insertLine(arr, current)
- insertIndent(arr, current)
- }
- }
- arr.push('</' + node.tagName + '>')
- }
- }
- function isComment(node, arr) {
- arr.push('<!--' + node.data + '-->')
- }
- function getNodeById(root, id) {
- var node
- if (root.type == 'element' && root.getAttr('id') == id) {
- return root
- }
- if (root.children && root.children.length) {
- for (var i = 0, ci; (ci = root.children[i++]); ) {
- if ((node = getNodeById(ci, id))) {
- return node
- }
- }
- }
- }
- function getNodesByTagName(node, tagName, arr) {
- if (node.type == 'element' && node.tagName == tagName) {
- arr.push(node)
- }
- if (node.children && node.children.length) {
- for (var i = 0, ci; (ci = node.children[i++]); ) {
- getNodesByTagName(ci, tagName, arr)
- }
- }
- }
- function nodeTraversal(root, fn) {
- if (root.children && root.children.length) {
- for (var i = 0, ci; (ci = root.children[i]); ) {
- nodeTraversal(ci, fn)
-
- if (ci.parentNode) {
- if (ci.children && ci.children.length) {
- fn(ci)
- }
- if (ci.parentNode) i++
- }
- }
- } else {
- fn(root)
- }
- }
- uNode.prototype = {
-
-
- toHtml: function (formatter) {
- var arr = []
- nodeToHtml(this, arr, formatter, 0)
- return arr.join('')
- },
-
-
- innerHTML: function (htmlstr) {
- if (this.type != 'element' || dtd.$empty[this.tagName]) {
- return this
- }
- if (utils.isString(htmlstr)) {
- if (this.children) {
- for (var i = 0, ci; (ci = this.children[i++]); ) {
- ci.parentNode = null
- }
- }
- this.children = []
- var tmpRoot = UE.htmlparser(htmlstr)
- for (var i = 0, ci; (ci = tmpRoot.children[i++]); ) {
- this.children.push(ci)
- ci.parentNode = this
- }
- return this
- } else {
- var tmpRoot = new UE.uNode({
- type: 'root',
- children: this.children
- })
- return tmpRoot.toHtml()
- }
- },
-
-
- innerText: function (textStr, noTrans) {
- if (this.type != 'element' || dtd.$empty[this.tagName]) {
- return this
- }
- if (textStr) {
- if (this.children) {
- for (var i = 0, ci; (ci = this.children[i++]); ) {
- ci.parentNode = null
- }
- }
- this.children = []
- this.appendChild(uNode.createText(textStr, noTrans))
- return this
- } else {
- return this.toHtml().replace(/<[^>]+>/g, '')
- }
- },
-
- getData: function () {
- if (this.type == 'element') return ''
- return this.data
- },
-
- firstChild: function () {
-
-
-
- return this.children ? this.children[0] : null
- },
-
- lastChild: function () {
-
-
-
- return this.children ? this.children[this.children.length - 1] : null
- },
-
- previousSibling: function () {
- var parent = this.parentNode
- for (var i = 0, ci; (ci = parent.children[i]); i++) {
- if (ci === this) {
- return i == 0 ? null : parent.children[i - 1]
- }
- }
- },
-
- nextSibling: function () {
- var parent = this.parentNode
- for (var i = 0, ci; (ci = parent.children[i++]); ) {
- if (ci === this) {
- return parent.children[i]
- }
- }
- },
-
- replaceChild: function (target, source) {
- if (this.children) {
- if (target.parentNode) {
- target.parentNode.removeChild(target)
- }
- for (var i = 0, ci; (ci = this.children[i]); i++) {
- if (ci === source) {
- this.children.splice(i, 1, target)
- source.parentNode = null
- target.parentNode = this
- return target
- }
- }
- }
- },
-
- appendChild: function (node) {
- if (
- this.type == 'root' ||
- (this.type == 'element' && !dtd.$empty[this.tagName])
- ) {
- if (!this.children) {
- this.children = []
- }
- if (node.parentNode) {
- node.parentNode.removeChild(node)
- }
- for (var i = 0, ci; (ci = this.children[i]); i++) {
- if (ci === node) {
- this.children.splice(i, 1)
- break
- }
- }
- this.children.push(node)
- node.parentNode = this
- return node
- }
- },
-
- insertBefore: function (target, source) {
- if (this.children) {
- if (target.parentNode) {
- target.parentNode.removeChild(target)
- }
- for (var i = 0, ci; (ci = this.children[i]); i++) {
- if (ci === source) {
- this.children.splice(i, 0, target)
- target.parentNode = this
- return target
- }
- }
- }
- },
-
- insertAfter: function (target, source) {
- if (this.children) {
- if (target.parentNode) {
- target.parentNode.removeChild(target)
- }
- for (var i = 0, ci; (ci = this.children[i]); i++) {
- if (ci === source) {
- this.children.splice(i + 1, 0, target)
- target.parentNode = this
- return target
- }
- }
- }
- },
-
- removeChild: function (node, keepChildren) {
- if (this.children) {
- for (var i = 0, ci; (ci = this.children[i]); i++) {
- if (ci === node) {
- this.children.splice(i, 1)
- ci.parentNode = null
- if (keepChildren && ci.children && ci.children.length) {
- for (var j = 0, cj; (cj = ci.children[j]); j++) {
- this.children.splice(i + j, 0, cj)
- cj.parentNode = this
- }
- }
- return ci
- }
- }
- }
- },
-
- getAttr: function (attrName) {
- return this.attrs && this.attrs[attrName.toLowerCase()]
- },
-
- setAttr: function (attrName, attrVal) {
- if (!attrName) {
- delete this.attrs
- return
- }
- if (!this.attrs) {
- this.attrs = {}
- }
- if (utils.isObject(attrName)) {
- for (var a in attrName) {
- if (!attrName[a]) {
- delete this.attrs[a]
- } else {
- this.attrs[a.toLowerCase()] = attrName[a]
- }
- }
- } else {
- if (!attrVal) {
- delete this.attrs[attrName]
- } else {
- this.attrs[attrName.toLowerCase()] = attrVal
- }
- }
- },
-
- getIndex: function () {
- var parent = this.parentNode
- for (var i = 0, ci; (ci = parent.children[i]); i++) {
- if (ci === this) {
- return i
- }
- }
- return -1
- },
-
- getNodeById: function (id) {
- var node
- if (this.children && this.children.length) {
- for (var i = 0, ci; (ci = this.children[i++]); ) {
- if ((node = getNodeById(ci, id))) {
- return node
- }
- }
- }
- },
-
- getNodesByTagName: function (tagNames) {
- tagNames = utils
- .trim(tagNames)
- .replace(/[ ]{2,}/g, ' ')
- .split(' ')
- var arr = [],
- me = this
- utils.each(tagNames, function (tagName) {
- if (me.children && me.children.length) {
- for (var i = 0, ci; (ci = me.children[i++]); ) {
- getNodesByTagName(ci, tagName, arr)
- }
- }
- })
- return arr
- },
-
- getStyle: function (name) {
- var cssStyle = this.getAttr('style')
- if (!cssStyle) {
- return ''
- }
- var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+)', 'i')
- var match = cssStyle.match(reg)
- if (match && match[0]) {
- return match[2]
- }
- return ''
- },
-
- setStyle: function (name, val) {
- function exec(name, val) {
- var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+;?)', 'gi')
- cssStyle = cssStyle.replace(reg, '$1')
- if (val) {
- cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle
- }
- }
- var cssStyle = this.getAttr('style')
- if (!cssStyle) {
- cssStyle = ''
- }
- if (utils.isObject(name)) {
- for (var a in name) {
- exec(a, name[a])
- }
- } else {
- exec(name, val)
- }
- this.setAttr('style', utils.trim(cssStyle))
- },
-
- traversal: function (fn) {
- if (this.children && this.children.length) {
- nodeTraversal(this, fn)
- }
- return this
- }
- }
- })()
-
-
-
-
- var htmlparser = (UE.htmlparser = function (htmlstr, ignoreBlank) {
-
-
- var re_tag =
- /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,
- re_attr =
- /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g
-
- var allowEmptyTags = {
- b: 1,
- code: 1,
- i: 1,
- u: 1,
- strike: 1,
- s: 1,
- tt: 1,
- strong: 1,
- q: 1,
- samp: 1,
- em: 1,
- span: 1,
- sub: 1,
- img: 1,
- sup: 1,
- font: 1,
- big: 1,
- small: 1,
- iframe: 1,
- a: 1,
- br: 1,
- pre: 1
- }
- htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), '')
- if (!ignoreBlank) {
- htmlstr = htmlstr.replace(
- new RegExp(
- '[\\r\\t\\n' +
- (ignoreBlank ? '' : ' ') +
- ']*</?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n' +
- (ignoreBlank ? '' : ' ') +
- ']*',
- 'g'
- ),
- function (a, b) {
-
- if (b && allowEmptyTags[b.toLowerCase()]) {
- return a.replace(/(^[\n\r]+)|([\n\r]+$)/g, '')
- }
- return a
- .replace(
- new RegExp('^[\\r\\n' + (ignoreBlank ? '' : ' ') + ']+'),
- ''
- )
- .replace(
- new RegExp('[\\r\\n' + (ignoreBlank ? '' : ' ') + ']+$'),
- ''
- )
- }
- )
- }
- var notTransAttrs = {
- href: 1,
- src: 1
- }
- var uNode = UE.uNode,
- needParentNode = {
- td: 'tr',
- tr: ['tbody', 'thead', 'tfoot'],
- tbody: 'table',
- th: 'tr',
- thead: 'table',
- tfoot: 'table',
- caption: 'table',
- li: ['ul', 'ol'],
- dt: 'dl',
- dd: 'dl',
- option: 'select'
- },
- needChild = {
- ol: 'li',
- ul: 'li'
- }
- function text(parent, data) {
- if (needChild[parent.tagName]) {
- var tmpNode = uNode.createElement(needChild[parent.tagName])
- parent.appendChild(tmpNode)
- tmpNode.appendChild(uNode.createText(data))
- parent = tmpNode
- } else {
- parent.appendChild(uNode.createText(data))
- }
- }
- function element(parent, tagName, htmlattr) {
- var needParentTag
- if ((needParentTag = needParentNode[tagName])) {
- var tmpParent = parent,
- hasParent
- while (tmpParent.type != 'root') {
- if (
- utils.isArray(needParentTag)
- ? utils.indexOf(needParentTag, tmpParent.tagName) != -1
- : needParentTag == tmpParent.tagName
- ) {
- parent = tmpParent
- hasParent = true
- break
- }
- tmpParent = tmpParent.parentNode
- }
- if (!hasParent) {
- parent = element(
- parent,
- utils.isArray(needParentTag) ? needParentTag[0] : needParentTag
- )
- }
- }
-
-
-
- var elm = new uNode({
- parentNode: parent,
- type: 'element',
- tagName: tagName.toLowerCase(),
-
- children: dtd.$empty[tagName] ? null : []
- })
-
- if (htmlattr) {
- var attrs = {},
- match
- while ((match = re_attr.exec(htmlattr))) {
- attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()]
- ? match[2] || match[3] || match[4]
- : utils.unhtml(match[2] || match[3] || match[4])
- }
- elm.attrs = attrs
- }
-
-
-
-
-
-
- parent.children.push(elm)
-
- return dtd.$empty[tagName] ? parent : elm
- }
- function comment(parent, data) {
- parent.children.push(
- new uNode({
- type: 'comment',
- data: data,
- parentNode: parent
- })
- )
- }
- var match,
- currentIndex = 0,
- nextIndex = 0
-
- var root = new uNode({
- type: 'root',
- children: []
- })
- var currentParent = root
- while ((match = re_tag.exec(htmlstr))) {
- currentIndex = match.index
- try {
- if (currentIndex > nextIndex) {
-
- text(currentParent, htmlstr.slice(nextIndex, currentIndex))
- }
- if (match[3]) {
- if (dtd.$cdata[currentParent.tagName]) {
- text(currentParent, match[0])
- } else {
-
- currentParent = element(
- currentParent,
- match[3].toLowerCase(),
- match[4]
- )
- }
- } else if (match[1]) {
- if (currentParent.type != 'root') {
- if (dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]) {
- text(currentParent, match[0])
- } else {
- var tmpParent = currentParent
- while (
- currentParent.type == 'element' &&
- currentParent.tagName != match[1].toLowerCase()
- ) {
- currentParent = currentParent.parentNode
- if (currentParent.type == 'root') {
- currentParent = tmpParent
- throw 'break'
- }
- }
-
- currentParent = currentParent.parentNode
- }
- }
- } else if (match[2]) {
-
- comment(currentParent, match[2])
- }
- } catch (e) {}
- nextIndex = re_tag.lastIndex
- }
-
-
- if (nextIndex < htmlstr.length) {
- text(currentParent, htmlstr.slice(nextIndex))
- }
- return root
- })
-
-
-
-
- var filterNode = (UE.filterNode = (function () {
- function filterNode(node, rules) {
- switch (node.type) {
- case 'text':
- break
- case 'element':
- var val
- if ((val = rules[node.tagName])) {
- if (val === '-') {
- node.parentNode.removeChild(node)
- } else if (utils.isFunction(val)) {
- var parentNode = node.parentNode,
- index = node.getIndex()
- val(node)
- if (node.parentNode) {
- if (node.children) {
- for (var i = 0, ci; (ci = node.children[i]); ) {
- filterNode(ci, rules)
- if (ci.parentNode) {
- i++
- }
- }
- }
- } else {
- for (var i = index, ci; (ci = parentNode.children[i]); ) {
- filterNode(ci, rules)
- if (ci.parentNode) {
- i++
- }
- }
- }
- } else {
- var attrs = val['$']
- if (attrs && node.attrs) {
- var tmpAttrs = {},
- tmpVal
- for (var a in attrs) {
- tmpVal = node.getAttr(a)
-
- if (a == 'style' && utils.isArray(attrs[a])) {
- var tmpCssStyle = []
- utils.each(attrs[a], function (v) {
- var tmp
- if ((tmp = node.getStyle(v))) {
- tmpCssStyle.push(v + ':' + tmp)
- }
- })
- tmpVal = tmpCssStyle.join(';')
- }
- if (tmpVal) {
- tmpAttrs[a] = tmpVal
- }
- }
- node.attrs = tmpAttrs
- }
- if (node.children) {
- for (var i = 0, ci; (ci = node.children[i]); ) {
- filterNode(ci, rules)
- if (ci.parentNode) {
- i++
- }
- }
- }
- }
- } else {
-
- if (dtd.$cdata[node.tagName]) {
- node.parentNode.removeChild(node)
- } else {
- var parentNode = node.parentNode,
- index = node.getIndex()
- node.parentNode.removeChild(node, true)
- for (var i = index, ci; (ci = parentNode.children[i]); ) {
- filterNode(ci, rules)
- if (ci.parentNode) {
- i++
- }
- }
- }
- }
- break
- case 'comment':
- node.parentNode.removeChild(node)
- }
- }
- return function (root, rules) {
- if (utils.isEmptyObject(rules)) {
- return root
- }
- var val
- if ((val = rules['-'])) {
- utils.each(val.split(' '), function (k) {
- rules[k] = '-'
- })
- }
- for (var i = 0, ci; (ci = root.children[i]); ) {
- filterNode(ci, rules)
- if (ci.parentNode) {
- i++
- }
- }
- return root
- }
- })())
-
-
- UE.plugin = (function () {
- var _plugins = {}
- return {
- register: function (pluginName, fn, oldOptionName, afterDisabled) {
- if (oldOptionName && utils.isFunction(oldOptionName)) {
- afterDisabled = oldOptionName
- oldOptionName = null
- }
- _plugins[pluginName] = {
- optionName: oldOptionName || pluginName,
- execFn: fn,
-
- afterDisabled: afterDisabled
- }
- },
- load: function (editor) {
- utils.each(_plugins, function (plugin) {
- var _export = plugin.execFn.call(editor)
- if (editor.options[plugin.optionName] !== false) {
- if (_export) {
-
- utils.each(_export, function (v, k) {
- switch (k.toLowerCase()) {
- case 'shortcutkey':
- editor.addshortcutkey(v)
- break
- case 'bindevents':
- utils.each(v, function (fn, eventName) {
- editor.addListener(eventName, fn)
- })
- break
- case 'bindmultievents':
- utils.each(utils.isArray(v) ? v : [v], function (event) {
- var types = utils.trim(event.type).split(/\s+/)
- utils.each(types, function (eventName) {
- editor.addListener(eventName, event.handler)
- })
- })
- break
- case 'commands':
- utils.each(v, function (execFn, execName) {
- editor.commands[execName] = execFn
- })
- break
- case 'outputrule':
- editor.addOutputRule(v)
- break
- case 'inputrule':
- editor.addInputRule(v)
- break
- case 'defaultoptions':
- editor.setOpt(v)
- }
- })
- }
- } else if (plugin.afterDisabled) {
- plugin.afterDisabled.call(editor)
- }
- })
-
- utils.each(UE.plugins, function (plugin) {
- plugin.call(editor)
- })
- },
- run: function (pluginName, editor) {
- var plugin = _plugins[pluginName]
- if (plugin) {
- plugin.exeFn.call(editor)
- }
- }
- }
- })()
-
- var keymap = (UE.keymap = {
- Backspace: 8,
- Tab: 9,
- Enter: 13,
- Shift: 16,
- Control: 17,
- Alt: 18,
- CapsLock: 20,
- Esc: 27,
- Spacebar: 32,
- PageUp: 33,
- PageDown: 34,
- End: 35,
- Home: 36,
- Left: 37,
- Up: 38,
- Right: 39,
- Down: 40,
- Insert: 45,
- Del: 46,
- NumLock: 144,
- Cmd: 91,
- '=': 187,
- '-': 189,
- b: 66,
- i: 73,
-
- z: 90,
- y: 89,
-
- v: 86,
- x: 88,
- s: 83,
- n: 78
- })
-
-
- var LocalStorage = (UE.LocalStorage = (function () {
- var storage = window.localStorage || getUserData() || null,
- LOCAL_FILE = 'localStorage'
- return {
- saveLocalData: function (key, data) {
- if (storage && data) {
- storage.setItem(key, data)
- return true
- }
- return false
- },
- getLocalData: function (key) {
- if (storage) {
- return storage.getItem(key)
- }
- return null
- },
- removeItem: function (key) {
- storage && storage.removeItem(key)
- }
- }
- function getUserData() {
- var container = document.createElement('div')
- container.style.display = 'none'
- if (!container.addBehavior) {
- return null
- }
- container.addBehavior('#default#userdata')
- return {
- getItem: function (key) {
- var result = null
- try {
- document.body.appendChild(container)
- container.load(LOCAL_FILE)
- result = container.getAttribute(key)
- document.body.removeChild(container)
- } catch (e) {}
- return result
- },
- setItem: function (key, value) {
- document.body.appendChild(container)
- container.setAttribute(key, value)
- container.save(LOCAL_FILE)
- document.body.removeChild(container)
- },
-
-
-
-
-
-
-
-
-
-
-
- removeItem: function (key) {
- document.body.appendChild(container)
- container.removeAttribute(key)
- container.save(LOCAL_FILE)
- document.body.removeChild(container)
- }
- }
- }
- })())
- ;(function () {
- var ROOTKEY = 'ueditor_preference'
- UE.Editor.prototype.setPreferences = function (key, value) {
- var obj = {}
- if (utils.isString(key)) {
- obj[key] = value
- } else {
- obj = key
- }
- var data = LocalStorage.getLocalData(ROOTKEY)
- if (data && (data = utils.str2json(data))) {
- utils.extend(data, obj)
- } else {
- data = obj
- }
- data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data))
- }
- UE.Editor.prototype.getPreferences = function (key) {
- var data = LocalStorage.getLocalData(ROOTKEY)
- if (data && (data = utils.str2json(data))) {
- return key ? data[key] : data
- }
- return null
- }
- UE.Editor.prototype.removePreferences = function (key) {
- var data = LocalStorage.getLocalData(ROOTKEY)
- if (data && (data = utils.str2json(data))) {
- data[key] = undefined
- delete data[key]
- }
- data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data))
- }
- })()
-
-
-
- UE.plugins['defaultfilter'] = function () {
- var me = this
- me.setOpt({
- allowDivTransToP: true,
- disabledTableInTable: true
- })
-
-
- me.addInputRule(function (root) {
- var allowDivTransToP = this.options.allowDivTransToP
- var val
- function tdParent(node) {
- while (node && node.type == 'element') {
- if (node.tagName == 'td') {
- return true
- }
- node = node.parentNode
- }
- return false
- }
-
- root.traversal(function (node) {
- if (node.type == 'element') {
- if (
- !dtd.$cdata[node.tagName] &&
- me.options.autoClearEmptyNode &&
- dtd.$inline[node.tagName] &&
- !dtd.$empty[node.tagName] &&
- (!node.attrs || utils.isEmptyObject(node.attrs))
- ) {
- if (!node.firstChild()) node.parentNode.removeChild(node)
- else if (
- node.tagName == 'span' &&
- (!node.attrs || utils.isEmptyObject(node.attrs))
- ) {
- node.parentNode.removeChild(node, true)
- }
- return
- }
- switch (node.tagName) {
- case 'style':
- case 'script':
- node.setAttr({
- cdata_tag: node.tagName,
- cdata_data: node.innerHTML() || '',
- _ue_custom_node_: 'true'
- })
- node.tagName = 'div'
- node.innerHTML('')
- break
- case 'a':
- if ((val = node.getAttr('href'))) {
- node.setAttr('_href', val)
- }
- break
- case 'img':
-
- if ((val = node.getAttr('src'))) {
- if (/^data:/.test(val)) {
- node.parentNode.removeChild(node)
- break
- }
- }
- node.setAttr('_src', node.getAttr('src'))
- break
- case 'span':
- if (browser.webkit && (val = node.getStyle('white-space'))) {
- if (/nowrap|normal/.test(val)) {
- node.setStyle('white-space', '')
- if (
- me.options.autoClearEmptyNode &&
- utils.isEmptyObject(node.attrs)
- ) {
- node.parentNode.removeChild(node, true)
- }
- }
- }
- val = node.getAttr('id')
- if (val && /^_baidu_bookmark_/i.test(val)) {
- node.parentNode.removeChild(node)
- }
- break
- case 'p':
- if ((val = node.getAttr('align'))) {
- node.setAttr('align')
- node.setStyle('text-align', val)
- }
-
-
-
-
-
-
-
-
- utils.each(node.children, function (n) {
- if (n.type == 'element' && n.tagName == 'p') {
- var next = n.nextSibling()
- node.parentNode.insertAfter(n, node)
- var last = n
- while (next) {
- var tmp = next.nextSibling()
- node.parentNode.insertAfter(next, last)
- last = next
- next = tmp
- }
- return false
- }
- })
- if (!node.firstChild()) {
- node.innerHTML(browser.ie ? ' ' : '<br/>')
- }
- break
- case 'div':
- if (node.getAttr('cdata_tag')) {
- break
- }
-
- val = node.getAttr('class')
- if (val && /^line number\d+/.test(val)) {
- break
- }
- if (!allowDivTransToP) {
- break
- }
- var tmpNode,
- p = UE.uNode.createElement('p')
- while ((tmpNode = node.firstChild())) {
- if (
- tmpNode.type == 'text' ||
- !UE.dom.dtd.$block[tmpNode.tagName]
- ) {
- p.appendChild(tmpNode)
- } else {
- if (p.firstChild()) {
- node.parentNode.insertBefore(p, node)
- p = UE.uNode.createElement('p')
- } else {
- node.parentNode.insertBefore(tmpNode, node)
- }
- }
- }
- if (p.firstChild()) {
- node.parentNode.insertBefore(p, node)
- }
- node.parentNode.removeChild(node)
- break
- case 'dl':
- node.tagName = 'ul'
- break
- case 'dt':
- case 'dd':
- node.tagName = 'li'
- break
- case 'li':
- var className = node.getAttr('class')
- if (!className || !/list\-/.test(className)) {
- node.setAttr()
- }
- var tmpNodes = node.getNodesByTagName('ol ul')
- UE.utils.each(tmpNodes, function (n) {
- node.parentNode.insertAfter(n, node)
- })
- break
- case 'td':
- case 'th':
- case 'caption':
- if (!node.children || !node.children.length) {
- node.appendChild(
- browser.ie11below
- ? UE.uNode.createText(' ')
- : UE.uNode.createElement('br')
- )
- }
- break
- case 'table':
- if (me.options.disabledTableInTable && tdParent(node)) {
- node.parentNode.insertBefore(
- UE.uNode.createText(node.innerText()),
- node
- )
- node.parentNode.removeChild(node)
- }
- }
- }
-
-
-
- })
- })
-
- me.addOutputRule(function (root) {
- var val
- root.traversal(function (node) {
- if (node.type == 'element') {
- if (
- me.options.autoClearEmptyNode &&
- dtd.$inline[node.tagName] &&
- !dtd.$empty[node.tagName] &&
- (!node.attrs || utils.isEmptyObject(node.attrs))
- ) {
- if (!node.firstChild()) node.parentNode.removeChild(node)
- else if (
- node.tagName == 'span' &&
- (!node.attrs || utils.isEmptyObject(node.attrs))
- ) {
- node.parentNode.removeChild(node, true)
- }
- return
- }
- switch (node.tagName) {
- case 'div':
- if ((val = node.getAttr('cdata_tag'))) {
- node.tagName = val
- node.appendChild(
- UE.uNode.createText(node.getAttr('cdata_data'))
- )
- node.setAttr({
- cdata_tag: '',
- cdata_data: '',
- _ue_custom_node_: ''
- })
- }
- break
- case 'a':
- if ((val = node.getAttr('_href'))) {
- node.setAttr({
- href: utils.html(val),
- _href: ''
- })
- }
- break
- break
- case 'span':
- val = node.getAttr('id')
- if (val && /^_baidu_bookmark_/i.test(val)) {
- node.parentNode.removeChild(node)
- }
- break
- case 'img':
- if ((val = node.getAttr('_src'))) {
- node.setAttr({
- src: node.getAttr('_src'),
- _src: ''
- })
- }
- }
- }
- })
- })
- }
-
-
-
- UE.commands['inserthtml'] = {
- execCommand: function (command, html, notNeedFilter) {
- var me = this,
- range,
- div
- if (!html) {
- return
- }
- if (me.fireEvent('beforeinserthtml', html) === true) {
- return
- }
- range = me.selection.getRange()
- div = range.document.createElement('div')
- div.style.display = 'inline'
- if (!notNeedFilter) {
- var root = UE.htmlparser(html)
-
- if (me.options.filterRules) {
- UE.filterNode(root, me.options.filterRules)
- }
-
- me.filterInputRule(root)
- html = root.toHtml()
- }
- div.innerHTML = utils.trim(html)
- if (!range.collapsed) {
- var tmpNode = range.startContainer
- if (domUtils.isFillChar(tmpNode)) {
- range.setStartBefore(tmpNode)
- }
- tmpNode = range.endContainer
- if (domUtils.isFillChar(tmpNode)) {
- range.setEndAfter(tmpNode)
- }
- range.txtToElmBoundary()
-
-
- if (range.endContainer && range.endContainer.nodeType == 1) {
- tmpNode = range.endContainer.childNodes[range.endOffset]
- if (tmpNode && domUtils.isBr(tmpNode)) {
- range.setEndAfter(tmpNode)
- }
- }
- if (range.startOffset == 0) {
- tmpNode = range.startContainer
- if (domUtils.isBoundaryNode(tmpNode, 'firstChild')) {
- tmpNode = range.endContainer
- if (
- range.endOffset ==
- (tmpNode.nodeType == 3
- ? tmpNode.nodeValue.length
- : tmpNode.childNodes.length) &&
- domUtils.isBoundaryNode(tmpNode, 'lastChild')
- ) {
- me.body.innerHTML = '<p>' + (browser.ie ? '' : '<br/>') + '</p>'
- range.setStart(me.body.firstChild, 0).collapse(true)
- }
- }
- }
- !range.collapsed && range.deleteContents()
- if (range.startContainer.nodeType == 1) {
- var child = range.startContainer.childNodes[range.startOffset],
- pre
- if (
- child &&
- domUtils.isBlockElm(child) &&
- (pre = child.previousSibling) &&
- domUtils.isBlockElm(pre)
- ) {
- range.setEnd(pre, pre.childNodes.length).collapse()
- while (child.firstChild) {
- pre.appendChild(child.firstChild)
- }
- domUtils.remove(child)
- }
- }
- }
- var child,
- parent,
- pre,
- tmp,
- hadBreak = 0,
- nextNode
-
- if (range.inFillChar()) {
- child = range.startContainer
- if (domUtils.isFillChar(child)) {
- range.setStartBefore(child).collapse(true)
- domUtils.remove(child)
- } else if (domUtils.isFillChar(child, true)) {
- child.nodeValue = child.nodeValue.replace(fillCharReg, '')
- range.startOffset--
- range.collapsed && range.collapse(true)
- }
- }
-
- var li = domUtils.findParentByTagName(range.startContainer, 'li', true)
- if (li) {
- var next, last
- while ((child = div.firstChild)) {
-
- while (
- child &&
- (child.nodeType == 3 ||
- !domUtils.isBlockElm(child) ||
- child.tagName == 'HR')
- ) {
- next = child.nextSibling
- range.insertNode(child).collapse()
- last = child
- child = next
- }
- if (child) {
- if (/^(ol|ul)$/i.test(child.tagName)) {
- while (child.firstChild) {
- last = child.firstChild
- domUtils.insertAfter(li, child.firstChild)
- li = li.nextSibling
- }
- domUtils.remove(child)
- } else {
- var tmpLi
- next = child.nextSibling
- tmpLi = me.document.createElement('li')
- domUtils.insertAfter(li, tmpLi)
- tmpLi.appendChild(child)
- last = child
- child = next
- li = tmpLi
- }
- }
- }
- li = domUtils.findParentByTagName(range.startContainer, 'li', true)
- if (domUtils.isEmptyBlock(li)) {
- domUtils.remove(li)
- }
- if (last) {
- range.setStartAfter(last).collapse(true).select(true)
- }
- } else {
- while ((child = div.firstChild)) {
- if (hadBreak) {
- var p = me.document.createElement('p')
- while (
- child &&
- (child.nodeType == 3 || !dtd.$block[child.tagName])
- ) {
- nextNode = child.nextSibling
- p.appendChild(child)
- child = nextNode
- }
- if (p.firstChild) {
- child = p
- }
- }
- range.insertNode(child)
- nextNode = child.nextSibling
- if (
- !hadBreak &&
- child.nodeType == domUtils.NODE_ELEMENT &&
- domUtils.isBlockElm(child)
- ) {
- parent = domUtils.findParent(child, function (node) {
- return domUtils.isBlockElm(node)
- })
- if (
- parent &&
- parent.tagName.toLowerCase() != 'body' &&
- !(
- dtd[parent.tagName][child.nodeName] &&
- child.parentNode === parent
- )
- ) {
- if (!dtd[parent.tagName][child.nodeName]) {
- pre = parent
- } else {
- tmp = child.parentNode
- while (tmp !== parent) {
- pre = tmp
- tmp = tmp.parentNode
- }
- }
- domUtils.breakParent(child, pre || tmp)
-
- var pre = child.previousSibling
- domUtils.trimWhiteTextNode(pre)
- if (!pre.childNodes.length) {
- domUtils.remove(pre)
- }
-
- if (
- !browser.ie &&
- (next = child.nextSibling) &&
- domUtils.isBlockElm(next) &&
- next.lastChild &&
- !domUtils.isBr(next.lastChild)
- ) {
- next.appendChild(me.document.createElement('br'))
- }
- hadBreak = 1
- }
- }
- var next = child.nextSibling
- if (!div.firstChild && next && domUtils.isBlockElm(next)) {
- range.setStart(next, 0).collapse(true)
- break
- }
- range.setEndAfter(child).collapse()
- }
- child = range.startContainer
- if (nextNode && domUtils.isBr(nextNode)) {
- domUtils.remove(nextNode)
- }
-
- if (domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)) {
- if ((nextNode = child.nextSibling)) {
- domUtils.remove(child)
- if (nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]) {
- range.setStart(nextNode, 0).collapse(true).shrinkBoundary()
- }
- } else {
- try {
- child.innerHTML = browser.ie ? domUtils.fillChar : '<br/>'
- } catch (e) {
- range.setStartBefore(child)
- domUtils.remove(child)
- }
- }
- }
-
- try {
- range.select(true)
- } catch (e) {}
- }
- setTimeout(function () {
- range = me.selection.getRange()
- range.scrollToView(
- me.autoHeightEnabled,
- me.autoHeightEnabled ? domUtils.getXY(me.iframe).y : 0
- )
- me.fireEvent('afterinserthtml', html)
- }, 200)
- }
- }
-
-
-
- UE.plugins['autotypeset'] = function () {
- this.setOpt({
- autotypeset: {
- mergeEmptyline: true,
- removeClass: true,
- removeEmptyline: false,
- textAlign: 'left',
- imageBlockLine: 'center',
- pasteFilter: false,
- clearFontSize: false,
- clearFontFamily: false,
- removeEmptyNode: false,
-
- removeTagNames: utils.extend({ div: 1 }, dtd.$removeEmpty),
- indent: false,
- indentValue: '2em',
- bdc2sb: false,
- tobdc: false
- }
- })
- var me = this,
- opt = me.options.autotypeset,
- remainClass = {
- selectTdClass: 1,
- pagebreak: 1,
- anchorclass: 1
- },
- remainTag = {
- li: 1
- },
- tags = {
- div: 1,
- p: 1,
-
- blockquote: 1,
- center: 1,
- h1: 1,
- h2: 1,
- h3: 1,
- h4: 1,
- h5: 1,
- h6: 1,
- span: 1
- },
- highlightCont
-
- if (!opt) {
- return
- }
- readLocalOpts()
- function isLine(node, notEmpty) {
- if (!node || node.nodeType == 3) return 0
- if (domUtils.isBr(node)) return 1
- if (node && node.parentNode && tags[node.tagName.toLowerCase()]) {
- if (
- (highlightCont && highlightCont.contains(node)) ||
- node.getAttribute('pagebreak')
- ) {
- return 0
- }
- return notEmpty
- ? !domUtils.isEmptyBlock(node)
- : domUtils.isEmptyBlock(
- node,
- new RegExp('[\\s' + domUtils.fillChar + ']', 'g')
- )
- }
- }
- function removeNotAttributeSpan(node) {
- if (!node.style.cssText) {
- domUtils.removeAttributes(node, ['style'])
- if (
- node.tagName.toLowerCase() == 'span' &&
- domUtils.hasNoAttributes(node)
- ) {
- domUtils.remove(node, true)
- }
- }
- }
- function autotype(type, html) {
- var me = this,
- cont
- if (html) {
- if (!opt.pasteFilter) {
- return
- }
- cont = me.document.createElement('div')
- cont.innerHTML = html.html
- } else {
- cont = me.document.body
- }
- var nodes = domUtils.getElementsByTagName(cont, '*')
-
- for (var i = 0, ci; (ci = nodes[i++]); ) {
- if (me.fireEvent('excludeNodeinautotype', ci) === true) {
- continue
- }
-
- if (opt.clearFontSize && ci.style.fontSize) {
- domUtils.removeStyle(ci, 'font-size')
- removeNotAttributeSpan(ci)
- }
-
- if (opt.clearFontFamily && ci.style.fontFamily) {
- domUtils.removeStyle(ci, 'font-family')
- removeNotAttributeSpan(ci)
- }
- if (isLine(ci)) {
-
- if (opt.mergeEmptyline) {
- var next = ci.nextSibling,
- tmpNode,
- isBr = domUtils.isBr(ci)
- while (isLine(next)) {
- tmpNode = next
- next = tmpNode.nextSibling
- if (isBr && (!next || (next && !domUtils.isBr(next)))) {
- break
- }
- domUtils.remove(tmpNode)
- }
- }
-
- if (
- opt.removeEmptyline &&
- domUtils.inDoc(ci, cont) &&
- !remainTag[ci.parentNode.tagName.toLowerCase()]
- ) {
- if (domUtils.isBr(ci)) {
- next = ci.nextSibling
- if (next && !domUtils.isBr(next)) {
- continue
- }
- }
- domUtils.remove(ci)
- continue
- }
- }
- if (isLine(ci, true) && ci.tagName != 'SPAN') {
- if (opt.indent) {
- ci.style.textIndent = opt.indentValue
- }
- if (opt.textAlign) {
- ci.style.textAlign = opt.textAlign
- }
-
-
- }
-
- if (
- opt.removeClass &&
- ci.className &&
- !remainClass[ci.className.toLowerCase()]
- ) {
- if (highlightCont && highlightCont.contains(ci)) {
- continue
- }
- domUtils.removeAttributes(ci, ['class'])
- }
-
- if (
- opt.imageBlockLine &&
- ci.tagName.toLowerCase() == 'img' &&
- !ci.getAttribute('emotion')
- ) {
- if (html) {
- var img = ci
- switch (opt.imageBlockLine) {
- case 'left':
- case 'right':
- case 'none':
- var pN = img.parentNode,
- tmpNode,
- pre,
- next
- while (dtd.$inline[pN.tagName] || pN.tagName == 'A') {
- pN = pN.parentNode
- }
- tmpNode = pN
- if (
- tmpNode.tagName == 'P' &&
- domUtils.getStyle(tmpNode, 'text-align') == 'center'
- ) {
- if (
- !domUtils.isBody(tmpNode) &&
- domUtils.getChildCount(tmpNode, function (node) {
- return (
- !domUtils.isBr(node) && !domUtils.isWhitespace(node)
- )
- }) == 1
- ) {
- pre = tmpNode.previousSibling
- next = tmpNode.nextSibling
- if (
- pre &&
- next &&
- pre.nodeType == 1 &&
- next.nodeType == 1 &&
- pre.tagName == next.tagName &&
- domUtils.isBlockElm(pre)
- ) {
- pre.appendChild(tmpNode.firstChild)
- while (next.firstChild) {
- pre.appendChild(next.firstChild)
- }
- domUtils.remove(tmpNode)
- domUtils.remove(next)
- } else {
- domUtils.setStyle(tmpNode, 'text-align', '')
- }
- }
- }
- domUtils.setStyle(img, 'float', opt.imageBlockLine)
- break
- case 'center':
- if (me.queryCommandValue('imagefloat') != 'center') {
- pN = img.parentNode
- domUtils.setStyle(img, 'float', 'none')
- tmpNode = img
- while (
- pN &&
- domUtils.getChildCount(pN, function (node) {
- return (
- !domUtils.isBr(node) && !domUtils.isWhitespace(node)
- )
- }) == 1 &&
- (dtd.$inline[pN.tagName] || pN.tagName == 'A')
- ) {
- tmpNode = pN
- pN = pN.parentNode
- }
- var pNode = me.document.createElement('p')
- domUtils.setAttributes(pNode, {
- style: 'text-align:center'
- })
- tmpNode.parentNode.insertBefore(pNode, tmpNode)
- pNode.appendChild(tmpNode)
- domUtils.setStyle(tmpNode, 'float', '')
- }
- }
- } else {
- var range = me.selection.getRange()
- range.selectNode(ci).select()
- me.execCommand('imagefloat', opt.imageBlockLine)
- }
- }
-
- if (opt.removeEmptyNode) {
- if (
- opt.removeTagNames[ci.tagName.toLowerCase()] &&
- domUtils.hasNoAttributes(ci) &&
- domUtils.isEmptyBlock(ci)
- ) {
- domUtils.remove(ci)
- }
- }
- }
- if (opt.tobdc) {
- var root = UE.htmlparser(cont.innerHTML)
- root.traversal(function (node) {
- if (node.type == 'text') {
- node.data = ToDBC(node.data)
- }
- })
- cont.innerHTML = root.toHtml()
- }
- if (opt.bdc2sb) {
- var root = UE.htmlparser(cont.innerHTML)
- root.traversal(function (node) {
- if (node.type == 'text') {
- node.data = DBC2SB(node.data)
- }
- })
- cont.innerHTML = root.toHtml()
- }
- if (html) {
- html.html = cont.innerHTML
- }
- }
- if (opt.pasteFilter) {
- me.addListener('beforepaste', autotype)
- }
- function DBC2SB(str) {
- var result = ''
- for (var i = 0; i < str.length; i++) {
- var code = str.charCodeAt(i)
- if (code >= 65281 && code <= 65373) {
-
- result += String.fromCharCode(str.charCodeAt(i) - 65248)
- } else if (code == 12288) {
-
- result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
- } else {
- result += str.charAt(i)
- }
- }
- return result
- }
- function ToDBC(txtstring) {
- txtstring = utils.html(txtstring)
- var tmp = ''
- var mark = ''
- for (var i = 0; i < txtstring.length; i++) {
- if (txtstring.charCodeAt(i) == 32) {
- tmp = tmp + String.fromCharCode(12288)
- } else if (txtstring.charCodeAt(i) < 127) {
- tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248)
- } else {
- tmp += txtstring.charAt(i)
- }
- }
- return tmp
- }
- function readLocalOpts() {
- var cookieOpt = me.getPreferences('autotypeset')
- utils.extend(me.options.autotypeset, cookieOpt)
- }
- me.commands['autotypeset'] = {
- execCommand: function () {
- me.removeListener('beforepaste', autotype)
- if (opt.pasteFilter) {
- me.addListener('beforepaste', autotype)
- }
- autotype.call(me)
- }
- }
- }
-
-
-
- UE.plugin.register('autosubmit', function () {
- return {
- shortcutkey: {
- autosubmit: 'ctrl+13'
- },
- commands: {
- autosubmit: {
- execCommand: function () {
- var me = this,
- form = domUtils.findParentByTagName(me.iframe, 'form', false)
- if (form) {
- if (me.fireEvent('beforesubmit') === false) {
- return
- }
- me.sync()
- form.submit()
- }
- }
- }
- }
- }
- })
-
-
- UE.plugin.register('background', function () {
- var me = this,
- cssRuleId = 'editor_background',
- isSetColored,
- reg = new RegExp('body[\\s]*\\{(.+)\\}', 'i')
- function stringToObj(str) {
- var obj = {},
- styles = str.split(';')
- utils.each(styles, function (v) {
- var index = v.indexOf(':'),
- key = utils.trim(v.substr(0, index)).toLowerCase()
- key && (obj[key] = utils.trim(v.substr(index + 1) || ''))
- })
- return obj
- }
- function setBackground(obj) {
- if (obj) {
- var styles = []
- for (var name in obj) {
- if (obj.hasOwnProperty(name)) {
- styles.push(name + ':' + obj[name] + '; ')
- }
- }
- utils.cssRule(
- cssRuleId,
- styles.length ? 'body{' + styles.join('') + '}' : '',
- me.document
- )
- } else {
- utils.cssRule(cssRuleId, '', me.document)
- }
- }
-
- var orgFn = me.hasContents
- me.hasContents = function () {
- if (me.queryCommandValue('background')) {
- return true
- }
- return orgFn.apply(me, arguments)
- }
- return {
- bindEvents: {
- getAllHtml: function (type, headHtml) {
- var body = this.body,
- su = domUtils.getComputedStyle(body, 'background-image'),
- url = ''
- if (su.indexOf(me.options.imagePath) > 0) {
- url = su
- .substring(su.indexOf(me.options.imagePath), su.length - 1)
- .replace(/"|\(|\)/gi, '')
- } else {
- url = su != 'none' ? su.replace(/url\("?|"?\)/gi, '') : ''
- }
- var html = '<style type="text/css">body{'
- var bgObj = {
- 'background-color':
- domUtils.getComputedStyle(body, 'background-color') || '#ffffff',
- 'background-image': url ? 'url(' + url + ')' : '',
- 'background-repeat':
- domUtils.getComputedStyle(body, 'background-repeat') || '',
- 'background-position': browser.ie
- ? domUtils.getComputedStyle(body, 'background-position-x') +
- ' ' +
- domUtils.getComputedStyle(body, 'background-position-y')
- : domUtils.getComputedStyle(body, 'background-position'),
- height: domUtils.getComputedStyle(body, 'height')
- }
- for (var name in bgObj) {
- if (bgObj.hasOwnProperty(name)) {
- html += name + ':' + bgObj[name] + '; '
- }
- }
- html += '}</style> '
- headHtml.push(html)
- },
- aftersetcontent: function () {
- if (isSetColored == false) setBackground()
- }
- },
- inputRule: function (root) {
- isSetColored = false
- utils.each(root.getNodesByTagName('p'), function (p) {
- var styles = p.getAttr('data-background')
- if (styles) {
- isSetColored = true
- setBackground(stringToObj(styles))
- p.parentNode.removeChild(p)
- }
- })
- },
- outputRule: function (root) {
- var me = this,
- styles = (utils.cssRule(cssRuleId, me.document) || '')
- .replace(/[\n\r]+/g, '')
- .match(reg)
- if (styles) {
- root.appendChild(
- UE.uNode.createElement(
- '<p style="display:none;" data-background="' +
- utils.trim(styles[1].replace(/"/g, '').replace(/[\s]+/g, ' ')) +
- '"><br/></p>'
- )
- )
- }
- },
- commands: {
- background: {
- execCommand: function (cmd, obj) {
- setBackground(obj)
- },
- queryCommandValue: function () {
- var me = this,
- styles = (utils.cssRule(cssRuleId, me.document) || '')
- .replace(/[\n\r]+/g, '')
- .match(reg)
- return styles ? stringToObj(styles[1]) : null
- },
- notNeedUndo: true
- }
- }
- }
- })
-
-
-
-
- UE.commands['imagefloat'] = {
- execCommand: function (cmd, align) {
- var me = this,
- range = me.selection.getRange()
- if (!range.collapsed) {
- var img = range.getClosedNode()
- if (img && img.tagName == 'IMG') {
- switch (align) {
- case 'left':
- case 'right':
- case 'none':
- var pN = img.parentNode,
- tmpNode,
- pre,
- next
- while (dtd.$inline[pN.tagName] || pN.tagName == 'A') {
- pN = pN.parentNode
- }
- tmpNode = pN
- if (
- tmpNode.tagName == 'P' &&
- domUtils.getStyle(tmpNode, 'text-align') == 'center'
- ) {
- if (
- !domUtils.isBody(tmpNode) &&
- domUtils.getChildCount(tmpNode, function (node) {
- return !domUtils.isBr(node) && !domUtils.isWhitespace(node)
- }) == 1
- ) {
- pre = tmpNode.previousSibling
- next = tmpNode.nextSibling
- if (
- pre &&
- next &&
- pre.nodeType == 1 &&
- next.nodeType == 1 &&
- pre.tagName == next.tagName &&
- domUtils.isBlockElm(pre)
- ) {
- pre.appendChild(tmpNode.firstChild)
- while (next.firstChild) {
- pre.appendChild(next.firstChild)
- }
- domUtils.remove(tmpNode)
- domUtils.remove(next)
- } else {
- domUtils.setStyle(tmpNode, 'text-align', '')
- }
- }
- range.selectNode(img).select()
- }
- domUtils.setStyle(img, 'float', align == 'none' ? '' : align)
- if (align == 'none') {
- domUtils.removeAttributes(img, 'align')
- }
- break
- case 'center':
- if (me.queryCommandValue('imagefloat') != 'center') {
- pN = img.parentNode
- domUtils.setStyle(img, 'float', '')
- domUtils.removeAttributes(img, 'align')
- tmpNode = img
- while (
- pN &&
- domUtils.getChildCount(pN, function (node) {
- return !domUtils.isBr(node) && !domUtils.isWhitespace(node)
- }) == 1 &&
- (dtd.$inline[pN.tagName] || pN.tagName == 'A')
- ) {
- tmpNode = pN
- pN = pN.parentNode
- }
- range.setStartBefore(tmpNode).setCursor(false)
- pN = me.document.createElement('div')
- pN.appendChild(tmpNode)
- domUtils.setStyle(tmpNode, 'float', '')
- me.execCommand(
- 'insertHtml',
- '<p id="_img_parent_tmp" style="text-align:center">' +
- pN.innerHTML +
- '</p>'
- )
- tmpNode = me.document.getElementById('_img_parent_tmp')
- tmpNode.removeAttribute('id')
- tmpNode = tmpNode.firstChild
- range.selectNode(tmpNode).select()
-
- next = tmpNode.parentNode.nextSibling
- if (next && domUtils.isEmptyNode(next)) {
- domUtils.remove(next)
- }
- }
- break
- }
- }
- }
- },
- queryCommandValue: function () {
- var range = this.selection.getRange(),
- startNode,
- floatStyle
- if (range.collapsed) {
- return 'none'
- }
- startNode = range.getClosedNode()
- if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') {
- floatStyle =
- domUtils.getComputedStyle(startNode, 'float') ||
- startNode.getAttribute('align')
- if (floatStyle == 'none') {
- floatStyle =
- domUtils.getComputedStyle(startNode.parentNode, 'text-align') ==
- 'center'
- ? 'center'
- : floatStyle
- }
- return {
- left: 1,
- right: 1,
- center: 1
- }[floatStyle]
- ? floatStyle
- : 'none'
- }
- return 'none'
- },
- queryCommandState: function () {
- var range = this.selection.getRange(),
- startNode
- if (range.collapsed) return -1
- startNode = range.getClosedNode()
- if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') {
- return 0
- }
- return -1
- }
- }
-
- UE.commands['insertimage'] = {
- execCommand: function (cmd, opt) {
- opt = utils.isArray(opt) ? opt : [opt]
- if (!opt.length) {
- return
- }
- var me = this,
- range = me.selection.getRange(),
- img = range.getClosedNode()
- if (me.fireEvent('beforeinsertimage', opt) === true) {
- return
- }
- function unhtmlData(imgCi) {
- utils.each(
- 'width,height,border,hspace,vspace'.split(','),
- function (item) {
- if (imgCi[item]) {
- imgCi[item] = parseInt(imgCi[item], 10) || 0
- }
- }
- )
- utils.each('src,_src'.split(','), function (item) {
- if (imgCi[item]) {
- imgCi[item] = utils.unhtmlForUrl(imgCi[item])
- }
- })
- utils.each('title,alt'.split(','), function (item) {
- if (imgCi[item]) {
- imgCi[item] = utils.unhtml(imgCi[item])
- }
- })
- }
- if (
- img &&
- /img/i.test(img.tagName) &&
- (img.className != 'edui-faked-video' ||
- img.className.indexOf('edui-upload-video') != -1) &&
- !img.getAttribute('word_img')
- ) {
- var first = opt.shift()
- var floatStyle = first['floatStyle']
- delete first['floatStyle']
-
-
-
- domUtils.setAttributes(img, first)
- me.execCommand('imagefloat', floatStyle)
- if (opt.length > 0) {
- range.setStartAfter(img).setCursor(false, true)
- me.execCommand('insertimage', opt)
- }
- } else {
- var html = [],
- str = '',
- ci
- ci = opt[0]
- if (opt.length == 1) {
- unhtmlData(ci)
- str =
- '<img src="' +
- ci.src +
- '" ' +
- (ci._src ? ' _src="' + ci._src + '" ' : '') +
- (ci.width ? 'width="' + ci.width + '" ' : '') +
- (ci.height ? ' height="' + ci.height + '" ' : '') +
- (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right'
- ? ' style="float:' + ci['floatStyle'] + ';"'
- : '') +
- (ci.title && ci.title != '' ? ' title="' + ci.title + '"' : '') +
- (ci.border && ci.border != '0'
- ? ' border="' + ci.border + '"'
- : '') +
- (ci.alt && ci.alt != '' ? ' alt="' + ci.alt + '"' : '') +
- (ci.hspace && ci.hspace != '0'
- ? ' hspace = "' + ci.hspace + '"'
- : '') +
- (ci.vspace && ci.vspace != '0'
- ? ' vspace = "' + ci.vspace + '"'
- : '') +
- '/>'
- if (ci['floatStyle'] == 'center') {
- str = '<p style="text-align: center">' + str + '</p>'
- }
- html.push(str)
- } else {
- for (var i = 0; (ci = opt[i++]); ) {
- unhtmlData(ci)
- str =
- '<p ' +
- (ci['floatStyle'] == 'center'
- ? 'style="text-align: center" '
- : '') +
- '><img src="' +
- ci.src +
- '" ' +
- (ci.width ? 'width="' + ci.width + '" ' : '') +
- (ci._src ? ' _src="' + ci._src + '" ' : '') +
- (ci.height ? ' height="' + ci.height + '" ' : '') +
- ' style="' +
- (ci['floatStyle'] && ci['floatStyle'] != 'center'
- ? 'float:' + ci['floatStyle'] + ';'
- : '') +
- (ci.border || '') +
- '" ' +
- (ci.title ? ' title="' + ci.title + '"' : '') +
- ' /></p>'
- html.push(str)
- }
- }
- me.execCommand('insertHtml', html.join(''))
- }
- me.fireEvent('afterinsertimage', opt)
- }
- }
-
-
-
-
- UE.plugins['justify'] = function () {
- var me = this,
- block = domUtils.isBlockElm,
- defaultValue = {
- left: 1,
- right: 1,
- center: 1,
- justify: 1
- },
- doJustify = function (range, style) {
- var bookmark = range.createBookmark(),
- filterFn = function (node) {
- return node.nodeType == 1
- ? node.tagName.toLowerCase() != 'br' &&
- !domUtils.isBookmarkNode(node)
- : !domUtils.isWhitespace(node)
- }
- range.enlarge(true)
- var bookmark2 = range.createBookmark(),
- current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
- tmpRange = range.cloneRange(),
- tmpNode
- while (
- current &&
- !(
- domUtils.getPosition(current, bookmark2.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- if (current.nodeType == 3 || !block(current)) {
- tmpRange.setStartBefore(current)
- while (current && current !== bookmark2.end && !block(current)) {
- tmpNode = current
- current = domUtils.getNextDomNode(
- current,
- false,
- null,
- function (node) {
- return !block(node)
- }
- )
- }
- tmpRange.setEndAfter(tmpNode)
- var common = tmpRange.getCommonAncestor()
- if (!domUtils.isBody(common) && block(common)) {
- domUtils.setStyles(
- common,
- utils.isString(style) ? { 'text-align': style } : style
- )
- current = common
- } else {
- var p = range.document.createElement('p')
- domUtils.setStyles(
- p,
- utils.isString(style) ? { 'text-align': style } : style
- )
- var frag = tmpRange.extractContents()
- p.appendChild(frag)
- tmpRange.insertNode(p)
- current = p
- }
- current = domUtils.getNextDomNode(current, false, filterFn)
- } else {
- current = domUtils.getNextDomNode(current, true, filterFn)
- }
- }
- return range.moveToBookmark(bookmark2).moveToBookmark(bookmark)
- }
- UE.commands['justify'] = {
- execCommand: function (cmdName, align) {
- var range = this.selection.getRange(),
- txt
-
- if (range.collapsed) {
- txt = this.document.createTextNode('p')
- range.insertNode(txt)
- }
- doJustify(range, align)
- if (txt) {
- range.setStartBefore(txt).collapse(true)
- domUtils.remove(txt)
- }
- range.select()
- return true
- },
- queryCommandValue: function () {
- var startNode = this.selection.getStart(),
- value = domUtils.getComputedStyle(startNode, 'text-align')
- return defaultValue[value] ? value : 'left'
- },
- queryCommandState: function () {
- var start = this.selection.getStart(),
- cell =
- start &&
- domUtils.findParentByTagName(start, ['td', 'th', 'caption'], true)
- return cell ? -1 : 0
- }
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- UE.plugins['font'] = function () {
- var me = this,
- fonts = {
- forecolor: 'color',
- backcolor: 'background-color',
- fontsize: 'font-size',
- fontfamily: 'font-family',
- underline: 'text-decoration',
- strikethrough: 'text-decoration',
- fontborder: 'border'
- },
- needCmd = { underline: 1, strikethrough: 1, fontborder: 1 },
- needSetChild = {
- forecolor: 'color',
- backcolor: 'background-color',
- fontsize: 'font-size',
- fontfamily: 'font-family'
- }
- me.setOpt({
- fontfamily: [
- { name: 'songti', val: '宋体,SimSun' },
- { name: 'yahei', val: '微软雅黑,Microsoft YaHei' },
- { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai' },
- { name: 'heiti', val: '黑体, SimHei' },
- { name: 'lishu', val: '隶书, SimLi' },
- { name: 'andaleMono', val: 'andale mono' },
- { name: 'arial', val: 'arial, helvetica,sans-serif' },
- { name: 'arialBlack', val: 'arial black,avant garde' },
- { name: 'comicSansMs', val: 'comic sans ms' },
- { name: 'impact', val: 'impact,chicago' },
- { name: 'timesNewRoman', val: 'times new roman' }
- ],
- fontsize: [10, 11, 12, 14, 16, 18, 20, 24, 36]
- })
- function mergeWithParent(node) {
- var parent
- while ((parent = node.parentNode)) {
- if (
- parent.tagName == 'SPAN' &&
- domUtils.getChildCount(parent, function (child) {
- return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child)
- }) == 1
- ) {
- parent.style.cssText += node.style.cssText
- domUtils.remove(node, true)
- node = parent
- } else {
- break
- }
- }
- }
- function mergeChild(rng, cmdName, value) {
- if (needSetChild[cmdName]) {
- rng.adjustmentBoundary()
- if (!rng.collapsed && rng.startContainer.nodeType == 1) {
- var start = rng.startContainer.childNodes[rng.startOffset]
- if (start && domUtils.isTagNode(start, 'span')) {
- var bk = rng.createBookmark()
- utils.each(
- domUtils.getElementsByTagName(start, 'span'),
- function (span) {
- if (!span.parentNode || domUtils.isBookmarkNode(span)) return
- if (
- cmdName == 'backcolor' &&
- domUtils
- .getComputedStyle(span, 'background-color')
- .toLowerCase() === value
- ) {
- return
- }
- domUtils.removeStyle(span, needSetChild[cmdName])
- if (span.style.cssText.replace(/^\s+$/, '').length == 0) {
- domUtils.remove(span, true)
- }
- }
- )
- rng.moveToBookmark(bk)
- }
- }
- }
- }
- function mergesibling(rng, cmdName, value) {
- var collapsed = rng.collapsed,
- bk = rng.createBookmark(),
- common
- if (collapsed) {
- common = bk.start.parentNode
- while (dtd.$inline[common.tagName]) {
- common = common.parentNode
- }
- } else {
- common = domUtils.getCommonAncestor(bk.start, bk.end)
- }
- utils.each(
- domUtils.getElementsByTagName(common, 'span'),
- function (span) {
- if (!span.parentNode || domUtils.isBookmarkNode(span)) return
- if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) {
- if (/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)) {
- domUtils.remove(span, true)
- } else {
- domUtils.removeStyle(span, 'border')
- }
- return
- }
- if (
- /border/i.test(span.style.cssText) &&
- span.parentNode.tagName == 'SPAN' &&
- /border/i.test(span.parentNode.style.cssText)
- ) {
- span.style.cssText = span.style.cssText.replace(
- /border[^:]*:[^;]+;?/gi,
- ''
- )
- }
- if (!(cmdName == 'fontborder' && value == 'none')) {
- var next = span.nextSibling
- while (next && next.nodeType == 1 && next.tagName == 'SPAN') {
- if (domUtils.isBookmarkNode(next) && cmdName == 'fontborder') {
- span.appendChild(next)
- next = span.nextSibling
- continue
- }
- if (next.style.cssText == span.style.cssText) {
- domUtils.moveChild(next, span)
- domUtils.remove(next)
- }
- if (span.nextSibling === next) break
- next = span.nextSibling
- }
- }
- mergeWithParent(span)
- if (browser.ie && browser.version > 8) {
-
- var parent = domUtils.findParent(span, function (n) {
- return (
- n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)
- )
- })
- if (parent && !/background-color/.test(span.style.cssText)) {
- span.style.backgroundColor = parent.style.backgroundColor
- }
- }
- }
- )
- rng.moveToBookmark(bk)
- mergeChild(rng, cmdName, value)
- }
- me.addInputRule(function (root) {
- utils.each(
- root.getNodesByTagName('u s del font strike'),
- function (node) {
- if (node.tagName == 'font') {
- var cssStyle = []
- for (var p in node.attrs) {
- switch (p) {
- case 'size':
- cssStyle.push(
- 'font-size:' +
- ({
- 1: '10',
- 2: '12',
- 3: '16',
- 4: '18',
- 5: '24',
- 6: '32',
- 7: '48'
- }[node.attrs[p]] || node.attrs[p]) +
- 'px'
- )
- break
- case 'color':
- cssStyle.push('color:' + node.attrs[p])
- break
- case 'face':
- cssStyle.push('font-family:' + node.attrs[p])
- break
- case 'style':
- cssStyle.push(node.attrs[p])
- }
- }
- node.attrs = {
- style: cssStyle.join(';')
- }
- } else {
- var val = node.tagName == 'u' ? 'underline' : 'line-through'
- node.attrs = {
- style:
- (node.getAttr('style') || '') + 'text-decoration:' + val + ';'
- }
- }
- node.tagName = 'span'
- }
- )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- })
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- for (var p in fonts) {
- ;(function (cmd, style) {
- UE.commands[cmd] = {
- execCommand: function (cmdName, value) {
- value =
- value ||
- (this.queryCommandState(cmdName)
- ? 'none'
- : cmdName == 'underline'
- ? 'underline'
- : cmdName == 'fontborder'
- ? '1px solid #000'
- : 'line-through')
- var me = this,
- range = this.selection.getRange(),
- text
- if (value == 'default') {
- if (range.collapsed) {
- text = me.document.createTextNode('font')
- range.insertNode(text).select()
- }
- me.execCommand('removeFormat', 'span,a', style)
- if (text) {
- range.setStartBefore(text).collapse(true)
- domUtils.remove(text)
- }
- mergesibling(range, cmdName, value)
- range.select()
- } else {
- if (!range.collapsed) {
- if (needCmd[cmd] && me.queryCommandValue(cmd)) {
- me.execCommand('removeFormat', 'span,a', style)
- }
- range = me.selection.getRange()
- range.applyInlineStyle('span', { style: style + ':' + value })
- mergesibling(range, cmdName, value)
- range.select()
- } else {
- var span = domUtils.findParentByTagName(
- range.startContainer,
- 'span',
- true
- )
- text = me.document.createTextNode('font')
- if (
- span &&
- !span.children.length &&
- !span[browser.ie ? 'innerText' : 'textContent'].replace(
- fillCharReg,
- ''
- ).length
- ) {
-
- range.insertNode(text)
- if (needCmd[cmd]) {
- range.selectNode(text).select()
- me.execCommand('removeFormat', 'span,a', style, null)
- span = domUtils.findParentByTagName(text, 'span', true)
- range.setStartBefore(text)
- }
- span && (span.style.cssText += ';' + style + ':' + value)
- range.collapse(true).select()
- } else {
- range.insertNode(text)
- range.selectNode(text).select()
- span = range.document.createElement('span')
- if (needCmd[cmd]) {
-
- if (domUtils.findParentByTagName(text, 'a', true)) {
- range.setStartBefore(text).setCursor()
- domUtils.remove(text)
- return
- }
- me.execCommand('removeFormat', 'span,a', style)
- }
- span.style.cssText = style + ':' + value
- text.parentNode.insertBefore(span, text)
-
- if (!browser.ie || (browser.ie && browser.version == 9)) {
- var spanParent = span.parentNode
- while (!domUtils.isBlockElm(spanParent)) {
- if (spanParent.tagName == 'SPAN') {
-
- span.style.cssText =
- spanParent.style.cssText + ';' + span.style.cssText
- }
- spanParent = spanParent.parentNode
- }
- }
- if (opera) {
- setTimeout(function () {
- range.setStart(span, 0).collapse(true)
- mergesibling(range, cmdName, value)
- range.select()
- })
- } else {
- range.setStart(span, 0).collapse(true)
- mergesibling(range, cmdName, value)
- range.select()
- }
-
-
- }
- domUtils.remove(text)
- }
- }
- return true
- },
- queryCommandValue: function (cmdName) {
- var startNode = this.selection.getStart()
-
- if (cmdName == 'underline' || cmdName == 'strikethrough') {
- var tmpNode = startNode,
- value
- while (
- tmpNode &&
- !domUtils.isBlockElm(tmpNode) &&
- !domUtils.isBody(tmpNode)
- ) {
- if (tmpNode.nodeType == 1) {
- value = domUtils.getComputedStyle(tmpNode, style)
- if (value != 'none') {
- return value
- }
- }
- tmpNode = tmpNode.parentNode
- }
- return 'none'
- }
- if (cmdName == 'fontborder') {
- var tmp = startNode,
- val
- while (tmp && dtd.$inline[tmp.tagName]) {
- if ((val = domUtils.getComputedStyle(tmp, 'border'))) {
- if (/1px/.test(val) && /solid/.test(val)) {
- return val
- }
- }
- tmp = tmp.parentNode
- }
- return ''
- }
- if (cmdName == 'FontSize') {
- var styleVal = domUtils.getComputedStyle(startNode, style),
- tmp = /^([\d\.]+)(\w+)$/.exec(styleVal)
- if (tmp) {
- return Math.floor(tmp[1]) + tmp[2]
- }
- return styleVal
- }
- return domUtils.getComputedStyle(startNode, style)
- },
- queryCommandState: function (cmdName) {
- if (!needCmd[cmdName]) return 0
- var val = this.queryCommandValue(cmdName)
- if (cmdName == 'fontborder') {
- return /1px/.test(val) && /solid/.test(val)
- } else {
- return cmdName == 'underline'
- ? /underline/.test(val)
- : /line\-through/.test(val)
- }
- }
- }
- })(p, fonts[p])
- }
- }
-
-
-
-
-
- UE.plugins['link'] = function () {
- function optimize(range) {
- var start = range.startContainer,
- end = range.endContainer
- if ((start = domUtils.findParentByTagName(start, 'a', true))) {
- range.setStartBefore(start)
- }
- if ((end = domUtils.findParentByTagName(end, 'a', true))) {
- range.setEndAfter(end)
- }
- }
- UE.commands['unlink'] = {
- execCommand: function () {
- var range = this.selection.getRange(),
- bookmark
- if (
- range.collapsed &&
- !domUtils.findParentByTagName(range.startContainer, 'a', true)
- ) {
- return
- }
- bookmark = range.createBookmark()
- optimize(range)
- range.removeInlineStyle('a').moveToBookmark(bookmark).select()
- },
- queryCommandState: function () {
- return !this.highlight && this.queryCommandValue('link') ? 0 : -1
- }
- }
- function doLink(range, opt, me) {
- var rngClone = range.cloneRange(),
- link = me.queryCommandValue('link')
- optimize((range = range.adjustmentBoundary()))
- var start = range.startContainer
- if (start.nodeType == 1 && link) {
- start = start.childNodes[range.startOffset]
- if (
- start &&
- start.nodeType == 1 &&
- start.tagName == 'A' &&
- /^(?:https?|ftp|file)\s*:\s*\/\//.test(
- start[browser.ie ? 'innerText' : 'textContent']
- )
- ) {
- start[browser.ie ? 'innerText' : 'textContent'] = utils.html(
- opt.textValue || opt.href
- )
- }
- }
- if (!rngClone.collapsed || link) {
- range.removeInlineStyle('a')
- rngClone = range.cloneRange()
- }
- if (rngClone.collapsed) {
- var a = range.document.createElement('a'),
- text = ''
- if (opt.textValue) {
- text = utils.html(opt.textValue)
- delete opt.textValue
- } else {
- text = utils.html(opt.href)
- }
- domUtils.setAttributes(a, opt)
- start = domUtils.findParentByTagName(rngClone.startContainer, 'a', true)
- if (start && domUtils.isInNodeEndBoundary(rngClone, start)) {
- range.setStartAfter(start).collapse(true)
- }
- a[browser.ie ? 'innerText' : 'textContent'] = text
- range.insertNode(a).selectNode(a)
- } else {
- range.applyInlineStyle('a', opt)
- }
- }
- UE.commands['link'] = {
- execCommand: function (cmdName, opt) {
- var range
- opt._href && (opt._href = utils.unhtml(opt._href, /[<">]/g))
- opt.href && (opt.href = utils.unhtml(opt.href, /[<">]/g))
- opt.textValue && (opt.textValue = utils.unhtml(opt.textValue, /[<">]/g))
- doLink((range = this.selection.getRange()), opt, this)
- //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题
- range.collapse().select(true)
- },
- queryCommandValue: function () {
- var range = this.selection.getRange(),
- node
- if (range.collapsed) {
- // node = this.selection.getStart();
- //在ie下getstart()取值偏上了
- node = range.startContainer
- node = node.nodeType == 1 ? node : node.parentNode
- if (
- node &&
- (node = domUtils.findParentByTagName(node, 'a', true)) &&
- !domUtils.isInNodeEndBoundary(range, node)
- ) {
- return node
- }
- } else {
- //trace:1111 如果是<p><a>xx</a></p> startContainer是p就会找不到a
- range.shrinkBoundary()
- var start =
- range.startContainer.nodeType == 3 ||
- !range.startContainer.childNodes[range.startOffset]
- ? range.startContainer
- : range.startContainer.childNodes[range.startOffset],
- end =
- range.endContainer.nodeType == 3 || range.endOffset == 0
- ? range.endContainer
- : range.endContainer.childNodes[range.endOffset - 1],
- common = range.getCommonAncestor()
- node = domUtils.findParentByTagName(common, 'a', true)
- if (!node && common.nodeType == 1) {
- var as = common.getElementsByTagName('a'),
- ps,
- pe
- for (var i = 0, ci; (ci = as[i++]); ) {
- ;(ps = domUtils.getPosition(ci, start)),
- (pe = domUtils.getPosition(ci, end))
- if (
- (ps & domUtils.POSITION_FOLLOWING ||
- ps & domUtils.POSITION_CONTAINS) &&
- (pe & domUtils.POSITION_PRECEDING ||
- pe & domUtils.POSITION_CONTAINS)
- ) {
- node = ci
- break
- }
- }
- }
- return node
- }
- },
- queryCommandState: function () {
- //判断如果是视频的话连接不可用
- //fix 853
- var img = this.selection.getRange().getClosedNode(),
- flag =
- img &&
- (img.className == 'edui-faked-video' ||
- img.className.indexOf('edui-upload-video') != -1)
- return flag ? -1 : 0
- }
- }
- }
- // plugins/iframe.js
- ///import core
- ///import plugins\inserthtml.js
- ///commands 插入框架
- ///commandsName InsertFrame
- ///commandsTitle 插入Iframe
- ///commandsDialog dialogs\insertframe
- UE.plugins['insertframe'] = function () {
- var me = this
- function deleteIframe() {
- me._iframe && delete me._iframe
- }
- me.addListener('selectionchange', function () {
- deleteIframe()
- })
- }
- // plugins/scrawl.js
- ///import core
- ///commands 涂鸦
- ///commandsName Scrawl
- ///commandsTitle 涂鸦
- ///commandsDialog dialogs\scrawl
- UE.commands['scrawl'] = {
- queryCommandState: function () {
- return browser.ie && browser.version <= 8 ? -1 : 0
- }
- }
- // plugins/removeformat.js
- /**
- * 清除格式
- * @file
- * @since 1.2.6.1
- */
- /**
- * 清除文字样式
- * @command removeformat
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param {String} tags 以逗号隔开的标签。如:strong
- * @param {String} style 样式如:color
- * @param {String} attrs 属性如:width
- * @example
- * ```javascript
- * editor.execCommand( 'removeformat', 'strong','color','width' );
- * ```
- */
- UE.plugins['removeformat'] = function () {
- var me = this
- me.setOpt({
- removeFormatTags:
- 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var',
- removeFormatAttributes:
- 'class,style,lang,width,height,align,hspace,valign'
- })
- me.commands['removeformat'] = {
- execCommand: function (cmdName, tags, style, attrs, notIncludeA) {
- var tagReg = new RegExp(
- '^(?:' +
- (tags || this.options.removeFormatTags).replace(/,/g, '|') +
- ')$',
- 'i'
- ),
- removeFormatAttributes = style
- ? []
- : (attrs || this.options.removeFormatAttributes).split(','),
- range = new dom.Range(this.document),
- bookmark,
- node,
- parent,
- filter = function (node) {
- return node.nodeType == 1
- }
- function isRedundantSpan(node) {
- if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span') {
- return 0
- }
- if (browser.ie) {
- //ie 下判断实效,所以只能简单用style来判断
- //return node.style.cssText == '' ? 1 : 0;
- var attrs = node.attributes
- if (attrs.length) {
- for (var i = 0, l = attrs.length; i < l; i++) {
- if (attrs[i].specified) {
- return 0
- }
- }
- return 1
- }
- }
- return !node.attributes.length
- }
- function doRemove(range) {
- var bookmark1 = range.createBookmark()
- if (range.collapsed) {
- range.enlarge(true)
- }
- //不能把a标签切了
- if (!notIncludeA) {
- var aNode = domUtils.findParentByTagName(
- range.startContainer,
- 'a',
- true
- )
- if (aNode) {
- range.setStartBefore(aNode)
- }
- aNode = domUtils.findParentByTagName(range.endContainer, 'a', true)
- if (aNode) {
- range.setEndAfter(aNode)
- }
- }
- bookmark = range.createBookmark()
- node = bookmark.start
- //切开始
- while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) {
- domUtils.breakParent(node, parent)
- domUtils.clearEmptySibling(node)
- }
- if (bookmark.end) {
- //切结束
- node = bookmark.end
- while ((parent = node.parentNode) && !domUtils.isBlockElm(parent)) {
- domUtils.breakParent(node, parent)
- domUtils.clearEmptySibling(node)
- }
- //开始去除样式
- var current = domUtils.getNextDomNode(
- bookmark.start,
- false,
- filter
- ),
- next
- while (current) {
- if (current == bookmark.end) {
- break
- }
- next = domUtils.getNextDomNode(current, true, filter)
- if (
- !dtd.$empty[current.tagName.toLowerCase()] &&
- !domUtils.isBookmarkNode(current)
- ) {
- if (tagReg.test(current.tagName)) {
- if (style) {
- domUtils.removeStyle(current, style)
- if (
- isRedundantSpan(current) &&
- style != 'text-decoration'
- ) {
- domUtils.remove(current, true)
- }
- } else {
- domUtils.remove(current, true)
- }
- } else {
- //trace:939 不能把list上的样式去掉
- if (
- !dtd.$tableContent[current.tagName] &&
- !dtd.$list[current.tagName]
- ) {
- domUtils.removeAttributes(current, removeFormatAttributes)
- if (isRedundantSpan(current)) {
- domUtils.remove(current, true)
- }
- }
- }
- }
- current = next
- }
- }
- //trace:1035
- //trace:1096 不能把td上的样式去掉,比如边框
- var pN = bookmark.start.parentNode
- if (
- domUtils.isBlockElm(pN) &&
- !dtd.$tableContent[pN.tagName] &&
- !dtd.$list[pN.tagName]
- ) {
- domUtils.removeAttributes(pN, removeFormatAttributes)
- }
- pN = bookmark.end.parentNode
- if (
- bookmark.end &&
- domUtils.isBlockElm(pN) &&
- !dtd.$tableContent[pN.tagName] &&
- !dtd.$list[pN.tagName]
- ) {
- domUtils.removeAttributes(pN, removeFormatAttributes)
- }
- range.moveToBookmark(bookmark).moveToBookmark(bookmark1)
- //清除冗余的代码 <b><bookmark></b>
- var node = range.startContainer,
- tmp,
- collapsed = range.collapsed
- while (
- node.nodeType == 1 &&
- domUtils.isEmptyNode(node) &&
- dtd.$removeEmpty[node.tagName]
- ) {
- tmp = node.parentNode
- range.setStartBefore(node)
- //trace:937
- //更新结束边界
- if (range.startContainer === range.endContainer) {
- range.endOffset--
- }
- domUtils.remove(node)
- node = tmp
- }
- if (!collapsed) {
- node = range.endContainer
- while (
- node.nodeType == 1 &&
- domUtils.isEmptyNode(node) &&
- dtd.$removeEmpty[node.tagName]
- ) {
- tmp = node.parentNode
- range.setEndBefore(node)
- domUtils.remove(node)
- node = tmp
- }
- }
- }
- range = this.selection.getRange()
- doRemove(range)
- range.select()
- }
- }
- }
- // plugins/blockquote.js
- /**
- * 添加引用
- * @file
- * @since 1.2.6.1
- */
- /**
- * 添加引用
- * @command blockquote
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'blockquote' );
- * ```
- */
- /**
- * 添加引用
- * @command blockquote
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param { Object } attrs 节点属性
- * @example
- * ```javascript
- * editor.execCommand( 'blockquote',{
- * style: "color: red;"
- * } );
- * ```
- */
- UE.plugins['blockquote'] = function () {
- var me = this
- function getObj(editor) {
- return domUtils.filterNodeList(
- editor.selection.getStartElementPath(),
- 'blockquote'
- )
- }
- me.commands['blockquote'] = {
- execCommand: function (cmdName, attrs) {
- var range = this.selection.getRange(),
- obj = getObj(this),
- blockquote = dtd.blockquote,
- bookmark = range.createBookmark()
- if (obj) {
- var start = range.startContainer,
- startBlock = domUtils.isBlockElm(start)
- ? start
- : domUtils.findParent(start, function (node) {
- return domUtils.isBlockElm(node)
- }),
- end = range.endContainer,
- endBlock = domUtils.isBlockElm(end)
- ? end
- : domUtils.findParent(end, function (node) {
- return domUtils.isBlockElm(node)
- })
- //处理一下li
- startBlock =
- domUtils.findParentByTagName(startBlock, 'li', true) || startBlock
- endBlock =
- domUtils.findParentByTagName(endBlock, 'li', true) || endBlock
- if (
- startBlock.tagName == 'LI' ||
- startBlock.tagName == 'TD' ||
- startBlock === obj ||
- domUtils.isBody(startBlock)
- ) {
- domUtils.remove(obj, true)
- } else {
- domUtils.breakParent(startBlock, obj)
- }
- if (startBlock !== endBlock) {
- obj = domUtils.findParentByTagName(endBlock, 'blockquote')
- if (obj) {
- if (
- endBlock.tagName == 'LI' ||
- endBlock.tagName == 'TD' ||
- domUtils.isBody(endBlock)
- ) {
- obj.parentNode && domUtils.remove(obj, true)
- } else {
- domUtils.breakParent(endBlock, obj)
- }
- }
- }
- var blockquotes = domUtils.getElementsByTagName(
- this.document,
- 'blockquote'
- )
- for (var i = 0, bi; (bi = blockquotes[i++]); ) {
- if (!bi.childNodes.length) {
- domUtils.remove(bi)
- } else if (
- domUtils.getPosition(bi, startBlock) &
- domUtils.POSITION_FOLLOWING &&
- domUtils.getPosition(bi, endBlock) & domUtils.POSITION_PRECEDING
- ) {
- domUtils.remove(bi, true)
- }
- }
- } else {
- var tmpRange = range.cloneRange(),
- node =
- tmpRange.startContainer.nodeType == 1
- ? tmpRange.startContainer
- : tmpRange.startContainer.parentNode,
- preNode = node,
- doEnd = 1
- //调整开始
- while (1) {
- if (domUtils.isBody(node)) {
- if (preNode !== node) {
- if (range.collapsed) {
- tmpRange.selectNode(preNode)
- doEnd = 0
- } else {
- tmpRange.setStartBefore(preNode)
- }
- } else {
- tmpRange.setStart(node, 0)
- }
- break
- }
- if (!blockquote[node.tagName]) {
- if (range.collapsed) {
- tmpRange.selectNode(preNode)
- } else {
- tmpRange.setStartBefore(preNode)
- }
- break
- }
- preNode = node
- node = node.parentNode
- }
- //调整结束
- if (doEnd) {
- preNode =
- node =
- node =
- tmpRange.endContainer.nodeType == 1
- ? tmpRange.endContainer
- : tmpRange.endContainer.parentNode
- while (1) {
- if (domUtils.isBody(node)) {
- if (preNode !== node) {
- tmpRange.setEndAfter(preNode)
- } else {
- tmpRange.setEnd(node, node.childNodes.length)
- }
- break
- }
- if (!blockquote[node.tagName]) {
- tmpRange.setEndAfter(preNode)
- break
- }
- preNode = node
- node = node.parentNode
- }
- }
- node = range.document.createElement('blockquote')
- domUtils.setAttributes(node, attrs)
- node.appendChild(tmpRange.extractContents())
- tmpRange.insertNode(node)
- //去除重复的
- var childs = domUtils.getElementsByTagName(node, 'blockquote')
- for (var i = 0, ci; (ci = childs[i++]); ) {
- if (ci.parentNode) {
- domUtils.remove(ci, true)
- }
- }
- }
- range.moveToBookmark(bookmark).select()
- },
- queryCommandState: function () {
- return getObj(this) ? 1 : 0
- }
- }
- }
- // plugins/convertcase.js
- /**
- * 大小写转换
- * @file
- * @since 1.2.6.1
- */
- /**
- * 把选区内文本变大写,与“tolowercase”命令互斥
- * @command touppercase
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'touppercase' );
- * ```
- */
- /**
- * 把选区内文本变小写,与“touppercase”命令互斥
- * @command tolowercase
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'tolowercase' );
- * ```
- */
- UE.commands['touppercase'] = UE.commands['tolowercase'] = {
- execCommand: function (cmd) {
- var me = this
- var rng = me.selection.getRange()
- if (rng.collapsed) {
- return rng
- }
- var bk = rng.createBookmark(),
- bkEnd = bk.end,
- filterFn = function (node) {
- return !domUtils.isBr(node) && !domUtils.isWhitespace(node)
- },
- curNode = domUtils.getNextDomNode(bk.start, false, filterFn)
- while (
- curNode &&
- domUtils.getPosition(curNode, bkEnd) & domUtils.POSITION_PRECEDING
- ) {
- if (curNode.nodeType == 3) {
- curNode.nodeValue =
- curNode.nodeValue[
- cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase'
- ]()
- }
- curNode = domUtils.getNextDomNode(curNode, true, filterFn)
- if (curNode === bkEnd) {
- break
- }
- }
- rng.moveToBookmark(bk).select()
- }
- }
- // plugins/indent.js
- /**
- * 首行缩进
- * @file
- * @since 1.2.6.1
- */
- /**
- * 缩进
- * @command indent
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'indent' );
- * ```
- */
- UE.commands['indent'] = {
- execCommand: function () {
- var me = this,
- value = me.queryCommandState('indent')
- ? '0em'
- : me.options.indentValue || '2em'
- me.execCommand('Paragraph', 'p', { style: 'text-indent:' + value })
- },
- queryCommandState: function () {
- var pN = domUtils.filterNodeList(
- this.selection.getStartElementPath(),
- 'p h1 h2 h3 h4 h5 h6'
- )
- return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0
- }
- }
- // plugins/print.js
- /**
- * 打印
- * @file
- * @since 1.2.6.1
- */
- /**
- * 打印
- * @command print
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'print' );
- * ```
- */
- UE.commands['print'] = {
- execCommand: function () {
- this.window.print()
- },
- notNeedUndo: 1
- }
- // plugins/preview.js
- /**
- * 预览
- * @file
- * @since 1.2.6.1
- */
- /**
- * 预览
- * @command preview
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'preview' );
- * ```
- */
- UE.commands['preview'] = {
- execCommand: function () {
- var w = window.open('', '_blank', ''),
- d = w.document
- d.open()
- d.write(
- '<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="' +
- this.options.UEDITOR_HOME_URL +
- 'ueditor.parse.js"></script><script>' +
- "setTimeout(function(){uParse('div',{rootPath: '" +
- this.options.UEDITOR_HOME_URL +
- "'})},300)" +
- '</script></head><body><div>' +
- this.getContent(null, null, true) +
- '</div></body></html>'
- )
- d.close()
- },
- notNeedUndo: 1
- }
- // plugins/selectall.js
- /**
- * 全选
- * @file
- * @since 1.2.6.1
- */
- /**
- * 选中所有内容
- * @command selectall
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'selectall' );
- * ```
- */
- UE.plugins['selectall'] = function () {
- var me = this
- me.commands['selectall'] = {
- execCommand: function () {
- //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标
- var me = this,
- body = me.body,
- range = me.selection.getRange()
- range.selectNodeContents(body)
- if (domUtils.isEmptyBlock(body)) {
- //opera不能自动合并到元素的里边,要手动处理一下
- if (
- browser.opera &&
- body.firstChild &&
- body.firstChild.nodeType == 1
- ) {
- range.setStartAtFirst(body.firstChild)
- }
- range.collapse(true)
- }
- range.select(true)
- },
- notNeedUndo: 1
- }
- //快捷键
- me.addshortcutkey({
- selectAll: 'ctrl+65'
- })
- }
- // plugins/paragraph.js
- /**
- * 段落样式
- * @file
- * @since 1.2.6.1
- */
- /**
- * 段落格式
- * @command paragraph
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
- * @param {Object} attrs 标签的属性
- * @example
- * ```javascript
- * editor.execCommand( 'Paragraph','h1','{
- * class:'test'
- * }' );
- * ```
- */
- /**
- * 返回选区内节点标签名
- * @command paragraph
- * @method queryCommandValue
- * @param { String } cmd 命令字符串
- * @return { String } 节点标签名
- * @example
- * ```javascript
- * editor.queryCommandValue( 'Paragraph' );
- * ```
- */
- UE.plugins['paragraph'] = function () {
- var me = this,
- block = domUtils.isBlockElm,
- notExchange = ['TD', 'LI', 'PRE'],
- doParagraph = function (range, style, attrs, sourceCmdName) {
- var bookmark = range.createBookmark(),
- filterFn = function (node) {
- return node.nodeType == 1
- ? node.tagName.toLowerCase() != 'br' &&
- !domUtils.isBookmarkNode(node)
- : !domUtils.isWhitespace(node)
- },
- para
- range.enlarge(true)
- var bookmark2 = range.createBookmark(),
- current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
- tmpRange = range.cloneRange(),
- tmpNode
- while (
- current &&
- !(
- domUtils.getPosition(current, bookmark2.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- if (current.nodeType == 3 || !block(current)) {
- tmpRange.setStartBefore(current)
- while (current && current !== bookmark2.end && !block(current)) {
- tmpNode = current
- current = domUtils.getNextDomNode(
- current,
- false,
- null,
- function (node) {
- return !block(node)
- }
- )
- }
- tmpRange.setEndAfter(tmpNode)
- para = range.document.createElement(style)
- if (attrs) {
- domUtils.setAttributes(para, attrs)
- if (
- sourceCmdName &&
- sourceCmdName == 'customstyle' &&
- attrs.style
- ) {
- para.style.cssText = attrs.style
- }
- }
- para.appendChild(tmpRange.extractContents())
- //需要内容占位
- if (domUtils.isEmptyNode(para)) {
- domUtils.fillChar(range.document, para)
- }
- tmpRange.insertNode(para)
- var parent = para.parentNode
- //如果para上一级是一个block元素且不是body,td就删除它
- if (
- block(parent) &&
- !domUtils.isBody(para.parentNode) &&
- utils.indexOf(notExchange, parent.tagName) == -1
- ) {
- //存储dir,style
- if (!(sourceCmdName && sourceCmdName == 'customstyle')) {
- parent.getAttribute('dir') &&
- para.setAttribute('dir', parent.getAttribute('dir'))
- //trace:1070
- parent.style.cssText &&
- (para.style.cssText =
- parent.style.cssText + ';' + para.style.cssText)
- //trace:1030
- parent.style.textAlign &&
- !para.style.textAlign &&
- (para.style.textAlign = parent.style.textAlign)
- parent.style.textIndent &&
- !para.style.textIndent &&
- (para.style.textIndent = parent.style.textIndent)
- parent.style.padding &&
- !para.style.padding &&
- (para.style.padding = parent.style.padding)
- }
- //trace:1706 选择的就是h1-6要删除
- if (
- attrs &&
- /h\d/i.test(parent.tagName) &&
- !/h\d/i.test(para.tagName)
- ) {
- domUtils.setAttributes(parent, attrs)
- if (
- sourceCmdName &&
- sourceCmdName == 'customstyle' &&
- attrs.style
- ) {
- parent.style.cssText = attrs.style
- }
- domUtils.remove(para, true)
- para = parent
- } else {
- domUtils.remove(para.parentNode, true)
- }
- }
- if (utils.indexOf(notExchange, parent.tagName) != -1) {
- current = parent
- } else {
- current = para
- }
- current = domUtils.getNextDomNode(current, false, filterFn)
- } else {
- current = domUtils.getNextDomNode(current, true, filterFn)
- }
- }
- return range.moveToBookmark(bookmark2).moveToBookmark(bookmark)
- }
- me.setOpt('paragraph', {
- p: '',
- h1: '',
- h2: '',
- h3: '',
- h4: '',
- h5: '',
- h6: ''
- })
- me.commands['paragraph'] = {
- execCommand: function (cmdName, style, attrs, sourceCmdName) {
- var range = this.selection.getRange()
- //闭合时单独处理
- if (range.collapsed) {
- var txt = this.document.createTextNode('p')
- range.insertNode(txt)
- //去掉冗余的fillchar
- if (browser.ie) {
- var node = txt.previousSibling
- if (node && domUtils.isWhitespace(node)) {
- domUtils.remove(node)
- }
- node = txt.nextSibling
- if (node && domUtils.isWhitespace(node)) {
- domUtils.remove(node)
- }
- }
- }
- range = doParagraph(range, style, attrs, sourceCmdName)
- if (txt) {
- range.setStartBefore(txt).collapse(true)
- pN = txt.parentNode
- domUtils.remove(txt)
- if (domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN)) {
- domUtils.fillNode(this.document, pN)
- }
- }
- if (
- browser.gecko &&
- range.collapsed &&
- range.startContainer.nodeType == 1
- ) {
- var child = range.startContainer.childNodes[range.startOffset]
- if (
- child &&
- child.nodeType == 1 &&
- child.tagName.toLowerCase() == style
- ) {
- range.setStart(child, 0).collapse(true)
- }
- }
- //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了
- range.select()
- return true
- },
- queryCommandValue: function () {
- var node = domUtils.filterNodeList(
- this.selection.getStartElementPath(),
- 'p h1 h2 h3 h4 h5 h6'
- )
- return node ? node.tagName.toLowerCase() : ''
- }
- }
- }
- // plugins/directionality.js
- /**
- * 设置文字输入的方向的插件
- * @file
- * @since 1.2.6.1
- */
- ;(function () {
- var block = domUtils.isBlockElm,
- getObj = function (editor) {
- // var startNode = editor.selection.getStart(),
- // parents;
- // if ( startNode ) {
- // //查找所有的是block的父亲节点
- // parents = domUtils.findParents( startNode, true, block, true );
- // for ( var i = 0,ci; ci = parents[i++]; ) {
- // if ( ci.getAttribute( 'dir' ) ) {
- // return ci;
- // }
- // }
- // }
- return domUtils.filterNodeList(
- editor.selection.getStartElementPath(),
- function (n) {
- return n && n.nodeType == 1 && n.getAttribute('dir')
- }
- )
- },
- doDirectionality = function (range, editor, forward) {
- var bookmark,
- filterFn = function (node) {
- return node.nodeType == 1
- ? !domUtils.isBookmarkNode(node)
- : !domUtils.isWhitespace(node)
- },
- obj = getObj(editor)
- if (obj && range.collapsed) {
- obj.setAttribute('dir', forward)
- return range
- }
- bookmark = range.createBookmark()
- range.enlarge(true)
- var bookmark2 = range.createBookmark(),
- current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),
- tmpRange = range.cloneRange(),
- tmpNode
- while (
- current &&
- !(
- domUtils.getPosition(current, bookmark2.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- if (current.nodeType == 3 || !block(current)) {
- tmpRange.setStartBefore(current)
- while (current && current !== bookmark2.end && !block(current)) {
- tmpNode = current
- current = domUtils.getNextDomNode(
- current,
- false,
- null,
- function (node) {
- return !block(node)
- }
- )
- }
- tmpRange.setEndAfter(tmpNode)
- var common = tmpRange.getCommonAncestor()
- if (!domUtils.isBody(common) && block(common)) {
- //遍历到了block节点
- common.setAttribute('dir', forward)
- current = common
- } else {
- //没有遍历到,添加一个block节点
- var p = range.document.createElement('p')
- p.setAttribute('dir', forward)
- var frag = tmpRange.extractContents()
- p.appendChild(frag)
- tmpRange.insertNode(p)
- current = p
- }
- current = domUtils.getNextDomNode(current, false, filterFn)
- } else {
- current = domUtils.getNextDomNode(current, true, filterFn)
- }
- }
- return range.moveToBookmark(bookmark2).moveToBookmark(bookmark)
- }
- /**
- * 文字输入方向
- * @command directionality
- * @method execCommand
- * @param { String } cmdName 命令字符串
- * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入
- * @example
- * ```javascript
- * editor.execCommand( 'directionality', 'ltr');
- * ```
- */
- /**
- * 查询当前选区的文字输入方向
- * @command directionality
- * @method queryCommandValue
- * @param { String } cmdName 命令字符串
- * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入
- * @example
- * ```javascript
- * editor.queryCommandValue( 'directionality');
- * ```
- */
- UE.commands['directionality'] = {
- execCommand: function (cmdName, forward) {
- var range = this.selection.getRange()
- //闭合时单独处理
- if (range.collapsed) {
- var txt = this.document.createTextNode('d')
- range.insertNode(txt)
- }
- doDirectionality(range, this, forward)
- if (txt) {
- range.setStartBefore(txt).collapse(true)
- domUtils.remove(txt)
- }
- range.select()
- return true
- },
- queryCommandValue: function () {
- var node = getObj(this)
- return node ? node.getAttribute('dir') : 'ltr'
- }
- }
- })()
- // plugins/horizontal.js
- /**
- * 插入分割线插件
- * @file
- * @since 1.2.6.1
- */
- /**
- * 插入分割线
- * @command horizontal
- * @method execCommand
- * @param { String } cmdName 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'horizontal' );
- * ```
- */
- UE.plugins['horizontal'] = function () {
- var me = this
- me.commands['horizontal'] = {
- execCommand: function (cmdName) {
- var me = this
- if (me.queryCommandState(cmdName) !== -1) {
- me.execCommand('insertHtml', '<hr>')
- var range = me.selection.getRange(),
- start = range.startContainer
- if (start.nodeType == 1 && !start.childNodes[range.startOffset]) {
- var tmp
- if ((tmp = start.childNodes[range.startOffset - 1])) {
- if (tmp.nodeType == 1 && tmp.tagName == 'HR') {
- if (me.options.enterTag == 'p') {
- tmp = me.document.createElement('p')
- range.insertNode(tmp)
- range.setStart(tmp, 0).setCursor()
- } else {
- tmp = me.document.createElement('br')
- range.insertNode(tmp)
- range.setStartBefore(tmp).setCursor()
- }
- }
- }
- }
- return true
- }
- },
- //边界在table里不能加分隔线
- queryCommandState: function () {
- return domUtils.filterNodeList(
- this.selection.getStartElementPath(),
- 'table'
- )
- ? -1
- : 0
- }
- }
- // me.addListener('delkeyup',function(){
- // var rng = this.selection.getRange();
- // if(browser.ie && browser.version > 8){
- // rng.txtToElmBoundary(true);
- // if(domUtils.isStartInblock(rng)){
- // var tmpNode = rng.startContainer;
- // var pre = tmpNode.previousSibling;
- // if(pre && domUtils.isTagNode(pre,'hr')){
- // domUtils.remove(pre);
- // rng.select();
- // return;
- // }
- // }
- // }
- // if(domUtils.isBody(rng.startContainer)){
- // var hr = rng.startContainer.childNodes[rng.startOffset -1];
- // if(hr && hr.nodeName == 'HR'){
- // var next = hr.nextSibling;
- // if(next){
- // rng.setStart(next,0)
- // }else if(hr.previousSibling){
- // rng.setStartAtLast(hr.previousSibling)
- // }else{
- // var p = this.document.createElement('p');
- // hr.parentNode.insertBefore(p,hr);
- // domUtils.fillNode(this.document,p);
- // rng.setStart(p,0);
- // }
- // domUtils.remove(hr);
- // rng.setCursor(false,true);
- // }
- // }
- // })
- me.addListener('delkeydown', function (name, evt) {
- var rng = this.selection.getRange()
- rng.txtToElmBoundary(true)
- if (domUtils.isStartInblock(rng)) {
- var tmpNode = rng.startContainer
- var pre = tmpNode.previousSibling
- if (pre && domUtils.isTagNode(pre, 'hr')) {
- domUtils.remove(pre)
- rng.select()
- domUtils.preventDefault(evt)
- return true
- }
- }
- })
- }
- // plugins/time.js
- /**
- * 插入时间和日期
- * @file
- * @since 1.2.6.1
- */
- /**
- * 插入时间,默认格式:12:59:59
- * @command time
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'time');
- * ```
- */
- /**
- * 插入日期,默认格式:2013-08-30
- * @command date
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'date');
- * ```
- */
- UE.commands['time'] = UE.commands['date'] = {
- execCommand: function (cmd, format) {
- var date = new Date()
- function formatTime(date, format) {
- var hh = ('0' + date.getHours()).slice(-2),
- ii = ('0' + date.getMinutes()).slice(-2),
- ss = ('0' + date.getSeconds()).slice(-2)
- format = format || 'hh:ii:ss'
- return format
- .replace(/hh/gi, hh)
- .replace(/ii/gi, ii)
- .replace(/ss/gi, ss)
- }
- function formatDate(date, format) {
- var yyyy = ('000' + date.getFullYear()).slice(-4),
- yy = yyyy.slice(-2),
- mm = ('0' + (date.getMonth() + 1)).slice(-2),
- dd = ('0' + date.getDate()).slice(-2)
- format = format || 'yyyy-mm-dd'
- return format
- .replace(/yyyy/gi, yyyy)
- .replace(/yy/gi, yy)
- .replace(/mm/gi, mm)
- .replace(/dd/gi, dd)
- }
- this.execCommand(
- 'insertHtml',
- cmd == 'time' ? formatTime(date, format) : formatDate(date, format)
- )
- }
- }
- // plugins/rowspacing.js
- /**
- * 段前段后间距插件
- * @file
- * @since 1.2.6.1
- */
- /**
- * 设置段间距
- * @command rowspacing
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param { String } value 段间距的值,以px为单位
- * @param { String } dir 间距位置,top或bottom,分别表示段前和段后
- * @example
- * ```javascript
- * editor.execCommand( 'rowspacing', '10', 'top' );
- * ```
- */
- UE.plugins['rowspacing'] = function () {
- var me = this
- me.setOpt({
- rowspacingtop: ['5', '10', '15', '20', '25'],
- rowspacingbottom: ['5', '10', '15', '20', '25']
- })
- me.commands['rowspacing'] = {
- execCommand: function (cmdName, value, dir) {
- this.execCommand('paragraph', 'p', {
- style: 'margin-' + dir + ':' + value + 'px'
- })
- return true
- },
- queryCommandValue: function (cmdName, dir) {
- var pN = domUtils.filterNodeList(
- this.selection.getStartElementPath(),
- function (node) {
- return domUtils.isBlockElm(node)
- }
- ),
- value
- //trace:1026
- if (pN) {
- value = domUtils
- .getComputedStyle(pN, 'margin-' + dir)
- .replace(/[^\d]/g, '')
- return !value ? 0 : value
- }
- return 0
- }
- }
- }
- // plugins/lineheight.js
- /**
- * 设置行内间距
- * @file
- * @since 1.2.6.1
- */
- UE.plugins['lineheight'] = function () {
- var me = this
- me.setOpt({ lineheight: ['1', '1.5', '1.75', '2', '3', '4', '5'] })
- /**
- * 行距
- * @command lineheight
- * @method execCommand
- * @param { String } cmdName 命令字符串
- * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75
- * @example
- * ```javascript
- * editor.execCommand( 'lineheight', 1.5);
- * ```
- */
- /**
- * 查询当前选区内容的行高大小
- * @command lineheight
- * @method queryCommandValue
- * @param { String } cmd 命令字符串
- * @return { String } 返回当前行高大小
- * @example
- * ```javascript
- * editor.queryCommandValue( 'lineheight' );
- * ```
- */
- me.commands['lineheight'] = {
- execCommand: function (cmdName, value) {
- this.execCommand('paragraph', 'p', {
- style: 'line-height:' + (value == '1' ? 'normal' : value + 'em')
- })
- return true
- },
- queryCommandValue: function () {
- var pN = domUtils.filterNodeList(
- this.selection.getStartElementPath(),
- function (node) {
- return domUtils.isBlockElm(node)
- }
- )
- if (pN) {
- var value = domUtils.getComputedStyle(pN, 'line-height')
- return value == 'normal' ? 1 : value.replace(/[^\d.]*/gi, '')
- }
- }
- }
- }
- // plugins/insertcode.js
- /**
- * 插入代码插件
- * @file
- * @since 1.2.6.1
- */
- UE.plugins['insertcode'] = function () {
- var me = this
- me.ready(function () {
- utils.cssRule(
- 'pre',
- 'pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}',
- me.document
- )
- })
- me.setOpt('insertcode', {
- as3: 'ActionScript3',
- bash: 'Bash/Shell',
- cpp: 'C/C++',
- css: 'Css',
- cf: 'CodeFunction',
- 'c#': 'C#',
- delphi: 'Delphi',
- diff: 'Diff',
- erlang: 'Erlang',
- groovy: 'Groovy',
- html: 'Html',
- java: 'Java',
- jfx: 'JavaFx',
- js: 'Javascript',
- pl: 'Perl',
- php: 'Php',
- plain: 'Plain Text',
- ps: 'PowerShell',
- python: 'Python',
- ruby: 'Ruby',
- scala: 'Scala',
- sql: 'Sql',
- vb: 'Vb',
- xml: 'Xml'
- })
- /**
- * 插入代码
- * @command insertcode
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param { String } lang 插入代码的语言
- * @example
- * ```javascript
- * editor.execCommand( 'insertcode', 'javascript' );
- * ```
- */
- /**
- * 如果选区所在位置是插入插入代码区域,返回代码的语言
- * @command insertcode
- * @method queryCommandValue
- * @param { String } cmd 命令字符串
- * @return { String } 返回代码的语言
- * @example
- * ```javascript
- * editor.queryCommandValue( 'insertcode' );
- * ```
- */
- me.commands['insertcode'] = {
- execCommand: function (cmd, lang) {
- var me = this,
- rng = me.selection.getRange(),
- pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true)
- if (pre) {
- pre.className = 'brush:' + lang + ';toolbar:false;'
- } else {
- var code = ''
- if (rng.collapsed) {
- code =
- browser.ie && browser.ie11below
- ? browser.version <= 8
- ? ' '
- : ''
- : '<br/>'
- } else {
- var frag = rng.extractContents()
- var div = me.document.createElement('div')
- div.appendChild(frag)
- utils.each(
- UE.filterNode(
- UE.htmlparser(div.innerHTML.replace(/[\r\t]/g, '')),
- me.options.filterTxtRules
- ).children,
- function (node) {
- if (browser.ie && browser.ie11below && browser.version > 8) {
- if (node.type == 'element') {
- if (node.tagName == 'br') {
- code += '\n'
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function (cn) {
- if (cn.type == 'element') {
- if (cn.tagName == 'br') {
- code += '\n'
- } else if (!dtd.$empty[node.tagName]) {
- code += cn.innerText()
- }
- } else {
- code += cn.data
- }
- })
- if (!/\n$/.test(code)) {
- code += '\n'
- }
- }
- } else {
- code += node.data + '\n'
- }
- if (!node.nextSibling() && /\n$/.test(code)) {
- code = code.replace(/\n$/, '')
- }
- } else {
- if (browser.ie && browser.ie11below) {
- if (node.type == 'element') {
- if (node.tagName == 'br') {
- code += '<br>'
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function (cn) {
- if (cn.type == 'element') {
- if (cn.tagName == 'br') {
- code += '<br>'
- } else if (!dtd.$empty[node.tagName]) {
- code += cn.innerText()
- }
- } else {
- code += cn.data
- }
- })
- if (!/br>$/.test(code)) {
- code += '<br>'
- }
- }
- } else {
- code += node.data + '<br>'
- }
- if (!node.nextSibling() && /<br>$/.test(code)) {
- code = code.replace(/<br>$/, '')
- }
- } else {
- code +=
- node.type == 'element'
- ? dtd.$empty[node.tagName]
- ? ''
- : node.innerText()
- : node.data
- if (!/br\/?\s*>$/.test(code)) {
- if (!node.nextSibling()) return
- code += '<br>'
- }
- }
- }
- }
- )
- }
- me.execCommand(
- 'inserthtml',
- '<pre id="coder"class="brush:' +
- lang +
- ';toolbar:false">' +
- code +
- '</pre>',
- true
- )
- pre = me.document.getElementById('coder')
- domUtils.removeAttributes(pre, 'id')
- var tmpNode = pre.previousSibling
- if (
- tmpNode &&
- ((tmpNode.nodeType == 3 &&
- tmpNode.nodeValue.length == 1 &&
- browser.ie &&
- browser.version == 6) ||
- domUtils.isEmptyBlock(tmpNode))
- ) {
- domUtils.remove(tmpNode)
- }
- var rng = me.selection.getRange()
- if (domUtils.isEmptyBlock(pre)) {
- rng.setStart(pre, 0).setCursor(false, true)
- } else {
- rng.selectNodeContents(pre).select()
- }
- }
- },
- queryCommandValue: function () {
- var path = this.selection.getStartElementPath()
- var lang = ''
- utils.each(path, function (node) {
- if (node.nodeName == 'PRE') {
- var match = node.className.match(/brush:([^;]+)/)
- lang = match && match[1] ? match[1] : ''
- return false
- }
- })
- return lang
- }
- }
- me.addInputRule(function (root) {
- utils.each(root.getNodesByTagName('pre'), function (pre) {
- var brs = pre.getNodesByTagName('br')
- if (brs.length) {
- browser.ie &&
- browser.ie11below &&
- browser.version > 8 &&
- utils.each(brs, function (br) {
- var txt = UE.uNode.createText('\n')
- br.parentNode.insertBefore(txt, br)
- br.parentNode.removeChild(br)
- })
- return
- }
- if (browser.ie && browser.ie11below && browser.version > 8) return
- var code = pre.innerText().split(/\n/)
- pre.innerHTML('')
- utils.each(code, function (c) {
- if (c.length) {
- pre.appendChild(UE.uNode.createText(c))
- }
- pre.appendChild(UE.uNode.createElement('br'))
- })
- })
- })
- me.addOutputRule(function (root) {
- utils.each(root.getNodesByTagName('pre'), function (pre) {
- var code = ''
- utils.each(pre.children, function (n) {
- if (n.type == 'text') {
- //在ie下文本内容有可能末尾带有\n要去掉
- //trace:3396
- code += n.data.replace(/[ ]/g, ' ').replace(/\n$/, '')
- } else {
- if (n.tagName == 'br') {
- code += '\n'
- } else {
- code += !dtd.$empty[n.tagName] ? '' : n.innerText()
- }
- }
- })
- pre.innerText(code.replace(/( |\n)+$/, ''))
- })
- })
- //不需要判断highlight的command列表
- me.notNeedCodeQuery = {
- help: 1,
- undo: 1,
- redo: 1,
- source: 1,
- print: 1,
- searchreplace: 1,
- fullscreen: 1,
- preview: 1,
- insertparagraph: 1,
- elementpath: 1,
- insertcode: 1,
- inserthtml: 1,
- selectall: 1
- }
- //将queyCommamndState重置
- var orgQuery = me.queryCommandState
- me.queryCommandState = function (cmd) {
- var me = this
- if (
- !me.notNeedCodeQuery[cmd.toLowerCase()] &&
- me.selection &&
- me.queryCommandValue('insertcode')
- ) {
- return -1
- }
- return UE.Editor.prototype.queryCommandState.apply(this, arguments)
- }
- me.addListener('beforeenterkeydown', function () {
- var rng = me.selection.getRange()
- var pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true)
- if (pre) {
- me.fireEvent('saveScene')
- if (!rng.collapsed) {
- rng.deleteContents()
- }
- if (!browser.ie || browser.ie9above) {
- var tmpNode = me.document.createElement('br'),
- pre
- rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true)
- var next = tmpNode.nextSibling
- if (!next && (!browser.ie || browser.version > 10)) {
- rng.insertNode(tmpNode.cloneNode(false))
- } else {
- rng.setStartAfter(tmpNode)
- }
- pre = tmpNode.previousSibling
- var tmp
- while (pre) {
- tmp = pre
- pre = pre.previousSibling
- if (!pre || pre.nodeName == 'BR') {
- pre = tmp
- break
- }
- }
- if (pre) {
- var str = ''
- while (
- pre &&
- pre.nodeName != 'BR' &&
- new RegExp('^[\\s' + domUtils.fillChar + ']*$').test(
- pre.nodeValue
- )
- ) {
- str += pre.nodeValue
- pre = pre.nextSibling
- }
- if (pre.nodeName != 'BR') {
- var match = pre.nodeValue.match(
- new RegExp('^([\\s' + domUtils.fillChar + ']+)')
- )
- if (match && match[1]) {
- str += match[1]
- }
- }
- if (str) {
- str = me.document.createTextNode(str)
- rng.insertNode(str).setStartAfter(str)
- }
- }
- rng.collapse(true).select(true)
- } else {
- if (browser.version > 8) {
- var txt = me.document.createTextNode('\n')
- var start = rng.startContainer
- if (rng.startOffset == 0) {
- var preNode = start.previousSibling
- if (preNode) {
- rng.insertNode(txt)
- var fillchar = me.document.createTextNode(' ')
- rng
- .setStartAfter(txt)
- .insertNode(fillchar)
- .setStart(fillchar, 0)
- .collapse(true)
- .select(true)
- }
- } else {
- rng.insertNode(txt).setStartAfter(txt)
- var fillchar = me.document.createTextNode(' ')
- start = rng.startContainer.childNodes[rng.startOffset]
- if (start && !/^\n/.test(start.nodeValue)) {
- rng.setStartBefore(txt)
- }
- rng
- .insertNode(fillchar)
- .setStart(fillchar, 0)
- .collapse(true)
- .select(true)
- }
- } else {
- var tmpNode = me.document.createElement('br')
- rng.insertNode(tmpNode)
- rng.insertNode(me.document.createTextNode(domUtils.fillChar))
- rng.setStartAfter(tmpNode)
- pre = tmpNode.previousSibling
- var tmp
- while (pre) {
- tmp = pre
- pre = pre.previousSibling
- if (!pre || pre.nodeName == 'BR') {
- pre = tmp
- break
- }
- }
- if (pre) {
- var str = ''
- while (
- pre &&
- pre.nodeName != 'BR' &&
- new RegExp('^[ ' + domUtils.fillChar + ']*$').test(
- pre.nodeValue
- )
- ) {
- str += pre.nodeValue
- pre = pre.nextSibling
- }
- if (pre.nodeName != 'BR') {
- var match = pre.nodeValue.match(
- new RegExp('^([ ' + domUtils.fillChar + ']+)')
- )
- if (match && match[1]) {
- str += match[1]
- }
- }
- str = me.document.createTextNode(str)
- rng.insertNode(str).setStartAfter(str)
- }
- rng.collapse(true).select()
- }
- }
- me.fireEvent('saveScene')
- return true
- }
- })
- me.addListener('tabkeydown', function (cmd, evt) {
- var rng = me.selection.getRange()
- var pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true)
- if (pre) {
- me.fireEvent('saveScene')
- if (evt.shiftKey) {
- } else {
- if (!rng.collapsed) {
- var bk = rng.createBookmark()
- var start = bk.start.previousSibling
- while (start) {
- if (pre.firstChild === start && !domUtils.isBr(start)) {
- pre.insertBefore(me.document.createTextNode(' '), start)
- break
- }
- if (domUtils.isBr(start)) {
- pre.insertBefore(
- me.document.createTextNode(' '),
- start.nextSibling
- )
- break
- }
- start = start.previousSibling
- }
- var end = bk.end
- start = bk.start.nextSibling
- if (pre.firstChild === bk.start) {
- pre.insertBefore(
- me.document.createTextNode(' '),
- start.nextSibling
- )
- }
- while (start && start !== end) {
- if (domUtils.isBr(start) && start.nextSibling) {
- if (start.nextSibling === end) {
- break
- }
- pre.insertBefore(
- me.document.createTextNode(' '),
- start.nextSibling
- )
- }
- start = start.nextSibling
- }
- rng.moveToBookmark(bk).select()
- } else {
- var tmpNode = me.document.createTextNode(' ')
- rng
- .insertNode(tmpNode)
- .setStartAfter(tmpNode)
- .collapse(true)
- .select(true)
- }
- }
- me.fireEvent('saveScene')
- return true
- }
- })
- me.addListener('beforeinserthtml', function (evtName, html) {
- var me = this,
- rng = me.selection.getRange(),
- pre = domUtils.findParentByTagName(rng.startContainer, 'pre', true)
- if (pre) {
- if (!rng.collapsed) {
- rng.deleteContents()
- }
- var htmlstr = ''
- if (browser.ie && browser.version > 8) {
- utils.each(
- UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules)
- .children,
- function (node) {
- if (node.type == 'element') {
- if (node.tagName == 'br') {
- htmlstr += '\n'
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function (cn) {
- if (cn.type == 'element') {
- if (cn.tagName == 'br') {
- htmlstr += '\n'
- } else if (!dtd.$empty[node.tagName]) {
- htmlstr += cn.innerText()
- }
- } else {
- htmlstr += cn.data
- }
- })
- if (!/\n$/.test(htmlstr)) {
- htmlstr += '\n'
- }
- }
- } else {
- htmlstr += node.data + '\n'
- }
- if (!node.nextSibling() && /\n$/.test(htmlstr)) {
- htmlstr = htmlstr.replace(/\n$/, '')
- }
- }
- )
- var tmpNode = me.document.createTextNode(
- utils.html(htmlstr.replace(/ /g, ' '))
- )
- rng.insertNode(tmpNode).selectNode(tmpNode).select()
- } else {
- var frag = me.document.createDocumentFragment()
- utils.each(
- UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules)
- .children,
- function (node) {
- if (node.type == 'element') {
- if (node.tagName == 'br') {
- frag.appendChild(me.document.createElement('br'))
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function (cn) {
- if (cn.type == 'element') {
- if (cn.tagName == 'br') {
- frag.appendChild(me.document.createElement('br'))
- } else if (!dtd.$empty[node.tagName]) {
- frag.appendChild(
- me.document.createTextNode(
- utils.html(cn.innerText().replace(/ /g, ' '))
- )
- )
- }
- } else {
- frag.appendChild(
- me.document.createTextNode(
- utils.html(cn.data.replace(/ /g, ' '))
- )
- )
- }
- })
- if (frag.lastChild.nodeName != 'BR') {
- frag.appendChild(me.document.createElement('br'))
- }
- }
- } else {
- frag.appendChild(
- me.document.createTextNode(
- utils.html(node.data.replace(/ /g, ' '))
- )
- )
- }
- if (!node.nextSibling() && frag.lastChild.nodeName == 'BR') {
- frag.removeChild(frag.lastChild)
- }
- }
- )
- rng.insertNode(frag).select()
- }
- return true
- }
- })
- //方向键的处理
- me.addListener('keydown', function (cmd, evt) {
- var me = this,
- keyCode = evt.keyCode || evt.which
- if (keyCode == 40) {
- var rng = me.selection.getRange(),
- pre,
- start = rng.startContainer
- if (
- rng.collapsed &&
- (pre = domUtils.findParentByTagName(
- rng.startContainer,
- 'pre',
- true
- )) &&
- !pre.nextSibling
- ) {
- var last = pre.lastChild
- while (last && last.nodeName == 'BR') {
- last = last.previousSibling
- }
- if (
- last === start ||
- (rng.startContainer === pre &&
- rng.startOffset == pre.childNodes.length)
- ) {
- me.execCommand('insertparagraph')
- domUtils.preventDefault(evt)
- }
- }
- }
- })
- //trace:3395
- me.addListener('delkeydown', function (type, evt) {
- var rng = this.selection.getRange()
- rng.txtToElmBoundary(true)
- var start = rng.startContainer
- if (
- domUtils.isTagNode(start, 'pre') &&
- rng.collapsed &&
- domUtils.isStartInblock(rng)
- ) {
- var p = me.document.createElement('p')
- domUtils.fillNode(me.document, p)
- start.parentNode.insertBefore(p, start)
- domUtils.remove(start)
- rng.setStart(p, 0).setCursor(false, true)
- domUtils.preventDefault(evt)
- return true
- }
- })
- }
- // plugins/cleardoc.js
- /**
- * 清空文档插件
- * @file
- * @since 1.2.6.1
- */
- /**
- * 清空文档
- * @command cleardoc
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * //editor 是编辑器实例
- * editor.execCommand('cleardoc');
- * ```
- */
- UE.commands['cleardoc'] = {
- execCommand: function (cmdName) {
- var me = this,
- enterTag = me.options.enterTag,
- range = me.selection.getRange()
- if (enterTag == 'br') {
- me.body.innerHTML = '<br/>'
- range.setStart(me.body, 0).setCursor()
- } else {
- me.body.innerHTML = '<p>' + (ie ? '' : '<br/>') + '</p>'
- range.setStart(me.body.firstChild, 0).setCursor(false, true)
- }
- setTimeout(function () {
- me.fireEvent('clearDoc')
- }, 0)
- }
- }
- // plugins/anchor.js
- /**
- * 锚点插件,为UEditor提供插入锚点支持
- * @file
- * @since 1.2.6.1
- */
- UE.plugin.register('anchor', function () {
- return {
- bindEvents: {
- ready: function () {
- utils.cssRule(
- 'anchor',
- ".anchorclass{background: url('" +
- this.options.themePath +
- this.options.theme +
- "/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}",
- this.document
- )
- }
- },
- outputRule: function (root) {
- utils.each(root.getNodesByTagName('img'), function (a) {
- var val
- if ((val = a.getAttr('anchorname'))) {
- a.tagName = 'a'
- a.setAttr({
- anchorname: '',
- name: val,
- class: ''
- })
- }
- })
- },
- inputRule: function (root) {
- utils.each(root.getNodesByTagName('a'), function (a) {
- var val
- if ((val = a.getAttr('name')) && !a.getAttr('href')) {
- a.tagName = 'img'
- a.setAttr({
- anchorname: a.getAttr('name'),
- class: 'anchorclass'
- })
- a.setAttr('name')
- }
- })
- },
- commands: {
- /**
- * 插入锚点
- * @command anchor
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param { String } name 锚点名称字符串
- * @example
- * ```javascript
- * //editor 是编辑器实例
- * editor.execCommand('anchor', 'anchor1');
- * ```
- */
- anchor: {
- execCommand: function (cmd, name) {
- var range = this.selection.getRange(),
- img = range.getClosedNode()
- if (img && img.getAttribute('anchorname')) {
- if (name) {
- img.setAttribute('anchorname', name)
- } else {
- range.setStartBefore(img).setCursor()
- domUtils.remove(img)
- }
- } else {
- if (name) {
- //只在选区的开始插入
- var anchor = this.document.createElement('img')
- range.collapse(true)
- domUtils.setAttributes(anchor, {
- anchorname: name,
- class: 'anchorclass'
- })
- range
- .insertNode(anchor)
- .setStartAfter(anchor)
- .setCursor(false, true)
- }
- }
- }
- }
- }
- }
- })
- // plugins/wordcount.js
- ///import core
- ///commands 字数统计
- ///commandsName WordCount,wordCount
- ///commandsTitle 字数统计
- /*
- * Created by JetBrains WebStorm.
- * User: taoqili
- * Date: 11-9-7
- * Time: 下午8:18
- * To change this template use File | Settings | File Templates.
- */
- UE.plugins['wordcount'] = function () {
- var me = this
- me.setOpt('wordCount', true)
- me.addListener('contentchange', function () {
- me.fireEvent('wordcount')
- })
- var timer
- me.addListener('ready', function () {
- var me = this
- domUtils.on(me.body, 'keyup', function (evt) {
- var code = evt.keyCode || evt.which,
- //忽略的按键,ctr,alt,shift,方向键
- ignores = { 16: 1, 18: 1, 20: 1, 37: 1, 38: 1, 39: 1, 40: 1 }
- if (code in ignores) return
- clearTimeout(timer)
- timer = setTimeout(function () {
- me.fireEvent('wordcount')
- }, 200)
- })
- })
- }
- // plugins/pagebreak.js
- /**
- * 分页功能插件
- * @file
- * @since 1.2.6.1
- */
- UE.plugins['pagebreak'] = function () {
- var me = this,
- notBreakTags = ['td']
- me.setOpt('pageBreakTag', '_ueditor_page_break_tag_')
- function fillNode(node) {
- if (domUtils.isEmptyBlock(node)) {
- var firstChild = node.firstChild,
- tmpNode
- while (
- firstChild &&
- firstChild.nodeType == 1 &&
- domUtils.isEmptyBlock(firstChild)
- ) {
- tmpNode = firstChild
- firstChild = firstChild.firstChild
- }
- !tmpNode && (tmpNode = node)
- domUtils.fillNode(me.document, tmpNode)
- }
- }
- //分页符样式添加
- me.ready(function () {
- utils.cssRule(
- 'pagebreak',
- '.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}',
- me.document
- )
- })
- function isHr(node) {
- return (
- node &&
- node.nodeType == 1 &&
- node.tagName == 'HR' &&
- node.className == 'pagebreak'
- )
- }
- me.addInputRule(function (root) {
- root.traversal(function (node) {
- if (node.type == 'text' && node.data == me.options.pageBreakTag) {
- var hr = UE.uNode.createElement(
- '<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">'
- )
- node.parentNode.insertBefore(hr, node)
- node.parentNode.removeChild(node)
- }
- })
- })
- me.addOutputRule(function (node) {
- utils.each(node.getNodesByTagName('hr'), function (n) {
- if (n.getAttr('class') == 'pagebreak') {
- var txt = UE.uNode.createText(me.options.pageBreakTag)
- n.parentNode.insertBefore(txt, n)
- n.parentNode.removeChild(n)
- }
- })
- })
- /**
- * 插入分页符
- * @command pagebreak
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @remind 在表格中插入分页符会把表格切分成两部分
- * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串,
- * 以便于提交数据到服务器端后处理分页。
- * @example
- * ```javascript
- * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak
- * ```
- */
- me.commands['pagebreak'] = {
- execCommand: function () {
- var range = me.selection.getRange(),
- hr = me.document.createElement('hr')
- domUtils.setAttributes(hr, {
- class: 'pagebreak',
- noshade: 'noshade',
- size: '5'
- })
- domUtils.unSelectable(hr)
- //table单独处理
- var node = domUtils.findParentByTagName(
- range.startContainer,
- notBreakTags,
- true
- ),
- parents = [],
- pN
- if (node) {
- switch (node.tagName) {
- case 'TD':
- pN = node.parentNode
- if (!pN.previousSibling) {
- var table = domUtils.findParentByTagName(pN, 'table')
- // var tableWrapDiv = table.parentNode;
- // if(tableWrapDiv && tableWrapDiv.nodeType == 1
- // && tableWrapDiv.tagName == 'DIV'
- // && tableWrapDiv.getAttribute('dropdrag')
- // ){
- // domUtils.remove(tableWrapDiv,true);
- // }
- table.parentNode.insertBefore(hr, table)
- parents = domUtils.findParents(hr, true)
- } else {
- pN.parentNode.insertBefore(hr, pN)
- parents = domUtils.findParents(hr)
- }
- pN = parents[1]
- if (hr !== pN) {
- domUtils.breakParent(hr, pN)
- }
- //table要重写绑定一下拖拽
- me.fireEvent('afteradjusttable', me.document)
- }
- } else {
- if (!range.collapsed) {
- range.deleteContents()
- var start = range.startContainer
- while (
- !domUtils.isBody(start) &&
- domUtils.isBlockElm(start) &&
- domUtils.isEmptyNode(start)
- ) {
- range.setStartBefore(start).collapse(true)
- domUtils.remove(start)
- start = range.startContainer
- }
- }
- range.insertNode(hr)
- var pN = hr.parentNode,
- nextNode
- while (!domUtils.isBody(pN)) {
- domUtils.breakParent(hr, pN)
- nextNode = hr.nextSibling
- if (nextNode && domUtils.isEmptyBlock(nextNode)) {
- domUtils.remove(nextNode)
- }
- pN = hr.parentNode
- }
- nextNode = hr.nextSibling
- var pre = hr.previousSibling
- if (isHr(pre)) {
- domUtils.remove(pre)
- } else {
- pre && fillNode(pre)
- }
- if (!nextNode) {
- var p = me.document.createElement('p')
- hr.parentNode.appendChild(p)
- domUtils.fillNode(me.document, p)
- range.setStart(p, 0).collapse(true)
- } else {
- if (isHr(nextNode)) {
- domUtils.remove(nextNode)
- } else {
- fillNode(nextNode)
- }
- range.setEndAfter(hr).collapse(false)
- }
- range.select(true)
- }
- }
- }
- }
- // plugins/wordimage.js
- ///import core
- ///commands 本地图片引导上传
- ///commandsName WordImage
- ///commandsTitle 本地图片引导上传
- ///commandsDialog dialogs\wordimage
- UE.plugin.register('wordimage', function () {
- var me = this,
- images = []
- return {
- commands: {
- wordimage: {
- execCommand: function () {
- var images = domUtils.getElementsByTagName(me.body, 'img')
- var urlList = []
- for (var i = 0, ci; (ci = images[i++]); ) {
- var url = ci.getAttribute('word_img')
- url && urlList.push(url)
- }
- return urlList
- },
- queryCommandState: function () {
- images = domUtils.getElementsByTagName(me.body, 'img')
- for (var i = 0, ci; (ci = images[i++]); ) {
- if (ci.getAttribute('word_img')) {
- return 1
- }
- }
- return -1
- },
- notNeedUndo: true
- }
- },
- inputRule: function (root) {
- utils.each(root.getNodesByTagName('img'), function (img) {
- var attrs = img.attrs,
- flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43,
- opt = me.options,
- src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'
- if (attrs['src'] && /^(?:(file:\/+))/.test(attrs['src'])) {
- img.setAttr({
- width: attrs.width,
- height: attrs.height,
- alt: attrs.alt,
- word_img: attrs.src,
- src: src,
- style:
- 'background:url(' +
- (flag
- ? opt.themePath + opt.theme + '/images/word.gif'
- : opt.langPath + opt.lang + '/images/localimage.png') +
- ') no-repeat center center;border:1px solid #ddd'
- })
- }
- })
- }
- }
- })
- // plugins/dragdrop.js
- UE.plugins['dragdrop'] = function () {
- var me = this
- me.ready(function () {
- domUtils.on(this.body, 'dragend', function () {
- var rng = me.selection.getRange()
- var node = rng.getClosedNode() || me.selection.getStart()
- if (node && node.tagName == 'IMG') {
- var pre = node.previousSibling,
- next
- while ((next = node.nextSibling)) {
- if (
- next.nodeType == 1 &&
- next.tagName == 'SPAN' &&
- !next.firstChild
- ) {
- domUtils.remove(next)
- } else {
- break
- }
- }
- if (
- ((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre)) ||
- !pre) &&
- (!next || (next && !domUtils.isEmptyBlock(next)))
- ) {
- if (pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)) {
- pre.appendChild(node)
- domUtils.moveChild(next, pre)
- domUtils.remove(next)
- } else if (
- next &&
- next.tagName == 'P' &&
- !domUtils.isEmptyBlock(next)
- ) {
- next.insertBefore(node, next.firstChild)
- }
- if (pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)) {
- domUtils.remove(pre)
- }
- if (next && next.tagName == 'P' && domUtils.isEmptyBlock(next)) {
- domUtils.remove(next)
- }
- rng.selectNode(node).select()
- me.fireEvent('saveScene')
- }
- }
- })
- })
- me.addListener('keyup', function (type, evt) {
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 13) {
- var rng = me.selection.getRange(),
- node
- if (
- (node = domUtils.findParentByTagName(rng.startContainer, 'p', true))
- ) {
- if (domUtils.getComputedStyle(node, 'text-align') == 'center') {
- domUtils.removeStyle(node, 'text-align')
- }
- }
- }
- })
- }
- // plugins/undo.js
- /**
- * undo redo
- * @file
- * @since 1.2.6.1
- */
- /**
- * 撤销上一次执行的命令
- * @command undo
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'undo' );
- * ```
- */
- /**
- * 重做上一次执行的命令
- * @command redo
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @example
- * ```javascript
- * editor.execCommand( 'redo' );
- * ```
- */
- UE.plugins['undo'] = function () {
- var saveSceneTimer
- var me = this,
- maxUndoCount = me.options.maxUndoCount || 20,
- maxInputCount = me.options.maxInputCount || 20,
- fillchar = new RegExp(domUtils.fillChar + '|</hr>', 'gi') // ie会产生多余的</hr>
- var noNeedFillCharTags = {
- ol: 1,
- ul: 1,
- table: 1,
- tbody: 1,
- tr: 1,
- body: 1
- }
- var orgState = me.options.autoClearEmptyNode
- function compareAddr(indexA, indexB) {
- if (indexA.length != indexB.length) return 0
- for (var i = 0, l = indexA.length; i < l; i++) {
- if (indexA[i] != indexB[i]) return 0
- }
- return 1
- }
- function compareRangeAddress(rngAddrA, rngAddrB) {
- if (rngAddrA.collapsed != rngAddrB.collapsed) {
- return 0
- }
- if (
- !compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) ||
- !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)
- ) {
- return 0
- }
- return 1
- }
- function UndoManager() {
- this.list = []
- this.index = 0
- this.hasUndo = false
- this.hasRedo = false
- this.undo = function () {
- if (this.hasUndo) {
- if (!this.list[this.index - 1] && this.list.length == 1) {
- this.reset()
- return
- }
- while (
- this.list[this.index].content == this.list[this.index - 1].content
- ) {
- this.index--
- if (this.index == 0) {
- return this.restore(0)
- }
- }
- this.restore(--this.index)
- }
- }
- this.redo = function () {
- if (this.hasRedo) {
- while (
- this.list[this.index].content == this.list[this.index + 1].content
- ) {
- this.index++
- if (this.index == this.list.length - 1) {
- return this.restore(this.index)
- }
- }
- this.restore(++this.index)
- }
- }
- this.restore = function () {
- var me = this.editor
- var scene = this.list[this.index]
- var root = UE.htmlparser(scene.content.replace(fillchar, ''))
- me.options.autoClearEmptyNode = false
- me.filterInputRule(root)
- me.options.autoClearEmptyNode = orgState
- //trace:873
- //去掉展位符
- me.document.body.innerHTML = root.toHtml()
- me.fireEvent('afterscencerestore')
- //处理undo后空格不展位的问题
- if (browser.ie) {
- utils.each(
- domUtils.getElementsByTagName(me.document, 'td th caption p'),
- function (node) {
- if (domUtils.isEmptyNode(node)) {
- domUtils.fillNode(me.document, node)
- }
- }
- )
- }
- try {
- var rng = new dom.Range(me.document).moveToAddress(scene.address)
- rng.select(
- noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]
- )
- } catch (e) {}
- this.update()
- this.clearKey()
- //不能把自己reset了
- me.fireEvent('reset', true)
- }
- this.getScene = function () {
- var me = this.editor
- var rng = me.selection.getRange(),
- rngAddress = rng.createAddress(false, true)
- me.fireEvent('beforegetscene')
- var root = UE.htmlparser(me.body.innerHTML)
- me.options.autoClearEmptyNode = false
- me.filterOutputRule(root)
- me.options.autoClearEmptyNode = orgState
- var cont = root.toHtml()
- //trace:3461
- //这个会引起回退时导致空格丢失的情况
- // browser.ie && (cont = cont.replace(/> </g, '><').replace(/\s*</g, '<').replace(/>\s*/g, '>'));
- me.fireEvent('aftergetscene')
- return {
- address: rngAddress,
- content: cont
- }
- }
- this.save = function (notCompareRange, notSetCursor) {
- clearTimeout(saveSceneTimer)
- var currentScene = this.getScene(notSetCursor),
- lastScene = this.list[this.index]
- if (lastScene && lastScene.content != currentScene.content) {
- me.trigger('contentchange')
- }
- //内容相同位置相同不存
- if (
- lastScene &&
- lastScene.content == currentScene.content &&
- (notCompareRange
- ? 1
- : compareRangeAddress(lastScene.address, currentScene.address))
- ) {
- return
- }
- this.list = this.list.slice(0, this.index + 1)
- this.list.push(currentScene)
- //如果大于最大数量了,就把最前的剔除
- if (this.list.length > maxUndoCount) {
- this.list.shift()
- }
- this.index = this.list.length - 1
- this.clearKey()
- //跟新undo/redo状态
- this.update()
- }
- this.update = function () {
- this.hasRedo = !!this.list[this.index + 1]
- this.hasUndo = !!this.list[this.index - 1]
- }
- this.reset = function () {
- this.list = []
- this.index = 0
- this.hasUndo = false
- this.hasRedo = false
- this.clearKey()
- }
- this.clearKey = function () {
- keycont = 0
- lastKeyCode = null
- }
- }
- me.undoManger = new UndoManager()
- me.undoManger.editor = me
- function saveScene() {
- this.undoManger.save()
- }
- me.addListener('saveScene', function () {
- var args = Array.prototype.splice.call(arguments, 1)
- this.undoManger.save.apply(this.undoManger, args)
- })
- // me.addListener('beforeexeccommand', saveScene);
- // me.addListener('afterexeccommand', saveScene);
- me.addListener('reset', function (type, exclude) {
- if (!exclude) {
- this.undoManger.reset()
- }
- })
- me.commands['redo'] = me.commands['undo'] = {
- execCommand: function (cmdName) {
- this.undoManger[cmdName]()
- },
- queryCommandState: function (cmdName) {
- return this.undoManger[
- 'has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')
- ]
- ? 0
- : -1
- },
- notNeedUndo: 1
- }
- var keys = {
- // /*Backspace*/ 8:1, /*Delete*/ 46:1,
- /*Shift*/ 16: 1,
- /*Ctrl*/ 17: 1,
- /*Alt*/ 18: 1,
- 37: 1,
- 38: 1,
- 39: 1,
- 40: 1
- },
- keycont = 0,
- lastKeyCode
- //输入法状态下不计算字符数
- var inputType = false
- me.addListener('ready', function () {
- domUtils.on(this.body, 'compositionstart', function () {
- inputType = true
- })
- domUtils.on(this.body, 'compositionend', function () {
- inputType = false
- })
- })
- //快捷键
- me.addshortcutkey({
- Undo: 'ctrl+90', //undo
- Redo: 'ctrl+89' //redo
- })
- var isCollapsed = true
- me.addListener('keydown', function (type, evt) {
- var me = this
- var keyCode = evt.keyCode || evt.which
- if (
- !keys[keyCode] &&
- !evt.ctrlKey &&
- !evt.metaKey &&
- !evt.shiftKey &&
- !evt.altKey
- ) {
- if (inputType) return
- if (!me.selection.getRange().collapsed) {
- me.undoManger.save(false, true)
- isCollapsed = false
- return
- }
- if (me.undoManger.list.length == 0) {
- me.undoManger.save(true)
- }
- clearTimeout(saveSceneTimer)
- function save(cont) {
- cont.undoManger.save(false, true)
- cont.fireEvent('selectionchange')
- }
- saveSceneTimer = setTimeout(function () {
- if (inputType) {
- var interalTimer = setInterval(function () {
- if (!inputType) {
- save(me)
- clearInterval(interalTimer)
- }
- }, 300)
- return
- }
- save(me)
- }, 200)
- lastKeyCode = keyCode
- keycont++
- if (keycont >= maxInputCount) {
- save(me)
- }
- }
- })
- me.addListener('keyup', function (type, evt) {
- var keyCode = evt.keyCode || evt.which
- if (
- !keys[keyCode] &&
- !evt.ctrlKey &&
- !evt.metaKey &&
- !evt.shiftKey &&
- !evt.altKey
- ) {
- if (inputType) return
- if (!isCollapsed) {
- this.undoManger.save(false, true)
- isCollapsed = true
- }
- }
- })
- //扩展实例,添加关闭和开启命令undo
- me.stopCmdUndo = function () {
- me.__hasEnterExecCommand = true
- }
- me.startCmdUndo = function () {
- me.__hasEnterExecCommand = false
- }
- }
- // plugins/copy.js
- UE.plugin.register('copy', function () {
- var me = this
- function initZeroClipboard() {
- ZeroClipboard.config({
- debug: false,
- swfPath:
- me.options.UEDITOR_HOME_URL +
- 'third-party/zeroclipboard/ZeroClipboard.swf'
- })
- var client = (me.zeroclipboard = new ZeroClipboard())
- // 复制内容
- client.on('copy', function (e) {
- var client = e.client,
- rng = me.selection.getRange(),
- div = document.createElement('div')
- div.appendChild(rng.cloneContents())
- client.setText(div.innerText || div.textContent)
- client.setHtml(div.innerHTML)
- rng.select()
- })
- // hover事件传递到target
- client.on('mouseover mouseout', function (e) {
- var target = e.target
- if (e.type == 'mouseover') {
- domUtils.addClass(target, 'edui-state-hover')
- } else if (e.type == 'mouseout') {
- domUtils.removeClasses(target, 'edui-state-hover')
- }
- })
- // flash加载不成功
- client.on('wrongflash noflash', function () {
- ZeroClipboard.destroy()
- })
- }
- return {
- bindEvents: {
- ready: function () {
- if (!browser.ie) {
- if (window.ZeroClipboard) {
- initZeroClipboard()
- } else {
- utils.loadFile(
- document,
- {
- src:
- me.options.UEDITOR_HOME_URL +
- 'third-party/zeroclipboard/ZeroClipboard.js',
- tag: 'script',
- type: 'text/javascript',
- defer: 'defer'
- },
- function () {
- initZeroClipboard()
- }
- )
- }
- }
- }
- },
- commands: {
- copy: {
- execCommand: function (cmd) {
- if (!me.document.execCommand('copy')) {
- alert(me.getLang('copymsg'))
- }
- }
- }
- }
- }
- })
- // plugins/paste.js
- ///import core
- ///import plugins/inserthtml.js
- ///import plugins/undo.js
- ///import plugins/serialize.js
- ///commands 粘贴
- ///commandsName PastePlain
- ///commandsTitle 纯文本粘贴模式
- /**
- * @description 粘贴
- * @author zhanyi
- */
- UE.plugins['paste'] = function () {
- function getClipboardData(callback) {
- var doc = this.document
- if (doc.getElementById('baidu_pastebin')) {
- return
- }
- var range = this.selection.getRange(),
- bk = range.createBookmark(),
- //创建剪贴的容器div
- pastebin = doc.createElement('div')
- pastebin.id = 'baidu_pastebin'
- // Safari 要求div必须有内容,才能粘贴内容进来
- browser.webkit &&
- pastebin.appendChild(
- doc.createTextNode(domUtils.fillChar + domUtils.fillChar)
- )
- doc.body.appendChild(pastebin)
- //trace:717 隐藏的span不能得到top
- //bk.start.innerHTML = ' ';
- bk.start.style.display = ''
- pastebin.style.cssText =
- 'position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:' +
- //要在现在光标平行的位置加入,否则会出现跳动的问题
- domUtils.getXY(bk.start).y +
- 'px'
- range.selectNodeContents(pastebin).select(true)
- setTimeout(function () {
- if (browser.webkit) {
- for (
- var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi;
- (pi = pastebins[i++]);
- ) {
- if (domUtils.isEmptyNode(pi)) {
- domUtils.remove(pi)
- } else {
- pastebin = pi
- break
- }
- }
- }
- try {
- pastebin.parentNode.removeChild(pastebin)
- } catch (e) {}
- range.moveToBookmark(bk).select(true)
- callback(pastebin)
- }, 0)
- }
- var me = this
- me.setOpt({
- retainOnlyLabelPasted: false
- })
- var txtContent, htmlContent, address
- function getPureHtml(html) {
- return html.replace(
- /<(\/?)([\w\-]+)([^>]*)>/gi,
- function (a, b, tagName, attrs) {
- tagName = tagName.toLowerCase()
- if ({ img: 1 }[tagName]) {
- return a
- }
- attrs = attrs.replace(
- /([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,
- function (str, atr, val) {
- if (
- {
- src: 1,
- href: 1,
- name: 1
- }[atr.toLowerCase()]
- ) {
- return atr + '=' + val + ' '
- }
- return ''
- }
- )
- if (
- {
- span: 1,
- div: 1
- }[tagName]
- ) {
- return ''
- } else {
- return '<' + b + tagName + ' ' + utils.trim(attrs) + '>'
- }
- }
- )
- }
- function filter(div) {
- var html
- if (div.firstChild) {
- //去掉cut中添加的边界值
- var nodes = domUtils.getElementsByTagName(div, 'span')
- for (var i = 0, ni; (ni = nodes[i++]); ) {
- if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') {
- domUtils.remove(ni)
- }
- }
- if (browser.webkit) {
- var brs = div.querySelectorAll('div br')
- for (var i = 0, bi; (bi = brs[i++]); ) {
- var pN = bi.parentNode
- if (pN.tagName == 'DIV' && pN.childNodes.length == 1) {
- pN.innerHTML = '<p><br/></p>'
- domUtils.remove(pN)
- }
- }
- var divs = div.querySelectorAll('#baidu_pastebin')
- for (var i = 0, di; (di = divs[i++]); ) {
- var tmpP = me.document.createElement('p')
- di.parentNode.insertBefore(tmpP, di)
- while (di.firstChild) {
- tmpP.appendChild(di.firstChild)
- }
- domUtils.remove(di)
- }
- var metas = div.querySelectorAll('meta')
- for (var i = 0, ci; (ci = metas[i++]); ) {
- domUtils.remove(ci)
- }
- var brs = div.querySelectorAll('br')
- for (i = 0; (ci = brs[i++]); ) {
- if (/^apple-/i.test(ci.className)) {
- domUtils.remove(ci)
- }
- }
- }
- if (browser.gecko) {
- var dirtyNodes = div.querySelectorAll('[_moz_dirty]')
- for (i = 0; (ci = dirtyNodes[i++]); ) {
- ci.removeAttribute('_moz_dirty')
- }
- }
- if (!browser.ie) {
- var spans = div.querySelectorAll('span.Apple-style-span')
- for (var i = 0, ci; (ci = spans[i++]); ) {
- domUtils.remove(ci, true)
- }
- }
- //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉
- html = div.innerHTML //.replace(/>(?:(\s| )*?)</g,'><');
- //过滤word粘贴过来的冗余属性
- html = UE.filterWord(html)
- //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签
- var root = UE.htmlparser(html)
- //如果给了过滤规则就先进行过滤
- if (me.options.filterRules) {
- UE.filterNode(root, me.options.filterRules)
- }
- //执行默认的处理
- me.filterInputRule(root)
- //针对chrome的处理
- if (browser.webkit) {
- var br = root.lastChild()
- if (br && br.type == 'element' && br.tagName == 'br') {
- root.removeChild(br)
- }
- utils.each(me.body.querySelectorAll('div'), function (node) {
- if (domUtils.isEmptyBlock(node)) {
- domUtils.remove(node, true)
- }
- })
- }
- html = { html: root.toHtml() }
- me.fireEvent('beforepaste', html, root)
- //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴
- if (!html.html) {
- return
- }
- root = UE.htmlparser(html.html, true)
- //如果开启了纯文本模式
- if (me.queryCommandState('pasteplain') === 1) {
- me.execCommand(
- 'insertHtml',
- UE.filterNode(root, me.options.filterTxtRules).toHtml(),
- true
- )
- } else {
- //文本模式
- UE.filterNode(root, me.options.filterTxtRules)
- txtContent = root.toHtml()
- //完全模式
- htmlContent = html.html
- address = me.selection.getRange().createAddress(true)
- me.execCommand(
- 'insertHtml',
- me.getOpt('retainOnlyLabelPasted') === true
- ? getPureHtml(htmlContent)
- : htmlContent,
- true
- )
- }
- me.fireEvent('afterpaste', html)
- }
- }
- me.addListener('pasteTransfer', function (cmd, plainType) {
- if (address && txtContent && htmlContent && txtContent != htmlContent) {
- var range = me.selection.getRange()
- range.moveToAddress(address, true)
- if (!range.collapsed) {
- while (!domUtils.isBody(range.startContainer)) {
- var start = range.startContainer
- if (start.nodeType == 1) {
- start = start.childNodes[range.startOffset]
- if (!start) {
- range.setStartBefore(range.startContainer)
- continue
- }
- var pre = start.previousSibling
- if (
- pre &&
- pre.nodeType == 3 &&
- new RegExp('^[\n\r\t ' + domUtils.fillChar + ']*$').test(
- pre.nodeValue
- )
- ) {
- range.setStartBefore(pre)
- }
- }
- if (range.startOffset == 0) {
- range.setStartBefore(range.startContainer)
- } else {
- break
- }
- }
- while (!domUtils.isBody(range.endContainer)) {
- var end = range.endContainer
- if (end.nodeType == 1) {
- end = end.childNodes[range.endOffset]
- if (!end) {
- range.setEndAfter(range.endContainer)
- continue
- }
- var next = end.nextSibling
- if (
- next &&
- next.nodeType == 3 &&
- new RegExp('^[\n\r\t' + domUtils.fillChar + ']*$').test(
- next.nodeValue
- )
- ) {
- range.setEndAfter(next)
- }
- }
- if (
- range.endOffset ==
- range.endContainer[
- range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'
- ].length
- ) {
- range.setEndAfter(range.endContainer)
- } else {
- break
- }
- }
- }
- range.deleteContents()
- range.select(true)
- me.__hasEnterExecCommand = true
- var html = htmlContent
- if (plainType === 2) {
- html = getPureHtml(html)
- } else if (plainType) {
- html = txtContent
- }
- me.execCommand('inserthtml', html, true)
- me.__hasEnterExecCommand = false
- var rng = me.selection.getRange()
- while (
- !domUtils.isBody(rng.startContainer) &&
- !rng.startOffset &&
- rng.startContainer[
- rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'
- ].length
- ) {
- rng.setStartBefore(rng.startContainer)
- }
- var tmpAddress = rng.createAddress(true)
- address.endAddress = tmpAddress.startAddress
- }
- })
- me.addListener('ready', function () {
- domUtils.on(me.body, 'cut', function () {
- var range = me.selection.getRange()
- if (!range.collapsed && me.undoManger) {
- me.undoManger.save()
- }
- })
- //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理
- domUtils.on(
- me.body,
- browser.ie || browser.opera ? 'keydown' : 'paste',
- function (e) {
- if (
- (browser.ie || browser.opera) &&
- ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')
- ) {
- return
- }
- getClipboardData.call(me, function (div) {
- filter(div)
- })
- }
- )
- })
- me.commands['paste'] = {
- execCommand: function (cmd) {
- if (browser.ie) {
- getClipboardData.call(me, function (div) {
- filter(div)
- })
- me.document.execCommand('paste')
- } else {
- alert(me.getLang('pastemsg'))
- }
- }
- }
- }
- // plugins/puretxtpaste.js
-
- UE.plugins['pasteplain'] = function () {
- var me = this
- me.setOpt({
- pasteplain: false,
- filterTxtRules: (function () {
- function transP(node) {
- node.tagName = 'p'
- node.setStyle()
- }
- function removeNode(node) {
- node.parentNode.removeChild(node, true)
- }
- return {
-
- '-': 'script style object iframe embed input select',
- p: { $: {} },
- br: { $: {} },
- div: function (node) {
- var tmpNode,
- p = UE.uNode.createElement('p')
- while ((tmpNode = node.firstChild())) {
- if (
- tmpNode.type == 'text' ||
- !UE.dom.dtd.$block[tmpNode.tagName]
- ) {
- p.appendChild(tmpNode)
- } else {
- if (p.firstChild()) {
- node.parentNode.insertBefore(p, node)
- p = UE.uNode.createElement('p')
- } else {
- node.parentNode.insertBefore(tmpNode, node)
- }
- }
- }
- if (p.firstChild()) {
- node.parentNode.insertBefore(p, node)
- }
- node.parentNode.removeChild(node)
- },
- ol: removeNode,
- ul: removeNode,
- dl: removeNode,
- dt: removeNode,
- dd: removeNode,
- li: removeNode,
- caption: transP,
- th: transP,
- tr: transP,
- h1: transP,
- h2: transP,
- h3: transP,
- h4: transP,
- h5: transP,
- h6: transP,
- td: function (node) {
-
- var txt = !!node.innerText()
- if (txt) {
- node.parentNode.insertAfter(
- UE.uNode.createText(' '),
- node
- )
- }
- node.parentNode.removeChild(node, node.innerText())
- }
- }
- })()
- })
-
- var pasteplain = me.options.pasteplain
-
-
- me.commands['pasteplain'] = {
- queryCommandState: function () {
- return pasteplain ? 1 : 0
- },
- execCommand: function () {
- pasteplain = !pasteplain | 0
- },
- notNeedUndo: 1
- }
- }
-
-
- UE.plugins['list'] = function () {
- var me = this,
- notExchange = {
- TD: 1,
- PRE: 1,
- BLOCKQUOTE: 1
- }
- var customStyle = {
- cn: 'cn-1-',
- cn1: 'cn-2-',
- cn2: 'cn-3-',
- num: 'num-1-',
- num1: 'num-2-',
- num2: 'num-3-',
- dash: 'dash',
- dot: 'dot'
- }
- me.setOpt({
- autoTransWordToList: false,
- insertorderedlist: {
- num: '',
- num1: '',
- num2: '',
- cn: '',
- cn1: '',
- cn2: '',
- decimal: '',
- 'lower-alpha': '',
- 'lower-roman': '',
- 'upper-alpha': '',
- 'upper-roman': ''
- },
- insertunorderedlist: {
- circle: '',
- disc: '',
- square: '',
- dash: '',
- dot: ''
- },
- listDefaultPaddingLeft: '30',
- listiconpath: 'http://bs.baidu.com/listicon/',
- maxListLevel: -1,
- disablePInList: false
- })
- function listToArray(list) {
- var arr = []
- for (var p in list) {
- arr.push(p)
- }
- return arr
- }
- var listStyle = {
- OL: listToArray(me.options.insertorderedlist),
- UL: listToArray(me.options.insertunorderedlist)
- }
- var liiconpath = me.options.listiconpath
-
- for (var s in customStyle) {
- if (
- !me.options.insertorderedlist.hasOwnProperty(s) &&
- !me.options.insertunorderedlist.hasOwnProperty(s)
- ) {
- delete customStyle[s]
- }
- }
- me.ready(function () {
- var customCss = []
- for (var p in customStyle) {
- if (p == 'dash' || p == 'dot') {
- customCss.push(
- 'li.list-' +
- customStyle[p] +
- '{background-image:url(' +
- liiconpath +
- customStyle[p] +
- '.gif)}'
- )
- customCss.push(
- 'ul.custom_' +
- p +
- '{list-style:none;}ul.custom_' +
- p +
- ' li{background-position:0 3px;background-repeat:no-repeat}'
- )
- } else {
- for (var i = 0; i < 99; i++) {
- customCss.push(
- 'li.list-' +
- customStyle[p] +
- i +
- '{background-image:url(' +
- liiconpath +
- 'list-' +
- customStyle[p] +
- i +
- '.gif)}'
- )
- }
- customCss.push(
- 'ol.custom_' +
- p +
- '{list-style:none;}ol.custom_' +
- p +
- ' li{background-position:0 3px;background-repeat:no-repeat}'
- )
- }
- switch (p) {
- case 'cn':
- customCss.push('li.list-' + p + '-paddingleft-1{padding-left:25px}')
- customCss.push('li.list-' + p + '-paddingleft-2{padding-left:40px}')
- customCss.push('li.list-' + p + '-paddingleft-3{padding-left:55px}')
- break
- case 'cn1':
- customCss.push('li.list-' + p + '-paddingleft-1{padding-left:30px}')
- customCss.push('li.list-' + p + '-paddingleft-2{padding-left:40px}')
- customCss.push('li.list-' + p + '-paddingleft-3{padding-left:55px}')
- break
- case 'cn2':
- customCss.push('li.list-' + p + '-paddingleft-1{padding-left:40px}')
- customCss.push('li.list-' + p + '-paddingleft-2{padding-left:55px}')
- customCss.push('li.list-' + p + '-paddingleft-3{padding-left:68px}')
- break
- case 'num':
- case 'num1':
- customCss.push('li.list-' + p + '-paddingleft-1{padding-left:25px}')
- break
- case 'num2':
- customCss.push('li.list-' + p + '-paddingleft-1{padding-left:35px}')
- customCss.push('li.list-' + p + '-paddingleft-2{padding-left:40px}')
- break
- case 'dash':
- customCss.push('li.list-' + p + '-paddingleft{padding-left:35px}')
- break
- case 'dot':
- customCss.push('li.list-' + p + '-paddingleft{padding-left:20px}')
- }
- }
- customCss.push('.list-paddingleft-1{padding-left:0}')
- customCss.push(
- '.list-paddingleft-2{padding-left:' +
- me.options.listDefaultPaddingLeft +
- 'px}'
- )
- customCss.push(
- '.list-paddingleft-3{padding-left:' +
- me.options.listDefaultPaddingLeft * 2 +
- 'px}'
- )
-
- utils.cssRule(
- 'list',
- 'ol,ul{margin:0;pading:0;' +
- (browser.ie ? '' : 'width:95%') +
- '}li{clear:both;}' +
- customCss.join('\n'),
- me.document
- )
- })
-
- me.ready(function () {
- domUtils.on(me.body, 'cut', function () {
- setTimeout(function () {
- var rng = me.selection.getRange(),
- li
-
- if (!rng.collapsed) {
- if (
- (li = domUtils.findParentByTagName(
- rng.startContainer,
- 'li',
- true
- ))
- ) {
- if (!li.nextSibling && domUtils.isEmptyBlock(li)) {
- var pn = li.parentNode,
- node
- if ((node = pn.previousSibling)) {
- domUtils.remove(pn)
- rng.setStartAtLast(node).collapse(true)
- rng.select(true)
- } else if ((node = pn.nextSibling)) {
- domUtils.remove(pn)
- rng.setStartAtFirst(node).collapse(true)
- rng.select(true)
- } else {
- var tmpNode = me.document.createElement('p')
- domUtils.fillNode(me.document, tmpNode)
- pn.parentNode.insertBefore(tmpNode, pn)
- domUtils.remove(pn)
- rng.setStart(tmpNode, 0).collapse(true)
- rng.select(true)
- }
- }
- }
- }
- })
- })
- })
- function getStyle(node) {
- var cls = node.className
- if (domUtils.hasClass(node, /custom_/)) {
- return cls.match(/custom_(\w+)/)[1]
- }
- return domUtils.getStyle(node, 'list-style-type')
- }
- me.addListener('beforepaste', function (type, html) {
- var me = this,
- rng = me.selection.getRange(),
- li
- var root = UE.htmlparser(html.html, true)
- if ((li = domUtils.findParentByTagName(rng.startContainer, 'li', true))) {
- var list = li.parentNode,
- tagName = list.tagName == 'OL' ? 'ul' : 'ol'
- utils.each(root.getNodesByTagName(tagName), function (n) {
- n.tagName = list.tagName
- n.setAttr()
- if (n.parentNode === root) {
- type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc')
- } else {
- var className = n.parentNode.getAttr('class')
- if (className && /custom_/.test(className)) {
- type = className.match(/custom_(\w+)/)[1]
- } else {
- type = n.parentNode.getStyle('list-style-type')
- }
- if (!type) {
- type = list.tagName == 'OL' ? 'decimal' : 'disc'
- }
- }
- var index = utils.indexOf(listStyle[list.tagName], type)
- if (n.parentNode !== root)
- index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1
- var currentStyle = listStyle[list.tagName][index]
- if (customStyle[currentStyle]) {
- n.setAttr('class', 'custom_' + currentStyle)
- } else {
- n.setStyle('list-style-type', currentStyle)
- }
- })
- }
- html.html = root.toHtml()
- })
-
- me.getOpt('disablePInList') === true &&
- me.addOutputRule(function (root) {
- utils.each(root.getNodesByTagName('li'), function (li) {
- var newChildrens = [],
- index = 0
- utils.each(li.children, function (n) {
- if (n.tagName == 'p') {
- var tmpNode
- while ((tmpNode = n.children.pop())) {
- newChildrens.splice(index, 0, tmpNode)
- tmpNode.parentNode = li
- lastNode = tmpNode
- }
- tmpNode = newChildrens[newChildrens.length - 1]
- if (
- !tmpNode ||
- tmpNode.type != 'element' ||
- tmpNode.tagName != 'br'
- ) {
- var br = UE.uNode.createElement('br')
- br.parentNode = li
- newChildrens.push(br)
- }
- index = newChildrens.length
- }
- })
- if (newChildrens.length) {
- li.children = newChildrens
- }
- })
- })
-
- me.addInputRule(function (root) {
- utils.each(root.getNodesByTagName('li'), function (li) {
- var tmpP = UE.uNode.createElement('p')
- for (var i = 0, ci; (ci = li.children[i]); ) {
- if (ci.type == 'text' || dtd.p[ci.tagName]) {
- tmpP.appendChild(ci)
- } else {
- if (tmpP.firstChild()) {
- li.insertBefore(tmpP, ci)
- tmpP = UE.uNode.createElement('p')
- i = i + 2
- } else {
- i++
- }
- }
- }
- if ((tmpP.firstChild() && !tmpP.parentNode) || !li.firstChild()) {
- li.appendChild(tmpP)
- }
-
-
- if (!tmpP.firstChild()) {
- tmpP.innerHTML(browser.ie ? ' ' : '<br/>')
- }
-
- var p = li.firstChild()
- var lastChild = p.lastChild()
- if (
- lastChild &&
- lastChild.type == 'text' &&
- /^\s*$/.test(lastChild.data)
- ) {
- p.removeChild(lastChild)
- }
- })
- if (me.options.autoTransWordToList) {
- var orderlisttype = {
- num1: /^\d+\)/,
- decimal: /^\d+\./,
- 'lower-alpha': /^[a-z]+\)/,
- 'upper-alpha': /^[A-Z]+\./,
- cn: /^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,
- cn2: /^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/
- },
- unorderlisttype = {
- square: 'n'
- }
- function checkListType(content, container) {
- var span = container.firstChild()
- if (
- span &&
- span.type == 'element' &&
- span.tagName == 'span' &&
- /Wingdings|Symbol/.test(span.getStyle('font-family'))
- ) {
- for (var p in unorderlisttype) {
- if (unorderlisttype[p] == span.data) {
- return p
- }
- }
- return 'disc'
- }
- for (var p in orderlisttype) {
- if (orderlisttype[p].test(content)) {
- return p
- }
- }
- }
- utils.each(root.getNodesByTagName('p'), function (node) {
- if (node.getAttr('class') != 'MsoListParagraph') {
- return
- }
-
- node.setStyle('margin', '')
- node.setStyle('margin-left', '')
- node.setAttr('class', '')
- function appendLi(list, p, type) {
- if (list.tagName == 'ol') {
- if (browser.ie) {
- var first = p.firstChild()
- if (
- first.type == 'element' &&
- first.tagName == 'span' &&
- orderlisttype[type].test(first.innerText())
- ) {
- p.removeChild(first)
- }
- } else {
- p.innerHTML(p.innerHTML().replace(orderlisttype[type], ''))
- }
- } else {
- p.removeChild(p.firstChild())
- }
- var li = UE.uNode.createElement('li')
- li.appendChild(p)
- list.appendChild(li)
- }
- var tmp = node,
- type,
- cacheNode = node
- if (
- node.parentNode.tagName != 'li' &&
- (type = checkListType(node.innerText(), node))
- ) {
- var list = UE.uNode.createElement(
- me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul'
- )
- if (customStyle[type]) {
- list.setAttr('class', 'custom_' + type)
- } else {
- list.setStyle('list-style-type', type)
- }
- while (
- node &&
- node.parentNode.tagName != 'li' &&
- checkListType(node.innerText(), node)
- ) {
- tmp = node.nextSibling()
- if (!tmp) {
- node.parentNode.insertBefore(list, node)
- }
- appendLi(list, node, type)
- node = tmp
- }
- if (!list.parentNode && node && node.parentNode) {
- node.parentNode.insertBefore(list, node)
- }
- }
- var span = cacheNode.firstChild()
- if (
- span &&
- span.type == 'element' &&
- span.tagName == 'span' &&
- /^\s*( )+\s*$/.test(span.innerText())
- ) {
- span.parentNode.removeChild(span)
- }
- })
- }
- })
-
- me.addListener('contentchange', function () {
- adjustListStyle(me.document)
- })
- function adjustListStyle(doc, ignore) {
- utils.each(domUtils.getElementsByTagName(doc, 'ol ul'), function (node) {
- if (!domUtils.inDoc(node, doc)) return
- var parent = node.parentNode
- if (parent.tagName == node.tagName) {
- var nodeStyleType =
- getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'),
- parentStyleType =
- getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc')
- if (nodeStyleType == parentStyleType) {
- var styleIndex = utils.indexOf(
- listStyle[node.tagName],
- nodeStyleType
- )
- styleIndex =
- styleIndex + 1 == listStyle[node.tagName].length
- ? 0
- : styleIndex + 1
- setListStyle(node, listStyle[node.tagName][styleIndex])
- }
- }
- var index = 0,
- type = 2
- if (domUtils.hasClass(node, /custom_/)) {
- if (
- !(
- /[ou]l/i.test(parent.tagName) &&
- domUtils.hasClass(parent, /custom_/)
- )
- ) {
- type = 1
- }
- } else {
- if (
- /[ou]l/i.test(parent.tagName) &&
- domUtils.hasClass(parent, /custom_/)
- ) {
- type = 3
- }
- }
- var style = domUtils.getStyle(node, 'list-style-type')
- style && (node.style.cssText = 'list-style-type:' + style)
- node.className =
- utils.trim(node.className.replace(/list-paddingleft-\w+/, '')) +
- ' list-paddingleft-' +
- type
- utils.each(domUtils.getElementsByTagName(node, 'li'), function (li) {
- li.style.cssText && (li.style.cssText = '')
- if (!li.firstChild) {
- domUtils.remove(li)
- return
- }
- if (li.parentNode !== node) {
- return
- }
- index++
- if (domUtils.hasClass(node, /custom_/)) {
- var paddingLeft = 1,
- currentStyle = getStyle(node)
- if (node.tagName == 'OL') {
- if (currentStyle) {
- switch (currentStyle) {
- case 'cn':
- case 'cn1':
- case 'cn2':
- if (
- index > 10 &&
- (index % 10 == 0 || (index > 10 && index < 20))
- ) {
- paddingLeft = 2
- } else if (index > 20) {
- paddingLeft = 3
- }
- break
- case 'num2':
- if (index > 9) {
- paddingLeft = 2
- }
- }
- }
- li.className =
- 'list-' +
- customStyle[currentStyle] +
- index +
- ' ' +
- 'list-' +
- currentStyle +
- '-paddingleft-' +
- paddingLeft
- } else {
- li.className =
- 'list-' +
- customStyle[currentStyle] +
- ' ' +
- 'list-' +
- currentStyle +
- '-paddingleft'
- }
- } else {
- li.className = li.className.replace(/list-[\w\-]+/gi, '')
- }
- var className = li.getAttribute('class')
- if (className !== null && !className.replace(/\s/g, '')) {
- domUtils.removeAttributes(li, 'class')
- }
- })
- !ignore &&
- adjustList(
- node,
- node.tagName.toLowerCase(),
- getStyle(node) || domUtils.getStyle(node, 'list-style-type'),
- true
- )
- })
- }
- function adjustList(list, tag, style, ignoreEmpty) {
- var nextList = list.nextSibling
- if (
- nextList &&
- nextList.nodeType == 1 &&
- nextList.tagName.toLowerCase() == tag &&
- (getStyle(nextList) ||
- domUtils.getStyle(nextList, 'list-style-type') ||
- (tag == 'ol' ? 'decimal' : 'disc')) == style
- ) {
- domUtils.moveChild(nextList, list)
- if (nextList.childNodes.length == 0) {
- domUtils.remove(nextList)
- }
- }
- if (nextList && domUtils.isFillChar(nextList)) {
- domUtils.remove(nextList)
- }
- var preList = list.previousSibling
- if (
- preList &&
- preList.nodeType == 1 &&
- preList.tagName.toLowerCase() == tag &&
- (getStyle(preList) ||
- domUtils.getStyle(preList, 'list-style-type') ||
- (tag == 'ol' ? 'decimal' : 'disc')) == style
- ) {
- domUtils.moveChild(list, preList)
- }
- if (preList && domUtils.isFillChar(preList)) {
- domUtils.remove(preList)
- }
- !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list)
- if (getStyle(list)) {
- adjustListStyle(list.ownerDocument, true)
- }
- }
- function setListStyle(list, style) {
- if (customStyle[style]) {
- list.className = 'custom_' + style
- }
- try {
- domUtils.setStyle(list, 'list-style-type', style)
- } catch (e) {}
- }
- function clearEmptySibling(node) {
- var tmpNode = node.previousSibling
- if (tmpNode && domUtils.isEmptyBlock(tmpNode)) {
- domUtils.remove(tmpNode)
- }
- tmpNode = node.nextSibling
- if (tmpNode && domUtils.isEmptyBlock(tmpNode)) {
- domUtils.remove(tmpNode)
- }
- }
- me.addListener('keydown', function (type, evt) {
- function preventAndSave() {
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false)
- me.fireEvent('contentchange')
- me.undoManger && me.undoManger.save()
- }
- function findList(node, filterFn) {
- while (node && !domUtils.isBody(node)) {
- if (filterFn(node)) {
- return null
- }
- if (node.nodeType == 1 && /[ou]l/i.test(node.tagName)) {
- return node
- }
- node = node.parentNode
- }
- return null
- }
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 13 && !evt.shiftKey) {
-
- var rng = me.selection.getRange(),
- parent = domUtils.findParent(
- rng.startContainer,
- function (node) {
- return domUtils.isBlockElm(node)
- },
- true
- ),
- li = domUtils.findParentByTagName(rng.startContainer, 'li', true)
- if (parent && parent.tagName != 'PRE' && !li) {
- var html = parent.innerHTML.replace(
- new RegExp(domUtils.fillChar, 'g'),
- ''
- )
- if (/^\s*1\s*\.[^\d]/.test(html)) {
- parent.innerHTML = html.replace(/^\s*1\s*\./, '')
- rng.setStartAtLast(parent).collapse(true).select()
- me.__hasEnterExecCommand = true
- me.execCommand('insertorderedlist')
- me.__hasEnterExecCommand = false
- }
- }
- var range = me.selection.getRange(),
- start = findList(range.startContainer, function (node) {
- return node.tagName == 'TABLE'
- }),
- end = range.collapsed
- ? start
- : findList(range.endContainer, function (node) {
- return node.tagName == 'TABLE'
- })
- if (start && end && start === end) {
- if (!range.collapsed) {
- start = domUtils.findParentByTagName(
- range.startContainer,
- 'li',
- true
- )
- end = domUtils.findParentByTagName(range.endContainer, 'li', true)
- if (start && end && start === end) {
- range.deleteContents()
- li = domUtils.findParentByTagName(
- range.startContainer,
- 'li',
- true
- )
- if (li && domUtils.isEmptyBlock(li)) {
- pre = li.previousSibling
- next = li.nextSibling
- p = me.document.createElement('p')
- domUtils.fillNode(me.document, p)
- parentList = li.parentNode
- if (pre && next) {
- range.setStart(next, 0).collapse(true).select(true)
- domUtils.remove(li)
- } else {
- if ((!pre && !next) || !pre) {
- parentList.parentNode.insertBefore(p, parentList)
- } else {
- li.parentNode.parentNode.insertBefore(
- p,
- parentList.nextSibling
- )
- }
- domUtils.remove(li)
- if (!parentList.firstChild) {
- domUtils.remove(parentList)
- }
- range.setStart(p, 0).setCursor()
- }
- preventAndSave()
- return
- }
- } else {
- var tmpRange = range.cloneRange(),
- bk = tmpRange.collapse(false).createBookmark()
- range.deleteContents()
- tmpRange.moveToBookmark(bk)
- var li = domUtils.findParentByTagName(
- tmpRange.startContainer,
- 'li',
- true
- )
- clearEmptySibling(li)
- tmpRange.select()
- preventAndSave()
- return
- }
- }
- li = domUtils.findParentByTagName(range.startContainer, 'li', true)
- if (li) {
- if (domUtils.isEmptyBlock(li)) {
- bk = range.createBookmark()
- var parentList = li.parentNode
- if (li !== parentList.lastChild) {
- domUtils.breakParent(li, parentList)
- clearEmptySibling(li)
- } else {
- parentList.parentNode.insertBefore(li, parentList.nextSibling)
- if (domUtils.isEmptyNode(parentList)) {
- domUtils.remove(parentList)
- }
- }
-
- if (!dtd.$list[li.parentNode.tagName]) {
- if (!domUtils.isBlockElm(li.firstChild)) {
- p = me.document.createElement('p')
- li.parentNode.insertBefore(p, li)
- while (li.firstChild) {
- p.appendChild(li.firstChild)
- }
- domUtils.remove(li)
- } else {
- domUtils.remove(li, true)
- }
- }
- range.moveToBookmark(bk).select()
- } else {
- var first = li.firstChild
- if (!first || !domUtils.isBlockElm(first)) {
- var p = me.document.createElement('p')
- !li.firstChild && domUtils.fillNode(me.document, p)
- while (li.firstChild) {
- p.appendChild(li.firstChild)
- }
- li.appendChild(p)
- first = p
- }
- var span = me.document.createElement('span')
- range.insertNode(span)
- domUtils.breakParent(span, li)
- var nextLi = span.nextSibling
- first = nextLi.firstChild
- if (!first) {
- p = me.document.createElement('p')
- domUtils.fillNode(me.document, p)
- nextLi.appendChild(p)
- first = p
- }
- if (domUtils.isEmptyNode(first)) {
- first.innerHTML = ''
- domUtils.fillNode(me.document, first)
- }
- range.setStart(first, 0).collapse(true).shrinkBoundary().select()
- domUtils.remove(span)
- var pre = nextLi.previousSibling
- if (pre && domUtils.isEmptyBlock(pre)) {
- pre.innerHTML = '<p></p>'
- domUtils.fillNode(me.document, pre.firstChild)
- }
- }
-
- preventAndSave()
- }
- }
- }
- if (keyCode == 8) {
-
- range = me.selection.getRange()
- if (range.collapsed && domUtils.isStartInblock(range)) {
- tmpRange = range.cloneRange().trimBoundary()
- li = domUtils.findParentByTagName(range.startContainer, 'li', true)
-
- if (li && domUtils.isStartInblock(tmpRange)) {
- start = domUtils.findParentByTagName(
- range.startContainer,
- 'p',
- true
- )
- if (start && start !== li.firstChild) {
- var parentList = domUtils.findParentByTagName(start, ['ol', 'ul'])
- domUtils.breakParent(start, parentList)
- clearEmptySibling(start)
- me.fireEvent('contentchange')
- range.setStart(start, 0).setCursor(false, true)
- me.fireEvent('saveScene')
- domUtils.preventDefault(evt)
- return
- }
- if (li && (pre = li.previousSibling)) {
- if (keyCode == 46 && li.childNodes.length) {
- return
- }
-
- if (dtd.$list[pre.tagName]) {
- pre = pre.lastChild
- }
- me.undoManger && me.undoManger.save()
- first = li.firstChild
- if (domUtils.isBlockElm(first)) {
- if (domUtils.isEmptyNode(first)) {
-
- pre.appendChild(first)
- range.setStart(first, 0).setCursor(false, true)
-
- while (li.firstChild) {
- pre.appendChild(li.firstChild)
- }
- } else {
- span = me.document.createElement('span')
- range.insertNode(span)
-
- if (domUtils.isEmptyBlock(pre)) {
- pre.innerHTML = ''
- }
- domUtils.moveChild(li, pre)
- range.setStartBefore(span).collapse(true).select(true)
- domUtils.remove(span)
- }
- } else {
- if (domUtils.isEmptyNode(li)) {
- var p = me.document.createElement('p')
- pre.appendChild(p)
- range.setStart(p, 0).setCursor()
-
- } else {
- range
- .setEnd(pre, pre.childNodes.length)
- .collapse()
- .select(true)
- while (li.firstChild) {
- pre.appendChild(li.firstChild)
- }
- }
- }
- domUtils.remove(li)
- me.fireEvent('contentchange')
- me.fireEvent('saveScene')
- domUtils.preventDefault(evt)
- return
- }
-
- if (li && !li.previousSibling) {
- var parentList = li.parentNode
- var bk = range.createBookmark()
- if (domUtils.isTagNode(parentList.parentNode, 'ol ul')) {
- parentList.parentNode.insertBefore(li, parentList)
- if (domUtils.isEmptyNode(parentList)) {
- domUtils.remove(parentList)
- }
- } else {
- while (li.firstChild) {
- parentList.parentNode.insertBefore(li.firstChild, parentList)
- }
- domUtils.remove(li)
- if (domUtils.isEmptyNode(parentList)) {
- domUtils.remove(parentList)
- }
- }
- range.moveToBookmark(bk).setCursor(false, true)
- me.fireEvent('contentchange')
- me.fireEvent('saveScene')
- domUtils.preventDefault(evt)
- return
- }
- }
- }
- }
- })
- me.addListener('keyup', function (type, evt) {
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 8) {
- var rng = me.selection.getRange(),
- list
- if (
- (list = domUtils.findParentByTagName(
- rng.startContainer,
- ['ol', 'ul'],
- true
- ))
- ) {
- adjustList(
- list,
- list.tagName.toLowerCase(),
- getStyle(list) ||
- domUtils.getComputedStyle(list, 'list-style-type'),
- true
- )
- }
- }
- })
-
- me.addListener('tabkeydown', function () {
- var range = me.selection.getRange()
-
- function checkLevel(li) {
- if (me.options.maxListLevel != -1) {
- var level = li.parentNode,
- levelNum = 0
- while (/[ou]l/i.test(level.tagName)) {
- levelNum++
- level = level.parentNode
- }
- if (levelNum >= me.options.maxListLevel) {
- return true
- }
- }
- }
-
-
- var li = domUtils.findParentByTagName(range.startContainer, 'li', true)
- if (li) {
- var bk
- if (range.collapsed) {
- if (checkLevel(li)) return true
- var parentLi = li.parentNode,
- list = me.document.createElement(parentLi.tagName),
- index = utils.indexOf(
- listStyle[list.tagName],
- getStyle(parentLi) ||
- domUtils.getComputedStyle(parentLi, 'list-style-type')
- )
- index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1
- var currentStyle = listStyle[list.tagName][index]
- setListStyle(list, currentStyle)
- if (domUtils.isStartInblock(range)) {
- me.fireEvent('saveScene')
- bk = range.createBookmark()
- parentLi.insertBefore(list, li)
- list.appendChild(li)
- adjustList(list, list.tagName.toLowerCase(), currentStyle)
- me.fireEvent('contentchange')
- range.moveToBookmark(bk).select(true)
- return true
- }
- } else {
- me.fireEvent('saveScene')
- bk = range.createBookmark()
- for (
- var i = 0, closeList, parents = domUtils.findParents(li), ci;
- (ci = parents[i++]);
- ) {
- if (domUtils.isTagNode(ci, 'ol ul')) {
- closeList = ci
- break
- }
- }
- var current = li
- if (bk.end) {
- while (
- current &&
- !(
- domUtils.getPosition(current, bk.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- if (checkLevel(current)) {
- current = domUtils.getNextDomNode(
- current,
- false,
- null,
- function (node) {
- return node !== closeList
- }
- )
- continue
- }
- var parentLi = current.parentNode,
- list = me.document.createElement(parentLi.tagName),
- index = utils.indexOf(
- listStyle[list.tagName],
- getStyle(parentLi) ||
- domUtils.getComputedStyle(parentLi, 'list-style-type')
- )
- var currentIndex =
- index + 1 == listStyle[list.tagName].length ? 0 : index + 1
- var currentStyle = listStyle[list.tagName][currentIndex]
- setListStyle(list, currentStyle)
- parentLi.insertBefore(list, current)
- while (
- current &&
- !(
- domUtils.getPosition(current, bk.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- li = current.nextSibling
- list.appendChild(current)
- if (!li || domUtils.isTagNode(li, 'ol ul')) {
- if (li) {
- while ((li = li.firstChild)) {
- if (li.tagName == 'LI') {
- break
- }
- }
- } else {
- li = domUtils.getNextDomNode(
- current,
- false,
- null,
- function (node) {
- return node !== closeList
- }
- )
- }
- break
- }
- current = li
- }
- adjustList(list, list.tagName.toLowerCase(), currentStyle)
- current = li
- }
- }
- me.fireEvent('contentchange')
- range.moveToBookmark(bk).select()
- return true
- }
- }
- })
- function getLi(start) {
- while (start && !domUtils.isBody(start)) {
- if (start.nodeName == 'TABLE') {
- return null
- }
- if (start.nodeName == 'LI') {
- return start
- }
- start = start.parentNode
- }
- }
-
-
-
-
-
-
- me.commands['insertorderedlist'] = me.commands['insertunorderedlist'] = {
- execCommand: function (command, style) {
- if (!style) {
- style =
- command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'
- }
- var me = this,
- range = this.selection.getRange(),
- filterFn = function (node) {
- return node.nodeType == 1
- ? node.tagName.toLowerCase() != 'br'
- : !domUtils.isWhitespace(node)
- },
- tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul',
- frag = me.document.createDocumentFragment()
-
-
- range.adjustmentBoundary().shrinkBoundary()
- var bko = range.createBookmark(true),
- start = getLi(me.document.getElementById(bko.start)),
- modifyStart = 0,
- end = getLi(me.document.getElementById(bko.end)),
- modifyEnd = 0,
- startParent,
- endParent,
- list,
- tmp
- if (start || end) {
- start && (startParent = start.parentNode)
- if (!bko.end) {
- end = start
- }
- end && (endParent = end.parentNode)
- if (startParent === endParent) {
- while (start !== end) {
- tmp = start
- start = start.nextSibling
- if (!domUtils.isBlockElm(tmp.firstChild)) {
- var p = me.document.createElement('p')
- while (tmp.firstChild) {
- p.appendChild(tmp.firstChild)
- }
- tmp.appendChild(p)
- }
- frag.appendChild(tmp)
- }
- tmp = me.document.createElement('span')
- startParent.insertBefore(tmp, end)
- if (!domUtils.isBlockElm(end.firstChild)) {
- p = me.document.createElement('p')
- while (end.firstChild) {
- p.appendChild(end.firstChild)
- }
- end.appendChild(p)
- }
- frag.appendChild(end)
- domUtils.breakParent(tmp, startParent)
- if (domUtils.isEmptyNode(tmp.previousSibling)) {
- domUtils.remove(tmp.previousSibling)
- }
- if (domUtils.isEmptyNode(tmp.nextSibling)) {
- domUtils.remove(tmp.nextSibling)
- }
- var nodeStyle =
- getStyle(startParent) ||
- domUtils.getComputedStyle(startParent, 'list-style-type') ||
- (command.toLowerCase() == 'insertorderedlist'
- ? 'decimal'
- : 'disc')
- if (
- startParent.tagName.toLowerCase() == tag &&
- nodeStyle == style
- ) {
- for (
- var i = 0, ci, tmpFrag = me.document.createDocumentFragment();
- (ci = frag.firstChild);
- ) {
- if (domUtils.isTagNode(ci, 'ol ul')) {
-
-
-
-
-
-
-
- tmpFrag.appendChild(ci)
- } else {
- while (ci.firstChild) {
- tmpFrag.appendChild(ci.firstChild)
- domUtils.remove(ci)
- }
- }
- }
- tmp.parentNode.insertBefore(tmpFrag, tmp)
- } else {
- list = me.document.createElement(tag)
- setListStyle(list, style)
- list.appendChild(frag)
- tmp.parentNode.insertBefore(list, tmp)
- }
- domUtils.remove(tmp)
- list && adjustList(list, tag, style)
- range.moveToBookmark(bko).select()
- return
- }
-
- if (start) {
- while (start) {
- tmp = start.nextSibling
- if (domUtils.isTagNode(start, 'ol ul')) {
- frag.appendChild(start)
- } else {
- var tmpfrag = me.document.createDocumentFragment(),
- hasBlock = 0
- while (start.firstChild) {
- if (domUtils.isBlockElm(start.firstChild)) {
- hasBlock = 1
- }
- tmpfrag.appendChild(start.firstChild)
- }
- if (!hasBlock) {
- var tmpP = me.document.createElement('p')
- tmpP.appendChild(tmpfrag)
- frag.appendChild(tmpP)
- } else {
- frag.appendChild(tmpfrag)
- }
- domUtils.remove(start)
- }
- start = tmp
- }
- startParent.parentNode.insertBefore(frag, startParent.nextSibling)
- if (domUtils.isEmptyNode(startParent)) {
- range.setStartBefore(startParent)
- domUtils.remove(startParent)
- } else {
- range.setStartAfter(startParent)
- }
- modifyStart = 1
- }
- if (end && domUtils.inDoc(endParent, me.document)) {
-
- start = endParent.firstChild
- while (start && start !== end) {
- tmp = start.nextSibling
- if (domUtils.isTagNode(start, 'ol ul')) {
- frag.appendChild(start)
- } else {
- tmpfrag = me.document.createDocumentFragment()
- hasBlock = 0
- while (start.firstChild) {
- if (domUtils.isBlockElm(start.firstChild)) {
- hasBlock = 1
- }
- tmpfrag.appendChild(start.firstChild)
- }
- if (!hasBlock) {
- tmpP = me.document.createElement('p')
- tmpP.appendChild(tmpfrag)
- frag.appendChild(tmpP)
- } else {
- frag.appendChild(tmpfrag)
- }
- domUtils.remove(start)
- }
- start = tmp
- }
- var tmpDiv = domUtils.createElement(me.document, 'div', {
- tmpDiv: 1
- })
- domUtils.moveChild(end, tmpDiv)
- frag.appendChild(tmpDiv)
- domUtils.remove(end)
- endParent.parentNode.insertBefore(frag, endParent)
- range.setEndBefore(endParent)
- if (domUtils.isEmptyNode(endParent)) {
- domUtils.remove(endParent)
- }
- modifyEnd = 1
- }
- }
- if (!modifyStart) {
- range.setStartBefore(me.document.getElementById(bko.start))
- }
- if (bko.end && !modifyEnd) {
- range.setEndAfter(me.document.getElementById(bko.end))
- }
- range.enlarge(true, function (node) {
- return notExchange[node.tagName]
- })
- frag = me.document.createDocumentFragment()
- var bk = range.createBookmark(),
- current = domUtils.getNextDomNode(bk.start, false, filterFn),
- tmpRange = range.cloneRange(),
- tmpNode,
- block = domUtils.isBlockElm
- while (
- current &&
- current !== bk.end &&
- domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING
- ) {
- if (current.nodeType == 3 || dtd.li[current.tagName]) {
- if (current.nodeType == 1 && dtd.$list[current.tagName]) {
- while (current.firstChild) {
- frag.appendChild(current.firstChild)
- }
- tmpNode = domUtils.getNextDomNode(current, false, filterFn)
- domUtils.remove(current)
- current = tmpNode
- continue
- }
- tmpNode = current
- tmpRange.setStartBefore(current)
- while (
- current &&
- current !== bk.end &&
- (!block(current) || domUtils.isBookmarkNode(current))
- ) {
- tmpNode = current
- current = domUtils.getNextDomNode(
- current,
- false,
- null,
- function (node) {
- return !notExchange[node.tagName]
- }
- )
- }
- if (current && block(current)) {
- tmp = domUtils.getNextDomNode(tmpNode, false, filterFn)
- if (tmp && domUtils.isBookmarkNode(tmp)) {
- current = domUtils.getNextDomNode(tmp, false, filterFn)
- tmpNode = tmp
- }
- }
- tmpRange.setEndAfter(tmpNode)
- current = domUtils.getNextDomNode(tmpNode, false, filterFn)
- var li = range.document.createElement('li')
- li.appendChild(tmpRange.extractContents())
- if (domUtils.isEmptyNode(li)) {
- var tmpNode = range.document.createElement('p')
- while (li.firstChild) {
- tmpNode.appendChild(li.firstChild)
- }
- li.appendChild(tmpNode)
- }
- frag.appendChild(li)
- } else {
- current = domUtils.getNextDomNode(current, true, filterFn)
- }
- }
- range.moveToBookmark(bk).collapse(true)
- list = me.document.createElement(tag)
- setListStyle(list, style)
- list.appendChild(frag)
- range.insertNode(list)
-
- adjustList(list, tag, style)
-
- for (
- var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div');
- (ci = tmpDivs[i++]);
- ) {
- if (ci.getAttribute('tmpDiv')) {
- domUtils.remove(ci, true)
- }
- }
- range.moveToBookmark(bko).select()
- },
- queryCommandState: function (command) {
- var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'
- var path = this.selection.getStartElementPath()
- for (var i = 0, ci; (ci = path[i++]); ) {
- if (ci.nodeName == 'TABLE') {
- return 0
- }
- if (tag == ci.nodeName.toLowerCase()) {
- return 1
- }
- }
- return 0
- },
- queryCommandValue: function (command) {
- var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'
- var path = this.selection.getStartElementPath(),
- node
- for (var i = 0, ci; (ci = path[i++]); ) {
- if (ci.nodeName == 'TABLE') {
- node = null
- break
- }
- if (tag == ci.nodeName.toLowerCase()) {
- node = ci
- break
- }
- }
- return node
- ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type')
- : null
- }
- }
- }
-
-
- ;(function () {
- var sourceEditors = {
- textarea: function (editor, holder) {
- var textarea = holder.ownerDocument.createElement('textarea')
- textarea.style.cssText =
- 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;'
-
- if (browser.ie && browser.version < 8) {
- textarea.style.width = holder.offsetWidth + 'px'
- textarea.style.height = holder.offsetHeight + 'px'
- holder.onresize = function () {
- textarea.style.width = holder.offsetWidth + 'px'
- textarea.style.height = holder.offsetHeight + 'px'
- }
- }
- holder.appendChild(textarea)
- return {
- setContent: function (content) {
- textarea.value = content
- },
- getContent: function () {
- return textarea.value
- },
- select: function () {
- var range
- if (browser.ie) {
- range = textarea.createTextRange()
- range.collapse(true)
- range.select()
- } else {
-
- textarea.setSelectionRange(0, 0)
- textarea.focus()
- }
- },
- dispose: function () {
- holder.removeChild(textarea)
-
- holder.onresize = null
- textarea = null
- holder = null
- }
- }
- },
- codemirror: function (editor, holder) {
- var codeEditor = window.CodeMirror(holder, {
- mode: 'text/html',
- tabMode: 'indent',
- lineNumbers: true,
- lineWrapping: true
- })
- var dom = codeEditor.getWrapperElement()
- dom.style.cssText =
- 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'
- codeEditor.getScrollerElement().style.cssText =
- 'position:absolute;left:0;top:0;width:100%;height:100%;'
- codeEditor.refresh()
- return {
- getCodeMirror: function () {
- return codeEditor
- },
- setContent: function (content) {
- codeEditor.setValue(content)
- },
- getContent: function () {
- return codeEditor.getValue()
- },
- select: function () {
- codeEditor.focus()
- },
- dispose: function () {
- holder.removeChild(dom)
- dom = null
- codeEditor = null
- }
- }
- }
- }
- UE.plugins['source'] = function () {
- var me = this
- var opt = this.options
- var sourceMode = false
- var sourceEditor
- var orgSetContent
- opt.sourceEditor = browser.ie
- ? 'textarea'
- : opt.sourceEditor || 'codemirror'
- me.setOpt({
- sourceEditorFirst: false
- })
- function createSourceEditor(holder) {
- return sourceEditors[
- opt.sourceEditor == 'codemirror' && window.CodeMirror
- ? 'codemirror'
- : 'textarea'
- ](me, holder)
- }
- var bakCssText
-
- var oldGetContent, bakAddress
-
-
- me.commands['source'] = {
- execCommand: function () {
- sourceMode = !sourceMode
- if (sourceMode) {
- bakAddress = me.selection.getRange().createAddress(false, true)
- me.undoManger && me.undoManger.save(true)
- if (browser.gecko) {
- me.body.contentEditable = false
- }
- bakCssText = me.iframe.style.cssText
- me.iframe.style.cssText +=
- 'position:absolute;left:-32768px;top:-32768px;'
- me.fireEvent('beforegetcontent')
- var root = UE.htmlparser(me.body.innerHTML)
- me.filterOutputRule(root)
- root.traversal(function (node) {
- if (node.type == 'element') {
- switch (node.tagName) {
- case 'td':
- case 'th':
- case 'caption':
- if (node.children && node.children.length == 1) {
- if (node.firstChild().tagName == 'br') {
- node.removeChild(node.firstChild())
- }
- }
- break
- case 'pre':
- node.innerText(node.innerText().replace(/ /g, ' '))
- }
- }
- })
- me.fireEvent('aftergetcontent')
- var content = root.toHtml(true)
- sourceEditor = createSourceEditor(me.iframe.parentNode)
- sourceEditor.setContent(content)
- orgSetContent = me.setContent
- me.setContent = function (html) {
-
- var root = UE.htmlparser(html)
- me.filterInputRule(root)
- html = root.toHtml()
- sourceEditor.setContent(html)
- }
- setTimeout(function () {
- sourceEditor.select()
- me.addListener('fullscreenchanged', function () {
- try {
- sourceEditor.getCodeMirror().refresh()
- } catch (e) {}
- })
- })
-
- oldGetContent = me.getContent
- me.getContent = function () {
- return (
- sourceEditor.getContent() ||
- '<p>' + (browser.ie ? '' : '<br/>') + '</p>'
- )
- }
- } else {
- me.iframe.style.cssText = bakCssText
- var cont =
- sourceEditor.getContent() ||
- '<p>' + (browser.ie ? '' : '<br/>') + '</p>'
-
- cont = cont.replace(
- new RegExp('[\\r\\t\\n ]*</?(\\w+)\\s*(?:[^>]*)>', 'g'),
- function (a, b) {
- if (b && !dtd.$inlineWithA[b.toLowerCase()]) {
- return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, '')
- }
- return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, '')
- }
- )
- me.setContent = orgSetContent
- me.setContent(cont)
- sourceEditor.dispose()
- sourceEditor = null
-
- me.getContent = oldGetContent
- var first = me.body.firstChild
-
- if (!first) {
- me.body.innerHTML = '<p>' + (browser.ie ? '' : '<br/>') + '</p>'
- first = me.body.firstChild
- }
-
-
- me.undoManger && me.undoManger.save(true)
- if (browser.gecko) {
- var input = document.createElement('input')
- input.style.cssText = 'position:absolute;left:0;top:-32768px'
- document.body.appendChild(input)
- me.body.contentEditable = false
- setTimeout(function () {
- domUtils.setViewportOffset(input, { left: -32768, top: 0 })
- input.focus()
- setTimeout(function () {
- me.body.contentEditable = true
- me.selection.getRange().moveToAddress(bakAddress).select(true)
- domUtils.remove(input)
- })
- })
- } else {
-
- try {
- me.selection.getRange().moveToAddress(bakAddress).select(true)
- } catch (e) {}
- }
- }
- this.fireEvent('sourcemodechanged', sourceMode)
- },
- queryCommandState: function () {
- return sourceMode | 0
- },
- notNeedUndo: 1
- }
- var oldQueryCommandState = me.queryCommandState
- me.queryCommandState = function (cmdName) {
- cmdName = cmdName.toLowerCase()
- if (sourceMode) {
-
- return cmdName in
- {
- source: 1,
- fullscreen: 1
- }
- ? 1
- : -1
- }
- return oldQueryCommandState.apply(this, arguments)
- }
- if (opt.sourceEditor == 'codemirror') {
- me.addListener('ready', function () {
- utils.loadFile(
- document,
- {
- src:
- opt.codeMirrorJsUrl ||
- opt.UEDITOR_HOME_URL + 'third-party/codemirror/codemirror.js',
- tag: 'script',
- type: 'text/javascript',
- defer: 'defer'
- },
- function () {
- if (opt.sourceEditorFirst) {
- setTimeout(function () {
- me.execCommand('source')
- }, 0)
- }
- }
- )
- utils.loadFile(document, {
- tag: 'link',
- rel: 'stylesheet',
- type: 'text/css',
- href:
- opt.codeMirrorCssUrl ||
- opt.UEDITOR_HOME_URL + 'third-party/codemirror/codemirror.css'
- })
- })
- }
- }
- })()
-
-
-
-
-
-
-
- UE.plugins['enterkey'] = function () {
- var hTag,
- me = this,
- tag = me.options.enterTag
- me.addListener('keyup', function (type, evt) {
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 13) {
- var range = me.selection.getRange(),
- start = range.startContainer,
- doSave
-
- if (!browser.ie) {
- if (/h\d/i.test(hTag)) {
- if (browser.gecko) {
- var h = domUtils.findParentByTagName(
- start,
- [
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'blockquote',
- 'caption',
- 'table'
- ],
- true
- )
- if (!h) {
- me.document.execCommand('formatBlock', false, '<p>')
- doSave = 1
- }
- } else {
-
- if (start.nodeType == 1) {
- var tmp = me.document.createTextNode(''),
- div
- range.insertNode(tmp)
- div = domUtils.findParentByTagName(tmp, 'div', true)
- if (div) {
- var p = me.document.createElement('p')
- while (div.firstChild) {
- p.appendChild(div.firstChild)
- }
- div.parentNode.insertBefore(p, div)
- domUtils.remove(div)
- range.setStartBefore(tmp).setCursor()
- doSave = 1
- }
- domUtils.remove(tmp)
- }
- }
- if (me.undoManger && doSave) {
- me.undoManger.save()
- }
- }
-
- browser.opera && range.select()
- } else {
- me.fireEvent('saveScene', true, true)
- }
- }
- })
- me.addListener('keydown', function (type, evt) {
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 13) {
-
- if (me.fireEvent('beforeenterkeydown')) {
- domUtils.preventDefault(evt)
- return
- }
- me.fireEvent('saveScene', true, true)
- hTag = ''
- var range = me.selection.getRange()
- if (!range.collapsed) {
-
- var start = range.startContainer,
- end = range.endContainer,
- startTd = domUtils.findParentByTagName(start, 'td', true),
- endTd = domUtils.findParentByTagName(end, 'td', true)
- if (
- (startTd && endTd && startTd !== endTd) ||
- (!startTd && endTd) ||
- (startTd && !endTd)
- ) {
- evt.preventDefault
- ? evt.preventDefault()
- : (evt.returnValue = false)
- return
- }
- }
- if (tag == 'p') {
- if (!browser.ie) {
- start = domUtils.findParentByTagName(
- range.startContainer,
- [
- 'ol',
- 'ul',
- 'p',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'blockquote',
- 'caption'
- ],
- true
- )
-
-
- if (!start && !browser.opera) {
- me.document.execCommand('formatBlock', false, '<p>')
- if (browser.gecko) {
- range = me.selection.getRange()
- start = domUtils.findParentByTagName(
- range.startContainer,
- 'p',
- true
- )
- start && domUtils.removeDirtyAttr(start)
- }
- } else {
- hTag = start.tagName
- start.tagName.toLowerCase() == 'p' &&
- browser.gecko &&
- domUtils.removeDirtyAttr(start)
- }
- }
- } else {
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false)
- if (!range.collapsed) {
- range.deleteContents()
- start = range.startContainer
- if (
- start.nodeType == 1 &&
- (start = start.childNodes[range.startOffset])
- ) {
- while (start.nodeType == 1) {
- if (dtd.$empty[start.tagName]) {
- range.setStartBefore(start).setCursor()
- if (me.undoManger) {
- me.undoManger.save()
- }
- return false
- }
- if (!start.firstChild) {
- var br = range.document.createElement('br')
- start.appendChild(br)
- range.setStart(start, 0).setCursor()
- if (me.undoManger) {
- me.undoManger.save()
- }
- return false
- }
- start = start.firstChild
- }
- if (
- start === range.startContainer.childNodes[range.startOffset]
- ) {
- br = range.document.createElement('br')
- range.insertNode(br).setCursor()
- } else {
- range.setStart(start, 0).setCursor()
- }
- } else {
- br = range.document.createElement('br')
- range.insertNode(br).setStartAfter(br).setCursor()
- }
- } else {
- br = range.document.createElement('br')
- range.insertNode(br)
- var parent = br.parentNode
- if (parent.lastChild === br) {
- br.parentNode.insertBefore(br.cloneNode(true), br)
- range.setStartBefore(br)
- } else {
- range.setStartAfter(br)
- }
- range.setCursor()
- }
- }
- }
- })
- }
-
-
- UE.plugins['keystrokes'] = function () {
- var me = this
- var collapsed = true
- me.addListener('keydown', function (type, evt) {
- var keyCode = evt.keyCode || evt.which,
- rng = me.selection.getRange()
-
- if (
- !rng.collapsed &&
- !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) &&
- ((keyCode >= 65 && keyCode <= 90) ||
- (keyCode >= 48 && keyCode <= 57) ||
- (keyCode >= 96 && keyCode <= 111) ||
- {
- 13: 1,
- 8: 1,
- 46: 1
- }[keyCode])
- ) {
- var tmpNode = rng.startContainer
- if (domUtils.isFillChar(tmpNode)) {
- rng.setStartBefore(tmpNode)
- }
- tmpNode = rng.endContainer
- if (domUtils.isFillChar(tmpNode)) {
- rng.setEndAfter(tmpNode)
- }
- rng.txtToElmBoundary()
-
-
- if (rng.endContainer && rng.endContainer.nodeType == 1) {
- tmpNode = rng.endContainer.childNodes[rng.endOffset]
- if (tmpNode && domUtils.isBr(tmpNode)) {
- rng.setEndAfter(tmpNode)
- }
- }
- if (rng.startOffset == 0) {
- tmpNode = rng.startContainer
- if (domUtils.isBoundaryNode(tmpNode, 'firstChild')) {
- tmpNode = rng.endContainer
- if (
- rng.endOffset ==
- (tmpNode.nodeType == 3
- ? tmpNode.nodeValue.length
- : tmpNode.childNodes.length) &&
- domUtils.isBoundaryNode(tmpNode, 'lastChild')
- ) {
- me.fireEvent('saveScene')
- me.body.innerHTML = '<p>' + (browser.ie ? '' : '<br/>') + '</p>'
- rng.setStart(me.body.firstChild, 0).setCursor(false, true)
- me._selectionChange()
- return
- }
- }
- }
- }
-
- if (keyCode == keymap.Backspace) {
- rng = me.selection.getRange()
- collapsed = rng.collapsed
- if (me.fireEvent('delkeydown', evt)) {
- return
- }
- var start, end
-
- if (rng.collapsed && rng.inFillChar()) {
- start = rng.startContainer
- if (domUtils.isFillChar(start)) {
- rng.setStartBefore(start).shrinkBoundary(true).collapse(true)
- domUtils.remove(start)
- } else {
- start.nodeValue = start.nodeValue.replace(
- new RegExp('^' + domUtils.fillChar),
- ''
- )
- rng.startOffset--
- rng.collapse(true).select(true)
- }
- }
-
- if ((start = rng.getClosedNode())) {
- me.fireEvent('saveScene')
- rng.setStartBefore(start)
- domUtils.remove(start)
- rng.setCursor()
- me.fireEvent('saveScene')
- domUtils.preventDefault(evt)
- return
- }
-
- if (!browser.ie) {
- start = domUtils.findParentByTagName(
- rng.startContainer,
- 'table',
- true
- )
- end = domUtils.findParentByTagName(rng.endContainer, 'table', true)
- if ((start && !end) || (!start && end) || start !== end) {
- evt.preventDefault()
- return
- }
- }
- }
-
- if (keyCode == keymap.Tab) {
-
- var excludeTagNameForTabKey = {
- ol: 1,
- ul: 1,
- table: 1
- }
-
- if (me.fireEvent('tabkeydown', evt)) {
- domUtils.preventDefault(evt)
- return
- }
- var range = me.selection.getRange()
- me.fireEvent('saveScene')
- for (
- var i = 0,
- txt = '',
- tabSize = me.options.tabSize || 4,
- tabNode = me.options.tabNode || ' ';
- i < tabSize;
- i++
- ) {
- txt += tabNode
- }
- var span = me.document.createElement('span')
- span.innerHTML = txt + domUtils.fillChar
- if (range.collapsed) {
- range.insertNode(span.cloneNode(true).firstChild).setCursor(true)
- } else {
- var filterFn = function (node) {
- return (
- domUtils.isBlockElm(node) &&
- !excludeTagNameForTabKey[node.tagName.toLowerCase()]
- )
- }
-
- start = domUtils.findParent(range.startContainer, filterFn, true)
- end = domUtils.findParent(range.endContainer, filterFn, true)
- if (start && end && start === end) {
- range.deleteContents()
- range.insertNode(span.cloneNode(true).firstChild).setCursor(true)
- } else {
- var bookmark = range.createBookmark()
- range.enlarge(true)
- var bookmark2 = range.createBookmark(),
- current = domUtils.getNextDomNode(
- bookmark2.start,
- false,
- filterFn
- )
- while (
- current &&
- !(
- domUtils.getPosition(current, bookmark2.end) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- current.insertBefore(
- span.cloneNode(true).firstChild,
- current.firstChild
- )
- current = domUtils.getNextDomNode(current, false, filterFn)
- }
- range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select()
- }
- }
- domUtils.preventDefault(evt)
- }
-
-
- if (browser.gecko && keyCode == 46) {
- range = me.selection.getRange()
- if (range.collapsed) {
- start = range.startContainer
- if (domUtils.isEmptyBlock(start)) {
- var parent = start.parentNode
- while (
- domUtils.getChildCount(parent) == 1 &&
- !domUtils.isBody(parent)
- ) {
- start = parent
- parent = parent.parentNode
- }
- if (start === parent.lastChild) evt.preventDefault()
- return
- }
- }
- }
- })
- me.addListener('keyup', function (type, evt) {
- var keyCode = evt.keyCode || evt.which,
- rng,
- me = this
- if (keyCode == keymap.Backspace) {
- if (me.fireEvent('delkeyup')) {
- return
- }
- rng = me.selection.getRange()
- if (rng.collapsed) {
- var tmpNode,
- autoClearTagName = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
- if (
- (tmpNode = domUtils.findParentByTagName(
- rng.startContainer,
- autoClearTagName,
- true
- ))
- ) {
- if (domUtils.isEmptyBlock(tmpNode)) {
- var pre = tmpNode.previousSibling
- if (pre && pre.nodeName != 'TABLE') {
- domUtils.remove(tmpNode)
- rng.setStartAtLast(pre).setCursor(false, true)
- return
- } else {
- var next = tmpNode.nextSibling
- if (next && next.nodeName != 'TABLE') {
- domUtils.remove(tmpNode)
- rng.setStartAtFirst(next).setCursor(false, true)
- return
- }
- }
- }
- }
-
- if (domUtils.isBody(rng.startContainer)) {
- var tmpNode = domUtils.createElement(me.document, 'p', {
- innerHTML: browser.ie ? domUtils.fillChar : '<br/>'
- })
- rng.insertNode(tmpNode).setStart(tmpNode, 0).setCursor(false, true)
- }
- }
-
- if (
- !collapsed &&
- (rng.startContainer.nodeType == 3 ||
- (rng.startContainer.nodeType == 1 &&
- domUtils.isEmptyBlock(rng.startContainer)))
- ) {
- if (browser.ie) {
- var span = rng.document.createElement('span')
- rng.insertNode(span).setStartBefore(span).collapse(true)
- rng.select()
- domUtils.remove(span)
- } else {
- rng.select()
- }
- }
- }
- })
- }
-
-
-
-
-
-
- UE.plugins['fiximgclick'] = (function () {
- var elementUpdated = false
- function Scale() {
- this.editor = null
- this.resizer = null
- this.cover = null
- this.doc = document
- this.prePos = { x: 0, y: 0 }
- this.startPos = { x: 0, y: 0 }
- }
- ;(function () {
- var rect = [
-
- [0, 0, -1, -1],
- [0, 0, 0, -1],
- [0, 0, 1, -1],
- [0, 0, -1, 0],
- [0, 0, 1, 0],
- [0, 0, -1, 1],
- [0, 0, 0, 1],
- [0, 0, 1, 1]
- ]
- Scale.prototype = {
- init: function (editor) {
- var me = this
- me.editor = editor
- me.startPos = this.prePos = { x: 0, y: 0 }
- me.dragId = -1
- var hands = [],
- cover = (me.cover = document.createElement('div')),
- resizer = (me.resizer = document.createElement('div'))
- cover.id = me.editor.ui.id + '_imagescale_cover'
- cover.style.cssText =
- 'position:absolute;display:none;z-index:' +
- me.editor.options.zIndex +
- ';filter:alpha(opacity=0); opacity:0;background:#CCC;'
- domUtils.on(cover, 'mousedown click', function () {
- me.hide()
- })
- for (i = 0; i < 8; i++) {
- hands.push(
- '<span class="edui-editor-imagescale-hand' + i + '"></span>'
- )
- }
- resizer.id = me.editor.ui.id + '_imagescale'
- resizer.className = 'edui-editor-imagescale'
- resizer.innerHTML = hands.join('')
- resizer.style.cssText +=
- ';display:none;border:1px solid #3b77ff;z-index:' +
- me.editor.options.zIndex +
- ';'
- me.editor.ui.getDom().appendChild(cover)
- me.editor.ui.getDom().appendChild(resizer)
- me.initStyle()
- me.initEvents()
- },
- initStyle: function () {
- utils.cssRule(
- 'imagescale',
- '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' +
- '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' +
- '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'
- )
- },
- initEvents: function () {
- var me = this
- me.startPos.x = me.startPos.y = 0
- me.isDraging = false
- },
- _eventHandler: function (e) {
- var me = this
- switch (e.type) {
- case 'mousedown':
- var hand = e.target || e.srcElement,
- hand
- if (
- hand.className.indexOf('edui-editor-imagescale-hand') != -1 &&
- me.dragId == -1
- ) {
- me.dragId = hand.className.slice(-1)
- me.startPos.x = me.prePos.x = e.clientX
- me.startPos.y = me.prePos.y = e.clientY
- domUtils.on(me.doc, 'mousemove', me.proxy(me._eventHandler, me))
- }
- break
- case 'mousemove':
- if (me.dragId != -1) {
- me.updateContainerStyle(me.dragId, {
- x: e.clientX - me.prePos.x,
- y: e.clientY - me.prePos.y
- })
- me.prePos.x = e.clientX
- me.prePos.y = e.clientY
- elementUpdated = true
- me.updateTargetElement()
- }
- break
- case 'mouseup':
- if (me.dragId != -1) {
- me.updateContainerStyle(me.dragId, {
- x: e.clientX - me.prePos.x,
- y: e.clientY - me.prePos.y
- })
- me.updateTargetElement()
- if (me.target.parentNode) me.attachTo(me.target)
- me.dragId = -1
- }
- domUtils.un(me.doc, 'mousemove', me.proxy(me._eventHandler, me))
-
- if (elementUpdated) {
- elementUpdated = false
- me.editor.fireEvent('contentchange')
- }
- break
- default:
- break
- }
- },
- updateTargetElement: function () {
- var me = this
- domUtils.setStyles(me.target, {
- width: me.resizer.style.width,
- height: me.resizer.style.height
- })
- me.target.width = parseInt(me.resizer.style.width)
- me.target.height = parseInt(me.resizer.style.height)
- me.attachTo(me.target)
- },
- updateContainerStyle: function (dir, offset) {
- var me = this,
- dom = me.resizer,
- tmp
- if (rect[dir][0] != 0) {
- tmp = parseInt(dom.style.left) + offset.x
- dom.style.left = me._validScaledProp('left', tmp) + 'px'
- }
- if (rect[dir][1] != 0) {
- tmp = parseInt(dom.style.top) + offset.y
- dom.style.top = me._validScaledProp('top', tmp) + 'px'
- }
- if (rect[dir][2] != 0) {
- tmp = dom.clientWidth + rect[dir][2] * offset.x
- dom.style.width = me._validScaledProp('width', tmp) + 'px'
- }
- if (rect[dir][3] != 0) {
- tmp = dom.clientHeight + rect[dir][3] * offset.y
- dom.style.height = me._validScaledProp('height', tmp) + 'px'
- }
- },
- _validScaledProp: function (prop, value) {
- var ele = this.resizer,
- wrap = document
- value = isNaN(value) ? 0 : value
- switch (prop) {
- case 'left':
- return value < 0
- ? 0
- : value + ele.clientWidth > wrap.clientWidth
- ? wrap.clientWidth - ele.clientWidth
- : value
- case 'top':
- return value < 0
- ? 0
- : value + ele.clientHeight > wrap.clientHeight
- ? wrap.clientHeight - ele.clientHeight
- : value
- case 'width':
- return value <= 0
- ? 1
- : value + ele.offsetLeft > wrap.clientWidth
- ? wrap.clientWidth - ele.offsetLeft
- : value
- case 'height':
- return value <= 0
- ? 1
- : value + ele.offsetTop > wrap.clientHeight
- ? wrap.clientHeight - ele.offsetTop
- : value
- }
- },
- hideCover: function () {
- this.cover.style.display = 'none'
- },
- showCover: function () {
- var me = this,
- editorPos = domUtils.getXY(me.editor.ui.getDom()),
- iframePos = domUtils.getXY(me.editor.iframe)
- domUtils.setStyles(me.cover, {
- width: me.editor.iframe.offsetWidth + 'px',
- height: me.editor.iframe.offsetHeight + 'px',
- top: iframePos.y - editorPos.y + 'px',
- left: iframePos.x - editorPos.x + 'px',
- position: 'absolute',
- display: ''
- })
- },
- show: function (targetObj) {
- var me = this
- me.resizer.style.display = 'block'
- if (targetObj) me.attachTo(targetObj)
- domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me))
- domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me))
- me.showCover()
- me.editor.fireEvent('afterscaleshow', me)
- me.editor.fireEvent('saveScene')
- },
- hide: function () {
- var me = this
- me.hideCover()
- me.resizer.style.display = 'none'
- domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me))
- domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me))
- me.editor.fireEvent('afterscalehide', me)
- },
- proxy: function (fn, context) {
- return function (e) {
- return fn.apply(context || this, arguments)
- }
- },
- attachTo: function (targetObj) {
- var me = this,
- target = (me.target = targetObj),
- resizer = this.resizer,
- imgPos = domUtils.getXY(target),
- iframePos = domUtils.getXY(me.editor.iframe),
- editorPos = domUtils.getXY(resizer.parentNode)
- domUtils.setStyles(resizer, {
- width: target.width + 'px',
- height: target.height + 'px',
- left:
- iframePos.x +
- imgPos.x -
- me.editor.document.body.scrollLeft -
- editorPos.x -
- parseInt(resizer.style.borderLeftWidth) +
- 'px',
- top:
- iframePos.y +
- imgPos.y -
- me.editor.document.body.scrollTop -
- editorPos.y -
- parseInt(resizer.style.borderTopWidth) +
- 'px'
- })
- }
- }
- })()
- return function () {
- var me = this,
- imageScale
- me.setOpt('imageScaleEnabled', true)
- if (!browser.ie && me.options.imageScaleEnabled) {
- me.addListener('click', function (type, e) {
- var range = me.selection.getRange(),
- img = range.getClosedNode()
- if (
- img &&
- img.tagName == 'IMG' &&
- me.body.contentEditable != 'false'
- ) {
- if (
- img.className.indexOf('edui-faked-music') != -1 ||
- img.getAttribute('anchorname') ||
- domUtils.hasClass(img, 'loadingclass') ||
- domUtils.hasClass(img, 'loaderrorclass')
- ) {
- return
- }
- if (!imageScale) {
- imageScale = new Scale()
- imageScale.init(me)
- me.ui.getDom().appendChild(imageScale.resizer)
- var _keyDownHandler = function (e) {
- imageScale.hide()
- if (imageScale.target)
- me.selection
- .getRange()
- .selectNode(imageScale.target)
- .select()
- },
- _mouseDownHandler = function (e) {
- var ele = e.target || e.srcElement
- if (
- ele &&
- (ele.className === undefined ||
- ele.className.indexOf('edui-editor-imagescale') == -1)
- ) {
- _keyDownHandler(e)
- }
- },
- timer
- me.addListener('afterscaleshow', function (e) {
- me.addListener('beforekeydown', _keyDownHandler)
- me.addListener('beforemousedown', _mouseDownHandler)
- domUtils.on(document, 'keydown', _keyDownHandler)
- domUtils.on(document, 'mousedown', _mouseDownHandler)
- me.selection.getNative().removeAllRanges()
- })
- me.addListener('afterscalehide', function (e) {
- me.removeListener('beforekeydown', _keyDownHandler)
- me.removeListener('beforemousedown', _mouseDownHandler)
- domUtils.un(document, 'keydown', _keyDownHandler)
- domUtils.un(document, 'mousedown', _mouseDownHandler)
- var target = imageScale.target
- if (target.parentNode) {
- me.selection.getRange().selectNode(target).select()
- }
- })
-
- domUtils.on(imageScale.resizer, 'mousedown', function (e) {
- me.selection.getNative().removeAllRanges()
- var ele = e.target || e.srcElement
- if (
- ele &&
- ele.className.indexOf('edui-editor-imagescale-hand') == -1
- ) {
- timer = setTimeout(function () {
- imageScale.hide()
- if (imageScale.target)
- me.selection.getRange().selectNode(ele).select()
- }, 200)
- }
- })
- domUtils.on(imageScale.resizer, 'mouseup', function (e) {
- var ele = e.target || e.srcElement
- if (
- ele &&
- ele.className.indexOf('edui-editor-imagescale-hand') == -1
- ) {
- clearTimeout(timer)
- }
- })
- }
- imageScale.show(img)
- } else {
- if (imageScale && imageScale.resizer.style.display != 'none')
- imageScale.hide()
- }
- })
- }
- if (browser.webkit) {
- me.addListener('click', function (type, e) {
- if (e.target.tagName == 'IMG' && me.body.contentEditable != 'false') {
- var range = new dom.Range(me.document)
- range.selectNode(e.target).select()
- }
- })
- }
- }
- })()
-
-
-
-
-
-
- UE.plugin.register(
- 'autolink',
- function () {
- var cont = 0
- return !browser.ie
- ? {
- bindEvents: {
- reset: function () {
- cont = 0
- },
- keydown: function (type, evt) {
- var me = this
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 32 || keyCode == 13) {
- var sel = me.selection.getNative(),
- range = sel.getRangeAt(0).cloneRange(),
- offset,
- charCode
- var start = range.startContainer
- while (start.nodeType == 1 && range.startOffset > 0) {
- start =
- range.startContainer.childNodes[range.startOffset - 1]
- if (!start) {
- break
- }
- range.setStart(
- start,
- start.nodeType == 1
- ? start.childNodes.length
- : start.nodeValue.length
- )
- range.collapse(true)
- start = range.startContainer
- }
- do {
- if (range.startOffset == 0) {
- start = range.startContainer.previousSibling
- while (start && start.nodeType == 1) {
- start = start.lastChild
- }
- if (!start || domUtils.isFillChar(start)) {
- break
- }
- offset = start.nodeValue.length
- } else {
- start = range.startContainer
- offset = range.startOffset
- }
- range.setStart(start, offset - 1)
- charCode = range.toString().charCodeAt(0)
- } while (charCode != 160 && charCode != 32)
- if (
- range
- .toString()
- .replace(new RegExp(domUtils.fillChar, 'g'), '')
- .match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)
- ) {
- while (range.toString().length) {
- if (
- /^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(
- range.toString()
- )
- ) {
- break
- }
- try {
- range.setStart(
- range.startContainer,
- range.startOffset + 1
- )
- } catch (e) {
-
- var start = range.startContainer
- while (!(next = start.nextSibling)) {
- if (domUtils.isBody(start)) {
- return
- }
- start = start.parentNode
- }
- range.setStart(next, 0)
- }
- }
-
- if (
- domUtils.findParentByTagName(
- range.startContainer,
- 'a',
- true
- )
- ) {
- return
- }
- var a = me.document.createElement('a'),
- text = me.document.createTextNode(' '),
- href
- me.undoManger && me.undoManger.save()
- a.appendChild(range.extractContents())
- a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, '')
- href = a
- .getAttribute('href')
- .replace(new RegExp(domUtils.fillChar, 'g'), '')
- href = /^(?:https?:\/\/)/gi.test(href)
- ? href
- : 'http://' + href
- a.setAttribute('_src', utils.html(href))
- a.href = utils.html(href)
- range.insertNode(a)
- a.parentNode.insertBefore(text, a.nextSibling)
- range.setStart(text, 0)
- range.collapse(true)
- sel.removeAllRanges()
- sel.addRange(range)
- me.undoManger && me.undoManger.save()
- }
- }
- }
- }
- }
- : {}
- },
- function () {
- var keyCodes = {
- 37: 1,
- 38: 1,
- 39: 1,
- 40: 1,
- 13: 1,
- 32: 1
- }
- function checkIsCludeLink(node) {
- if (node.nodeType == 3) {
- return null
- }
- if (node.nodeName == 'A') {
- return node
- }
- var lastChild = node.lastChild
- while (lastChild) {
- if (lastChild.nodeName == 'A') {
- return lastChild
- }
- if (lastChild.nodeType == 3) {
- if (domUtils.isWhitespace(lastChild)) {
- lastChild = lastChild.previousSibling
- continue
- }
- return null
- }
- lastChild = lastChild.lastChild
- }
- }
- browser.ie &&
- this.addListener('keyup', function (cmd, evt) {
- var me = this,
- keyCode = evt.keyCode
- if (keyCodes[keyCode]) {
- var rng = me.selection.getRange()
- var start = rng.startContainer
- if (keyCode == 13) {
- while (
- start &&
- !domUtils.isBody(start) &&
- !domUtils.isBlockElm(start)
- ) {
- start = start.parentNode
- }
- if (start && !domUtils.isBody(start) && start.nodeName == 'P') {
- var pre = start.previousSibling
- if (pre && pre.nodeType == 1) {
- var pre = checkIsCludeLink(pre)
- if (pre && !pre.getAttribute('_href')) {
- domUtils.remove(pre, true)
- }
- }
- }
- } else if (keyCode == 32) {
- if (start.nodeType == 3 && /^\s$/.test(start.nodeValue)) {
- start = start.previousSibling
- if (
- start &&
- start.nodeName == 'A' &&
- !start.getAttribute('_href')
- ) {
- domUtils.remove(start, true)
- }
- }
- } else {
- start = domUtils.findParentByTagName(start, 'a', true)
- if (start && !start.getAttribute('_href')) {
- var bk = rng.createBookmark()
- domUtils.remove(start, true)
- rng.moveToBookmark(bk).select(true)
- }
- }
- }
- })
- }
- )
-
-
-
-
-
-
- UE.plugins['autoheight'] = function () {
- var me = this
-
- me.autoHeightEnabled = me.options.autoHeightEnabled !== false
- if (!me.autoHeightEnabled) {
- return
- }
- var bakOverflow,
- lastHeight = 0,
- options = me.options,
- currentHeight,
- timer
- function adjustHeight() {
- var me = this
- clearTimeout(timer)
- if (isFullscreen) return
- if (
- !me.queryCommandState ||
- (me.queryCommandState && me.queryCommandState('source') != 1)
- ) {
- timer = setTimeout(function () {
- var node = me.body.lastChild
- while (node && node.nodeType != 1) {
- node = node.previousSibling
- }
- if (node && node.nodeType == 1) {
- node.style.clear = 'both'
- currentHeight = Math.max(
- domUtils.getXY(node).y + node.offsetHeight + 25,
- Math.max(options.minFrameHeight, options.initialFrameHeight)
- )
- if (currentHeight != lastHeight) {
- if (
- currentHeight !== parseInt(me.iframe.parentNode.style.height)
- ) {
- me.iframe.parentNode.style.height = currentHeight + 'px'
- }
- me.body.style.height = currentHeight + 'px'
- lastHeight = currentHeight
- }
- domUtils.removeStyle(node, 'clear')
- }
- }, 50)
- }
- }
- var isFullscreen
- me.addListener('fullscreenchanged', function (cmd, f) {
- isFullscreen = f
- })
- me.addListener('destroy', function () {
- me.removeListener(
- 'contentchange afterinserthtml keyup mouseup',
- adjustHeight
- )
- })
- me.enableAutoHeight = function () {
- var me = this
- if (!me.autoHeightEnabled) {
- return
- }
- var doc = me.document
- me.autoHeightEnabled = true
- bakOverflow = doc.body.style.overflowY
- doc.body.style.overflowY = 'hidden'
- me.addListener(
- 'contentchange afterinserthtml keyup mouseup',
- adjustHeight
- )
-
- setTimeout(
- function () {
- adjustHeight.call(me)
- },
- browser.gecko ? 100 : 0
- )
- me.fireEvent('autoheightchanged', me.autoHeightEnabled)
- }
- me.disableAutoHeight = function () {
- me.body.style.overflowY = bakOverflow || ''
- me.removeListener('contentchange', adjustHeight)
- me.removeListener('keyup', adjustHeight)
- me.removeListener('mouseup', adjustHeight)
- me.autoHeightEnabled = false
- me.fireEvent('autoheightchanged', me.autoHeightEnabled)
- }
- me.on('setHeight', function () {
- me.disableAutoHeight()
- })
- me.addListener('ready', function () {
- me.enableAutoHeight()
-
- var timer
- domUtils.on(
- browser.ie ? me.body : me.document,
- browser.webkit ? 'dragover' : 'drop',
- function () {
- clearTimeout(timer)
- timer = setTimeout(function () {
-
- adjustHeight.call(me)
- }, 100)
- }
- )
-
- var lastScrollY
- window.onscroll = function () {
- if (lastScrollY === null) {
- lastScrollY = this.scrollY
- } else if (this.scrollY == 0 && lastScrollY != 0) {
- me.window.scrollTo(0, 0)
- lastScrollY = null
- }
- }
- })
- }
-
-
-
-
-
-
- UE.plugins['autofloat'] = function () {
- var me = this,
- lang = me.getLang()
- me.setOpt({
- topOffset: 0
- })
- var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false,
- topOffset = me.options.topOffset
-
- if (!optsAutoFloatEnabled) {
- return
- }
- var uiUtils = UE.ui.uiUtils,
- LteIE6 = browser.ie && browser.version <= 6,
- quirks = browser.quirks
- function checkHasUI() {
- if (!UE.ui) {
- alert(lang.autofloatMsg)
- return 0
- }
- return 1
- }
- function fixIE6FixedPos() {
- var docStyle = document.body.style
- docStyle.backgroundImage = 'url("about:blank")'
- docStyle.backgroundAttachment = 'fixed'
- }
- var bakCssText,
- placeHolder = document.createElement('div'),
- toolbarBox,
- orgTop,
- getPosition,
- flag = true
- function setFloating() {
- var toobarBoxPos = domUtils.getXY(toolbarBox),
- origalFloat = domUtils.getComputedStyle(toolbarBox, 'position'),
- origalLeft = domUtils.getComputedStyle(toolbarBox, 'left')
- toolbarBox.style.width = toolbarBox.offsetWidth + 'px'
- toolbarBox.style.zIndex = me.options.zIndex * 1 + 1
- toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox)
- if (LteIE6 || (quirks && browser.ie)) {
- if (toolbarBox.style.position != 'absolute') {
- toolbarBox.style.position = 'absolute'
- }
- toolbarBox.style.top =
- (document.body.scrollTop || document.documentElement.scrollTop) -
- orgTop +
- topOffset +
- 'px'
- } else {
- if (browser.ie7Compat && flag) {
- flag = false
- toolbarBox.style.left =
- domUtils.getXY(toolbarBox).x -
- document.documentElement.getBoundingClientRect().left +
- 2 +
- 'px'
- }
- if (toolbarBox.style.position != 'fixed') {
- toolbarBox.style.position = 'fixed'
- toolbarBox.style.top = topOffset + 'px'
- ;(origalFloat == 'absolute' || origalFloat == 'relative') &&
- parseFloat(origalLeft) &&
- (toolbarBox.style.left = toobarBoxPos.x + 'px')
- }
- }
- }
- function unsetFloating() {
- flag = true
- if (placeHolder.parentNode) {
- placeHolder.parentNode.removeChild(placeHolder)
- }
- toolbarBox.style.cssText = bakCssText
- }
- function updateFloating() {
- var rect3 = getPosition(me.container)
- var offset = me.options.toolbarTopOffset || 0
- if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) {
- setFloating()
- } else {
- unsetFloating()
- }
- }
- var defer_updateFloating = utils.defer(
- function () {
- updateFloating()
- },
- browser.ie ? 200 : 100,
- true
- )
- me.addListener('destroy', function () {
- domUtils.un(window, ['scroll', 'resize'], updateFloating)
- me.removeListener('keydown', defer_updateFloating)
- })
- me.addListener('ready', function () {
- if (checkHasUI(me)) {
-
- if (!me.ui) {
- return
- }
- getPosition = uiUtils.getClientRect
- toolbarBox = me.ui.getDom('toolbarbox')
- orgTop = getPosition(toolbarBox).top
- bakCssText = toolbarBox.style.cssText
- placeHolder.style.height = toolbarBox.offsetHeight + 'px'
- if (LteIE6) {
- fixIE6FixedPos()
- }
- domUtils.on(window, ['scroll', 'resize'], updateFloating)
- me.addListener('keydown', defer_updateFloating)
- me.addListener('beforefullscreenchange', function (t, enabled) {
- if (enabled) {
- unsetFloating()
- }
- })
- me.addListener('fullscreenchanged', function (t, enabled) {
- if (!enabled) {
- updateFloating()
- }
- })
- me.addListener('sourcemodechanged', function (t, enabled) {
- setTimeout(function () {
- updateFloating()
- }, 0)
- })
- me.addListener('clearDoc', function () {
- setTimeout(function () {
- updateFloating()
- }, 0)
- })
- }
- })
- }
-
-
- UE.plugins['video'] = function () {
- var me = this
-
- function creatInsertStr(url, width, height, id, align, classname, type) {
- url = utils.unhtmlForUrl(url)
- align = utils.unhtml(align)
- classname = utils.unhtml(classname).trim()
- width = parseInt(width, 10) || 0
- height = parseInt(height, 10) || 0
- var str
- switch (type) {
- case 'image':
- str =
- '<img ' +
- (id ? 'id="' + id + '"' : '') +
- ' width="' +
- width +
- '" height="' +
- height +
- '" _url="' +
- url +
- '" class="' +
- classname.replace(/\bvideo-js\b/, '') +
- '"' +
- ' src="' +
- me.options.UEDITOR_HOME_URL +
- 'themes/default/images/spacer.gif" style="background:url(' +
- me.options.UEDITOR_HOME_URL +
- 'themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;' +
- (align ? 'float:' + align + ';' : '') +
- '" />'
- break
- case 'embed':
- str =
- '<embed type="application/x-shockwave-flash" class="' +
- classname +
- '" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
- ' src="' +
- utils.html(url) +
- '" width="' +
- width +
- '" height="' +
- height +
- '"' +
- (align ? ' style="float:' + align + '"' : '') +
- ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >'
- break
- case 'video':
- var ext = url.substr(url.lastIndexOf('.') + 1)
- if (ext == 'ogv') ext = 'ogg'
- str =
- '<video' +
- (id ? ' id="' + id + '"' : '') +
- ' class="' +
- classname +
- ' video-js" ' +
- (align ? ' style="float:' + align + '"' : '') +
- ' controls preload="none" width="' +
- width +
- '" height="' +
- height +
- '" src="' +
- url +
- '" data-setup="{}">' +
- '<source src="' +
- url +
- '" type="video/' +
- ext +
- '" /></video>'
- break
- }
- return str
- }
- function switchImgAndVideo(root, img2video) {
- utils.each(
- root.getNodesByTagName(img2video ? 'img' : 'embed video'),
- function (node) {
- var className = node.getAttr('class')
- if (className && className.indexOf('edui-faked-video') != -1) {
- var html = creatInsertStr(
- img2video ? node.getAttr('_url') : node.getAttr('src'),
- node.getAttr('width'),
- node.getAttr('height'),
- null,
- node.getStyle('float') || '',
- className,
- img2video ? 'embed' : 'image'
- )
- node.parentNode.replaceChild(UE.uNode.createElement(html), node)
- }
- if (className && className.indexOf('edui-upload-video') != -1) {
- var html = creatInsertStr(
- img2video ? node.getAttr('_url') : node.getAttr('src'),
- node.getAttr('width'),
- node.getAttr('height'),
- null,
- node.getStyle('float') || '',
- className,
- img2video ? 'video' : 'image'
- )
- node.parentNode.replaceChild(UE.uNode.createElement(html), node)
- }
- }
- )
- }
- me.addOutputRule(function (root) {
- switchImgAndVideo(root, true)
- })
- me.addInputRule(function (root) {
- switchImgAndVideo(root)
- })
-
-
-
- me.commands['insertvideo'] = {
- execCommand: function (cmd, videoObjs, type) {
- videoObjs = utils.isArray(videoObjs) ? videoObjs : [videoObjs]
- var html = [],
- id = 'tmpVedio',
- cl
- for (var i = 0, vi, len = videoObjs.length; i < len; i++) {
- vi = videoObjs[i]
- cl =
- type == 'upload'
- ? 'edui-upload-video video-js vjs-default-skin'
- : 'edui-faked-video'
- html.push(
- creatInsertStr(
- vi.url,
- vi.width || 420,
- vi.height || 280,
- id + i,
- null,
- cl,
- 'image'
- )
- )
- }
- me.execCommand('inserthtml', html.join(''), true)
- var rng = this.selection.getRange()
- for (var i = 0, len = videoObjs.length; i < len; i++) {
- var img = this.document.getElementById('tmpVedio' + i)
- domUtils.removeAttributes(img, 'id')
- rng.selectNode(img).select()
- me.execCommand('imagefloat', videoObjs[i].align)
- }
- },
- queryCommandState: function () {
- var img = me.selection.getRange().getClosedNode(),
- flag =
- img &&
- (img.className == 'edui-faked-video' ||
- img.className.indexOf('edui-upload-video') != -1)
- return flag ? 1 : 0
- }
- }
- }
-
-
-
- ;(function () {
- var UETable = (UE.UETable = function (table) {
- this.table = table
- this.indexTable = []
- this.selectedTds = []
- this.cellsRange = {}
- this.update(table)
- })
-
- UETable.removeSelectedClass = function (cells) {
- utils.each(cells, function (cell) {
- domUtils.removeClasses(cell, 'selectTdClass')
- })
- }
- UETable.addSelectedClass = function (cells) {
- utils.each(cells, function (cell) {
- domUtils.addClass(cell, 'selectTdClass')
- })
- }
- UETable.isEmptyBlock = function (node) {
- var reg = new RegExp(domUtils.fillChar, 'g')
- if (
- node[browser.ie ? 'innerText' : 'textContent']
- .replace(/^\s*$/, '')
- .replace(reg, '').length > 0
- ) {
- return 0
- }
- for (var i in dtd.$isNotEmpty)
- if (dtd.$isNotEmpty.hasOwnProperty(i)) {
- if (node.getElementsByTagName(i).length) {
- return 0
- }
- }
- return 1
- }
- UETable.getWidth = function (cell) {
- if (!cell) return 0
- return parseInt(domUtils.getComputedStyle(cell, 'width'), 10)
- }
-
- UETable.getTableCellAlignState = function (cells) {
- !utils.isArray(cells) && (cells = [cells])
- var result = {},
- status = ['align', 'valign'],
- tempStatus = null,
- isSame = true
- utils.each(cells, function (cellNode) {
- utils.each(status, function (currentState) {
- tempStatus = cellNode.getAttribute(currentState)
- if (!result[currentState] && tempStatus) {
- result[currentState] = tempStatus
- } else if (
- !result[currentState] ||
- tempStatus !== result[currentState]
- ) {
- isSame = false
- return false
- }
- })
- return isSame
- })
- return isSame ? result : null
- }
-
- UETable.getTableItemsByRange = function (editor) {
- var start = editor.selection.getStart()
-
- if (
- start &&
- start.id &&
- start.id.indexOf('_baidu_bookmark_start_') === 0 &&
- start.nextSibling
- ) {
- start = start.nextSibling
- }
-
- var cell =
- start && domUtils.findParentByTagName(start, ['td', 'th'], true),
- tr = cell && cell.parentNode,
- caption = start && domUtils.findParentByTagName(start, 'caption', true),
- table = caption ? caption.parentNode : tr && tr.parentNode.parentNode
- return {
- cell: cell,
- tr: tr,
- table: table,
- caption: caption
- }
- }
- UETable.getUETableBySelected = function (editor) {
- var table = UETable.getTableItemsByRange(editor).table
- if (table && table.ueTable && table.ueTable.selectedTds.length) {
- return table.ueTable
- }
- return null
- }
- UETable.getDefaultValue = function (editor, table) {
- var borderMap = {
- thin: '0px',
- medium: '1px',
- thick: '2px'
- },
- tableBorder,
- tdPadding,
- tdBorder,
- tmpValue
- if (!table) {
- table = editor.document.createElement('table')
- table.insertRow(0).insertCell(0).innerHTML = 'xxx'
- editor.body.appendChild(table)
- var td = table.getElementsByTagName('td')[0]
- tmpValue = domUtils.getComputedStyle(table, 'border-left-width')
- tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10)
- tmpValue = domUtils.getComputedStyle(td, 'padding-left')
- tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10)
- tmpValue = domUtils.getComputedStyle(td, 'border-left-width')
- tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10)
- domUtils.remove(table)
- return {
- tableBorder: tableBorder,
- tdPadding: tdPadding,
- tdBorder: tdBorder
- }
- } else {
- td = table.getElementsByTagName('td')[0]
- tmpValue = domUtils.getComputedStyle(table, 'border-left-width')
- tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10)
- tmpValue = domUtils.getComputedStyle(td, 'padding-left')
- tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10)
- tmpValue = domUtils.getComputedStyle(td, 'border-left-width')
- tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10)
- return {
- tableBorder: tableBorder,
- tdPadding: tdPadding,
- tdBorder: tdBorder
- }
- }
- }
-
- UETable.getUETable = function (tdOrTable) {
- var tag = tdOrTable.tagName.toLowerCase()
- tdOrTable =
- tag == 'td' || tag == 'th' || tag == 'caption'
- ? domUtils.findParentByTagName(tdOrTable, 'table', true)
- : tdOrTable
- if (!tdOrTable.ueTable) {
- tdOrTable.ueTable = new UETable(tdOrTable)
- }
- return tdOrTable.ueTable
- }
- UETable.cloneCell = function (cell, ignoreMerge, keepPro) {
- if (!cell || utils.isString(cell)) {
- return this.table.ownerDocument.createElement(cell || 'td')
- }
- var flag = domUtils.hasClass(cell, 'selectTdClass')
- flag && domUtils.removeClasses(cell, 'selectTdClass')
- var tmpCell = cell.cloneNode(true)
- if (ignoreMerge) {
- tmpCell.rowSpan = tmpCell.colSpan = 1
- }
-
- !keepPro && domUtils.removeAttributes(tmpCell, 'width height')
- !keepPro && domUtils.removeAttributes(tmpCell, 'style')
- tmpCell.style.borderLeftStyle = ''
- tmpCell.style.borderTopStyle = ''
- tmpCell.style.borderLeftColor = cell.style.borderRightColor
- tmpCell.style.borderLeftWidth = cell.style.borderRightWidth
- tmpCell.style.borderTopColor = cell.style.borderBottomColor
- tmpCell.style.borderTopWidth = cell.style.borderBottomWidth
- flag && domUtils.addClass(cell, 'selectTdClass')
- return tmpCell
- }
- UETable.prototype = {
- getMaxRows: function () {
- var rows = this.table.rows,
- maxLen = 1
- for (var i = 0, row; (row = rows[i]); i++) {
- var currentMax = 1
- for (var j = 0, cj; (cj = row.cells[j++]); ) {
- currentMax = Math.max(cj.rowSpan || 1, currentMax)
- }
- maxLen = Math.max(currentMax + i, maxLen)
- }
- return maxLen
- },
-
- getMaxCols: function () {
- var rows = this.table.rows,
- maxLen = 0,
- cellRows = {}
- for (var i = 0, row; (row = rows[i]); i++) {
- var cellsNum = 0
- for (var j = 0, cj; (cj = row.cells[j++]); ) {
- cellsNum += cj.colSpan || 1
- if (cj.rowSpan && cj.rowSpan > 1) {
- for (var k = 1; k < cj.rowSpan; k++) {
- if (!cellRows['row_' + (i + k)]) {
- cellRows['row_' + (i + k)] = cj.colSpan || 1
- } else {
- cellRows['row_' + (i + k)]++
- }
- }
- }
- }
- cellsNum += cellRows['row_' + i] || 0
- maxLen = Math.max(cellsNum, maxLen)
- }
- return maxLen
- },
- getCellColIndex: function (cell) {},
-
- getHSideCell: function (cell, right) {
- try {
- var cellInfo = this.getCellInfo(cell),
- previewRowIndex,
- previewColIndex
- var len = this.selectedTds.length,
- range = this.cellsRange
-
- if (
- (!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) ||
- (right &&
- (!len
- ? cellInfo.colIndex == this.colsNum - 1
- : range.endColIndex == this.colsNum - 1))
- )
- return null
- previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex
- previewColIndex = !right
- ? !len
- ? cellInfo.colIndex < 1
- ? 0
- : cellInfo.colIndex - 1
- : range.beginColIndex - 1
- : !len
- ? cellInfo.colIndex + 1
- : range.endColIndex + 1
- return this.getCell(
- this.indexTable[previewRowIndex][previewColIndex].rowIndex,
- this.indexTable[previewRowIndex][previewColIndex].cellIndex
- )
- } catch (e) {
- showError(e)
- }
- },
- getTabNextCell: function (cell, preRowIndex) {
- var cellInfo = this.getCellInfo(cell),
- rowIndex = preRowIndex || cellInfo.rowIndex,
- colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1),
- nextCell
- try {
- nextCell = this.getCell(
- this.indexTable[rowIndex][colIndex].rowIndex,
- this.indexTable[rowIndex][colIndex].cellIndex
- )
- } catch (e) {
- try {
- rowIndex = rowIndex * 1 + 1
- colIndex = 0
- nextCell = this.getCell(
- this.indexTable[rowIndex][colIndex].rowIndex,
- this.indexTable[rowIndex][colIndex].cellIndex
- )
- } catch (e) {}
- }
- return nextCell
- },
-
- getVSideCell: function (cell, bottom, ignoreRange) {
- try {
- var cellInfo = this.getCellInfo(cell),
- nextRowIndex,
- nextColIndex
- var len = this.selectedTds.length && !ignoreRange,
- range = this.cellsRange
-
- if (
- (!bottom && cellInfo.rowIndex == 0) ||
- (bottom &&
- (!len
- ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1
- : range.endRowIndex == this.rowsNum - 1))
- )
- return null
- nextRowIndex = !bottom
- ? !len
- ? cellInfo.rowIndex - 1
- : range.beginRowIndex - 1
- : !len
- ? cellInfo.rowIndex + cellInfo.rowSpan
- : range.endRowIndex + 1
- nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex
- return this.getCell(
- this.indexTable[nextRowIndex][nextColIndex].rowIndex,
- this.indexTable[nextRowIndex][nextColIndex].cellIndex
- )
- } catch (e) {
- showError(e)
- }
- },
-
- getSameEndPosCells: function (cell, xOrY) {
- try {
- var flag = xOrY.toLowerCase() === 'x',
- end =
- domUtils.getXY(cell)[flag ? 'x' : 'y'] +
- cell['offset' + (flag ? 'Width' : 'Height')],
- rows = this.table.rows,
- cells = null,
- returns = []
- for (var i = 0; i < this.rowsNum; i++) {
- cells = rows[i].cells
- for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) {
- var tmpEnd =
- domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] +
- tmpCell['offset' + (flag ? 'Width' : 'Height')]
-
- if (tmpEnd > end && flag) break
- if (cell == tmpCell || end == tmpEnd) {
-
-
- if (tmpCell[flag ? 'colSpan' : 'rowSpan'] == 1) {
- returns.push(tmpCell)
- }
- if (flag) break
- }
- }
- }
- return returns
- } catch (e) {
- showError(e)
- }
- },
- setCellContent: function (cell, content) {
- cell.innerHTML = content || (browser.ie ? domUtils.fillChar : '<br />')
- },
- cloneCell: UETable.cloneCell,
-
- getSameStartPosXCells: function (cell) {
- try {
- var start = domUtils.getXY(cell).x + cell.offsetWidth,
- rows = this.table.rows,
- cells,
- returns = []
- for (var i = 0; i < this.rowsNum; i++) {
- cells = rows[i].cells
- for (var j = 0, tmpCell; (tmpCell = cells[j++]); ) {
- var tmpStart = domUtils.getXY(tmpCell).x
- if (tmpStart > start) break
- if (tmpStart == start && tmpCell.colSpan == 1) {
- returns.push(tmpCell)
- break
- }
- }
- }
- return returns
- } catch (e) {
- showError(e)
- }
- },
-
- update: function (table) {
- this.table = table || this.table
- this.selectedTds = []
- this.cellsRange = {}
- this.indexTable = []
- var rows = this.table.rows,
- rowsNum = this.getMaxRows(),
- dNum = rowsNum - rows.length,
- colsNum = this.getMaxCols()
- while (dNum--) {
- this.table.insertRow(rows.length)
- }
- this.rowsNum = rowsNum
- this.colsNum = colsNum
- for (var i = 0, len = rows.length; i < len; i++) {
- this.indexTable[i] = new Array(colsNum)
- }
-
- for (var rowIndex = 0, row; (row = rows[rowIndex]); rowIndex++) {
- for (
- var cellIndex = 0, cell, cells = row.cells;
- (cell = cells[cellIndex]);
- cellIndex++
- ) {
-
- if (cell.rowSpan > rowsNum) {
- cell.rowSpan = rowsNum
- }
- var colIndex = cellIndex,
- rowSpan = cell.rowSpan || 1,
- colSpan = cell.colSpan || 1
-
- while (this.indexTable[rowIndex][colIndex]) colIndex++
- for (var j = 0; j < rowSpan; j++) {
- for (var k = 0; k < colSpan; k++) {
- this.indexTable[rowIndex + j][colIndex + k] = {
- rowIndex: rowIndex,
- cellIndex: cellIndex,
- colIndex: colIndex,
- rowSpan: rowSpan,
- colSpan: colSpan
- }
- }
- }
- }
- }
-
- for (j = 0; j < rowsNum; j++) {
- for (k = 0; k < colsNum; k++) {
- if (this.indexTable[j][k] === undefined) {
- row = rows[j]
- cell = row.cells[row.cells.length - 1]
- cell = cell
- ? cell.cloneNode(true)
- : this.table.ownerDocument.createElement('td')
- this.setCellContent(cell)
- if (cell.colSpan !== 1) cell.colSpan = 1
- if (cell.rowSpan !== 1) cell.rowSpan = 1
- row.appendChild(cell)
- this.indexTable[j][k] = {
- rowIndex: j,
- cellIndex: cell.cellIndex,
- colIndex: k,
- rowSpan: 1,
- colSpan: 1
- }
- }
- }
- }
-
- var tds = domUtils.getElementsByTagName(this.table, 'td'),
- selectTds = []
- utils.each(tds, function (td) {
- if (domUtils.hasClass(td, 'selectTdClass')) {
- selectTds.push(td)
- }
- })
- if (selectTds.length) {
- var start = selectTds[0],
- end = selectTds[selectTds.length - 1],
- startInfo = this.getCellInfo(start),
- endInfo = this.getCellInfo(end)
- this.selectedTds = selectTds
- this.cellsRange = {
- beginRowIndex: startInfo.rowIndex,
- beginColIndex: startInfo.colIndex,
- endRowIndex: endInfo.rowIndex + endInfo.rowSpan - 1,
- endColIndex: endInfo.colIndex + endInfo.colSpan - 1
- }
- }
-
- if (!domUtils.hasClass(this.table.rows[0], 'firstRow')) {
- domUtils.addClass(this.table.rows[0], 'firstRow')
- for (var i = 1; i < this.table.rows.length; i++) {
- domUtils.removeClasses(this.table.rows[i], 'firstRow')
- }
- }
- },
-
- getCellInfo: function (cell) {
- if (!cell) return
- var cellIndex = cell.cellIndex,
- rowIndex = cell.parentNode.rowIndex,
- rowInfo = this.indexTable[rowIndex],
- numCols = this.colsNum
- for (var colIndex = cellIndex; colIndex < numCols; colIndex++) {
- var cellInfo = rowInfo[colIndex]
- if (
- cellInfo.rowIndex === rowIndex &&
- cellInfo.cellIndex === cellIndex
- ) {
- return cellInfo
- }
- }
- },
-
- getCell: function (rowIndex, cellIndex) {
- return (
- (rowIndex < this.rowsNum &&
- this.table.rows[rowIndex].cells[cellIndex]) ||
- null
- )
- },
-
- deleteCell: function (cell, rowIndex) {
- rowIndex =
- typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex
- var row = this.table.rows[rowIndex]
- row.deleteCell(cell.cellIndex)
- },
-
- getCellsRange: function (cellA, cellB) {
- function checkRange(
- beginRowIndex,
- beginColIndex,
- endRowIndex,
- endColIndex
- ) {
- var tmpBeginRowIndex = beginRowIndex,
- tmpBeginColIndex = beginColIndex,
- tmpEndRowIndex = endRowIndex,
- tmpEndColIndex = endColIndex,
- cellInfo,
- colIndex,
- rowIndex
-
- if (beginRowIndex > 0) {
- for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) {
- cellInfo = me.indexTable[beginRowIndex][colIndex]
- rowIndex = cellInfo.rowIndex
- if (rowIndex < beginRowIndex) {
- tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex)
- }
- }
- }
-
- if (endColIndex < me.colsNum) {
- for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) {
- cellInfo = me.indexTable[rowIndex][endColIndex]
- colIndex = cellInfo.colIndex + cellInfo.colSpan - 1
- if (colIndex > endColIndex) {
- tmpEndColIndex = Math.max(colIndex, tmpEndColIndex)
- }
- }
- }
-
- if (endRowIndex < me.rowsNum) {
- for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) {
- cellInfo = me.indexTable[endRowIndex][colIndex]
- rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1
- if (rowIndex > endRowIndex) {
- tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex)
- }
- }
- }
-
- if (beginColIndex > 0) {
- for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) {
- cellInfo = me.indexTable[rowIndex][beginColIndex]
- colIndex = cellInfo.colIndex
- if (colIndex < beginColIndex) {
- tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex)
- }
- }
- }
-
- if (
- tmpBeginRowIndex != beginRowIndex ||
- tmpBeginColIndex != beginColIndex ||
- tmpEndRowIndex != endRowIndex ||
- tmpEndColIndex != endColIndex
- ) {
- return checkRange(
- tmpBeginRowIndex,
- tmpBeginColIndex,
- tmpEndRowIndex,
- tmpEndColIndex
- )
- } else {
-
- return {
- beginRowIndex: beginRowIndex,
- beginColIndex: beginColIndex,
- endRowIndex: endRowIndex,
- endColIndex: endColIndex
- }
- }
- }
- try {
- var me = this,
- cellAInfo = me.getCellInfo(cellA)
- if (cellA === cellB) {
- return {
- beginRowIndex: cellAInfo.rowIndex,
- beginColIndex: cellAInfo.colIndex,
- endRowIndex: cellAInfo.rowIndex + cellAInfo.rowSpan - 1,
- endColIndex: cellAInfo.colIndex + cellAInfo.colSpan - 1
- }
- }
- var cellBInfo = me.getCellInfo(cellB)
-
- var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex),
- beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex),
- endRowIndex = Math.max(
- cellAInfo.rowIndex + cellAInfo.rowSpan - 1,
- cellBInfo.rowIndex + cellBInfo.rowSpan - 1
- ),
- endColIndex = Math.max(
- cellAInfo.colIndex + cellAInfo.colSpan - 1,
- cellBInfo.colIndex + cellBInfo.colSpan - 1
- )
- return checkRange(
- beginRowIndex,
- beginColIndex,
- endRowIndex,
- endColIndex
- )
- } catch (e) {
-
- }
- },
-
- getCells: function (range) {
-
- this.clearSelected()
- var beginRowIndex = range.beginRowIndex,
- beginColIndex = range.beginColIndex,
- endRowIndex = range.endRowIndex,
- endColIndex = range.endColIndex,
- cellInfo,
- rowIndex,
- colIndex,
- tdHash = {},
- returnTds = []
- for (var i = beginRowIndex; i <= endRowIndex; i++) {
- for (var j = beginColIndex; j <= endColIndex; j++) {
- cellInfo = this.indexTable[i][j]
- rowIndex = cellInfo.rowIndex
- colIndex = cellInfo.colIndex
-
- var key = rowIndex + '|' + colIndex
- if (tdHash[key]) continue
- tdHash[key] = 1
- if (
- rowIndex < i ||
- colIndex < j ||
- rowIndex + cellInfo.rowSpan - 1 > endRowIndex ||
- colIndex + cellInfo.colSpan - 1 > endColIndex
- ) {
- return null
- }
- returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex))
- }
- }
- return returnTds
- },
-
- clearSelected: function () {
- UETable.removeSelectedClass(this.selectedTds)
- this.selectedTds = []
- this.cellsRange = {}
- },
-
- setSelected: function (range) {
- var cells = this.getCells(range)
- UETable.addSelectedClass(cells)
- this.selectedTds = cells
- this.cellsRange = range
- },
- isFullRow: function () {
- var range = this.cellsRange
- return range.endColIndex - range.beginColIndex + 1 == this.colsNum
- },
- isFullCol: function () {
- var range = this.cellsRange,
- table = this.table,
- ths = table.getElementsByTagName('th'),
- rows = range.endRowIndex - range.beginRowIndex + 1
- return !ths.length
- ? rows == this.rowsNum
- : rows == this.rowsNum || rows == this.rowsNum - 1
- },
-
- getNextCell: function (cell, bottom, ignoreRange) {
- try {
- var cellInfo = this.getCellInfo(cell),
- nextRowIndex,
- nextColIndex
- var len = this.selectedTds.length && !ignoreRange,
- range = this.cellsRange
-
- if (
- (!bottom && cellInfo.rowIndex == 0) ||
- (bottom &&
- (!len
- ? cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1
- : range.endRowIndex == this.rowsNum - 1))
- )
- return null
- nextRowIndex = !bottom
- ? !len
- ? cellInfo.rowIndex - 1
- : range.beginRowIndex - 1
- : !len
- ? cellInfo.rowIndex + cellInfo.rowSpan
- : range.endRowIndex + 1
- nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex
- return this.getCell(
- this.indexTable[nextRowIndex][nextColIndex].rowIndex,
- this.indexTable[nextRowIndex][nextColIndex].cellIndex
- )
- } catch (e) {
- showError(e)
- }
- },
- getPreviewCell: function (cell, top) {
- try {
- var cellInfo = this.getCellInfo(cell),
- previewRowIndex,
- previewColIndex
- var len = this.selectedTds.length,
- range = this.cellsRange
-
- if (
- (!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) ||
- (top &&
- (!len
- ? cellInfo.rowIndex > this.colsNum - 1
- : range.endColIndex == this.colsNum - 1))
- )
- return null
- previewRowIndex = !top
- ? !len
- ? cellInfo.rowIndex
- : range.beginRowIndex
- : !len
- ? cellInfo.rowIndex < 1
- ? 0
- : cellInfo.rowIndex - 1
- : range.beginRowIndex
- previewColIndex = !top
- ? !len
- ? cellInfo.colIndex < 1
- ? 0
- : cellInfo.colIndex - 1
- : range.beginColIndex - 1
- : !len
- ? cellInfo.colIndex
- : range.endColIndex + 1
- return this.getCell(
- this.indexTable[previewRowIndex][previewColIndex].rowIndex,
- this.indexTable[previewRowIndex][previewColIndex].cellIndex
- )
- } catch (e) {
- showError(e)
- }
- },
-
- moveContent: function (cellTo, cellFrom) {
- if (UETable.isEmptyBlock(cellFrom)) return
- if (UETable.isEmptyBlock(cellTo)) {
- cellTo.innerHTML = cellFrom.innerHTML
- return
- }
- var child = cellTo.lastChild
- if (child.nodeType == 3 || !dtd.$block[child.tagName]) {
- cellTo.appendChild(cellTo.ownerDocument.createElement('br'))
- }
- while ((child = cellFrom.firstChild)) {
- cellTo.appendChild(child)
- }
- },
-
- mergeRight: function (cell) {
- var cellInfo = this.getCellInfo(cell),
- rightColIndex = cellInfo.colIndex + cellInfo.colSpan,
- rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex],
- rightCell = this.getCell(
- rightCellInfo.rowIndex,
- rightCellInfo.cellIndex
- )
-
- cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan
-
- cell.removeAttribute('width')
-
- this.moveContent(cell, rightCell)
-
- this.deleteCell(rightCell, rightCellInfo.rowIndex)
- this.update()
- },
-
- mergeDown: function (cell) {
- var cellInfo = this.getCellInfo(cell),
- downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan,
- downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex],
- downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex)
- cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan
- cell.removeAttribute('height')
- this.moveContent(cell, downCell)
- this.deleteCell(downCell, downCellInfo.rowIndex)
- this.update()
- },
-
- mergeRange: function () {
-
- var range = this.cellsRange,
- leftTopCell = this.getCell(
- range.beginRowIndex,
- this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex
- )
- if (
- leftTopCell.tagName == 'TH' &&
- range.endRowIndex !== range.beginRowIndex
- ) {
- var index = this.indexTable,
- info = this.getCellInfo(leftTopCell)
- leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex)
- range = this.getCellsRange(
- leftTopCell,
- this.getCell(
- index[this.rowsNum - 1][info.colIndex].rowIndex,
- index[this.rowsNum - 1][info.colIndex].cellIndex
- )
- )
- }
-
- var cells = this.getCells(range)
- for (var i = 0, ci; (ci = cells[i++]); ) {
- if (ci !== leftTopCell) {
- this.moveContent(leftTopCell, ci)
- this.deleteCell(ci)
- }
- }
-
- leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1
- leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute('height')
- leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1
- leftTopCell.colSpan > 1 && leftTopCell.removeAttribute('width')
- if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) {
- leftTopCell.colSpan = 1
- }
- if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) {
- var rowIndex = leftTopCell.parentNode.rowIndex
-
- if (this.table.deleteRow) {
- for (
- var i = rowIndex + 1,
- curIndex = rowIndex + 1,
- len = leftTopCell.rowSpan;
- i < len;
- i++
- ) {
- this.table.deleteRow(curIndex)
- }
- } else {
- for (var i = 0, len = leftTopCell.rowSpan - 1; i < len; i++) {
- var row = this.table.rows[rowIndex + 1]
- row.parentNode.removeChild(row)
- }
- }
- leftTopCell.rowSpan = 1
- }
- this.update()
- },
-
- insertRow: function (rowIndex, sourceCell) {
- var numCols = this.colsNum,
- table = this.table,
- row = table.insertRow(rowIndex),
- cell,
- isInsertTitle =
- typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'
- function replaceTdToTh(colIndex, cell, tableRow) {
- if (colIndex == 0) {
- var tr = tableRow.nextSibling || tableRow.previousSibling,
- th = tr.cells[colIndex]
- if (th.tagName == 'TH') {
- th = cell.ownerDocument.createElement('th')
- th.appendChild(cell.firstChild)
- tableRow.insertBefore(th, cell)
- domUtils.remove(cell)
- }
- } else {
- if (cell.tagName == 'TH') {
- var td = cell.ownerDocument.createElement('td')
- td.appendChild(cell.firstChild)
- tableRow.insertBefore(td, cell)
- domUtils.remove(cell)
- }
- }
- }
-
- if (rowIndex == 0 || rowIndex == this.rowsNum) {
- for (var colIndex = 0; colIndex < numCols; colIndex++) {
- cell = this.cloneCell(sourceCell, true)
- this.setCellContent(cell)
- cell.getAttribute('vAlign') &&
- cell.setAttribute('vAlign', cell.getAttribute('vAlign'))
- row.appendChild(cell)
- if (!isInsertTitle) replaceTdToTh(colIndex, cell, row)
- }
- } else {
- var infoRow = this.indexTable[rowIndex],
- cellIndex = 0
- for (colIndex = 0; colIndex < numCols; colIndex++) {
- var cellInfo = infoRow[colIndex]
-
- if (cellInfo.rowIndex < rowIndex) {
- cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex)
- cell.rowSpan = cellInfo.rowSpan + 1
- } else {
- cell = this.cloneCell(sourceCell, true)
- this.setCellContent(cell)
- row.appendChild(cell)
- }
- if (!isInsertTitle) replaceTdToTh(colIndex, cell, row)
- }
- }
-
- this.update()
- return row
- },
-
- deleteRow: function (rowIndex) {
- var row = this.table.rows[rowIndex],
- infoRow = this.indexTable[rowIndex],
- colsNum = this.colsNum,
- count = 0
- for (var colIndex = 0; colIndex < colsNum; ) {
- var cellInfo = infoRow[colIndex],
- cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex)
- if (cell.rowSpan > 1) {
- if (cellInfo.rowIndex == rowIndex) {
- var clone = cell.cloneNode(true)
- clone.rowSpan = cell.rowSpan - 1
- clone.innerHTML = ''
- cell.rowSpan = 1
- var nextRowIndex = rowIndex + 1,
- nextRow = this.table.rows[nextRowIndex],
- insertCellIndex,
- preMerged =
- this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count
- if (preMerged < colIndex) {
- insertCellIndex = colIndex - preMerged - 1
-
- domUtils.insertAfter(nextRow.cells[insertCellIndex], clone)
- } else {
- if (nextRow.cells.length)
- nextRow.insertBefore(clone, nextRow.cells[0])
- }
- count += 1
-
- }
- }
- colIndex += cell.colSpan || 1
- }
- var deleteTds = [],
- cacheMap = {}
- for (colIndex = 0; colIndex < colsNum; colIndex++) {
- var tmpRowIndex = infoRow[colIndex].rowIndex,
- tmpCellIndex = infoRow[colIndex].cellIndex,
- key = tmpRowIndex + '_' + tmpCellIndex
- if (cacheMap[key]) continue
- cacheMap[key] = 1
- cell = this.getCell(tmpRowIndex, tmpCellIndex)
- deleteTds.push(cell)
- }
- var mergeTds = []
- utils.each(deleteTds, function (td) {
- if (td.rowSpan == 1) {
- td.parentNode.removeChild(td)
- } else {
- mergeTds.push(td)
- }
- })
- utils.each(mergeTds, function (td) {
- td.rowSpan--
- })
- row.parentNode.removeChild(row)
-
-
- this.update()
- },
- insertCol: function (colIndex, sourceCell, defaultValue) {
- var rowsNum = this.rowsNum,
- rowIndex = 0,
- tableRow,
- cell,
- backWidth = parseInt(
- (this.table.offsetWidth -
- (this.colsNum + 1) * 20 -
- (this.colsNum + 1)) /
- (this.colsNum + 1),
- 10
- ),
- isInsertTitleCol =
- typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'
- function replaceTdToTh(rowIndex, cell, tableRow) {
- if (rowIndex == 0) {
- var th = cell.nextSibling || cell.previousSibling
- if (th.tagName == 'TH') {
- th = cell.ownerDocument.createElement('th')
- th.appendChild(cell.firstChild)
- tableRow.insertBefore(th, cell)
- domUtils.remove(cell)
- }
- } else {
- if (cell.tagName == 'TH') {
- var td = cell.ownerDocument.createElement('td')
- td.appendChild(cell.firstChild)
- tableRow.insertBefore(td, cell)
- domUtils.remove(cell)
- }
- }
- }
- var preCell
- if (colIndex == 0 || colIndex == this.colsNum) {
- for (; rowIndex < rowsNum; rowIndex++) {
- tableRow = this.table.rows[rowIndex]
- preCell =
- tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]
- cell = this.cloneCell(sourceCell, true)
- this.setCellContent(cell)
- cell.setAttribute('vAlign', cell.getAttribute('vAlign'))
- preCell && cell.setAttribute('width', preCell.getAttribute('width'))
- if (!colIndex) {
- tableRow.insertBefore(cell, tableRow.cells[0])
- } else {
- domUtils.insertAfter(
- tableRow.cells[tableRow.cells.length - 1],
- cell
- )
- }
- if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow)
- }
- } else {
- for (; rowIndex < rowsNum; rowIndex++) {
- var cellInfo = this.indexTable[rowIndex][colIndex]
- if (cellInfo.colIndex < colIndex) {
- cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex)
- cell.colSpan = cellInfo.colSpan + 1
- } else {
- tableRow = this.table.rows[rowIndex]
- preCell = tableRow.cells[cellInfo.cellIndex]
- cell = this.cloneCell(sourceCell, true)
- this.setCellContent(cell)
- cell.setAttribute('vAlign', cell.getAttribute('vAlign'))
- preCell &&
- cell.setAttribute('width', preCell.getAttribute('width'))
-
- preCell
- ? tableRow.insertBefore(cell, preCell)
- : tableRow.appendChild(cell)
- }
- if (!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow)
- }
- }
-
- this.update()
- this.updateWidth(
- backWidth,
- defaultValue || { tdPadding: 10, tdBorder: 1 }
- )
- },
- updateWidth: function (width, defaultValue) {
- var table = this.table,
- tmpWidth =
- UETable.getWidth(table) -
- defaultValue.tdPadding * 2 -
- defaultValue.tdBorder +
- width
- if (tmpWidth < table.ownerDocument.body.offsetWidth) {
- table.setAttribute('width', tmpWidth)
- return
- }
- var tds = domUtils.getElementsByTagName(this.table, 'td th')
- utils.each(tds, function (td) {
- td.setAttribute('width', width)
- })
- },
- deleteCol: function (colIndex) {
- var indexTable = this.indexTable,
- tableRows = this.table.rows,
- backTableWidth = this.table.getAttribute('width'),
- backTdWidth = 0,
- rowsNum = this.rowsNum,
- cacheMap = {}
- for (var rowIndex = 0; rowIndex < rowsNum; ) {
- var infoRow = indexTable[rowIndex],
- cellInfo = infoRow[colIndex],
- key = cellInfo.rowIndex + '_' + cellInfo.colIndex
-
- if (cacheMap[key]) continue
- cacheMap[key] = 1
- var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex)
- if (!backTdWidth)
- backTdWidth =
- cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0)
-
- if (cell.colSpan > 1) {
- cell.colSpan--
- } else {
- tableRows[rowIndex].deleteCell(cellInfo.cellIndex)
- }
- rowIndex += cellInfo.rowSpan || 1
- }
- this.table.setAttribute('width', backTableWidth - backTdWidth)
- this.update()
- },
- splitToCells: function (cell) {
- var me = this,
- cells = this.splitToRows(cell)
- utils.each(cells, function (cell) {
- me.splitToCols(cell)
- })
- },
- splitToRows: function (cell) {
- var cellInfo = this.getCellInfo(cell),
- rowIndex = cellInfo.rowIndex,
- colIndex = cellInfo.colIndex,
- results = []
-
- cell.rowSpan = 1
- results.push(cell)
-
- for (
- var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan;
- i < endRow;
- i++
- ) {
- if (i == rowIndex) continue
- var tableRow = this.table.rows[i],
- tmpCell = tableRow.insertCell(
- colIndex - this.getPreviewMergedCellsNum(i, colIndex)
- )
- tmpCell.colSpan = cellInfo.colSpan
- this.setCellContent(tmpCell)
- tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign'))
- tmpCell.setAttribute('align', cell.getAttribute('align'))
- if (cell.style.cssText) {
- tmpCell.style.cssText = cell.style.cssText
- }
- results.push(tmpCell)
- }
- this.update()
- return results
- },
- getPreviewMergedCellsNum: function (rowIndex, colIndex) {
- var indexRow = this.indexTable[rowIndex],
- num = 0
- for (var i = 0; i < colIndex; ) {
- var colSpan = indexRow[i].colSpan,
- tmpRowIndex = indexRow[i].rowIndex
- num += colSpan - (tmpRowIndex == rowIndex ? 1 : 0)
- i += colSpan
- }
- return num
- },
- splitToCols: function (cell) {
- var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0),
- cellInfo = this.getCellInfo(cell),
- rowIndex = cellInfo.rowIndex,
- colIndex = cellInfo.colIndex,
- results = []
-
- cell.colSpan = 1
- cell.setAttribute('width', backWidth)
- results.push(cell)
-
- for (
- var j = colIndex, endCol = colIndex + cellInfo.colSpan;
- j < endCol;
- j++
- ) {
- if (j == colIndex) continue
- var tableRow = this.table.rows[rowIndex],
- tmpCell = tableRow.insertCell(
- this.indexTable[rowIndex][j].cellIndex + 1
- )
- tmpCell.rowSpan = cellInfo.rowSpan
- this.setCellContent(tmpCell)
- tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign'))
- tmpCell.setAttribute('align', cell.getAttribute('align'))
- tmpCell.setAttribute('width', backWidth)
- if (cell.style.cssText) {
- tmpCell.style.cssText = cell.style.cssText
- }
-
- if (cell.tagName == 'TH') {
- var th = cell.ownerDocument.createElement('th')
- th.appendChild(tmpCell.firstChild)
- th.setAttribute('vAlign', cell.getAttribute('vAlign'))
- th.rowSpan = tmpCell.rowSpan
- tableRow.insertBefore(th, tmpCell)
- domUtils.remove(tmpCell)
- }
- results.push(tmpCell)
- }
- this.update()
- return results
- },
- isLastCell: function (cell, rowsNum, colsNum) {
- rowsNum = rowsNum || this.rowsNum
- colsNum = colsNum || this.colsNum
- var cellInfo = this.getCellInfo(cell)
- return (
- cellInfo.rowIndex + cellInfo.rowSpan == rowsNum &&
- cellInfo.colIndex + cellInfo.colSpan == colsNum
- )
- },
- getLastCell: function (cells) {
- cells = cells || this.table.getElementsByTagName('td')
- var firstInfo = this.getCellInfo(cells[0])
- var me = this,
- last = cells[0],
- tr = last.parentNode,
- cellsNum = 0,
- cols = 0,
- rows
- utils.each(cells, function (cell) {
- if (cell.parentNode == tr) cols += cell.colSpan || 1
- cellsNum += cell.rowSpan * cell.colSpan || 1
- })
- rows = cellsNum / cols
- utils.each(cells, function (cell) {
- if (me.isLastCell(cell, rows, cols)) {
- last = cell
- return false
- }
- })
- return last
- },
- selectRow: function (rowIndex) {
- var indexRow = this.indexTable[rowIndex],
- start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex),
- end = this.getCell(
- indexRow[this.colsNum - 1].rowIndex,
- indexRow[this.colsNum - 1].cellIndex
- ),
- range = this.getCellsRange(start, end)
- this.setSelected(range)
- },
- selectTable: function () {
- var tds = this.table.getElementsByTagName('td'),
- range = this.getCellsRange(tds[0], tds[tds.length - 1])
- this.setSelected(range)
- },
- setBackground: function (cells, value) {
- if (typeof value === 'string') {
- utils.each(cells, function (cell) {
- cell.style.backgroundColor = value
- })
- } else if (typeof value === 'object') {
- value = utils.extend(
- {
- repeat: true,
- colorList: ['#ddd', '#fff']
- },
- value
- )
- var rowIndex = this.getCellInfo(cells[0]).rowIndex,
- count = 0,
- colors = value.colorList,
- getColor = function (list, index, repeat) {
- return list[index]
- ? list[index]
- : repeat
- ? list[index % list.length]
- : ''
- }
- for (var i = 0, cell; (cell = cells[i++]); ) {
- var cellInfo = this.getCellInfo(cell)
- cell.style.backgroundColor = getColor(
- colors,
- rowIndex + count == cellInfo.rowIndex ? count : ++count,
- value.repeat
- )
- }
- }
- },
- removeBackground: function (cells) {
- utils.each(cells, function (cell) {
- cell.style.backgroundColor = ''
- })
- }
- }
- function showError(e) {}
- })()
-
-
- ;(function () {
- var UT = UE.UETable,
- getTableItemsByRange = function (editor) {
- return UT.getTableItemsByRange(editor)
- },
- getUETableBySelected = function (editor) {
- return UT.getUETableBySelected(editor)
- },
- getDefaultValue = function (editor, table) {
- return UT.getDefaultValue(editor, table)
- },
- getUETable = function (tdOrTable) {
- return UT.getUETable(tdOrTable)
- }
- UE.commands['inserttable'] = {
- queryCommandState: function () {
- return getTableItemsByRange(this).table ? -1 : 0
- },
- execCommand: function (cmd, opt) {
- function createTable(opt, tdWidth) {
- var html = [],
- rowsNum = opt.numRows,
- colsNum = opt.numCols
- for (var r = 0; r < rowsNum; r++) {
- html.push('<tr' + (r == 0 ? ' class="firstRow"' : '') + '>')
- for (var c = 0; c < colsNum; c++) {
- html.push(
- '<td width="' +
- tdWidth +
- '" vAlign="' +
- opt.tdvalign +
- '" >' +
- (browser.ie && browser.version < 11
- ? domUtils.fillChar
- : '<br/>') +
- '</td>'
- )
- }
- html.push('</tr>')
- }
-
- return '<table><tbody>' + html.join('') + '</tbody></table>'
- }
- if (!opt) {
- opt = utils.extend(
- {},
- {
- numCols: this.options.defaultCols,
- numRows: this.options.defaultRows,
- tdvalign: this.options.tdvalign
- }
- )
- }
- var me = this
- var range = this.selection.getRange(),
- start = range.startContainer,
- firstParentBlock =
- domUtils.findParent(
- start,
- function (node) {
- return domUtils.isBlockElm(node)
- },
- true
- ) || me.body
- var defaultValue = getDefaultValue(me),
- tableWidth = firstParentBlock.offsetWidth,
- tdWidth = Math.floor(
- tableWidth / opt.numCols -
- defaultValue.tdPadding * 2 -
- defaultValue.tdBorder
- )
-
- !opt.tdvalign && (opt.tdvalign = me.options.tdvalign)
- me.execCommand('inserthtml', createTable(opt, tdWidth))
- }
- }
- UE.commands['insertparagraphbeforetable'] = {
- queryCommandState: function () {
- return getTableItemsByRange(this).cell ? 0 : -1
- },
- execCommand: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- var p = this.document.createElement('p')
- p.innerHTML = browser.ie ? ' ' : '<br />'
- table.parentNode.insertBefore(p, table)
- this.selection.getRange().setStart(p, 0).setCursor()
- }
- }
- }
- UE.commands['deletetable'] = {
- queryCommandState: function () {
- var rng = this.selection.getRange()
- return domUtils.findParentByTagName(rng.startContainer, 'table', true)
- ? 0
- : -1
- },
- execCommand: function (cmd, table) {
- var rng = this.selection.getRange()
- table =
- table ||
- domUtils.findParentByTagName(rng.startContainer, 'table', true)
- if (table) {
- var next = table.nextSibling
- if (!next) {
- next = domUtils.createElement(this.document, 'p', {
- innerHTML: browser.ie ? domUtils.fillChar : '<br/>'
- })
- table.parentNode.insertBefore(next, table)
- }
- domUtils.remove(table)
- rng = this.selection.getRange()
- if (next.nodeType == 3) {
- rng.setStartBefore(next)
- } else {
- rng.setStart(next, 0)
- }
- rng.setCursor(false, true)
- this.fireEvent('tablehasdeleted')
- }
- }
- }
- UE.commands['cellalign'] = {
- queryCommandState: function () {
- return getSelectedArr(this).length ? 0 : -1
- },
- execCommand: function (cmd, align) {
- var selectedTds = getSelectedArr(this)
- if (selectedTds.length) {
- for (var i = 0, ci; (ci = selectedTds[i++]); ) {
- ci.setAttribute('align', align)
- }
- }
- }
- }
- UE.commands['cellvalign'] = {
- queryCommandState: function () {
- return getSelectedArr(this).length ? 0 : -1
- },
- execCommand: function (cmd, valign) {
- var selectedTds = getSelectedArr(this)
- if (selectedTds.length) {
- for (var i = 0, ci; (ci = selectedTds[i++]); ) {
- ci.setAttribute('vAlign', valign)
- }
- }
- }
- }
- UE.commands['insertcaption'] = {
- queryCommandState: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- return table.getElementsByTagName('caption').length == 0 ? 1 : -1
- }
- return -1
- },
- execCommand: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- var caption = this.document.createElement('caption')
- caption.innerHTML = browser.ie ? domUtils.fillChar : '<br/>'
- table.insertBefore(caption, table.firstChild)
- var range = this.selection.getRange()
- range.setStart(caption, 0).setCursor()
- }
- }
- }
- UE.commands['deletecaption'] = {
- queryCommandState: function () {
- var rng = this.selection.getRange(),
- table = domUtils.findParentByTagName(rng.startContainer, 'table')
- if (table) {
- return table.getElementsByTagName('caption').length == 0 ? -1 : 1
- }
- return -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- table = domUtils.findParentByTagName(rng.startContainer, 'table')
- if (table) {
- domUtils.remove(table.getElementsByTagName('caption')[0])
- var range = this.selection.getRange()
- range.setStart(table.rows[0].cells[0], 0).setCursor()
- }
- }
- }
- UE.commands['inserttitle'] = {
- queryCommandState: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- var firstRow = table.rows[0]
- return firstRow.cells[
- firstRow.cells.length - 1
- ].tagName.toLowerCase() != 'th'
- ? 0
- : -1
- }
- return -1
- },
- execCommand: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- getUETable(table).insertRow(0, 'th')
- }
- var th = table.getElementsByTagName('th')[0]
- this.selection.getRange().setStart(th, 0).setCursor(false, true)
- }
- }
- UE.commands['deletetitle'] = {
- queryCommandState: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- var firstRow = table.rows[0]
- return firstRow.cells[
- firstRow.cells.length - 1
- ].tagName.toLowerCase() == 'th'
- ? 0
- : -1
- }
- return -1
- },
- execCommand: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- domUtils.remove(table.rows[0])
- }
- var td = table.getElementsByTagName('td')[0]
- this.selection.getRange().setStart(td, 0).setCursor(false, true)
- }
- }
- UE.commands['inserttitlecol'] = {
- queryCommandState: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- var lastRow = table.rows[table.rows.length - 1]
- return lastRow.getElementsByTagName('th').length ? -1 : 0
- }
- return -1
- },
- execCommand: function (cmd) {
- var table = getTableItemsByRange(this).table
- if (table) {
- getUETable(table).insertCol(0, 'th')
- }
- resetTdWidth(table, this)
- var th = table.getElementsByTagName('th')[0]
- this.selection.getRange().setStart(th, 0).setCursor(false, true)
- }
- }
- UE.commands['deletetitlecol'] = {
- queryCommandState: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- var lastRow = table.rows[table.rows.length - 1]
- return lastRow.getElementsByTagName('th').length ? 0 : -1
- }
- return -1
- },
- execCommand: function () {
- var table = getTableItemsByRange(this).table
- if (table) {
- for (var i = 0; i < table.rows.length; i++) {
- domUtils.remove(table.rows[i].children[0])
- }
- }
- resetTdWidth(table, this)
- var td = table.getElementsByTagName('td')[0]
- this.selection.getRange().setStart(td, 0).setCursor(false, true)
- }
- }
- UE.commands['mergeright'] = {
- queryCommandState: function (cmd) {
- var tableItems = getTableItemsByRange(this),
- table = tableItems.table,
- cell = tableItems.cell
- if (!table || !cell) return -1
- var ut = getUETable(table)
- if (ut.selectedTds.length) return -1
- var cellInfo = ut.getCellInfo(cell),
- rightColIndex = cellInfo.colIndex + cellInfo.colSpan
- if (rightColIndex >= ut.colsNum) return -1
- var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex],
- rightCell =
- table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]
- if (!rightCell || cell.tagName != rightCell.tagName) return -1
-
- return rightCellInfo.rowIndex == cellInfo.rowIndex &&
- rightCellInfo.rowSpan == cellInfo.rowSpan
- ? 0
- : -1
- },
- execCommand: function (cmd) {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell)
- ut.mergeRight(cell)
- rng.moveToBookmark(bk).select()
- }
- }
- UE.commands['mergedown'] = {
- queryCommandState: function (cmd) {
- var tableItems = getTableItemsByRange(this),
- table = tableItems.table,
- cell = tableItems.cell
- if (!table || !cell) return -1
- var ut = getUETable(table)
- if (ut.selectedTds.length) return -1
- var cellInfo = ut.getCellInfo(cell),
- downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan
- if (downRowIndex >= ut.rowsNum) return -1
- var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex],
- downCell =
- table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]
- if (!downCell || cell.tagName != downCell.tagName) return -1
-
- return downCellInfo.colIndex == cellInfo.colIndex &&
- downCellInfo.colSpan == cellInfo.colSpan
- ? 0
- : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell)
- ut.mergeDown(cell)
- rng.moveToBookmark(bk).select()
- }
- }
- UE.commands['mergecells'] = {
- queryCommandState: function () {
- return getUETableBySelected(this) ? 0 : -1
- },
- execCommand: function () {
- var ut = getUETableBySelected(this)
- if (ut && ut.selectedTds.length) {
- var cell = ut.selectedTds[0]
- ut.mergeRange()
- var rng = this.selection.getRange()
- if (domUtils.isEmptyBlock(cell)) {
- rng.setStart(cell, 0).collapse(true)
- } else {
- rng.selectNodeContents(cell)
- }
- rng.select()
- }
- }
- }
- UE.commands['insertrow'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- return cell &&
- (cell.tagName == 'TD' ||
- (cell.tagName == 'TH' &&
- tableItems.tr !== tableItems.table.rows[0])) &&
- getUETable(tableItems.table).rowsNum < this.options.maxRowNum
- ? 0
- : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell,
- table = tableItems.table,
- ut = getUETable(table),
- cellInfo = ut.getCellInfo(cell)
-
- if (!ut.selectedTds.length) {
- ut.insertRow(cellInfo.rowIndex, cell)
- } else {
- var range = ut.cellsRange
- for (
- var i = 0, len = range.endRowIndex - range.beginRowIndex + 1;
- i < len;
- i++
- ) {
- ut.insertRow(range.beginRowIndex, cell)
- }
- }
- rng.moveToBookmark(bk).select()
- if (table.getAttribute('interlaced') === 'enabled')
- this.fireEvent('interlacetable', table)
- }
- }
-
- UE.commands['insertrownext'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- return cell &&
- cell.tagName == 'TD' &&
- getUETable(tableItems.table).rowsNum < this.options.maxRowNum
- ? 0
- : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell,
- table = tableItems.table,
- ut = getUETable(table),
- cellInfo = ut.getCellInfo(cell)
-
- if (!ut.selectedTds.length) {
- ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell)
- } else {
- var range = ut.cellsRange
- for (
- var i = 0, len = range.endRowIndex - range.beginRowIndex + 1;
- i < len;
- i++
- ) {
- ut.insertRow(range.endRowIndex + 1, cell)
- }
- }
- rng.moveToBookmark(bk).select()
- if (table.getAttribute('interlaced') === 'enabled')
- this.fireEvent('interlacetable', table)
- }
- }
- UE.commands['deleterow'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this)
- return tableItems.cell ? 0 : -1
- },
- execCommand: function () {
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell),
- cellsRange = ut.cellsRange,
- cellInfo = ut.getCellInfo(cell),
- preCell = ut.getVSideCell(cell),
- nextCell = ut.getVSideCell(cell, true),
- rng = this.selection.getRange()
- if (utils.isEmptyObject(cellsRange)) {
- ut.deleteRow(cellInfo.rowIndex)
- } else {
- for (
- var i = cellsRange.beginRowIndex;
- i < cellsRange.endRowIndex + 1;
- i++
- ) {
- ut.deleteRow(cellsRange.beginRowIndex)
- }
- }
- var table = ut.table
- if (!table.getElementsByTagName('td').length) {
- var nextSibling = table.nextSibling
- domUtils.remove(table)
- if (nextSibling) {
- rng.setStart(nextSibling, 0).setCursor(false, true)
- }
- } else {
- if (
- cellInfo.rowSpan == 1 ||
- cellInfo.rowSpan ==
- cellsRange.endRowIndex - cellsRange.beginRowIndex + 1
- ) {
- if (nextCell || preCell)
- rng.selectNodeContents(nextCell || preCell).setCursor(false, true)
- } else {
- var newCell = ut.getCell(
- cellInfo.rowIndex,
- ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex
- )
- if (newCell) rng.selectNodeContents(newCell).setCursor(false, true)
- }
- }
- if (table.getAttribute('interlaced') === 'enabled')
- this.fireEvent('interlacetable', table)
- }
- }
- UE.commands['insertcol'] = {
- queryCommandState: function (cmd) {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- return cell &&
- (cell.tagName == 'TD' ||
- (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) &&
- getUETable(tableItems.table).colsNum < this.options.maxColNum
- ? 0
- : -1
- },
- execCommand: function (cmd) {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- if (this.queryCommandState(cmd) == -1) return
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell),
- cellInfo = ut.getCellInfo(cell)
-
- if (!ut.selectedTds.length) {
- ut.insertCol(cellInfo.colIndex, cell)
- } else {
- var range = ut.cellsRange
- for (
- var i = 0, len = range.endColIndex - range.beginColIndex + 1;
- i < len;
- i++
- ) {
- ut.insertCol(range.beginColIndex, cell)
- }
- }
- rng.moveToBookmark(bk).select(true)
- }
- }
- UE.commands['insertcolnext'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- return cell &&
- getUETable(tableItems.table).colsNum < this.options.maxColNum
- ? 0
- : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell),
- cellInfo = ut.getCellInfo(cell)
-
- if (!ut.selectedTds.length) {
- ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell)
- } else {
- var range = ut.cellsRange
- for (
- var i = 0, len = range.endColIndex - range.beginColIndex + 1;
- i < len;
- i++
- ) {
- ut.insertCol(range.endColIndex + 1, cell)
- }
- }
- rng.moveToBookmark(bk).select()
- }
- }
- UE.commands['deletecol'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this)
- return tableItems.cell ? 0 : -1
- },
- execCommand: function () {
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell),
- range = ut.cellsRange,
- cellInfo = ut.getCellInfo(cell),
- preCell = ut.getHSideCell(cell),
- nextCell = ut.getHSideCell(cell, true)
- if (utils.isEmptyObject(range)) {
- ut.deleteCol(cellInfo.colIndex)
- } else {
- for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) {
- ut.deleteCol(range.beginColIndex)
- }
- }
- var table = ut.table,
- rng = this.selection.getRange()
- if (!table.getElementsByTagName('td').length) {
- var nextSibling = table.nextSibling
- domUtils.remove(table)
- if (nextSibling) {
- rng.setStart(nextSibling, 0).setCursor(false, true)
- }
- } else {
- if (domUtils.inDoc(cell, this.document)) {
- rng.setStart(cell, 0).setCursor(false, true)
- } else {
- if (nextCell && domUtils.inDoc(nextCell, this.document)) {
- rng.selectNodeContents(nextCell).setCursor(false, true)
- } else {
- if (preCell && domUtils.inDoc(preCell, this.document)) {
- rng.selectNodeContents(preCell).setCursor(true, true)
- }
- }
- }
- }
- }
- }
- UE.commands['splittocells'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- if (!cell) return -1
- var ut = getUETable(tableItems.table)
- if (ut.selectedTds.length > 0) return -1
- return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell)
- ut.splitToCells(cell)
- rng.moveToBookmark(bk).select()
- }
- }
- UE.commands['splittorows'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- if (!cell) return -1
- var ut = getUETable(tableItems.table)
- if (ut.selectedTds.length > 0) return -1
- return cell && cell.rowSpan > 1 ? 0 : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell)
- ut.splitToRows(cell)
- rng.moveToBookmark(bk).select()
- }
- }
- UE.commands['splittocols'] = {
- queryCommandState: function () {
- var tableItems = getTableItemsByRange(this),
- cell = tableItems.cell
- if (!cell) return -1
- var ut = getUETable(tableItems.table)
- if (ut.selectedTds.length > 0) return -1
- return cell && cell.colSpan > 1 ? 0 : -1
- },
- execCommand: function () {
- var rng = this.selection.getRange(),
- bk = rng.createBookmark(true)
- var cell = getTableItemsByRange(this).cell,
- ut = getUETable(cell)
- ut.splitToCols(cell)
- rng.moveToBookmark(bk).select()
- }
- }
- UE.commands['adaptbytext'] = UE.commands['adaptbywindow'] = {
- queryCommandState: function () {
- return getTableItemsByRange(this).table ? 0 : -1
- },
- execCommand: function (cmd) {
- var tableItems = getTableItemsByRange(this),
- table = tableItems.table
- if (table) {
- if (cmd == 'adaptbywindow') {
- resetTdWidth(table, this)
- } else {
- var cells = domUtils.getElementsByTagName(table, 'td th')
- utils.each(cells, function (cell) {
- cell.removeAttribute('width')
- })
- table.removeAttribute('width')
- }
- }
- }
- }
-
- UE.commands['averagedistributecol'] = {
- queryCommandState: function () {
- var ut = getUETableBySelected(this)
- if (!ut) return -1
- return ut.isFullRow() || ut.isFullCol() ? 0 : -1
- },
- execCommand: function (cmd) {
- var me = this,
- ut = getUETableBySelected(me)
- function getAverageWidth() {
- var tb = ut.table,
- averageWidth,
- sumWidth = 0,
- colsNum = 0,
- tbAttr = getDefaultValue(me, tb)
- if (ut.isFullRow()) {
- sumWidth = tb.offsetWidth
- colsNum = ut.colsNum
- } else {
- var begin = ut.cellsRange.beginColIndex,
- end = ut.cellsRange.endColIndex,
- node
- for (var i = begin; i <= end; ) {
- node = ut.selectedTds[i]
- sumWidth += node.offsetWidth
- i += node.colSpan
- colsNum += 1
- }
- }
- averageWidth =
- Math.ceil(sumWidth / colsNum) -
- tbAttr.tdBorder * 2 -
- tbAttr.tdPadding * 2
- return averageWidth
- }
- function setAverageWidth(averageWidth) {
- utils.each(
- domUtils.getElementsByTagName(ut.table, 'th'),
- function (node) {
- node.setAttribute('width', '')
- }
- )
- var cells = ut.isFullRow()
- ? domUtils.getElementsByTagName(ut.table, 'td')
- : ut.selectedTds
- utils.each(cells, function (node) {
- if (node.colSpan == 1) {
- node.setAttribute('width', averageWidth)
- }
- })
- }
- if (ut && ut.selectedTds.length) {
- setAverageWidth(getAverageWidth())
- }
- }
- }
-
- UE.commands['averagedistributerow'] = {
- queryCommandState: function () {
- var ut = getUETableBySelected(this)
- if (!ut) return -1
- if (ut.selectedTds && /th/gi.test(ut.selectedTds[0].tagName)) return -1
- return ut.isFullRow() || ut.isFullCol() ? 0 : -1
- },
- execCommand: function (cmd) {
- var me = this,
- ut = getUETableBySelected(me)
- function getAverageHeight() {
- var averageHeight,
- rowNum,
- sumHeight = 0,
- tb = ut.table,
- tbAttr = getDefaultValue(me, tb),
- tdpadding = parseInt(
- domUtils.getComputedStyle(
- tb.getElementsByTagName('td')[0],
- 'padding-top'
- )
- )
- if (ut.isFullCol()) {
- var captionArr = domUtils.getElementsByTagName(tb, 'caption'),
- thArr = domUtils.getElementsByTagName(tb, 'th'),
- captionHeight,
- thHeight
- if (captionArr.length > 0) {
- captionHeight = captionArr[0].offsetHeight
- }
- if (thArr.length > 0) {
- thHeight = thArr[0].offsetHeight
- }
- sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0)
- rowNum = thArr.length == 0 ? ut.rowsNum : ut.rowsNum - 1
- } else {
- var begin = ut.cellsRange.beginRowIndex,
- end = ut.cellsRange.endRowIndex,
- count = 0,
- trs = domUtils.getElementsByTagName(tb, 'tr')
- for (var i = begin; i <= end; i++) {
- sumHeight += trs[i].offsetHeight
- count += 1
- }
- rowNum = count
- }
-
- if (browser.ie && browser.version < 9) {
- averageHeight = Math.ceil(sumHeight / rowNum)
- } else {
- averageHeight =
- Math.ceil(sumHeight / rowNum) -
- tbAttr.tdBorder * 2 -
- tdpadding * 2
- }
- return averageHeight
- }
- function setAverageHeight(averageHeight) {
- var cells = ut.isFullCol()
- ? domUtils.getElementsByTagName(ut.table, 'td')
- : ut.selectedTds
- utils.each(cells, function (node) {
- if (node.rowSpan == 1) {
- node.setAttribute('height', averageHeight)
- }
- })
- }
- if (ut && ut.selectedTds.length) {
- setAverageHeight(getAverageHeight())
- }
- }
- }
-
- UE.commands['cellalignment'] = {
- queryCommandState: function () {
- return getTableItemsByRange(this).table ? 0 : -1
- },
- execCommand: function (cmd, data) {
- var me = this,
- ut = getUETableBySelected(me)
- if (!ut) {
- var start = me.selection.getStart(),
- cell =
- start &&
- domUtils.findParentByTagName(start, ['td', 'th', 'caption'], true)
- if (!/caption/gi.test(cell.tagName)) {
- domUtils.setAttributes(cell, data)
- } else {
- cell.style.textAlign = data.align
- cell.style.verticalAlign = data.vAlign
- }
- me.selection.getRange().setCursor(true)
- } else {
- utils.each(ut.selectedTds, function (cell) {
- domUtils.setAttributes(cell, data)
- })
- }
- },
-
- queryCommandValue: function (cmd) {
- var activeMenuCell = getTableItemsByRange(this).cell
- if (!activeMenuCell) {
- activeMenuCell = getSelectedArr(this)[0]
- }
- if (!activeMenuCell) {
- return null
- } else {
-
- var cells = UE.UETable.getUETable(activeMenuCell).selectedTds
- !cells.length && (cells = activeMenuCell)
- return UE.UETable.getTableCellAlignState(cells)
- }
- }
- }
-
- UE.commands['tablealignment'] = {
- queryCommandState: function () {
- if (browser.ie && browser.version < 8) {
- return -1
- }
- return getTableItemsByRange(this).table ? 0 : -1
- },
- execCommand: function (cmd, value) {
- var me = this,
- start = me.selection.getStart(),
- table = start && domUtils.findParentByTagName(start, ['table'], true)
- if (table) {
- table.setAttribute('align', value)
- }
- }
- }
-
- UE.commands['edittable'] = {
- queryCommandState: function () {
- return getTableItemsByRange(this).table ? 0 : -1
- },
- execCommand: function (cmd, color) {
- var rng = this.selection.getRange(),
- table = domUtils.findParentByTagName(rng.startContainer, 'table')
- if (table) {
- var arr = domUtils
- .getElementsByTagName(table, 'td')
- .concat(
- domUtils.getElementsByTagName(table, 'th'),
- domUtils.getElementsByTagName(table, 'caption')
- )
- utils.each(arr, function (node) {
- node.style.borderColor = color
- })
- }
- }
- }
-
- UE.commands['edittd'] = {
- queryCommandState: function () {
- return getTableItemsByRange(this).table ? 0 : -1
- },
- execCommand: function (cmd, bkColor) {
- var me = this,
- ut = getUETableBySelected(me)
- if (!ut) {
- var start = me.selection.getStart(),
- cell =
- start &&
- domUtils.findParentByTagName(start, ['td', 'th', 'caption'], true)
- if (cell) {
- cell.style.backgroundColor = bkColor
- }
- } else {
- utils.each(ut.selectedTds, function (cell) {
- cell.style.backgroundColor = bkColor
- })
- }
- }
- }
- UE.commands['settablebackground'] = {
- queryCommandState: function () {
- return getSelectedArr(this).length > 1 ? 0 : -1
- },
- execCommand: function (cmd, value) {
- var cells, ut
- cells = getSelectedArr(this)
- ut = getUETable(cells[0])
- ut.setBackground(cells, value)
- }
- }
- UE.commands['cleartablebackground'] = {
- queryCommandState: function () {
- var cells = getSelectedArr(this)
- if (!cells.length) return -1
- for (var i = 0, cell; (cell = cells[i++]); ) {
- if (cell.style.backgroundColor !== '') return 0
- }
- return -1
- },
- execCommand: function () {
- var cells = getSelectedArr(this),
- ut = getUETable(cells[0])
- ut.removeBackground(cells)
- }
- }
- UE.commands['interlacetable'] = UE.commands['uninterlacetable'] = {
- queryCommandState: function (cmd) {
- var table = getTableItemsByRange(this).table
- if (!table) return -1
- var interlaced = table.getAttribute('interlaced')
- if (cmd == 'interlacetable') {
-
-
- return interlaced === 'enabled' ? -1 : 0
- } else {
- return !interlaced || interlaced === 'disabled' ? -1 : 0
- }
- },
- execCommand: function (cmd, classList) {
- var table = getTableItemsByRange(this).table
- if (cmd == 'interlacetable') {
- table.setAttribute('interlaced', 'enabled')
- this.fireEvent('interlacetable', table, classList)
- } else {
- table.setAttribute('interlaced', 'disabled')
- this.fireEvent('uninterlacetable', table)
- }
- }
- }
- UE.commands['setbordervisible'] = {
- queryCommandState: function (cmd) {
- var table = getTableItemsByRange(this).table
- if (!table) return -1
- return 0
- },
- execCommand: function () {
- var table = getTableItemsByRange(this).table
- utils.each(domUtils.getElementsByTagName(table, 'td'), function (td) {
- td.style.borderWidth = '1px'
- td.style.borderStyle = 'solid'
- })
- }
- }
- function resetTdWidth(table, editor) {
- var tds = domUtils.getElementsByTagName(table, 'td th')
- utils.each(tds, function (td) {
- td.removeAttribute('width')
- })
- table.setAttribute(
- 'width',
- getTableWidth(editor, true, getDefaultValue(editor, table))
- )
- var tdsWidths = []
- setTimeout(function () {
- utils.each(tds, function (td) {
- td.colSpan == 1 && tdsWidths.push(td.offsetWidth)
- })
- utils.each(tds, function (td, i) {
- td.colSpan == 1 && td.setAttribute('width', tdsWidths[i] + '')
- })
- }, 0)
- }
- function getTableWidth(editor, needIEHack, defaultValue) {
- var body = editor.body
- return (
- body.offsetWidth -
- (needIEHack
- ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2
- : 0) -
- defaultValue.tableBorder * 2 -
- (editor.options.offsetWidth || 0)
- )
- }
- function getSelectedArr(editor) {
- var cell = getTableItemsByRange(editor).cell
- if (cell) {
- var ut = getUETable(cell)
- return ut.selectedTds.length ? ut.selectedTds : [cell]
- } else {
- return []
- }
- }
- })()
-
-
- UE.plugins['table'] = function () {
- var me = this,
- tabTimer = null,
-
- tableDragTimer = null,
-
- tableResizeTimer = null,
-
- cellMinWidth = 5,
- isInResizeBuffer = false,
-
- cellBorderWidth = 5,
-
- offsetOfTableCell = 10,
-
- singleClickState = 0,
- userActionStatus = null,
-
- dblclickTime = 360,
- UT = UE.UETable,
- getUETable = function (tdOrTable) {
- return UT.getUETable(tdOrTable)
- },
- getUETableBySelected = function (editor) {
- return UT.getUETableBySelected(editor)
- },
- getDefaultValue = function (editor, table) {
- return UT.getDefaultValue(editor, table)
- },
- removeSelectedClass = function (cells) {
- return UT.removeSelectedClass(cells)
- }
- function showError(e) {
-
- }
- me.ready(function () {
- var me = this
- var orgGetText = me.selection.getText
- me.selection.getText = function () {
- var table = getUETableBySelected(me)
- if (table) {
- var str = ''
- utils.each(table.selectedTds, function (td) {
- str += td[browser.ie ? 'innerText' : 'textContent']
- })
- return str
- } else {
- return orgGetText.call(me.selection)
- }
- }
- })
-
- var startTd = null,
- currentTd = null,
- onDrag = '',
- onBorder = false,
- dragButton = null,
- dragOver = false,
- dragLine = null,
- dragTd = null
- var mousedown = false,
-
- needIEHack = true
- me.setOpt({
- maxColNum: 20,
- maxRowNum: 100,
- defaultCols: 5,
- defaultRows: 5,
- tdvalign: 'top',
- cursorpath: me.options.UEDITOR_HOME_URL + 'themes/default/images/cursor_',
- tableDragable: false,
- classList: [
- 'ue-table-interlace-color-single',
- 'ue-table-interlace-color-double'
- ]
- })
- me.getUETable = getUETable
- var commands = {
- deletetable: 1,
- inserttable: 1,
- cellvalign: 1,
- insertcaption: 1,
- deletecaption: 1,
- inserttitle: 1,
- deletetitle: 1,
- mergeright: 1,
- mergedown: 1,
- mergecells: 1,
- insertrow: 1,
- insertrownext: 1,
- deleterow: 1,
- insertcol: 1,
- insertcolnext: 1,
- deletecol: 1,
- splittocells: 1,
- splittorows: 1,
- splittocols: 1,
- adaptbytext: 1,
- adaptbywindow: 1,
- adaptbycustomer: 1,
- insertparagraph: 1,
- insertparagraphbeforetable: 1,
- averagedistributecol: 1,
- averagedistributerow: 1
- }
- me.ready(function () {
- utils.cssRule(
- 'table',
-
- '.selectTdClass{background-color:#edf5fa !important}' +
- 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' +
-
- 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' +
- 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' +
- 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +
- 'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' +
- 'table tr.firstRow th{border-top-width:2px;}' +
- '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' +
- 'td p{margin:0;padding:0;}',
- me.document
- )
- var tableCopyList, isFullCol, isFullRow
-
- me.addListener('keydown', function (cmd, evt) {
- var me = this
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 8) {
- var ut = getUETableBySelected(me)
- if (ut && ut.selectedTds.length) {
- if (ut.isFullCol()) {
- me.execCommand('deletecol')
- } else if (ut.isFullRow()) {
- me.execCommand('deleterow')
- } else {
- me.fireEvent('delcells')
- }
- domUtils.preventDefault(evt)
- }
- var caption = domUtils.findParentByTagName(
- me.selection.getStart(),
- 'caption',
- true
- ),
- range = me.selection.getRange()
- if (range.collapsed && caption && isEmptyBlock(caption)) {
- me.fireEvent('saveScene')
- var table = caption.parentNode
- domUtils.remove(caption)
- if (table) {
- range.setStart(table.rows[0].cells[0], 0).setCursor(false, true)
- }
- me.fireEvent('saveScene')
- }
- }
- if (keyCode == 46) {
- ut = getUETableBySelected(me)
- if (ut) {
- me.fireEvent('saveScene')
- for (var i = 0, ci; (ci = ut.selectedTds[i++]); ) {
- domUtils.fillNode(me.document, ci)
- }
- me.fireEvent('saveScene')
- domUtils.preventDefault(evt)
- }
- }
- if (keyCode == 13) {
- var rng = me.selection.getRange(),
- caption = domUtils.findParentByTagName(
- rng.startContainer,
- 'caption',
- true
- )
- if (caption) {
- var table = domUtils.findParentByTagName(caption, 'table')
- if (!rng.collapsed) {
- rng.deleteContents()
- me.fireEvent('saveScene')
- } else {
- if (caption) {
- rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true)
- }
- }
- domUtils.preventDefault(evt)
- return
- }
- if (rng.collapsed) {
- var table = domUtils.findParentByTagName(
- rng.startContainer,
- 'table'
- )
- if (table) {
- var cell = table.rows[0].cells[0],
- start = domUtils.findParentByTagName(
- me.selection.getStart(),
- ['td', 'th'],
- true
- ),
- preNode = table.previousSibling
- if (
- cell === start &&
- (!preNode ||
- (preNode.nodeType == 1 && preNode.tagName == 'TABLE')) &&
- domUtils.isStartInblock(rng)
- ) {
- var first = domUtils.findParent(
- me.selection.getStart(),
- function (n) {
- return domUtils.isBlockElm(n)
- },
- true
- )
- if (
- first &&
- (/t(h|d)/i.test(first.tagName) || first === start.firstChild)
- ) {
- me.execCommand('insertparagraphbeforetable')
- domUtils.preventDefault(evt)
- }
- }
- }
- }
- }
- if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') {
- tableCopyList = null
- var ut = getUETableBySelected(me)
- if (ut) {
- var tds = ut.selectedTds
- isFullCol = ut.isFullCol()
- isFullRow = ut.isFullRow()
- tableCopyList = [[ut.cloneCell(tds[0], null, true)]]
- for (var i = 1, ci; (ci = tds[i]); i++) {
- if (ci.parentNode !== tds[i - 1].parentNode) {
- tableCopyList.push([ut.cloneCell(ci, null, true)])
- } else {
- tableCopyList[tableCopyList.length - 1].push(
- ut.cloneCell(ci, null, true)
- )
- }
- }
- }
- }
- })
- me.addListener('tablehasdeleted', function () {
- toggleDraggableState(this, false, '', null)
- if (dragButton) domUtils.remove(dragButton)
- })
- me.addListener('beforepaste', function (cmd, html) {
- var me = this
- var rng = me.selection.getRange()
- if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) {
- var div = me.document.createElement('div')
- div.innerHTML = html.html
-
- html.html = div[browser.ie9below ? 'innerText' : 'textContent']
- return
- }
- var table = getUETableBySelected(me)
- if (tableCopyList) {
- me.fireEvent('saveScene')
- var rng = me.selection.getRange()
- var td = domUtils.findParentByTagName(
- rng.startContainer,
- ['td', 'th'],
- true
- ),
- tmpNode,
- preNode
- if (td) {
- var ut = getUETable(td)
- if (isFullRow) {
- var rowIndex = ut.getCellInfo(td).rowIndex
- if (td.tagName == 'TH') {
- rowIndex++
- }
- for (var i = 0, ci; (ci = tableCopyList[i++]); ) {
- var tr = ut.insertRow(rowIndex++, 'td')
- for (var j = 0, cj; (cj = ci[j]); j++) {
- var cell = tr.cells[j]
- if (!cell) {
- cell = tr.insertCell(j)
- }
- cell.innerHTML = cj.innerHTML
- cj.getAttribute('width') &&
- cell.setAttribute('width', cj.getAttribute('width'))
- cj.getAttribute('vAlign') &&
- cell.setAttribute('vAlign', cj.getAttribute('vAlign'))
- cj.getAttribute('align') &&
- cell.setAttribute('align', cj.getAttribute('align'))
- cj.style.cssText && (cell.style.cssText = cj.style.cssText)
- }
- for (var j = 0, cj; (cj = tr.cells[j]); j++) {
- if (!ci[j]) break
- cj.innerHTML = ci[j].innerHTML
- ci[j].getAttribute('width') &&
- cj.setAttribute('width', ci[j].getAttribute('width'))
- ci[j].getAttribute('vAlign') &&
- cj.setAttribute('vAlign', ci[j].getAttribute('vAlign'))
- ci[j].getAttribute('align') &&
- cj.setAttribute('align', ci[j].getAttribute('align'))
- ci[j].style.cssText &&
- (cj.style.cssText = ci[j].style.cssText)
- }
- }
- } else {
- if (isFullCol) {
- cellInfo = ut.getCellInfo(td)
- var maxColNum = 0
- for (var j = 0, ci = tableCopyList[0], cj; (cj = ci[j++]); ) {
- maxColNum += cj.colSpan || 1
- }
- me.__hasEnterExecCommand = true
- for (i = 0; i < maxColNum; i++) {
- me.execCommand('insertcol')
- }
- me.__hasEnterExecCommand = false
- td = ut.table.rows[0].cells[cellInfo.cellIndex]
- if (td.tagName == 'TH') {
- td = ut.table.rows[1].cells[cellInfo.cellIndex]
- }
- }
- for (var i = 0, ci; (ci = tableCopyList[i++]); ) {
- tmpNode = td
- for (var j = 0, cj; (cj = ci[j++]); ) {
- if (td) {
- td.innerHTML = cj.innerHTML
-
- cj.getAttribute('width') &&
- td.setAttribute('width', cj.getAttribute('width'))
- cj.getAttribute('vAlign') &&
- td.setAttribute('vAlign', cj.getAttribute('vAlign'))
- cj.getAttribute('align') &&
- td.setAttribute('align', cj.getAttribute('align'))
- cj.style.cssText && (td.style.cssText = cj.style.cssText)
- preNode = td
- td = td.nextSibling
- } else {
- var cloneTd = cj.cloneNode(true)
- domUtils.removeAttributes(cloneTd, [
- 'class',
- 'rowSpan',
- 'colSpan'
- ])
- preNode.parentNode.appendChild(cloneTd)
- }
- }
- td = ut.getNextCell(tmpNode, true, true)
- if (!tableCopyList[i]) break
- if (!td) {
- var cellInfo = ut.getCellInfo(tmpNode)
- ut.table.insertRow(ut.table.rows.length)
- ut.update()
- td = ut.getVSideCell(tmpNode, true)
- }
- }
- }
- ut.update()
- } else {
- table = me.document.createElement('table')
- for (var i = 0, ci; (ci = tableCopyList[i++]); ) {
- var tr = table.insertRow(table.rows.length)
- for (var j = 0, cj; (cj = ci[j++]); ) {
- cloneTd = UT.cloneCell(cj, null, true)
- domUtils.removeAttributes(cloneTd, ['class'])
- tr.appendChild(cloneTd)
- }
- if (j == 2 && cloneTd.rowSpan > 1) {
- cloneTd.rowSpan = 1
- }
- }
- var defaultValue = getDefaultValue(me),
- width =
- me.body.offsetWidth -
- (needIEHack
- ? parseInt(
- domUtils.getComputedStyle(me.body, 'margin-left'),
- 10
- ) * 2
- : 0) -
- defaultValue.tableBorder * 2 -
- (me.options.offsetWidth || 0)
- me.execCommand(
- 'insertHTML',
- '<table ' +
- (isFullCol && isFullRow ? 'width="' + width + '"' : '') +
- '>' +
- table.innerHTML
- .replace(/>\s*</g, '><')
- .replace(/\bth\b/gi, 'td') +
- '</table>'
- )
- }
- me.fireEvent('contentchange')
- me.fireEvent('saveScene')
- html.html = ''
- return true
- } else {
- var div = me.document.createElement('div'),
- tables
- div.innerHTML = html.html
- tables = div.getElementsByTagName('table')
- if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) {
- utils.each(tables, function (t) {
- domUtils.remove(t)
- })
- if (
- domUtils.findParentByTagName(
- me.selection.getStart(),
- 'caption',
- true
- )
- ) {
- div.innerHTML = div[browser.ie ? 'innerText' : 'textContent']
- }
- } else {
- utils.each(tables, function (table) {
- removeStyleSize(table, true)
- domUtils.removeAttributes(table, ['style', 'border'])
- utils.each(
- domUtils.getElementsByTagName(table, 'td'),
- function (td) {
- if (isEmptyBlock(td)) {
- domUtils.fillNode(me.document, td)
- }
- removeStyleSize(td, true)
-
- }
- )
- })
- }
- html.html = div.innerHTML
- }
- })
- me.addListener('afterpaste', function () {
- utils.each(
- domUtils.getElementsByTagName(me.body, 'table'),
- function (table) {
- if (table.offsetWidth > me.body.offsetWidth) {
- var defaultValue = getDefaultValue(me, table)
- table.style.width =
- me.body.offsetWidth -
- (needIEHack
- ? parseInt(
- domUtils.getComputedStyle(me.body, 'margin-left'),
- 10
- ) * 2
- : 0) -
- defaultValue.tableBorder * 2 -
- (me.options.offsetWidth || 0) +
- 'px'
- }
- }
- )
- })
- me.addListener('blur', function () {
- tableCopyList = null
- })
- var timer
- me.addListener('keydown', function () {
- clearTimeout(timer)
- timer = setTimeout(function () {
- var rng = me.selection.getRange(),
- cell = domUtils.findParentByTagName(
- rng.startContainer,
- ['th', 'td'],
- true
- )
- if (cell) {
- var table = cell.parentNode.parentNode.parentNode
- if (table.offsetWidth > table.getAttribute('width')) {
- cell.style.wordBreak = 'break-all'
- }
- }
- }, 100)
- })
- me.addListener('selectionchange', function () {
- toggleDraggableState(me, false, '', null)
- })
-
-
- me.addListener('contentchange', function () {
- var me = this
-
- hideDragLine(me)
- if (getUETableBySelected(me)) return
- var rng = me.selection.getRange()
- var start = rng.startContainer
- start = domUtils.findParentByTagName(start, ['td', 'th'], true)
- utils.each(
- domUtils.getElementsByTagName(me.document, 'table'),
- function (table) {
- if (me.fireEvent('excludetable', table) === true) return
- table.ueTable = new UT(table)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- table.onmouseover = function () {
- me.fireEvent('tablemouseover', table)
- }
- table.onmousemove = function () {
- me.fireEvent('tablemousemove', table)
- me.options.tableDragable && toggleDragButton(true, this, me)
- utils.defer(function () {
- me.fireEvent('contentchange', 50)
- }, true)
- }
- table.onmouseout = function () {
- me.fireEvent('tablemouseout', table)
- toggleDraggableState(me, false, '', null)
- hideDragLine(me)
- }
- table.onclick = function (evt) {
- evt = me.window.event || evt
- var target = getParentTdOrTh(evt.target || evt.srcElement)
- if (!target) return
- var ut = getUETable(target),
- table = ut.table,
- cellInfo = ut.getCellInfo(target),
- cellsRange,
- rng = me.selection.getRange()
-
-
-
-
-
-
-
-
-
- if (inTableSide(table, target, evt, true)) {
- var endTdCol = ut.getCell(
- ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex,
- ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex
- )
- if (evt.shiftKey && ut.selectedTds.length) {
- if (ut.selectedTds[0] !== endTdCol) {
- cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol)
- ut.setSelected(cellsRange)
- } else {
- rng && rng.selectNodeContents(endTdCol).select()
- }
- } else {
- if (target !== endTdCol) {
- cellsRange = ut.getCellsRange(target, endTdCol)
- ut.setSelected(cellsRange)
- } else {
- rng && rng.selectNodeContents(endTdCol).select()
- }
- }
- return
- }
- if (inTableSide(table, target, evt)) {
- var endTdRow = ut.getCell(
- ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex,
- ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex
- )
- if (evt.shiftKey && ut.selectedTds.length) {
- if (ut.selectedTds[0] !== endTdRow) {
- cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow)
- ut.setSelected(cellsRange)
- } else {
- rng && rng.selectNodeContents(endTdRow).select()
- }
- } else {
- if (target !== endTdRow) {
- cellsRange = ut.getCellsRange(target, endTdRow)
- ut.setSelected(cellsRange)
- } else {
- rng && rng.selectNodeContents(endTdRow).select()
- }
- }
- }
- }
- }
- )
- switchBorderColor(me, true)
- })
- domUtils.on(me.document, 'mousemove', mouseMoveEvent)
- domUtils.on(me.document, 'mouseout', function (evt) {
- var target = evt.target || evt.srcElement
- if (target.tagName == 'TABLE') {
- toggleDraggableState(me, false, '', null)
- }
- })
-
- me.addListener('interlacetable', function (type, table, classList) {
- if (!table) return
- var me = this,
- rows = table.rows,
- len = rows.length,
- getClass = function (list, index, repeat) {
- return list[index]
- ? list[index]
- : repeat
- ? list[index % list.length]
- : ''
- }
- for (var i = 0; i < len; i++) {
- rows[i].className = getClass(
- classList || me.options.classList,
- i,
- true
- )
- }
- })
- me.addListener('uninterlacetable', function (type, table) {
- if (!table) return
- var me = this,
- rows = table.rows,
- classList = me.options.classList,
- len = rows.length
- for (var i = 0; i < len; i++) {
- domUtils.removeClasses(rows[i], classList)
- }
- })
- me.addListener('mousedown', mouseDownEvent)
- me.addListener('mouseup', mouseUpEvent)
-
- domUtils.on(me.body, 'dragstart', function (evt) {
- mouseUpEvent.call(me, 'dragstart', evt)
- })
- me.addOutputRule(function (root) {
- utils.each(root.getNodesByTagName('div'), function (n) {
- if (n.getAttr('id') == 'ue_tableDragLine') {
- n.parentNode.removeChild(n)
- }
- })
- })
- var currentRowIndex = 0
- me.addListener('mousedown', function () {
- currentRowIndex = 0
- })
- me.addListener('tabkeydown', function () {
- var range = this.selection.getRange(),
- common = range.getCommonAncestor(true, true),
- table = domUtils.findParentByTagName(common, 'table')
- if (table) {
- if (domUtils.findParentByTagName(common, 'caption', true)) {
- var cell = domUtils.getElementsByTagName(table, 'th td')
- if (cell && cell.length) {
- range.setStart(cell[0], 0).setCursor(false, true)
- }
- } else {
- var cell = domUtils.findParentByTagName(common, ['td', 'th'], true),
- ua = getUETable(cell)
- currentRowIndex =
- cell.rowSpan > 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex
- var nextCell = ua.getTabNextCell(cell, currentRowIndex)
- if (nextCell) {
- if (isEmptyBlock(nextCell)) {
- range.setStart(nextCell, 0).setCursor(false, true)
- } else {
- range.selectNodeContents(nextCell).select()
- }
- } else {
- me.fireEvent('saveScene')
- me.__hasEnterExecCommand = true
- this.execCommand('insertrownext')
- me.__hasEnterExecCommand = false
- range = this.selection.getRange()
- range
- .setStart(table.rows[table.rows.length - 1].cells[0], 0)
- .setCursor()
- me.fireEvent('saveScene')
- }
- }
- return true
- }
- })
- browser.ie &&
- me.addListener('selectionchange', function () {
- toggleDraggableState(this, false, '', null)
- })
- me.addListener('keydown', function (type, evt) {
- var me = this
-
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 8 || keyCode == 46) {
- return
- }
- var notCtrlKey =
- !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey
- notCtrlKey &&
- removeSelectedClass(domUtils.getElementsByTagName(me.body, 'td'))
- var ut = getUETableBySelected(me)
- if (!ut) return
- notCtrlKey && ut.clearSelected()
- })
- me.addListener('beforegetcontent', function () {
- switchBorderColor(this, false)
- browser.ie &&
- utils.each(
- this.document.getElementsByTagName('caption'),
- function (ci) {
- if (domUtils.isEmptyNode(ci)) {
- ci.innerHTML = ' '
- }
- }
- )
- })
- me.addListener('aftergetcontent', function () {
- switchBorderColor(this, true)
- })
- me.addListener('getAllHtml', function () {
- removeSelectedClass(me.document.getElementsByTagName('td'))
- })
-
- me.addListener('fullscreenchanged', function (type, fullscreen) {
- if (!fullscreen) {
- var ratio = this.body.offsetWidth / document.body.offsetWidth,
- tables = domUtils.getElementsByTagName(this.body, 'table')
- utils.each(tables, function (table) {
- if (table.offsetWidth < me.body.offsetWidth) return false
- var tds = domUtils.getElementsByTagName(table, 'td'),
- backWidths = []
- utils.each(tds, function (td) {
- backWidths.push(td.offsetWidth)
- })
- for (var i = 0, td; (td = tds[i]); i++) {
- td.setAttribute('width', Math.floor(backWidths[i] * ratio))
- }
- table.setAttribute(
- 'width',
- Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))
- )
- })
- }
- })
-
- var oldExecCommand = me.execCommand
- me.execCommand = function (cmd, datatat) {
- var me = this,
- args = arguments
- cmd = cmd.toLowerCase()
- var ut = getUETableBySelected(me),
- tds,
- range = new dom.Range(me.document),
- cmdFun = me.commands[cmd] || UE.commands[cmd],
- result
- if (!cmdFun) return
- if (
- ut &&
- !commands[cmd] &&
- !cmdFun.notNeedUndo &&
- !me.__hasEnterExecCommand
- ) {
- me.__hasEnterExecCommand = true
- me.fireEvent('beforeexeccommand', cmd)
- tds = ut.selectedTds
- var lastState = -2,
- lastValue = -2,
- value,
- state
- for (var i = 0, td; (td = tds[i]); i++) {
- if (isEmptyBlock(td)) {
- range.setStart(td, 0).setCursor(false, true)
- } else {
- range.selectNode(td).select(true)
- }
- state = me.queryCommandState(cmd)
- value = me.queryCommandValue(cmd)
- if (state != -1) {
- if (lastState !== state || lastValue !== value) {
- me._ignoreContentChange = true
- result = oldExecCommand.apply(me, arguments)
- me._ignoreContentChange = false
- }
- lastState = me.queryCommandState(cmd)
- lastValue = me.queryCommandValue(cmd)
- if (domUtils.isEmptyBlock(td)) {
- domUtils.fillNode(me.document, td)
- }
- }
- }
- range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true)
- me.fireEvent('contentchange')
- me.fireEvent('afterexeccommand', cmd)
- me.__hasEnterExecCommand = false
- me._selectionChange()
- } else {
- result = oldExecCommand.apply(me, arguments)
- }
- return result
- }
- })
-
- function removeStyleSize(obj, replaceToProperty) {
- removeStyle(obj, 'width', true)
- removeStyle(obj, 'height', true)
- }
- function removeStyle(obj, styleName, replaceToProperty) {
- if (obj.style[styleName]) {
- replaceToProperty &&
- obj.setAttribute(styleName, parseInt(obj.style[styleName], 10))
- obj.style[styleName] = ''
- }
- }
- function getParentTdOrTh(ele) {
- if (ele.tagName == 'TD' || ele.tagName == 'TH') return ele
- var td
- if (
- (td =
- domUtils.findParentByTagName(ele, 'td', true) ||
- domUtils.findParentByTagName(ele, 'th', true))
- )
- return td
- return null
- }
- function isEmptyBlock(node) {
- var reg = new RegExp(domUtils.fillChar, 'g')
- if (
- node[browser.ie ? 'innerText' : 'textContent']
- .replace(/^\s*$/, '')
- .replace(reg, '').length > 0
- ) {
- return 0
- }
- for (var n in dtd.$isNotEmpty) {
- if (node.getElementsByTagName(n).length) {
- return 0
- }
- }
- return 1
- }
- function mouseCoords(evt) {
- if (evt.pageX || evt.pageY) {
- return { x: evt.pageX, y: evt.pageY }
- }
- return {
- x:
- evt.clientX +
- me.document.body.scrollLeft -
- me.document.body.clientLeft,
- y: evt.clientY + me.document.body.scrollTop - me.document.body.clientTop
- }
- }
- function mouseMoveEvent(evt) {
- if (isEditorDisabled()) {
- return
- }
- try {
-
- var target = getParentTdOrTh(evt.target || evt.srcElement),
- pos
-
- if (isInResizeBuffer) {
- me.body.style.webkitUserSelect = 'none'
- if (
- Math.abs(userActionStatus.x - evt.clientX) > offsetOfTableCell ||
- Math.abs(userActionStatus.y - evt.clientY) > offsetOfTableCell
- ) {
- clearTableDragTimer()
- isInResizeBuffer = false
- singleClickState = 0
-
- tableBorderDrag(evt)
- }
- }
-
- if (onDrag && dragTd) {
- singleClickState = 0
- me.body.style.webkitUserSelect = 'none'
- me.selection
- .getNative()
- [browser.ie9below ? 'empty' : 'removeAllRanges']()
- pos = mouseCoords(evt)
- toggleDraggableState(me, true, onDrag, pos, target)
- if (onDrag == 'h') {
- dragLine.style.left = getPermissionX(dragTd, evt) + 'px'
- } else if (onDrag == 'v') {
- dragLine.style.top = getPermissionY(dragTd, evt) + 'px'
- }
- return
- }
-
- if (target) {
-
- if (me.fireEvent('excludetable', target) === true) return
- pos = mouseCoords(evt)
- var state = getRelation(target, pos),
- table = domUtils.findParentByTagName(target, 'table', true)
- if (inTableSide(table, target, evt, true)) {
- if (me.fireEvent('excludetable', table) === true) return
- me.body.style.cursor =
- 'url(' + me.options.cursorpath + 'h.png),pointer'
- } else if (inTableSide(table, target, evt)) {
- if (me.fireEvent('excludetable', table) === true) return
- me.body.style.cursor =
- 'url(' + me.options.cursorpath + 'v.png),pointer'
- } else {
- me.body.style.cursor = 'text'
- var curCell = target
- if (/\d/.test(state)) {
- state = state.replace(/\d/, '')
- target = getUETable(target).getPreviewCell(target, state == 'v')
- }
-
- toggleDraggableState(
- me,
- target ? !!state : false,
- target ? state : '',
- pos,
- target
- )
- }
- } else {
- toggleDragButton(false, table, me)
- }
- } catch (e) {
- showError(e)
- }
- }
- var dragButtonTimer
- function toggleDragButton(show, table, editor) {
- if (!show) {
- if (dragOver) return
- dragButtonTimer = setTimeout(function () {
- !dragOver &&
- dragButton &&
- dragButton.parentNode &&
- dragButton.parentNode.removeChild(dragButton)
- }, 2000)
- } else {
- createDragButton(table, editor)
- }
- }
- function createDragButton(table, editor) {
- var pos = domUtils.getXY(table),
- doc = table.ownerDocument
- if (dragButton && dragButton.parentNode) return dragButton
- dragButton = doc.createElement('div')
- dragButton.contentEditable = false
- dragButton.innerHTML = ''
- dragButton.style.cssText =
- 'width:15px;height:15px;background-image:url(' +
- editor.options.UEDITOR_HOME_URL +
- 'dialogs/table/dragicon.png);position: absolute;cursor:move;top:' +
- (pos.y - 15) +
- 'px;left:' +
- pos.x +
- 'px;'
- domUtils.unSelectable(dragButton)
- dragButton.onmouseover = function (evt) {
- dragOver = true
- }
- dragButton.onmouseout = function (evt) {
- dragOver = false
- }
- domUtils.on(dragButton, 'click', function (type, evt) {
- doClick(evt, this)
- })
- domUtils.on(dragButton, 'dblclick', function (type, evt) {
- doDblClick(evt)
- })
- domUtils.on(dragButton, 'dragstart', function (type, evt) {
- domUtils.preventDefault(evt)
- })
- var timer
- function doClick(evt, button) {
-
- clearTimeout(timer)
- timer = setTimeout(function () {
- editor.fireEvent('tableClicked', table, button)
- }, 300)
- }
- function doDblClick(evt) {
- clearTimeout(timer)
- var ut = getUETable(table),
- start = table.rows[0].cells[0],
- end = ut.getLastCell(),
- range = ut.getCellsRange(start, end)
- editor.selection.getRange().setStart(start, 0).setCursor(false, true)
- ut.setSelected(range)
- }
- doc.body.appendChild(dragButton)
- }
-
-
-
-
-
-
-
-
-
-
- function inTableSide(table, cell, evt, top) {
- var pos = mouseCoords(evt),
- state = getRelation(cell, pos)
- if (top) {
- var caption = table.getElementsByTagName('caption')[0],
- capHeight = caption ? caption.offsetHeight : 0
- return state == 'v1' && pos.y - domUtils.getXY(table).y - capHeight < 8
- } else {
- return state == 'h1' && pos.x - domUtils.getXY(table).x < 8
- }
- }
-
- function getPermissionX(dragTd, evt) {
- var ut = getUETable(dragTd)
- if (ut) {
- var preTd = ut.getSameEndPosCells(dragTd, 'x')[0],
- nextTd = ut.getSameStartPosXCells(dragTd)[0],
- mouseX = mouseCoords(evt).x,
- left =
- (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20,
- right = nextTd
- ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20
- : me.body.offsetWidth + 5 ||
- parseInt(domUtils.getComputedStyle(me.body, 'width'), 10)
- left += cellMinWidth
- right -= cellMinWidth
- return mouseX < left ? left : mouseX > right ? right : mouseX
- }
- }
-
- function getPermissionY(dragTd, evt) {
- try {
- var top = domUtils.getXY(dragTd).y,
- mousePosY = mouseCoords(evt).y
- return mousePosY < top ? top : mousePosY
- } catch (e) {
- showError(e)
- }
- }
-
- function toggleDraggableState(editor, draggable, dir, mousePos, cell) {
- try {
- editor.body.style.cursor =
- dir == 'h' ? 'col-resize' : dir == 'v' ? 'row-resize' : 'text'
- if (browser.ie) {
- if (dir && !mousedown && !getUETableBySelected(editor)) {
- getDragLine(editor, editor.document)
- showDragLineAt(dir, cell)
- } else {
- hideDragLine(editor)
- }
- }
- onBorder = draggable
- } catch (e) {
- showError(e)
- }
- }
-
- function getResizeLineByUETable() {
- var lineId = '_UETableResizeLine',
- line = this.document.getElementById(lineId)
- if (!line) {
- line = this.document.createElement('div')
- line.id = lineId
- line.contnetEditable = false
- line.setAttribute('unselectable', 'on')
- var styles = {
- width: 2 * cellBorderWidth + 1 + 'px',
- position: 'absolute',
- 'z-index': 100000,
- cursor: 'col-resize',
- background: 'red',
- display: 'none'
- }
-
- line.onmouseout = function () {
- this.style.display = 'none'
- }
- utils.extend(line.style, styles)
- this.document.body.appendChild(line)
- }
- return line
- }
-
- function updateResizeLine(cell, uetable) {
- var line = getResizeLineByUETable.call(this),
- table = uetable.table,
- styles = {
- top: domUtils.getXY(table).y + 'px',
- left:
- domUtils.getXY(cell).x + cell.offsetWidth - cellBorderWidth + 'px',
- display: 'block',
- height: table.offsetHeight + 'px'
- }
- utils.extend(line.style, styles)
- }
-
- function showResizeLine(cell) {
- var uetable = getUETable(cell)
- updateResizeLine.call(this, cell, uetable)
- }
-
- function getRelation(ele, mousePos) {
- var elePos = domUtils.getXY(ele)
- if (!elePos) {
- return ''
- }
- if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) {
- return 'h'
- }
- if (mousePos.x - elePos.x < cellBorderWidth) {
- return 'h1'
- }
- if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) {
- return 'v'
- }
- if (mousePos.y - elePos.y < cellBorderWidth) {
- return 'v1'
- }
- return ''
- }
- function mouseDownEvent(type, evt) {
- if (isEditorDisabled()) {
- return
- }
- userActionStatus = {
- x: evt.clientX,
- y: evt.clientY
- }
-
- if (evt.button == 2) {
- var ut = getUETableBySelected(me),
- flag = false
- if (ut) {
- var td = getTargetTd(me, evt)
- utils.each(ut.selectedTds, function (ti) {
- if (ti === td) {
- flag = true
- }
- })
- if (!flag) {
- removeSelectedClass(domUtils.getElementsByTagName(me.body, 'th td'))
- ut.clearSelected()
- } else {
- td = ut.selectedTds[0]
- setTimeout(function () {
- me.selection.getRange().setStart(td, 0).setCursor(false, true)
- }, 0)
- }
- }
- } else {
- tableClickHander(evt)
- }
- }
-
- function clearTableTimer() {
- tabTimer && clearTimeout(tabTimer)
- tabTimer = null
- }
-
- function tableDbclickHandler(evt) {
- singleClickState = 0
- evt = evt || me.window.event
- var target = getParentTdOrTh(evt.target || evt.srcElement)
- if (target) {
- var h
- if ((h = getRelation(target, mouseCoords(evt)))) {
- hideDragLine(me)
- if (h == 'h1') {
- h = 'h'
- if (
- inTableSide(
- domUtils.findParentByTagName(target, 'table'),
- target,
- evt
- )
- ) {
- me.execCommand('adaptbywindow')
- } else {
- target = getUETable(target).getPreviewCell(target)
- if (target) {
- var rng = me.selection.getRange()
- rng.selectNodeContents(target).setCursor(true, true)
- }
- }
- }
- if (h == 'h') {
- var ut = getUETable(target),
- table = ut.table,
- cells = getCellsByMoveBorder(target, table, true)
- cells = extractArray(cells, 'left')
- ut.width = ut.offsetWidth
- var oldWidth = [],
- newWidth = []
- utils.each(cells, function (cell) {
- oldWidth.push(cell.offsetWidth)
- })
- utils.each(cells, function (cell) {
- cell.removeAttribute('width')
- })
- window.setTimeout(function () {
-
- var changeable = true
- utils.each(cells, function (cell, index) {
- var width = cell.offsetWidth
- if (width > oldWidth[index]) {
- changeable = false
- return false
- }
- newWidth.push(width)
- })
- var change = changeable ? newWidth : oldWidth
- utils.each(cells, function (cell, index) {
- cell.width = change[index] - getTabcellSpace()
- })
- }, 0)
-
-
-
-
-
-
-
- }
- }
- }
- }
- function tableClickHander(evt) {
- removeSelectedClass(domUtils.getElementsByTagName(me.body, 'td th'))
-
-
- utils.each(me.document.getElementsByTagName('table'), function (t) {
- t.ueTable = null
- })
- startTd = getTargetTd(me, evt)
- if (!startTd) return
- var table = domUtils.findParentByTagName(startTd, 'table', true)
- ut = getUETable(table)
- ut && ut.clearSelected()
-
- if (!onBorder) {
- me.document.body.style.webkitUserSelect = ''
- mousedown = true
- me.addListener('mouseover', mouseOverEvent)
- } else {
-
- borderActionHandler(evt)
- }
- }
-
- function borderActionHandler(evt) {
- if (browser.ie) {
- evt = reconstruct(evt)
- }
- clearTableDragTimer()
-
- isInResizeBuffer = true
- tableDragTimer = setTimeout(function () {
- tableBorderDrag(evt)
- }, dblclickTime)
- }
- function extractArray(originArr, key) {
- var result = [],
- tmp = null
- for (var i = 0, len = originArr.length; i < len; i++) {
- tmp = originArr[i][key]
- if (tmp) {
- result.push(tmp)
- }
- }
- return result
- }
- function clearTableDragTimer() {
- tableDragTimer && clearTimeout(tableDragTimer)
- tableDragTimer = null
- }
- function reconstruct(obj) {
- var attrs = [
- 'pageX',
- 'pageY',
- 'clientX',
- 'clientY',
- 'srcElement',
- 'target'
- ],
- newObj = {}
- if (obj) {
- for (var i = 0, key, val; (key = attrs[i]); i++) {
- val = obj[key]
- val && (newObj[key] = val)
- }
- }
- return newObj
- }
-
- function tableBorderDrag(evt) {
- isInResizeBuffer = false
- startTd = evt.target || evt.srcElement
- if (!startTd) return
- var state = getRelation(startTd, mouseCoords(evt))
- if (/\d/.test(state)) {
- state = state.replace(/\d/, '')
- startTd = getUETable(startTd).getPreviewCell(startTd, state == 'v')
- }
- hideDragLine(me)
- getDragLine(me, me.document)
- me.fireEvent('saveScene')
- showDragLineAt(state, startTd)
- mousedown = true
-
- onDrag = state
- dragTd = startTd
- }
- function mouseUpEvent(type, evt) {
- if (isEditorDisabled()) {
- return
- }
- clearTableDragTimer()
- isInResizeBuffer = false
- if (onBorder) {
- singleClickState = ++singleClickState % 3
- userActionStatus = {
- x: evt.clientX,
- y: evt.clientY
- }
- tableResizeTimer = setTimeout(function () {
- singleClickState > 0 && singleClickState--
- }, dblclickTime)
- if (singleClickState === 2) {
- singleClickState = 0
- tableDbclickHandler(evt)
- return
- }
- }
- if (evt.button == 2) return
- var me = this
-
- var range = me.selection.getRange(),
- start = domUtils.findParentByTagName(
- range.startContainer,
- 'table',
- true
- ),
- end = domUtils.findParentByTagName(range.endContainer, 'table', true)
- if (start || end) {
- if (start === end) {
- start = domUtils.findParentByTagName(
- range.startContainer,
- ['td', 'th', 'caption'],
- true
- )
- end = domUtils.findParentByTagName(
- range.endContainer,
- ['td', 'th', 'caption'],
- true
- )
- if (start !== end) {
- me.selection.clearRange()
- }
- } else {
- me.selection.clearRange()
- }
- }
- mousedown = false
- me.document.body.style.webkitUserSelect = ''
-
- if (onDrag && dragTd) {
- me.selection
- .getNative()
- [browser.ie9below ? 'empty' : 'removeAllRanges']()
- singleClickState = 0
- dragLine = me.document.getElementById('ue_tableDragLine')
-
- if (dragLine) {
- var dragTdPos = domUtils.getXY(dragTd),
- dragLinePos = domUtils.getXY(dragLine)
- switch (onDrag) {
- case 'h':
- changeColWidth(dragTd, dragLinePos.x - dragTdPos.x)
- break
- case 'v':
- changeRowHeight(
- dragTd,
- dragLinePos.y - dragTdPos.y - dragTd.offsetHeight
- )
- break
- default:
- }
- onDrag = ''
- dragTd = null
- hideDragLine(me)
- me.fireEvent('saveScene')
- return
- }
- }
-
- if (!startTd) {
- var target = domUtils.findParentByTagName(
- evt.target || evt.srcElement,
- 'td',
- true
- )
- if (!target)
- target = domUtils.findParentByTagName(
- evt.target || evt.srcElement,
- 'th',
- true
- )
- if (target && (target.tagName == 'TD' || target.tagName == 'TH')) {
- if (me.fireEvent('excludetable', target) === true) return
- range = new dom.Range(me.document)
- range.setStart(target, 0).setCursor(false, true)
- }
- } else {
- var ut = getUETable(startTd),
- cell = ut ? ut.selectedTds[0] : null
- if (cell) {
- range = new dom.Range(me.document)
- if (domUtils.isEmptyBlock(cell)) {
- range.setStart(cell, 0).setCursor(false, true)
- } else {
- range
- .selectNodeContents(cell)
- .shrinkBoundary()
- .setCursor(false, true)
- }
- } else {
- range = me.selection.getRange().shrinkBoundary()
- if (!range.collapsed) {
- var start = domUtils.findParentByTagName(
- range.startContainer,
- ['td', 'th'],
- true
- ),
- end = domUtils.findParentByTagName(
- range.endContainer,
- ['td', 'th'],
- true
- )
-
- if (
- (start && !end) ||
- (!start && end) ||
- (start && end && start !== end)
- ) {
- range.setCursor(false, true)
- }
- }
- }
- startTd = null
- me.removeListener('mouseover', mouseOverEvent)
- }
- me._selectionChange(250, evt)
- }
- function mouseOverEvent(type, evt) {
- if (isEditorDisabled()) {
- return
- }
- var me = this,
- tar = evt.target || evt.srcElement
- currentTd =
- domUtils.findParentByTagName(tar, 'td', true) ||
- domUtils.findParentByTagName(tar, 'th', true)
-
- if (
- startTd &&
- currentTd &&
- ((startTd.tagName == 'TD' && currentTd.tagName == 'TD') ||
- (startTd.tagName == 'TH' && currentTd.tagName == 'TH')) &&
- domUtils.findParentByTagName(startTd, 'table') ==
- domUtils.findParentByTagName(currentTd, 'table')
- ) {
- var ut = getUETable(currentTd)
- if (startTd != currentTd) {
- me.document.body.style.webkitUserSelect = 'none'
- me.selection
- .getNative()
- [browser.ie9below ? 'empty' : 'removeAllRanges']()
- var range = ut.getCellsRange(startTd, currentTd)
- ut.setSelected(range)
- } else {
- me.document.body.style.webkitUserSelect = ''
- ut.clearSelected()
- }
- }
- evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false)
- }
- function setCellHeight(cell, height, backHeight) {
- var lineHight = parseInt(
- domUtils.getComputedStyle(cell, 'line-height'),
- 10
- ),
- tmpHeight = backHeight + height
- height = tmpHeight < lineHight ? lineHight : tmpHeight
- if (cell.style.height) cell.style.height = ''
- cell.rowSpan == 1
- ? cell.setAttribute('height', height)
- : cell.removeAttribute && cell.removeAttribute('height')
- }
- function getWidth(cell) {
- if (!cell) return 0
- return parseInt(domUtils.getComputedStyle(cell, 'width'), 10)
- }
- function changeColWidth(cell, changeValue) {
- var ut = getUETable(cell)
- if (ut) {
-
- var table = ut.table,
- cells = getCellsByMoveBorder(cell, table)
- table.style.width = ''
- table.removeAttribute('width')
-
- changeValue = correctChangeValue(changeValue, cell, cells)
- if (cell.nextSibling) {
- var i = 0
- utils.each(cells, function (cellGroup) {
- cellGroup.left.width = +cellGroup.left.width + changeValue
- cellGroup.right &&
- (cellGroup.right.width = +cellGroup.right.width - changeValue)
- })
- } else {
- utils.each(cells, function (cellGroup) {
- cellGroup.left.width -= -changeValue
- })
- }
- }
- }
- function isEditorDisabled() {
- return me.body.contentEditable === 'false'
- }
- function changeRowHeight(td, changeValue) {
- if (Math.abs(changeValue) < 10) return
- var ut = getUETable(td)
- if (ut) {
- var cells = ut.getSameEndPosCells(td, 'y'),
-
- backHeight = cells[0] ? cells[0].offsetHeight : 0
- for (var i = 0, cell; (cell = cells[i++]); ) {
- setCellHeight(cell, changeValue, backHeight)
- }
- }
- }
-
- function getCellsByMoveBorder(cell, table, isContainMergeCell) {
- if (!table) {
- table = domUtils.findParentByTagName(cell, 'table')
- }
- if (!table) {
- return null
- }
-
- var index = domUtils.getNodeIndex(cell),
- temp = cell,
- rows = table.rows,
- colIndex = 0
- while (temp) {
-
- if (temp.nodeType === 1) {
- colIndex += temp.colSpan || 1
- }
- temp = temp.previousSibling
- }
- temp = null
-
- var borderCells = []
- utils.each(rows, function (tabRow) {
- var cells = tabRow.cells,
- currIndex = 0
- utils.each(cells, function (tabCell) {
- currIndex += tabCell.colSpan || 1
- if (currIndex === colIndex) {
- borderCells.push({
- left: tabCell,
- right: tabCell.nextSibling || null
- })
- return false
- } else if (currIndex > colIndex) {
- if (isContainMergeCell) {
- borderCells.push({
- left: tabCell
- })
- }
- return false
- }
- })
- })
- return borderCells
- }
-
- function getMinWidthByTableCells(cells) {
- var minWidth = Number.MAX_VALUE
- for (var i = 0, curCell; (curCell = cells[i]); i++) {
- minWidth = Math.min(
- minWidth,
- curCell.width || getTableCellWidth(curCell)
- )
- }
- return minWidth
- }
- function correctChangeValue(changeValue, relatedCell, cells) {
-
- changeValue -= getTabcellSpace()
- if (changeValue < 0) {
- return 0
- }
- changeValue -= getTableCellWidth(relatedCell)
-
- var direction = changeValue < 0 ? 'left' : 'right'
- changeValue = Math.abs(changeValue)
-
- utils.each(cells, function (cellGroup) {
- var curCell = cellGroup[direction]
-
- if (curCell) {
- changeValue = Math.min(
- changeValue,
- getTableCellWidth(curCell) - cellMinWidth
- )
- }
- })
-
- changeValue = changeValue < 0 ? 0 : changeValue
- return direction === 'left' ? -changeValue : changeValue
- }
- function getTableCellWidth(cell) {
- var width = 0,
-
- offset = 0,
- width = cell.offsetWidth - getTabcellSpace()
-
- if (!cell.nextSibling) {
- width -= getTableCellOffset(cell)
- }
- width = width < 0 ? 0 : width
- try {
- cell.width = width
- } catch (e) {}
- return width
- }
-
- function getTableCellOffset(cell) {
- tab = domUtils.findParentByTagName(cell, 'table', false)
- if (tab.offsetVal === undefined) {
- var prev = cell.previousSibling
- if (prev) {
-
- tab.offsetVal =
- cell.offsetWidth - prev.offsetWidth === UT.borderWidth
- ? UT.borderWidth
- : 0
- } else {
- tab.offsetVal = 0
- }
- }
- return tab.offsetVal
- }
- function getTabcellSpace() {
- if (UT.tabcellSpace === undefined) {
- var cell = null,
- tab = me.document.createElement('table'),
- tbody = me.document.createElement('tbody'),
- trow = me.document.createElement('tr'),
- tabcell = me.document.createElement('td'),
- mirror = null
- tabcell.style.cssText = 'border: 0;'
- tabcell.width = 1
- trow.appendChild(tabcell)
- trow.appendChild((mirror = tabcell.cloneNode(false)))
- tbody.appendChild(trow)
- tab.appendChild(tbody)
- tab.style.cssText = 'visibility: hidden;'
- me.body.appendChild(tab)
- UT.paddingSpace = tabcell.offsetWidth - 1
- var tmpTabWidth = tab.offsetWidth
- tabcell.style.cssText = ''
- mirror.style.cssText = ''
- UT.borderWidth = (tab.offsetWidth - tmpTabWidth) / 3
- UT.tabcellSpace = UT.paddingSpace + UT.borderWidth
- me.body.removeChild(tab)
- }
- getTabcellSpace = function () {
- return UT.tabcellSpace
- }
- return UT.tabcellSpace
- }
- function getDragLine(editor, doc) {
- if (mousedown) return
- dragLine = editor.document.createElement('div')
- domUtils.setAttributes(dragLine, {
- id: 'ue_tableDragLine',
- unselectable: 'on',
- contenteditable: false,
- onresizestart: 'return false',
- ondragstart: 'return false',
- onselectstart: 'return false',
- style:
- 'background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)'
- })
- editor.body.appendChild(dragLine)
- }
- function hideDragLine(editor) {
- if (mousedown) return
- var line
- while ((line = editor.document.getElementById('ue_tableDragLine'))) {
- domUtils.remove(line)
- }
- }
-
- function showDragLineAt(state, cell) {
- if (!cell) return
- var table = domUtils.findParentByTagName(cell, 'table'),
- caption = table.getElementsByTagName('caption'),
- width = table.offsetWidth,
- height =
- table.offsetHeight -
- (caption.length > 0 ? caption[0].offsetHeight : 0),
- tablePos = domUtils.getXY(table),
- cellPos = domUtils.getXY(cell),
- css
- switch (state) {
- case 'h':
- css =
- 'height:' +
- height +
- 'px;top:' +
- (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) +
- 'px;left:' +
- (cellPos.x + cell.offsetWidth)
- dragLine.style.cssText =
- css +
- 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)'
- break
- case 'v':
- css =
- 'width:' +
- width +
- 'px;left:' +
- tablePos.x +
- 'px;top:' +
- (cellPos.y + cell.offsetHeight)
-
- dragLine.style.cssText =
- css +
- 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)'
- break
- default:
- }
- }
-
- function switchBorderColor(editor, flag) {
- var tableArr = domUtils.getElementsByTagName(editor.body, 'table'),
- color
- for (var i = 0, node; (node = tableArr[i++]); ) {
- var td = domUtils.getElementsByTagName(node, 'td')
- if (td[0]) {
- if (flag) {
- color = td[0].style.borderColor.replace(/\s/g, '')
- if (/(#ffffff)|(rgb\(255,255,255\))/gi.test(color))
- domUtils.addClass(node, 'noBorderTable')
- } else {
- domUtils.removeClasses(node, 'noBorderTable')
- }
- }
- }
- }
- function getTableWidth(editor, needIEHack, defaultValue) {
- var body = editor.body
- return (
- body.offsetWidth -
- (needIEHack
- ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2
- : 0) -
- defaultValue.tableBorder * 2 -
- (editor.options.offsetWidth || 0)
- )
- }
-
- function getTargetTd(editor, evt) {
- var target = domUtils.findParentByTagName(
- evt.target || evt.srcElement,
- ['td', 'th'],
- true
- ),
- dir = null
- if (!target) {
- return null
- }
- dir = getRelation(target, mouseCoords(evt))
-
- if (!target) {
- return null
- }
- if (dir === 'h1' && target.previousSibling) {
- var position = domUtils.getXY(target),
- cellWidth = target.offsetWidth
- if (Math.abs(position.x + cellWidth - evt.clientX) > cellWidth / 3) {
- target = target.previousSibling
- }
- } else if (dir === 'v1' && target.parentNode.previousSibling) {
- var position = domUtils.getXY(target),
- cellHeight = target.offsetHeight
- if (Math.abs(position.y + cellHeight - evt.clientY) > cellHeight / 3) {
- target = target.parentNode.previousSibling.firstChild
- }
- }
-
- return target && !(editor.fireEvent('excludetable', target) === true)
- ? target
- : null
- }
- }
-
-
- UE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) {
- var table = this.table,
- rows = table.rows,
- trArray = [],
- flag = rows[0].cells[0].tagName === 'TH',
- lastRowIndex = 0
- if (this.selectedTds.length) {
- var range = this.cellsRange,
- len = range.endRowIndex + 1
- for (var i = range.beginRowIndex; i < len; i++) {
- trArray[i] = rows[i]
- }
- trArray.splice(0, range.beginRowIndex)
- lastRowIndex =
- range.endRowIndex + 1 === this.rowsNum ? 0 : range.endRowIndex + 1
- } else {
- for (var i = 0, len = rows.length; i < len; i++) {
- trArray[i] = rows[i]
- }
- }
- var Fn = {
- reversecurrent: function (td1, td2) {
- return 1
- },
- orderbyasc: function (td1, td2) {
- var value1 = td1.innerText || td1.textContent,
- value2 = td2.innerText || td2.textContent
- return value1.localeCompare(value2)
- },
- reversebyasc: function (td1, td2) {
- var value1 = td1.innerHTML,
- value2 = td2.innerHTML
- return value2.localeCompare(value1)
- },
- orderbynum: function (td1, td2) {
- var value1 = td1[browser.ie ? 'innerText' : 'textContent'].match(/\d+/),
- value2 = td2[browser.ie ? 'innerText' : 'textContent'].match(/\d+/)
- if (value1) value1 = +value1[0]
- if (value2) value2 = +value2[0]
- return (value1 || 0) - (value2 || 0)
- },
- reversebynum: function (td1, td2) {
- var value1 = td1[browser.ie ? 'innerText' : 'textContent'].match(/\d+/),
- value2 = td2[browser.ie ? 'innerText' : 'textContent'].match(/\d+/)
- if (value1) value1 = +value1[0]
- if (value2) value2 = +value2[0]
- return (value2 || 0) - (value1 || 0)
- }
- }
-
- table.setAttribute(
- 'data-sort-type',
- compareFn && typeof compareFn === 'string' && Fn[compareFn]
- ? compareFn
- : ''
- )
-
- flag && trArray.splice(0, 1)
- trArray = utils.sort(trArray, function (tr1, tr2) {
- var result
- if (compareFn && typeof compareFn === 'function') {
- result = compareFn.call(
- this,
- tr1.cells[sortByCellIndex],
- tr2.cells[sortByCellIndex]
- )
- } else if (compareFn && typeof compareFn === 'number') {
- result = 1
- } else if (compareFn && typeof compareFn === 'string' && Fn[compareFn]) {
- result = Fn[compareFn].call(
- this,
- tr1.cells[sortByCellIndex],
- tr2.cells[sortByCellIndex]
- )
- } else {
- result = Fn['orderbyasc'].call(
- this,
- tr1.cells[sortByCellIndex],
- tr2.cells[sortByCellIndex]
- )
- }
- return result
- })
- var fragment = table.ownerDocument.createDocumentFragment()
- for (var j = 0, len = trArray.length; j < len; j++) {
- fragment.appendChild(trArray[j])
- }
- var tbody = table.getElementsByTagName('tbody')[0]
- if (!lastRowIndex) {
- tbody.appendChild(fragment)
- } else {
- tbody.insertBefore(
- fragment,
- rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1]
- )
- }
- }
- UE.plugins['tablesort'] = function () {
- var me = this,
- UT = UE.UETable,
- getUETable = function (tdOrTable) {
- return UT.getUETable(tdOrTable)
- },
- getTableItemsByRange = function (editor) {
- return UT.getTableItemsByRange(editor)
- }
- me.ready(function () {
-
- utils.cssRule(
- 'tablesort',
- 'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' +
- ' background-image:url(' +
- me.options.themePath +
- me.options.theme +
- '/images/sortable.png);}',
- me.document
- )
-
- me.addListener('afterexeccommand', function (type, cmd) {
- if (cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') {
- this.execCommand('disablesort')
- }
- })
- })
-
- UE.commands['sorttable'] = {
- queryCommandState: function () {
- var me = this,
- tableItems = getTableItemsByRange(me)
- if (!tableItems.cell) return -1
- var table = tableItems.table,
- cells = table.getElementsByTagName('td')
- for (var i = 0, cell; (cell = cells[i++]); ) {
- if (cell.rowSpan != 1 || cell.colSpan != 1) return -1
- }
- return 0
- },
- execCommand: function (cmd, fn) {
- var me = this,
- range = me.selection.getRange(),
- bk = range.createBookmark(true),
- tableItems = getTableItemsByRange(me),
- cell = tableItems.cell,
- ut = getUETable(tableItems.table),
- cellInfo = ut.getCellInfo(cell)
- ut.sortTable(cellInfo.cellIndex, fn)
- range.moveToBookmark(bk)
- try {
- range.select()
- } catch (e) {}
- }
- }
-
- UE.commands['enablesort'] = UE.commands['disablesort'] = {
- queryCommandState: function (cmd) {
- var table = getTableItemsByRange(this).table
- if (table && cmd == 'enablesort') {
- var cells = domUtils.getElementsByTagName(table, 'th td')
- for (var i = 0; i < cells.length; i++) {
- if (
- cells[i].getAttribute('colspan') > 1 ||
- cells[i].getAttribute('rowspan') > 1
- )
- return -1
- }
- }
- return !table
- ? -1
- : (cmd == 'enablesort') ^
- (table.getAttribute('data-sort') != 'sortEnabled')
- ? -1
- : 0
- },
- execCommand: function (cmd) {
- var table = getTableItemsByRange(this).table
- table.setAttribute(
- 'data-sort',
- cmd == 'enablesort' ? 'sortEnabled' : 'sortDisabled'
- )
- cmd == 'enablesort'
- ? domUtils.addClass(table, 'sortEnabled')
- : domUtils.removeClasses(table, 'sortEnabled')
- }
- }
- }
-
-
-
-
-
-
- UE.plugins['contextmenu'] = function () {
- var me = this
- me.setOpt('enableContextMenu', true)
- if (me.getOpt('enableContextMenu') === false) {
- return
- }
- var lang = me.getLang('contextMenu'),
- menu,
- items = me.options.contextMenu || [
- { label: lang['selectall'], cmdName: 'selectall' },
- {
- label: lang.cleardoc,
- cmdName: 'cleardoc',
- exec: function () {
- if (confirm(lang.confirmclear)) {
- this.execCommand('cleardoc')
- }
- }
- },
- '-',
- {
- label: lang.unlink,
- cmdName: 'unlink'
- },
- '-',
- {
- group: lang.paragraph,
- icon: 'justifyjustify',
- subMenu: [
- {
- label: lang.justifyleft,
- cmdName: 'justify',
- value: 'left'
- },
- {
- label: lang.justifyright,
- cmdName: 'justify',
- value: 'right'
- },
- {
- label: lang.justifycenter,
- cmdName: 'justify',
- value: 'center'
- },
- {
- label: lang.justifyjustify,
- cmdName: 'justify',
- value: 'justify'
- }
- ]
- },
- '-',
- {
- group: lang.table,
- icon: 'table',
- subMenu: [
- {
- label: lang.inserttable,
- cmdName: 'inserttable'
- },
- {
- label: lang.deletetable,
- cmdName: 'deletetable'
- },
- '-',
- {
- label: lang.deleterow,
- cmdName: 'deleterow'
- },
- {
- label: lang.deletecol,
- cmdName: 'deletecol'
- },
- {
- label: lang.insertcol,
- cmdName: 'insertcol'
- },
- {
- label: lang.insertcolnext,
- cmdName: 'insertcolnext'
- },
- {
- label: lang.insertrow,
- cmdName: 'insertrow'
- },
- {
- label: lang.insertrownext,
- cmdName: 'insertrownext'
- },
- '-',
- {
- label: lang.insertcaption,
- cmdName: 'insertcaption'
- },
- {
- label: lang.deletecaption,
- cmdName: 'deletecaption'
- },
- {
- label: lang.inserttitle,
- cmdName: 'inserttitle'
- },
- {
- label: lang.deletetitle,
- cmdName: 'deletetitle'
- },
- {
- label: lang.inserttitlecol,
- cmdName: 'inserttitlecol'
- },
- {
- label: lang.deletetitlecol,
- cmdName: 'deletetitlecol'
- },
- '-',
- {
- label: lang.mergecells,
- cmdName: 'mergecells'
- },
- {
- label: lang.mergeright,
- cmdName: 'mergeright'
- },
- {
- label: lang.mergedown,
- cmdName: 'mergedown'
- },
- '-',
- {
- label: lang.splittorows,
- cmdName: 'splittorows'
- },
- {
- label: lang.splittocols,
- cmdName: 'splittocols'
- },
- {
- label: lang.splittocells,
- cmdName: 'splittocells'
- },
- '-',
- {
- label: lang.averageDiseRow,
- cmdName: 'averagedistributerow'
- },
- {
- label: lang.averageDisCol,
- cmdName: 'averagedistributecol'
- },
- '-',
- {
- label: lang.edittd,
- cmdName: 'edittd',
- exec: function () {
- if (UE.ui['edittd']) {
- new UE.ui['edittd'](this)
- }
- this.getDialog('edittd').open()
- }
- },
- {
- label: lang.edittable,
- cmdName: 'edittable',
- exec: function () {
- if (UE.ui['edittable']) {
- new UE.ui['edittable'](this)
- }
- this.getDialog('edittable').open()
- }
- },
- {
- label: lang.setbordervisible,
- cmdName: 'setbordervisible'
- }
- ]
- },
- {
- group: lang.tablesort,
- icon: 'tablesort',
- subMenu: [
- {
- label: lang.enablesort,
- cmdName: 'enablesort'
- },
- {
- label: lang.disablesort,
- cmdName: 'disablesort'
- },
- '-',
- {
- label: lang.reversecurrent,
- cmdName: 'sorttable',
- value: 'reversecurrent'
- },
- {
- label: lang.orderbyasc,
- cmdName: 'sorttable',
- value: 'orderbyasc'
- },
- {
- label: lang.reversebyasc,
- cmdName: 'sorttable',
- value: 'reversebyasc'
- },
- {
- label: lang.orderbynum,
- cmdName: 'sorttable',
- value: 'orderbynum'
- },
- {
- label: lang.reversebynum,
- cmdName: 'sorttable',
- value: 'reversebynum'
- }
- ]
- },
- {
- group: lang.borderbk,
- icon: 'borderBack',
- subMenu: [
- {
- label: lang.setcolor,
- cmdName: 'interlacetable',
- exec: function () {
- this.execCommand('interlacetable')
- }
- },
- {
- label: lang.unsetcolor,
- cmdName: 'uninterlacetable',
- exec: function () {
- this.execCommand('uninterlacetable')
- }
- },
- {
- label: lang.setbackground,
- cmdName: 'settablebackground',
- exec: function () {
- this.execCommand('settablebackground', {
- repeat: true,
- colorList: ['#bbb', '#ccc']
- })
- }
- },
- {
- label: lang.unsetbackground,
- cmdName: 'cleartablebackground',
- exec: function () {
- this.execCommand('cleartablebackground')
- }
- },
- {
- label: lang.redandblue,
- cmdName: 'settablebackground',
- exec: function () {
- this.execCommand('settablebackground', {
- repeat: true,
- colorList: ['red', 'blue']
- })
- }
- },
- {
- label: lang.threecolorgradient,
- cmdName: 'settablebackground',
- exec: function () {
- this.execCommand('settablebackground', {
- repeat: true,
- colorList: ['#aaa', '#bbb', '#ccc']
- })
- }
- }
- ]
- },
- {
- group: lang.aligntd,
- icon: 'aligntd',
- subMenu: [
- {
- cmdName: 'cellalignment',
- value: { align: 'left', vAlign: 'top' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'center', vAlign: 'top' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'right', vAlign: 'top' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'left', vAlign: 'middle' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'center', vAlign: 'middle' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'right', vAlign: 'middle' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'left', vAlign: 'bottom' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'center', vAlign: 'bottom' }
- },
- {
- cmdName: 'cellalignment',
- value: { align: 'right', vAlign: 'bottom' }
- }
- ]
- },
- {
- group: lang.aligntable,
- icon: 'aligntable',
- subMenu: [
- {
- cmdName: 'tablealignment',
- className: 'left',
- label: lang.tableleft,
- value: 'left'
- },
- {
- cmdName: 'tablealignment',
- className: 'center',
- label: lang.tablecenter,
- value: 'center'
- },
- {
- cmdName: 'tablealignment',
- className: 'right',
- label: lang.tableright,
- value: 'right'
- }
- ]
- },
- '-',
- {
- label: lang.insertparagraphbefore,
- cmdName: 'insertparagraph',
- value: true
- },
- {
- label: lang.insertparagraphafter,
- cmdName: 'insertparagraph'
- },
- {
- label: lang['copy'],
- cmdName: 'copy'
- },
- {
- label: lang['paste'],
- cmdName: 'paste'
- }
- ]
- if (!items.length) {
- return
- }
- var uiUtils = UE.ui.uiUtils
- me.addListener('contextmenu', function (type, evt) {
- var offset = uiUtils.getViewportOffsetByEvent(evt)
- me.fireEvent('beforeselectionchange')
- if (menu) {
- menu.destroy()
- }
- for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) {
- var last
- ;(function (item) {
- if (item == '-') {
- if (
- (last = contextItems[contextItems.length - 1]) &&
- last !== '-'
- ) {
- contextItems.push('-')
- }
- } else if (item.hasOwnProperty('group')) {
- for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); j++) {
- ;(function (subItem) {
- if (subItem == '-') {
- if ((last = subMenu[subMenu.length - 1]) && last !== '-') {
- subMenu.push('-')
- } else {
- subMenu.splice(subMenu.length - 1)
- }
- } else {
- if (
- (me.commands[subItem.cmdName] ||
- UE.commands[subItem.cmdName] ||
- subItem.query) &&
- (subItem.query
- ? subItem.query()
- : me.queryCommandState(subItem.cmdName)) > -1
- ) {
- subMenu.push({
- label:
- subItem.label ||
- me.getLang(
- 'contextMenu.' +
- subItem.cmdName +
- (subItem.value || '')
- ) ||
- '',
- className:
- 'edui-for-' +
- subItem.cmdName +
- (subItem.className
- ? ' edui-for-' +
- subItem.cmdName +
- '-' +
- subItem.className
- : ''),
- onclick: subItem.exec
- ? function () {
- subItem.exec.call(me)
- }
- : function () {
- me.execCommand(subItem.cmdName, subItem.value)
- }
- })
- }
- }
- })(cj)
- }
- if (subMenu.length) {
- function getLabel() {
- switch (item.icon) {
- case 'table':
- return me.getLang('contextMenu.table')
- case 'justifyjustify':
- return me.getLang('contextMenu.paragraph')
- case 'aligntd':
- return me.getLang('contextMenu.aligntd')
- case 'aligntable':
- return me.getLang('contextMenu.aligntable')
- case 'tablesort':
- return lang.tablesort
- case 'borderBack':
- return lang.borderbk
- default:
- return ''
- }
- }
- contextItems.push({
-
- label: getLabel(),
- className: 'edui-for-' + item.icon,
- subMenu: {
- items: subMenu,
- editor: me
- }
- })
- }
- } else {
-
- if (
- (me.commands[item.cmdName] ||
- UE.commands[item.cmdName] ||
- item.query) &&
- (item.query
- ? item.query.call(me)
- : me.queryCommandState(item.cmdName)) > -1
- ) {
- contextItems.push({
- label: item.label || me.getLang('contextMenu.' + item.cmdName),
- className:
- 'edui-for-' +
- (item.icon ? item.icon : item.cmdName + (item.value || '')),
- onclick: item.exec
- ? function () {
- item.exec.call(me)
- }
- : function () {
- me.execCommand(item.cmdName, item.value)
- }
- })
- }
- }
- })(ti)
- }
- if (contextItems[contextItems.length - 1] == '-') {
- contextItems.pop()
- }
- menu = new UE.ui.Menu({
- items: contextItems,
- className: 'edui-contextmenu',
- editor: me
- })
- menu.render()
- menu.showAt(offset)
- me.fireEvent('aftershowcontextmenu', menu)
- domUtils.preventDefault(evt)
- if (browser.ie) {
- var ieRange
- try {
- ieRange = me.selection.getNative().createRange()
- } catch (e) {
- return
- }
- if (ieRange.item) {
- var range = new dom.Range(me.document)
- range.selectNode(ieRange.item(0)).select(true, true)
- }
- }
- })
-
- me.addListener('aftershowcontextmenu', function (type, menu) {
- if (me.zeroclipboard) {
- var items = menu.items
- for (var key in items) {
- if (items[key].className == 'edui-for-copy') {
- me.zeroclipboard.clip(items[key].getDom())
- }
- }
- }
- })
- }
-
-
-
-
-
-
- UE.plugins['shortcutmenu'] = function () {
- var me = this,
- menu,
- items = me.options.shortcutMenu || []
- if (!items.length) {
- return
- }
- me.addListener('contextmenu mouseup', function (type, e) {
- var me = this,
- customEvt = {
- type: type,
- target: e.target || e.srcElement,
- screenX: e.screenX,
- screenY: e.screenY,
- clientX: e.clientX,
- clientY: e.clientY
- }
- setTimeout(function () {
- var rng = me.selection.getRange()
- if (rng.collapsed === false || type == 'contextmenu') {
- if (!menu) {
- menu = new baidu.editor.ui.ShortCutMenu({
- editor: me,
- items: items,
- theme: me.options.theme,
- className: 'edui-shortcutmenu'
- })
- menu.render()
- me.fireEvent('afterrendershortcutmenu', menu)
- }
- menu.show(customEvt, !!UE.plugins['contextmenu'])
- }
- })
- if (type == 'contextmenu') {
- domUtils.preventDefault(e)
- if (browser.ie9below) {
- var ieRange
- try {
- ieRange = me.selection.getNative().createRange()
- } catch (e) {
- return
- }
- if (ieRange.item) {
- var range = new dom.Range(me.document)
- range.selectNode(ieRange.item(0)).select(true, true)
- }
- }
- }
- })
- me.addListener('keydown', function (type) {
- if (type == 'keydown') {
- menu && !menu.isHidden && menu.hide()
- }
- })
- }
-
-
- UE.plugins['basestyle'] = function () {
-
-
-
-
- var basestyles = {
- bold: ['strong', 'b'],
- italic: ['em', 'i'],
- subscript: ['sub'],
- superscript: ['sup']
- },
- getObj = function (editor, tagNames) {
- return domUtils.filterNodeList(
- editor.selection.getStartElementPath(),
- tagNames
- )
- },
- me = this
-
- me.addshortcutkey({
- Bold: 'ctrl+66',
- Italic: 'ctrl+73',
- Underline: 'ctrl+85'
- })
- me.addInputRule(function (root) {
- utils.each(root.getNodesByTagName('b i'), function (node) {
- switch (node.tagName) {
- case 'b':
- node.tagName = 'strong'
- break
- case 'i':
- node.tagName = 'em'
- }
- })
- })
- for (var style in basestyles) {
- ;(function (cmd, tagNames) {
- me.commands[cmd] = {
- execCommand: function (cmdName) {
- var range = me.selection.getRange(),
- obj = getObj(this, tagNames)
- if (range.collapsed) {
- if (obj) {
- var tmpText = me.document.createTextNode('')
- range.insertNode(tmpText).removeInlineStyle(tagNames)
- range.setStartBefore(tmpText)
- domUtils.remove(tmpText)
- } else {
- var tmpNode = range.document.createElement(tagNames[0])
- if (cmdName == 'superscript' || cmdName == 'subscript') {
- tmpText = me.document.createTextNode('')
- range
- .insertNode(tmpText)
- .removeInlineStyle(['sub', 'sup'])
- .setStartBefore(tmpText)
- .collapse(true)
- }
- range.insertNode(tmpNode).setStart(tmpNode, 0)
- }
- range.collapse(true)
- } else {
- if (cmdName == 'superscript' || cmdName == 'subscript') {
- if (!obj || obj.tagName.toLowerCase() != cmdName) {
- range.removeInlineStyle(['sub', 'sup'])
- }
- }
- obj
- ? range.removeInlineStyle(tagNames)
- : range.applyInlineStyle(tagNames[0])
- }
- range.select()
- },
- queryCommandState: function () {
- return getObj(this, tagNames) ? 1 : 0
- }
- }
- })(style, basestyles[style])
- }
- }
-
-
- UE.plugins['elementpath'] = function () {
- var currentLevel,
- tagNames,
- me = this
- me.setOpt('elementPathEnabled', true)
- if (!me.options.elementPathEnabled) {
- return
- }
- me.commands['elementpath'] = {
- execCommand: function (cmdName, level) {
- var start = tagNames[level],
- range = me.selection.getRange()
- currentLevel = level * 1
- range.selectNode(start).select()
- },
- queryCommandValue: function () {
-
- var parents = [].concat(this.selection.getStartElementPath()).reverse(),
- names = []
- tagNames = parents
- for (var i = 0, ci; (ci = parents[i]); i++) {
- if (ci.nodeType == 3) {
- continue
- }
- var name = ci.tagName.toLowerCase()
- if (name == 'img' && ci.getAttribute('anchorname')) {
- name = 'anchor'
- }
- names[i] = name
- if (currentLevel == i) {
- currentLevel = -1
- break
- }
- }
- return names
- }
- }
- }
-
-
-
- UE.plugins['formatmatch'] = function () {
- var me = this,
- list = [],
- img,
- flag = 0
- me.addListener('reset', function () {
- list = []
- flag = 0
- })
- function addList(type, evt) {
- if (browser.webkit) {
- var target = evt.target.tagName == 'IMG' ? evt.target : null
- }
- function addFormat(range) {
- if (text) {
- range.selectNode(text)
- }
- return range.applyInlineStyle(list[list.length - 1].tagName, null, list)
- }
- me.undoManger && me.undoManger.save()
- var range = me.selection.getRange(),
- imgT = target || range.getClosedNode()
- if (img && imgT && imgT.tagName == 'IMG') {
-
- imgT.style.cssText +=
- ';float:' +
- (img.style.cssFloat || img.style.styleFloat || 'none') +
- ';display:' +
- (img.style.display || 'inline')
- img = null
- } else {
- if (!img) {
- var collapsed = range.collapsed
- if (collapsed) {
- var text = me.document.createTextNode('match')
- range.insertNode(text).select()
- }
- me.__hasEnterExecCommand = true
-
-
- var removeFormatAttributes = me.options.removeFormatAttributes
- me.options.removeFormatAttributes = ''
- me.execCommand('removeformat')
- me.options.removeFormatAttributes = removeFormatAttributes
- me.__hasEnterExecCommand = false
-
- range = me.selection.getRange()
- if (list.length) {
- addFormat(range)
- }
- if (text) {
- range.setStartBefore(text).collapse(true)
- }
- range.select()
- text && domUtils.remove(text)
- }
- }
- me.undoManger && me.undoManger.save()
- me.removeListener('mouseup', addList)
- flag = 0
- }
- me.commands['formatmatch'] = {
- execCommand: function (cmdName) {
- if (flag) {
- flag = 0
- list = []
- me.removeListener('mouseup', addList)
- return
- }
- var range = me.selection.getRange()
- img = range.getClosedNode()
- if (!img || img.tagName != 'IMG') {
- range.collapse(true).shrinkBoundary()
- var start = range.startContainer
- list = domUtils.findParents(start, true, function (node) {
- return !domUtils.isBlockElm(node) && node.nodeType == 1
- })
-
- for (var i = 0, ci; (ci = list[i]); i++) {
- if (ci.tagName == 'A') {
- list.splice(i, 1)
- break
- }
- }
- }
- me.addListener('mouseup', addList)
- flag = 1
- },
- queryCommandState: function () {
- return flag
- },
- notNeedUndo: 1
- }
- }
-
-
-
-
-
-
-
- UE.plugin.register('searchreplace', function () {
- var me = this
- var _blockElm = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }
- function findTextInString(textContent, opt, currentIndex) {
- var str = opt.searchStr
- if (opt.dir == -1) {
- textContent = textContent.split('').reverse().join('')
- str = str.split('').reverse().join('')
- currentIndex = textContent.length - currentIndex
- }
- var reg = new RegExp(str, 'g' + (opt.casesensitive ? '' : 'i')),
- match
- while ((match = reg.exec(textContent))) {
- if (match.index >= currentIndex) {
- return opt.dir == -1
- ? textContent.length - match.index - opt.searchStr.length
- : match.index
- }
- }
- return -1
- }
- function findTextBlockElm(node, currentIndex, opt) {
- var textContent,
- index,
- methodName =
- opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode'
- if (domUtils.isBody(node)) {
- node = node.firstChild
- }
- var first = 1
- while (node) {
- textContent =
- node.nodeType == 3
- ? node.nodeValue
- : node[browser.ie ? 'innerText' : 'textContent']
- index = findTextInString(textContent, opt, currentIndex)
- first = 0
- if (index != -1) {
- return {
- node: node,
- index: index
- }
- }
- node = domUtils[methodName](node)
- while (node && _blockElm[node.nodeName.toLowerCase()]) {
- node = domUtils[methodName](node, true)
- }
- if (node) {
- currentIndex =
- opt.dir == -1
- ? (node.nodeType == 3
- ? node.nodeValue
- : node[browser.ie ? 'innerText' : 'textContent']
- ).length
- : 0
- }
- }
- }
- function findNTextInBlockElm(node, index, str) {
- var currentIndex = 0,
- currentNode = node.firstChild,
- currentNodeLength = 0,
- result
- while (currentNode) {
- if (currentNode.nodeType == 3) {
- currentNodeLength = currentNode.nodeValue.replace(
- /(^[\t\r\n]+)|([\t\r\n]+$)/,
- ''
- ).length
- currentIndex += currentNodeLength
- if (currentIndex >= index) {
- return {
- node: currentNode,
- index: currentNodeLength - (currentIndex - index)
- }
- }
- } else if (!dtd.$empty[currentNode.tagName]) {
- currentNodeLength = currentNode[
- browser.ie ? 'innerText' : 'textContent'
- ].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, '').length
- currentIndex += currentNodeLength
- if (currentIndex >= index) {
- result = findNTextInBlockElm(
- currentNode,
- currentNodeLength - (currentIndex - index),
- str
- )
- if (result) {
- return result
- }
- }
- }
- currentNode = domUtils.getNextDomNode(currentNode)
- }
- }
- function searchReplace(me, opt) {
- var rng = me.selection.getRange(),
- startBlockNode,
- searchStr = opt.searchStr,
- span = me.document.createElement('span')
- span.innerHTML = '$$ueditor_searchreplace_key$$'
- rng.shrinkBoundary(true)
-
- if (!rng.collapsed) {
- rng.select()
- var rngText = me.selection.getText()
- if (
- new RegExp(
- '^' + opt.searchStr + '$',
- opt.casesensitive ? '' : 'i'
- ).test(rngText)
- ) {
- if (opt.replaceStr != undefined) {
- replaceText(rng, opt.replaceStr)
- rng.select()
- return true
- } else {
- rng.collapse(opt.dir == -1)
- }
- }
- }
- rng.insertNode(span)
- rng.enlargeToBlockElm(true)
- startBlockNode = rng.startContainer
- var currentIndex = startBlockNode[
- browser.ie ? 'innerText' : 'textContent'
- ].indexOf('$$ueditor_searchreplace_key$$')
- rng.setStartBefore(span)
- domUtils.remove(span)
- var result = findTextBlockElm(startBlockNode, currentIndex, opt)
- if (result) {
- var rngStart = findNTextInBlockElm(result.node, result.index, searchStr)
- var rngEnd = findNTextInBlockElm(
- result.node,
- result.index + searchStr.length,
- searchStr
- )
- rng
- .setStart(rngStart.node, rngStart.index)
- .setEnd(rngEnd.node, rngEnd.index)
- if (opt.replaceStr !== undefined) {
- replaceText(rng, opt.replaceStr)
- }
- rng.select()
- return true
- } else {
- rng.setCursor()
- }
- }
- function replaceText(rng, str) {
- str = me.document.createTextNode(str)
- rng.deleteContents().insertNode(str)
- }
- return {
- commands: {
- searchreplace: {
- execCommand: function (cmdName, opt) {
- utils.extend(
- opt,
- {
- all: false,
- casesensitive: false,
- dir: 1
- },
- true
- )
- var num = 0
- if (opt.all) {
- var rng = me.selection.getRange(),
- first = me.body.firstChild
- if (first && first.nodeType == 1) {
- rng.setStart(first, 0)
- rng.shrinkBoundary(true)
- } else if (first.nodeType == 3) {
- rng.setStartBefore(first)
- }
- rng.collapse(true).select(true)
- if (opt.replaceStr !== undefined) {
- me.fireEvent('saveScene')
- }
- while (searchReplace(this, opt)) {
- num++
- }
- if (num) {
- me.fireEvent('saveScene')
- }
- } else {
- if (opt.replaceStr !== undefined) {
- me.fireEvent('saveScene')
- }
- if (searchReplace(this, opt)) {
- num++
- }
- if (num) {
- me.fireEvent('saveScene')
- }
- }
- return num
- },
- notNeedUndo: 1
- }
- }
- }
- })
-
-
-
- UE.plugins['customstyle'] = function () {
- var me = this
- me.setOpt({
- customstyle: [
- {
- tag: 'h1',
- name: 'tc',
- style:
- 'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'
- },
- {
- tag: 'h1',
- name: 'tl',
- style:
- 'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;'
- },
- {
- tag: 'span',
- name: 'im',
- style:
- 'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'
- },
- {
- tag: 'span',
- name: 'hi',
- style:
- 'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;'
- }
- ]
- })
- me.commands['customstyle'] = {
- execCommand: function (cmdName, obj) {
- var me = this,
- tagName = obj.tag,
- node = domUtils.findParent(
- me.selection.getStart(),
- function (node) {
- return node.getAttribute('label')
- },
- true
- ),
- range,
- bk,
- tmpObj = {}
- for (var p in obj) {
- if (obj[p] !== undefined) tmpObj[p] = obj[p]
- }
- delete tmpObj.tag
- if (node && node.getAttribute('label') == obj.label) {
- range = this.selection.getRange()
- bk = range.createBookmark()
- if (range.collapsed) {
-
- if (dtd.$block[node.tagName]) {
- var fillNode = me.document.createElement('p')
- domUtils.moveChild(node, fillNode)
- node.parentNode.insertBefore(fillNode, node)
- domUtils.remove(node)
- } else {
- domUtils.remove(node, true)
- }
- } else {
- var common = domUtils.getCommonAncestor(bk.start, bk.end),
- nodes = domUtils.getElementsByTagName(common, tagName)
- if (new RegExp(tagName, 'i').test(common.tagName)) {
- nodes.push(common)
- }
- for (var i = 0, ni; (ni = nodes[i++]); ) {
- if (ni.getAttribute('label') == obj.label) {
- var ps = domUtils.getPosition(ni, bk.start),
- pe = domUtils.getPosition(ni, bk.end)
- if (
- (ps & domUtils.POSITION_FOLLOWING ||
- ps & domUtils.POSITION_CONTAINS) &&
- (pe & domUtils.POSITION_PRECEDING ||
- pe & domUtils.POSITION_CONTAINS)
- )
- if (dtd.$block[tagName]) {
- var fillNode = me.document.createElement('p')
- domUtils.moveChild(ni, fillNode)
- ni.parentNode.insertBefore(fillNode, ni)
- }
- domUtils.remove(ni, true)
- }
- }
- node = domUtils.findParent(
- common,
- function (node) {
- return node.getAttribute('label') == obj.label
- },
- true
- )
- if (node) {
- domUtils.remove(node, true)
- }
- }
- range.moveToBookmark(bk).select()
- } else {
- if (dtd.$block[tagName]) {
- this.execCommand('paragraph', tagName, tmpObj, 'customstyle')
- range = me.selection.getRange()
- if (!range.collapsed) {
- range.collapse()
- node = domUtils.findParent(
- me.selection.getStart(),
- function (node) {
- return node.getAttribute('label') == obj.label
- },
- true
- )
- var pNode = me.document.createElement('p')
- domUtils.insertAfter(node, pNode)
- domUtils.fillNode(me.document, pNode)
- range.setStart(pNode, 0).setCursor()
- }
- } else {
- range = me.selection.getRange()
- if (range.collapsed) {
- node = me.document.createElement(tagName)
- domUtils.setAttributes(node, tmpObj)
- range.insertNode(node).setStart(node, 0).setCursor()
- return
- }
- bk = range.createBookmark()
- range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select()
- }
- }
- },
- queryCommandValue: function () {
- var parent = domUtils.filterNodeList(
- this.selection.getStartElementPath(),
- function (node) {
- return node.getAttribute('label')
- }
- )
- return parent ? parent.getAttribute('label') : ''
- }
- }
-
- me.addListener('keyup', function (type, evt) {
- var keyCode = evt.keyCode || evt.which
- if (keyCode == 32 || keyCode == 13) {
- var range = me.selection.getRange()
- if (range.collapsed) {
- var node = domUtils.findParent(
- me.selection.getStart(),
- function (node) {
- return node.getAttribute('label')
- },
- true
- )
- if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) {
- var p = me.document.createElement('p')
- domUtils.insertAfter(node, p)
- domUtils.fillNode(me.document, p)
- domUtils.remove(node)
- range.setStart(p, 0).setCursor()
- }
- }
- }
- })
- }
-
-
-
-
-
-
- UE.plugins['catchremoteimage'] = function () {
- var me = this,
- ajax = UE.ajax
-
- if (me.options.catchRemoteImageEnable === false) return
- me.setOpt({
- catchRemoteImageEnable: false
- })
- me.addListener('afterpaste', function () {
- me.fireEvent('catchRemoteImage')
- })
- me.addListener('catchRemoteImage', function () {
- var catcherLocalDomain = me.getOpt('catcherLocalDomain'),
- catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')),
- catcherUrlPrefix = me.getOpt('catcherUrlPrefix'),
- catcherFieldName = me.getOpt('catcherFieldName')
- var remoteImages = [],
- imgs = domUtils.getElementsByTagName(me.document, 'img'),
- test = function (src, urls) {
- if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) {
- return true
- }
- if (urls) {
- for (var j = 0, url; (url = urls[j++]); ) {
- if (src.indexOf(url) !== -1) {
- return true
- }
- }
- }
- return false
- }
- for (var i = 0, ci; (ci = imgs[i++]); ) {
- if (ci.getAttribute('word_img')) {
- continue
- }
- var src = ci.getAttribute('_src') || ci.src || ''
- if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) {
- remoteImages.push(src)
- }
- }
- if (remoteImages.length) {
- catchremoteimage(remoteImages, {
-
- success: function (r) {
- try {
- var info =
- r.state !== undefined ? r : eval('(' + r.responseText + ')')
- } catch (e) {
- return
- }
-
- var i,
- j,
- ci,
- cj,
- oldSrc,
- newSrc,
- list = info.list
- for (i = 0; (ci = imgs[i++]); ) {
- oldSrc = ci.getAttribute('_src') || ci.src || ''
- for (j = 0; (cj = list[j++]); ) {
- if (oldSrc == cj.source && cj.state == 'SUCCESS') {
-
- newSrc = catcherUrlPrefix + cj.url
- domUtils.setAttributes(ci, {
- src: newSrc,
- _src: newSrc
- })
- break
- }
- }
- }
- me.fireEvent('catchremotesuccess')
- },
-
- error: function () {
- me.fireEvent('catchremoteerror')
- }
- })
- }
- function catchremoteimage(imgs, callbacks) {
- var params =
- utils.serializeParam(me.queryCommandValue('serverparam')) || '',
- url = utils.formatUrl(
- catcherActionUrl +
- (catcherActionUrl.indexOf('?') == -1 ? '?' : '&') +
- params
- ),
- isJsonp = utils.isCrossDomainUrl(url),
- opt = {
- method: 'POST',
- dataType: isJsonp ? 'jsonp' : '',
- timeout: 60000,
- onsuccess: callbacks['success'],
- onerror: callbacks['error']
- }
- opt[catcherFieldName] = imgs
- ajax.request(url, opt)
- }
- })
- }
-
-
- UE.plugin.register('snapscreen', function () {
- var me = this
- var snapplugin
- function getLocation(url) {
- var search,
- a = document.createElement('a'),
- params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''
- a.href = url
- if (browser.ie) {
- a.href = a.href
- }
- search = a.search
- if (params) {
- search = search + (search.indexOf('?') == -1 ? '?' : '&') + params
- search = search.replace(/[&]+/gi, '&')
- }
- return {
- port: a.port,
- hostname: a.hostname,
- path: a.pathname + search || +a.hash
- }
- }
- return {
- commands: {
-
- snapscreen: {
- execCommand: function (cmd) {
- var url, local, res
- var lang = me.getLang('snapScreen_plugin')
- if (!snapplugin) {
- var container = me.container
- var doc = me.container.ownerDocument || me.container.document
- snapplugin = doc.createElement('object')
- try {
- snapplugin.type = 'application/x-pluginbaidusnap'
- } catch (e) {
- return
- }
- snapplugin.style.cssText =
- 'position:absolute;left:-9999px;width:0;height:0;'
- snapplugin.setAttribute('width', '0')
- snapplugin.setAttribute('height', '0')
- container.appendChild(snapplugin)
- }
- function onSuccess(rs) {
- try {
- rs = eval('(' + rs + ')')
- if (rs.state == 'SUCCESS') {
- var opt = me.options
- me.execCommand('insertimage', {
- src: opt.snapscreenUrlPrefix + rs.url,
- _src: opt.snapscreenUrlPrefix + rs.url,
- alt: rs.title || '',
- floatStyle: opt.snapscreenImgAlign
- })
- } else {
- alert(rs.state)
- }
- } catch (e) {
- alert(lang.callBackErrorMsg)
- }
- }
- url = me.getActionUrl(me.getOpt('snapscreenActionName'))
- local = getLocation(url)
- setTimeout(function () {
- try {
- res = snapplugin.saveSnapshot(
- local.hostname,
- local.path,
- local.port
- )
- } catch (e) {
- me.ui._dialogs['snapscreenDialog'].open()
- return
- }
- onSuccess(res)
- }, 50)
- },
- queryCommandState: function () {
- return navigator.userAgent.indexOf('Windows', 0) != -1 ? 0 : -1
- }
- }
- }
- }
- })
-
-
-
- UE.commands['insertparagraph'] = {
- execCommand: function (cmdName, front) {
- var me = this,
- range = me.selection.getRange(),
- start = range.startContainer,
- tmpNode
- while (start) {
- if (domUtils.isBody(start)) {
- break
- }
- tmpNode = start
- start = start.parentNode
- }
- if (tmpNode) {
- var p = me.document.createElement('p')
- if (front) {
- tmpNode.parentNode.insertBefore(p, tmpNode)
- } else {
- tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling)
- }
- domUtils.fillNode(me.document, p)
- range.setStart(p, 0).setCursor(false, true)
- }
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- UE.plugin.register('webapp', function () {
- var me = this
- function createInsertStr(obj, toEmbed) {
- return !toEmbed
- ? '<img title="' +
- obj.title +
- '" width="' +
- obj.width +
- '" height="' +
- obj.height +
- '"' +
- ' src="' +
- me.options.UEDITOR_HOME_URL +
- 'themes/default/images/spacer.gif" _logo_url="' +
- obj.logo +
- '" style="background:url(' +
- obj.logo +
- ') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' +
- obj.url +
- '" ' +
- (obj.align && !obj.cssfloat ? 'align="' + obj.align + '"' : '') +
- (obj.cssfloat ? 'style="float:' + obj.cssfloat + '"' : '') +
- '/>'
- : '<iframe class="edui-faked-webapp" title="' +
- obj.title +
- '" ' +
- (obj.align && !obj.cssfloat ? 'align="' + obj.align + '"' : '') +
- (obj.cssfloat ? 'style="float:' + obj.cssfloat + '"' : '') +
- 'width="' +
- obj.width +
- '" height="' +
- obj.height +
- '" scrolling="no" frameborder="0" src="' +
- obj.url +
- '" logo_url = "' +
- obj.logo +
- '"></iframe>'
- }
- return {
- outputRule: function (root) {
- utils.each(root.getNodesByTagName('img'), function (node) {
- var html
- if (node.getAttr('class') == 'edui-faked-webapp') {
- html = createInsertStr(
- {
- title: node.getAttr('title'),
- width: node.getAttr('width'),
- height: node.getAttr('height'),
- align: node.getAttr('align'),
- cssfloat: node.getStyle('float'),
- url: node.getAttr('_url'),
- logo: node.getAttr('_logo_url')
- },
- true
- )
- var embed = UE.uNode.createElement(html)
- node.parentNode.replaceChild(embed, node)
- }
- })
- },
- inputRule: function (root) {
- utils.each(root.getNodesByTagName('iframe'), function (node) {
- if (node.getAttr('class') == 'edui-faked-webapp') {
- var img = UE.uNode.createElement(
- createInsertStr({
- title: node.getAttr('title'),
- width: node.getAttr('width'),
- height: node.getAttr('height'),
- align: node.getAttr('align'),
- cssfloat: node.getStyle('float'),
- url: node.getAttr('src'),
- logo: node.getAttr('logo_url')
- })
- )
- node.parentNode.replaceChild(img, node)
- }
- })
- },
- commands: {
-
- webapp: {
- execCommand: function (cmd, obj) {
- var me = this,
- str = createInsertStr(
- utils.extend(obj, {
- align: 'none'
- }),
- false
- )
- me.execCommand('inserthtml', str)
- },
- queryCommandState: function () {
- var me = this,
- img = me.selection.getRange().getClosedNode(),
- flag = img && img.className == 'edui-faked-webapp'
- return flag ? 1 : 0
- }
- }
- }
- }
- })
-
-
-
-
-
-
-
-
- UE.plugins['template'] = function () {
- UE.commands['template'] = {
- execCommand: function (cmd, obj) {
- obj.html && this.execCommand('inserthtml', obj.html)
- }
- }
- this.addListener('click', function (type, evt) {
- var el = evt.target || evt.srcElement,
- range = this.selection.getRange()
- var tnode = domUtils.findParent(
- el,
- function (node) {
- if (node.className && domUtils.hasClass(node, 'ue_t')) {
- return node
- }
- },
- true
- )
- tnode && range.selectNode(tnode).shrinkBoundary().select()
- })
- this.addListener('keydown', function (type, evt) {
- var range = this.selection.getRange()
- if (!range.collapsed) {
- if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) {
- var tnode = domUtils.findParent(
- range.startContainer,
- function (node) {
- if (node.className && domUtils.hasClass(node, 'ue_t')) {
- return node
- }
- },
- true
- )
- if (tnode) {
- domUtils.removeClasses(tnode, ['ue_t'])
- }
- }
- }
- })
- }
-
-
- UE.plugin.register('music', function () {
- var me = this
- function creatInsertStr(url, width, height, align, cssfloat, toEmbed) {
- return !toEmbed
- ? '<img ' +
- (align && !cssfloat ? 'align="' + align + '"' : '') +
- (cssfloat ? 'style="float:' + cssfloat + '"' : '') +
- ' width="' +
- width +
- '" height="' +
- height +
- '" _url="' +
- url +
- '" class="edui-faked-music"' +
- ' src="' +
- me.options.langPath +
- me.options.lang +
- '/images/music.png" />'
- : '<embed type="application/x-shockwave-flash" class="edui-faked-music" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
- ' src="' +
- url +
- '" width="' +
- width +
- '" height="' +
- height +
- '" ' +
- (align && !cssfloat ? 'align="' + align + '"' : '') +
- (cssfloat ? 'style="float:' + cssfloat + '"' : '') +
- ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >'
- }
- return {
- outputRule: function (root) {
- utils.each(root.getNodesByTagName('img'), function (node) {
- var html
- if (node.getAttr('class') == 'edui-faked-music') {
- var cssfloat = node.getStyle('float')
- var align = node.getAttr('align')
- html = creatInsertStr(
- node.getAttr('_url'),
- node.getAttr('width'),
- node.getAttr('height'),
- align,
- cssfloat,
- true
- )
- var embed = UE.uNode.createElement(html)
- node.parentNode.replaceChild(embed, node)
- }
- })
- },
- inputRule: function (root) {
- utils.each(root.getNodesByTagName('embed'), function (node) {
- if (node.getAttr('class') == 'edui-faked-music') {
- var cssfloat = node.getStyle('float')
- var align = node.getAttr('align')
- html = creatInsertStr(
- node.getAttr('src'),
- node.getAttr('width'),
- node.getAttr('height'),
- align,
- cssfloat,
- false
- )
- var img = UE.uNode.createElement(html)
- node.parentNode.replaceChild(img, node)
- }
- })
- },
- commands: {
-
- music: {
- execCommand: function (cmd, musicObj) {
- var me = this,
- str = creatInsertStr(
- musicObj.url,
- musicObj.width || 400,
- musicObj.height || 95,
- 'none',
- false
- )
- me.execCommand('inserthtml', str)
- },
- queryCommandState: function () {
- var me = this,
- img = me.selection.getRange().getClosedNode(),
- flag = img && img.className == 'edui-faked-music'
- return flag ? 1 : 0
- }
- }
- }
- }
- })
-
-
- UE.plugin.register('autoupload', function () {
- function sendAndInsertFile(file, editor) {
- var me = editor
-
- var fieldName,
- urlPrefix,
- maxSize,
- allowFiles,
- actionUrl,
- loadingHtml,
- errorHandler,
- successHandler,
- filetype = /image\/\w+/i.test(file.type) ? 'image' : 'file',
- loadingId = 'loading_' + (+new Date()).toString(36)
- fieldName = me.getOpt(filetype + 'FieldName')
- urlPrefix = me.getOpt(filetype + 'UrlPrefix')
- maxSize = me.getOpt(filetype + 'MaxSize')
- allowFiles = me.getOpt(filetype + 'AllowFiles')
- actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName'))
- errorHandler = function (title) {
- var loader = me.document.getElementById(loadingId)
- loader && domUtils.remove(loader)
- me.fireEvent('showmessage', {
- id: loadingId,
- content: title,
- type: 'error',
- timeout: 4000
- })
- }
- if (filetype == 'image') {
- loadingHtml =
- '<img class="loadingclass" id="' +
- loadingId +
- '" src="' +
- me.options.themePath +
- me.options.theme +
- '/images/spacer.gif" title="' +
- (me.getLang('autoupload.loading') || '') +
- '" >'
- successHandler = function (data) {
- var link = urlPrefix + data.url,
- loader = me.document.getElementById(loadingId)
- if (loader) {
- loader.setAttribute('src', link)
- loader.setAttribute('_src', link)
- loader.setAttribute('title', data.title || '')
- loader.setAttribute('alt', data.original || '')
- loader.removeAttribute('id')
- domUtils.removeClasses(loader, 'loadingclass')
- }
- }
- } else {
- loadingHtml =
- '<p>' +
- '<img class="loadingclass" id="' +
- loadingId +
- '" src="' +
- me.options.themePath +
- me.options.theme +
- '/images/spacer.gif" title="' +
- (me.getLang('autoupload.loading') || '') +
- '" >' +
- '</p>'
- successHandler = function (data) {
- var link = urlPrefix + data.url,
- loader = me.document.getElementById(loadingId)
- var rng = me.selection.getRange(),
- bk = rng.createBookmark()
- rng.selectNode(loader).select()
- me.execCommand('insertfile', { url: link })
- rng.moveToBookmark(bk).select()
- }
- }
-
- me.execCommand('inserthtml', loadingHtml)
-
- if (!me.getOpt(filetype + 'ActionName')) {
- errorHandler(me.getLang('autoupload.errorLoadConfig'))
- return
- }
-
- if (file.size > maxSize) {
- errorHandler(me.getLang('autoupload.exceedSizeError'))
- return
- }
-
- var fileext = file.name
- ? file.name.substr(file.name.lastIndexOf('.'))
- : ''
- if (
- (fileext && filetype != 'image') ||
- (allowFiles &&
- (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') ==
- -1)
- ) {
- errorHandler(me.getLang('autoupload.exceedTypeError'))
- return
- }
-
- var xhr = new XMLHttpRequest(),
- fd = new FormData(),
- params =
- utils.serializeParam(me.queryCommandValue('serverparam')) || '',
- url = utils.formatUrl(
- actionUrl + (actionUrl.indexOf('?') == -1 ? '?' : '&') + params
- )
- fd.append(
- fieldName,
- file,
- file.name || 'blob.' + file.type.substr('image/'.length)
- )
- fd.append('type', 'ajax')
- xhr.open('post', url, true)
- xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
- xhr.addEventListener('load', function (e) {
- try {
- var json = new Function('return ' + utils.trim(e.target.response))()
- if (json.state == 'SUCCESS' && json.url) {
- successHandler(json)
- } else {
- errorHandler(json.state)
- }
- } catch (er) {
- errorHandler(me.getLang('autoupload.loadError'))
- }
- })
- xhr.send(fd)
- }
- function getPasteImage(e) {
- return e.clipboardData &&
- e.clipboardData.items &&
- e.clipboardData.items.length == 1 &&
- /^image\//.test(e.clipboardData.items[0].type)
- ? e.clipboardData.items
- : null
- }
- function getDropImage(e) {
- return e.dataTransfer && e.dataTransfer.files
- ? e.dataTransfer.files
- : null
- }
- return {
- outputRule: function (root) {
- utils.each(root.getNodesByTagName('img'), function (n) {
- if (
- /\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))
- ) {
- n.parentNode.removeChild(n)
- }
- })
- utils.each(root.getNodesByTagName('p'), function (n) {
- if (/\bloadpara\b/.test(n.getAttr('class'))) {
- n.parentNode.removeChild(n)
- }
- })
- },
- bindEvents: {
-
- ready: function (e) {
- var me = this
- if (window.FormData && window.FileReader) {
- domUtils.on(me.body, 'paste drop', function (e) {
- var hasImg = false,
- items
-
- items = e.type == 'paste' ? getPasteImage(e) : getDropImage(e)
- if (items) {
- var len = items.length,
- file
- while (len--) {
- file = items[len]
- if (file.getAsFile) file = file.getAsFile()
- if (file && file.size > 0) {
- sendAndInsertFile(file, me)
- hasImg = true
- }
- }
- hasImg && e.preventDefault()
- }
- })
-
- domUtils.on(me.body, 'dragover', function (e) {
- if (e.dataTransfer.types[0] == 'Files') {
- e.preventDefault()
- }
- })
-
- utils.cssRule(
- 'loading',
- ".loadingclass{display:inline-block;cursor:default;background: url('" +
- this.options.themePath +
- this.options.theme +
- "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n" +
- ".loaderrorclass{display:inline-block;cursor:default;background: url('" +
- this.options.themePath +
- this.options.theme +
- "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" +
- '}',
- this.document
- )
- }
- }
- }
- }
- })
-
- UE.plugin.register('autosave', function () {
- var me = this,
-
- lastSaveTime = new Date(),
-
- MIN_TIME = 20,
-
- saveKey = null
- function save(editor) {
- var saveData
- if (new Date() - lastSaveTime < MIN_TIME) {
- return
- }
- if (!editor.hasContents()) {
-
- saveKey && me.removePreferences(saveKey)
- return
- }
- lastSaveTime = new Date()
- editor._saveFlag = null
- saveData = me.body.innerHTML
- if (
- editor.fireEvent('beforeautosave', {
- content: saveData
- }) === false
- ) {
- return
- }
- me.setPreferences(saveKey, saveData)
- editor.fireEvent('afterautosave', {
- content: saveData
- })
- }
- return {
- defaultOptions: {
-
- saveInterval: 500,
- enableAutoSave: true
- },
- bindEvents: {
- ready: function () {
- var _suffix = '-drafts-data',
- key = null
- if (me.key) {
- key = me.key + _suffix
- } else {
- key = (me.container.parentNode.id || 'ue-common') + _suffix
- }
-
- saveKey =
- (location.protocol + location.host + location.pathname).replace(
- /[.:\/]/g,
- '_'
- ) + key
- },
- contentchange: function () {
-
- if (!me.getOpt('enableAutoSave')) {
- return
- }
- if (!saveKey) {
- return
- }
- if (me._saveFlag) {
- window.clearTimeout(me._saveFlag)
- }
- if (me.options.saveInterval > 0) {
- me._saveFlag = window.setTimeout(function () {
- save(me)
- }, me.options.saveInterval)
- } else {
- save(me)
- }
- }
- },
- commands: {
- clearlocaldata: {
- execCommand: function (cmd, name) {
- if (saveKey && me.getPreferences(saveKey)) {
- me.removePreferences(saveKey)
- }
- },
- notNeedUndo: true,
- ignoreContentChange: true
- },
- getlocaldata: {
- execCommand: function (cmd, name) {
- return saveKey ? me.getPreferences(saveKey) || '' : ''
- },
- notNeedUndo: true,
- ignoreContentChange: true
- },
- drafts: {
- execCommand: function (cmd, name) {
- if (saveKey) {
- me.body.innerHTML =
- me.getPreferences(saveKey) || '<p>' + domUtils.fillHtml + '</p>'
- me.focus(true)
- }
- },
- queryCommandState: function () {
- return saveKey ? (me.getPreferences(saveKey) === null ? -1 : 0) : -1
- },
- notNeedUndo: true,
- ignoreContentChange: true
- }
- }
- }
- })
-
- UE.plugin.register('charts', function () {
- var me = this
- return {
- bindEvents: {
- chartserror: function () {}
- },
- commands: {
- charts: {
- execCommand: function (cmd, data) {
- var tableNode = domUtils.findParentByTagName(
- this.selection.getRange().startContainer,
- 'table',
- true
- ),
- flagText = [],
- config = {}
- if (!tableNode) {
- return false
- }
- if (!validData(tableNode)) {
- me.fireEvent('chartserror')
- return false
- }
- config.title = data.title || ''
- config.subTitle = data.subTitle || ''
- config.xTitle = data.xTitle || ''
- config.yTitle = data.yTitle || ''
- config.suffix = data.suffix || ''
- config.tip = data.tip || ''
-
- config.dataFormat = data.tableDataFormat || ''
-
- config.chartType = data.chartType || 0
- for (var key in config) {
- if (!config.hasOwnProperty(key)) {
- continue
- }
- flagText.push(key + ':' + config[key])
- }
- tableNode.setAttribute('data-chart', flagText.join(';'))
- domUtils.addClass(tableNode, 'edui-charts-table')
- },
- queryCommandState: function (cmd, name) {
- var tableNode = domUtils.findParentByTagName(
- this.selection.getRange().startContainer,
- 'table',
- true
- )
- return tableNode && validData(tableNode) ? 0 : -1
- }
- }
- },
- inputRule: function (root) {
- utils.each(root.getNodesByTagName('table'), function (tableNode) {
- if (tableNode.getAttr('data-chart') !== undefined) {
- tableNode.setAttr('style')
- }
- })
- },
- outputRule: function (root) {
- utils.each(root.getNodesByTagName('table'), function (tableNode) {
- if (tableNode.getAttr('data-chart') !== undefined) {
- tableNode.setAttr('style', 'display: none;')
- }
- })
- }
- }
- function validData(table) {
- var firstRows = null,
- cellCount = 0
-
- if (table.rows.length < 2) {
- return false
- }
-
- if (table.rows[0].cells.length < 2) {
- return false
- }
-
- firstRows = table.rows[0].cells
- cellCount = firstRows.length
- for (var i = 0, cell; (cell = firstRows[i]); i++) {
- if (cell.tagName.toLowerCase() !== 'th') {
- return false
- }
- }
- for (var i = 1, row; (row = table.rows[i]); i++) {
-
- if (row.cells.length != cellCount) {
- return false
- }
-
- if (row.cells[0].tagName.toLowerCase() !== 'th') {
- return false
- }
- for (var j = 1, cell; (cell = row.cells[j]); j++) {
- var value = utils.trim(cell.innerText || cell.textContent || '')
- value = value
- .replace(new RegExp(UE.dom.domUtils.fillChar, 'g'), '')
- .replace(/^\s+|\s+$/g, '')
-
- if (!/^\d*\.?\d+$/.test(value)) {
- return false
- }
- }
- }
- return true
- }
- })
-
-
- UE.plugin.register('section', function () {
-
- function Section(option) {
- this.tag = ''
- ;(this.level = -1), (this.dom = null)
- this.nextSection = null
- this.previousSection = null
- this.parentSection = null
- this.startAddress = []
- this.endAddress = []
- this.children = []
- }
- function getSection(option) {
- var section = new Section()
- return utils.extend(section, option)
- }
- function getNodeFromAddress(startAddress, root) {
- var current = root
- for (var i = 0; i < startAddress.length; i++) {
- if (!current.childNodes) return null
- current = current.childNodes[startAddress[i]]
- }
- return current
- }
- var me = this
- return {
- bindMultiEvents: {
- type: 'aftersetcontent afterscencerestore',
- handler: function () {
- me.fireEvent('updateSections')
- }
- },
- bindEvents: {
-
- ready: function () {
- me.fireEvent('updateSections')
- domUtils.on(me.body, 'drop paste', function () {
- me.fireEvent('updateSections')
- })
- },
-
- afterexeccommand: function (type, cmd) {
- if (cmd == 'paragraph') {
- me.fireEvent('updateSections')
- }
- },
-
- keyup: function (type, e) {
- var me = this,
- range = me.selection.getRange()
- if (range.collapsed != true) {
- me.fireEvent('updateSections')
- } else {
- var keyCode = e.keyCode || e.which
- if (keyCode == 13 || keyCode == 8 || keyCode == 46) {
- me.fireEvent('updateSections')
- }
- }
- }
- },
- commands: {
- getsections: {
- execCommand: function (cmd, levels) {
- var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
- for (var i = 0; i < levelFn.length; i++) {
- if (typeof levelFn[i] == 'string') {
- levelFn[i] = (function (fn) {
- return function (node) {
- return node.tagName == fn.toUpperCase()
- }
- })(levelFn[i])
- } else if (typeof levelFn[i] != 'function') {
- levelFn[i] = function (node) {
- return null
- }
- }
- }
- function getSectionLevel(node) {
- for (var i = 0; i < levelFn.length; i++) {
- if (levelFn[i](node)) return i
- }
- return -1
- }
- var me = this,
- Directory = getSection({ level: -1, title: 'root' }),
- previous = Directory
- function traversal(node, Directory) {
- var level,
- tmpSection = null,
- parent,
- child,
- children = node.childNodes
- for (var i = 0, len = children.length; i < len; i++) {
- child = children[i]
- level = getSectionLevel(child)
- if (level >= 0) {
- var address = me.selection
- .getRange()
- .selectNode(child)
- .createAddress(true).startAddress,
- current = getSection({
- tag: child.tagName,
- title: child.innerText || child.textContent || '',
- level: level,
- dom: child,
- startAddress: utils.clone(address, []),
- endAddress: utils.clone(address, []),
- children: []
- })
- previous.nextSection = current
- current.previousSection = previous
- parent = previous
- while (level <= parent.level) {
- parent = parent.parentSection
- }
- current.parentSection = parent
- parent.children.push(current)
- tmpSection = previous = current
- } else {
- child.nodeType === 1 && traversal(child, Directory)
- tmpSection &&
- tmpSection.endAddress[tmpSection.endAddress.length - 1]++
- }
- }
- }
- traversal(me.body, Directory)
- return Directory
- },
- notNeedUndo: true
- },
- movesection: {
- execCommand: function (cmd, sourceSection, targetSection, isAfter) {
- var me = this,
- targetAddress,
- target
- if (!sourceSection || !targetSection || targetSection.level == -1)
- return
- targetAddress = isAfter
- ? targetSection.endAddress
- : targetSection.startAddress
- target = getNodeFromAddress(targetAddress, me.body)
-
- if (
- !targetAddress ||
- !target ||
- isContainsAddress(
- sourceSection.startAddress,
- sourceSection.endAddress,
- targetAddress
- )
- )
- return
- var startNode = getNodeFromAddress(
- sourceSection.startAddress,
- me.body
- ),
- endNode = getNodeFromAddress(sourceSection.endAddress, me.body),
- current,
- nextNode
- if (isAfter) {
- current = endNode
- while (
- current &&
- !(
- domUtils.getPosition(startNode, current) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- nextNode = current.previousSibling
- domUtils.insertAfter(target, current)
- if (current == startNode) break
- current = nextNode
- }
- } else {
- current = startNode
- while (
- current &&
- !(
- domUtils.getPosition(current, endNode) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- nextNode = current.nextSibling
- target.parentNode.insertBefore(current, target)
- if (current == endNode) break
- current = nextNode
- }
- }
- me.fireEvent('updateSections')
-
- function isContainsAddress(
- startAddress,
- endAddress,
- addressTarget
- ) {
- var isAfterStartAddress = false,
- isBeforeEndAddress = false
- for (var i = 0; i < startAddress.length; i++) {
- if (i >= addressTarget.length) break
- if (addressTarget[i] > startAddress[i]) {
- isAfterStartAddress = true
- break
- } else if (addressTarget[i] < startAddress[i]) {
- break
- }
- }
- for (var i = 0; i < endAddress.length; i++) {
- if (i >= addressTarget.length) break
- if (addressTarget[i] < startAddress[i]) {
- isBeforeEndAddress = true
- break
- } else if (addressTarget[i] > startAddress[i]) {
- break
- }
- }
- return isAfterStartAddress && isBeforeEndAddress
- }
- }
- },
- deletesection: {
- execCommand: function (cmd, section, keepChildren) {
- var me = this
- if (!section) return
- function getNodeFromAddress(startAddress) {
- var current = me.body
- for (var i = 0; i < startAddress.length; i++) {
- if (!current.childNodes) return null
- current = current.childNodes[startAddress[i]]
- }
- return current
- }
- var startNode = getNodeFromAddress(section.startAddress),
- endNode = getNodeFromAddress(section.endAddress),
- current = startNode,
- nextNode
- if (!keepChildren) {
- while (
- current &&
- domUtils.inDoc(endNode, me.document) &&
- !(
- domUtils.getPosition(current, endNode) &
- domUtils.POSITION_FOLLOWING
- )
- ) {
- nextNode = current.nextSibling
- domUtils.remove(current)
- current = nextNode
- }
- } else {
- domUtils.remove(current)
- }
- me.fireEvent('updateSections')
- }
- },
- selectsection: {
- execCommand: function (cmd, section) {
- if (!section && !section.dom) return false
- var me = this,
- range = me.selection.getRange(),
- address = {
- startAddress: utils.clone(section.startAddress, []),
- endAddress: utils.clone(section.endAddress, [])
- }
- address.endAddress[address.endAddress.length - 1]++
- range.moveToAddress(address).select().scrollToView()
- return true
- },
- notNeedUndo: true
- },
- scrolltosection: {
- execCommand: function (cmd, section) {
- if (!section && !section.dom) return false
- var me = this,
- range = me.selection.getRange(),
- address = {
- startAddress: section.startAddress,
- endAddress: section.endAddress
- }
- address.endAddress[address.endAddress.length - 1]++
- range.moveToAddress(address).scrollToView()
- return true
- },
- notNeedUndo: true
- }
- }
- }
- })
-
-
- UE.plugin.register('simpleupload', function () {
- var me = this,
- containerBtn,
- timestrap = (+new Date()).toString(36)
- function initUploadBtn() {
- var w = containerBtn.offsetWidth || 20,
- h = containerBtn.offsetHeight || 20,
- btnStyle =
- 'display:block;width:' +
- w +
- 'px;height:' +
- h +
- 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;'
- var form = document.createElement('form')
- var input = document.createElement('input')
- form.id = 'edui_form_' + timestrap
- form.enctype = 'multipart/form-data'
- form.style = btnStyle
- input.id = 'edui_input_' + timestrap
- input.type = 'file'
- input.accept = 'image/*'
- input.name = me.options.imageFieldName
- input.style = btnStyle
- form.appendChild(input)
- containerBtn.appendChild(form)
- input.addEventListener('change', function (event) {
- if (!input.value) return
- var loadingId = 'loading_' + (+new Date()).toString(36)
- var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName'))
- var params =
- utils.serializeParam(me.queryCommandValue('serverparam')) || ''
- var action = utils.formatUrl(
- imageActionUrl +
- (imageActionUrl.indexOf('?') == -1 ? '?' : '&') +
- params
- )
- var allowFiles = me.getOpt('imageAllowFiles')
- console.log(action, 'action', 'allowFiles', allowFiles)
- me.focus()
- me.execCommand(
- 'inserthtml',
- '<img class="loadingclass" id="' +
- loadingId +
- '" src="' +
- me.options.themePath +
- me.options.theme +
- '/images/spacer.gif" title="' +
- (me.getLang('simpleupload.loading') || '') +
- '" >'
- )
- function showErrorLoader(title) {
- if (loadingId) {
- var loader = me.document.getElementById(loadingId)
- loader && domUtils.remove(loader)
- me.fireEvent('showmessage', {
- id: loadingId,
- content: title,
- type: 'error',
- timeout: 4000
- })
- }
- }
-
- if (!me.getOpt('imageActionName')) {
- showErrorLoader(me.getLang('autoupload.errorLoadConfig'))
- return
- }
-
- var filename = input.value,
- fileext = filename ? filename.substr(filename.lastIndexOf('.')) : ''
- if (
- !fileext ||
- (allowFiles &&
- (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') ==
- -1)
- ) {
- showErrorLoader(me.getLang('simpleupload.exceedTypeError'))
- return
- }
- console.log('filename', input.value)
- console.log('准备上传action', action, input)
- let formData = new FormData()
- let files = input.files[0]
- formData.append('file', files)
- var xhr = new XMLHttpRequest()
-
- xhr.open('post', action, true)
- xhr.send(formData)
- if (
- me.options.headers &&
- Object.prototype.toString.apply(me.options.headers) ===
- '[object Object]'
- ) {
- for (var key in me.options.headers) {
- xhr.setRequestHeader(key, me.options.headers[key])
- }
- }
- xhr.onload = function () {
- if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
- var res = JSON.parse(xhr.responseText)
- var link = res.data.url
- if (res.code == 200 && res.data.url) {
- loader = me.document.getElementById(loadingId)
- loader.setAttribute('src', link)
- loader.setAttribute('_src', link)
- loader.setAttribute('title', res.title || '')
- loader.setAttribute('alt', res.original || '')
- loader.removeAttribute('id')
- domUtils.removeClasses(loader, 'loadingclass')
- me.fireEvent('contentchange')
- } else {
- showErrorLoader(res.state)
- }
- } else {
- console.log('请求失败')
- showErrorLoader(me.getLang('simpleupload.loadError'))
- }
- }
- xhr.onerror = function () {
- console.log('请求失败onerror')
- showErrorLoader(me.getLang('simpleupload.loadError'))
- }
- form.reset()
- })
- }
- return {
- bindEvents: {
- ready: function () {
-
- utils.cssRule(
- 'loading',
- ".loadingclass{display:inline-block;cursor:default;background: url('" +
- this.options.themePath +
- this.options.theme +
- "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n" +
- ".loaderrorclass{display:inline-block;cursor:default;background: url('" +
- this.options.themePath +
- this.options.theme +
- "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" +
- '}',
- this.document
- )
- },
-
- simpleuploadbtnready: function (type, container) {
- containerBtn = container
- me.afterConfigReady(initUploadBtn)
- }
- },
- outputRule: function (root) {
- utils.each(root.getNodesByTagName('img'), function (n) {
- if (
- /\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))
- ) {
- n.parentNode.removeChild(n)
- }
- })
- }
- }
- })
-
-
- UE.plugin.register('serverparam', function () {
- var me = this,
- serverParam = {}
- return {
- commands: {
-
-
-
-
-
-
- serverparam: {
- execCommand: function (cmd, key, value) {
- if (key === undefined || key === null) {
-
- serverParam = {}
- } else if (utils.isString(key)) {
-
- if (value === undefined || value === null) {
- delete serverParam[key]
- } else {
- serverParam[key] = value
- }
- } else if (utils.isObject(key)) {
-
- utils.extend(serverParam, key, true)
- } else if (utils.isFunction(key)) {
-
- utils.extend(serverParam, key(), true)
- }
- },
- queryCommandValue: function () {
- return serverParam || {}
- }
- }
- }
- }
- })
-
-
- UE.plugin.register('insertfile', function () {
- var me = this
- function getFileIcon(url) {
- var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(),
- maps = {
- rar: 'icon_rar.gif',
- zip: 'icon_rar.gif',
- tar: 'icon_rar.gif',
- gz: 'icon_rar.gif',
- bz2: 'icon_rar.gif',
- doc: 'icon_doc.gif',
- docx: 'icon_doc.gif',
- pdf: 'icon_pdf.gif',
- mp3: 'icon_mp3.gif',
- xls: 'icon_xls.gif',
- chm: 'icon_chm.gif',
- ppt: 'icon_ppt.gif',
- pptx: 'icon_ppt.gif',
- avi: 'icon_mv.gif',
- rmvb: 'icon_mv.gif',
- wmv: 'icon_mv.gif',
- flv: 'icon_mv.gif',
- swf: 'icon_mv.gif',
- rm: 'icon_mv.gif',
- exe: 'icon_exe.gif',
- psd: 'icon_psd.gif',
- txt: 'icon_txt.gif',
- jpg: 'icon_jpg.gif',
- png: 'icon_jpg.gif',
- jpeg: 'icon_jpg.gif',
- gif: 'icon_jpg.gif',
- ico: 'icon_jpg.gif',
- bmp: 'icon_jpg.gif'
- }
- return maps[ext] ? maps[ext] : maps['txt']
- }
- return {
- commands: {
- insertfile: {
- execCommand: function (command, filelist) {
- filelist = utils.isArray(filelist) ? filelist : [filelist]
- var i,
- item,
- icon,
- title,
- html = '',
- URL = me.getOpt('UEDITOR_HOME_URL'),
- iconDir =
- URL +
- (URL.substr(URL.length - 1) == '/' ? '' : '/') +
- 'dialogs/attachment/fileTypeImages/'
- for (i = 0; i < filelist.length; i++) {
- item = filelist[i]
- icon = iconDir + getFileIcon(item.url)
- title =
- item.title || item.url.substr(item.url.lastIndexOf('/') + 1)
- html +=
- '<p style="line-height: 16px;">' +
- '<img style="vertical-align: middle; margin-right: 2px;" src="' +
- icon +
- '" _src="' +
- icon +
- '" />' +
- '<a style="font-size:12px; color:#0066cc;" href="' +
- item.url +
- '" title="' +
- title +
- '">' +
- title +
- '</a>' +
- '</p>'
- }
- me.execCommand('insertHtml', html)
- }
- }
- }
- }
- })
-
-
- UE.plugins.xssFilter = function () {
- var config = UEDITOR_CONFIG
- var whitList = config.whitList
- function filter(node) {
- var tagName = node.tagName
- var attrs = node.attrs
- if (!whitList.hasOwnProperty(tagName)) {
- node.parentNode.removeChild(node)
- return false
- }
- UE.utils.each(attrs, function (val, key) {
- if (whitList[tagName].indexOf(key) === -1) {
- node.setAttr(key)
- }
- })
- }
-
- if (whitList && config.xssFilterRules) {
- this.options.filterRules = (function () {
- var result = {}
- UE.utils.each(whitList, function (val, key) {
- result[key] = function (node) {
- return filter(node)
- }
- })
- return result
- })()
- }
- var tagList = []
- UE.utils.each(whitList, function (val, key) {
- tagList.push(key)
- })
-
-
- if (whitList && config.inputXssFilter) {
- this.addInputRule(function (root) {
- root.traversal(function (node) {
- if (node.type !== 'element') {
- return false
- }
- filter(node)
- })
- })
- }
-
-
- if (whitList && config.outputXssFilter) {
- this.addOutputRule(function (root) {
- root.traversal(function (node) {
- if (node.type !== 'element') {
- return false
- }
- filter(node)
- })
- })
- }
- }
-
- var baidu = baidu || {}
- baidu.editor = baidu.editor || {}
- UE.ui = baidu.editor.ui = {}
-
- ;(function () {
- var browser = baidu.editor.browser,
- domUtils = baidu.editor.dom.domUtils
- var magic = '$EDITORUI'
- var root = (window[magic] = {})
- var uidMagic = 'ID' + magic
- var uidCount = 0
- var uiUtils = (baidu.editor.ui.uiUtils = {
- uid: function (obj) {
- return obj ? obj[uidMagic] || (obj[uidMagic] = ++uidCount) : ++uidCount
- },
- hook: function (fn, callback) {
- var dg
- if (fn && fn._callbacks) {
- dg = fn
- } else {
- dg = function () {
- var q
- if (fn) {
- q = fn.apply(this, arguments)
- }
- var callbacks = dg._callbacks
- var k = callbacks.length
- while (k--) {
- var r = callbacks[k].apply(this, arguments)
- if (q === undefined) {
- q = r
- }
- }
- return q
- }
- dg._callbacks = []
- }
- dg._callbacks.push(callback)
- return dg
- },
- createElementByHtml: function (html) {
- var el = document.createElement('div')
- el.innerHTML = html
- el = el.firstChild
- el.parentNode.removeChild(el)
- return el
- },
- getViewportElement: function () {
- return browser.ie && browser.quirks
- ? document.body
- : document.documentElement
- },
- getClientRect: function (element) {
- var bcr
-
- try {
- bcr = element.getBoundingClientRect()
- } catch (e) {
- bcr = { left: 0, top: 0, height: 0, width: 0 }
- }
- var rect = {
- left: Math.round(bcr.left),
- top: Math.round(bcr.top),
- height: Math.round(bcr.bottom - bcr.top),
- width: Math.round(bcr.right - bcr.left)
- }
- var doc
- while (
- (doc = element.ownerDocument) !== document &&
- (element = domUtils.getWindow(doc).frameElement)
- ) {
- bcr = element.getBoundingClientRect()
- rect.left += bcr.left
- rect.top += bcr.top
- }
- rect.bottom = rect.top + rect.height
- rect.right = rect.left + rect.width
- return rect
- },
- getViewportRect: function () {
- var viewportEl = uiUtils.getViewportElement()
- var width = (window.innerWidth || viewportEl.clientWidth) | 0
- var height = (window.innerHeight || viewportEl.clientHeight) | 0
- return {
- left: 0,
- top: 0,
- height: height,
- width: width,
- bottom: height,
- right: width
- }
- },
- setViewportOffset: function (element, offset) {
- var rect
- var fixedLayer = uiUtils.getFixedLayer()
- if (element.parentNode === fixedLayer) {
- element.style.left = offset.left + 'px'
- element.style.top = offset.top + 'px'
- } else {
- domUtils.setViewportOffset(element, offset)
- }
- },
- getEventOffset: function (evt) {
- var el = evt.target || evt.srcElement
- var rect = uiUtils.getClientRect(el)
- var offset = uiUtils.getViewportOffsetByEvent(evt)
- return {
- left: offset.left - rect.left,
- top: offset.top - rect.top
- }
- },
- getViewportOffsetByEvent: function (evt) {
- var el = evt.target || evt.srcElement
- var frameEl = domUtils.getWindow(el).frameElement
- var offset = {
- left: evt.clientX,
- top: evt.clientY
- }
- if (frameEl && el.ownerDocument !== document) {
- var rect = uiUtils.getClientRect(frameEl)
- offset.left += rect.left
- offset.top += rect.top
- }
- return offset
- },
- setGlobal: function (id, obj) {
- root[id] = obj
- return magic + '["' + id + '"]'
- },
- unsetGlobal: function (id) {
- delete root[id]
- },
- copyAttributes: function (tgt, src) {
- var attributes = src.attributes
- var k = attributes.length
- while (k--) {
- var attrNode = attributes[k]
- if (
- attrNode.nodeName != 'style' &&
- attrNode.nodeName != 'class' &&
- (!browser.ie || attrNode.specified)
- ) {
- tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue)
- }
- }
- if (src.className) {
- domUtils.addClass(tgt, src.className)
- }
- if (src.style.cssText) {
- tgt.style.cssText += ';' + src.style.cssText
- }
- },
- removeStyle: function (el, styleName) {
- if (el.style.removeProperty) {
- el.style.removeProperty(styleName)
- } else if (el.style.removeAttribute) {
- el.style.removeAttribute(styleName)
- } else throw ''
- },
- contains: function (elA, elB) {
- return (
- elA &&
- elB &&
- (elA === elB
- ? false
- : elA.contains
- ? elA.contains(elB)
- : elA.compareDocumentPosition(elB) & 16)
- )
- },
- startDrag: function (evt, callbacks, doc) {
- var doc = doc || document
- var startX = evt.clientX
- var startY = evt.clientY
- function handleMouseMove(evt) {
- var x = evt.clientX - startX
- var y = evt.clientY - startY
- callbacks.ondragmove(x, y, evt)
- if (evt.stopPropagation) {
- evt.stopPropagation()
- } else {
- evt.cancelBubble = true
- }
- }
- if (doc.addEventListener) {
- function handleMouseUp(evt) {
- doc.removeEventListener('mousemove', handleMouseMove, true)
- doc.removeEventListener('mouseup', handleMouseUp, true)
- window.removeEventListener('mouseup', handleMouseUp, true)
- callbacks.ondragstop()
- }
- doc.addEventListener('mousemove', handleMouseMove, true)
- doc.addEventListener('mouseup', handleMouseUp, true)
- window.addEventListener('mouseup', handleMouseUp, true)
- evt.preventDefault()
- } else {
- var elm = evt.srcElement
- elm.setCapture()
- function releaseCaptrue() {
- elm.releaseCapture()
- elm.detachEvent('onmousemove', handleMouseMove)
- elm.detachEvent('onmouseup', releaseCaptrue)
- elm.detachEvent('onlosecaptrue', releaseCaptrue)
- callbacks.ondragstop()
- }
- elm.attachEvent('onmousemove', handleMouseMove)
- elm.attachEvent('onmouseup', releaseCaptrue)
- elm.attachEvent('onlosecaptrue', releaseCaptrue)
- evt.returnValue = false
- }
- callbacks.ondragstart()
- },
- getFixedLayer: function () {
- var layer = document.getElementById('edui_fixedlayer')
- if (layer == null) {
- layer = document.createElement('div')
- layer.id = 'edui_fixedlayer'
- document.body.appendChild(layer)
- if (browser.ie && browser.version <= 8) {
- layer.style.position = 'absolute'
- bindFixedLayer()
- setTimeout(updateFixedOffset)
- } else {
- layer.style.position = 'fixed'
- }
- layer.style.left = '0'
- layer.style.top = '0'
- layer.style.width = '0'
- layer.style.height = '0'
- layer.style.zIndex = '3005'
- }
- return layer
- },
- makeUnselectable: function (element) {
- if (browser.opera || (browser.ie && browser.version < 9)) {
- element.unselectable = 'on'
- if (element.hasChildNodes()) {
- for (var i = 0; i < element.childNodes.length; i++) {
- if (element.childNodes[i].nodeType == 1) {
- uiUtils.makeUnselectable(element.childNodes[i])
- }
- }
- }
- } else {
- if (element.style.MozUserSelect !== undefined) {
- element.style.MozUserSelect = 'none'
- } else if (element.style.WebkitUserSelect !== undefined) {
- element.style.WebkitUserSelect = 'none'
- } else if (element.style.KhtmlUserSelect !== undefined) {
- element.style.KhtmlUserSelect = 'none'
- }
- }
- }
- })
- function updateFixedOffset() {
- var layer = document.getElementById('edui_fixedlayer')
- uiUtils.setViewportOffset(layer, {
- left: 0,
- top: 0
- })
-
-
-
-
- }
- function bindFixedLayer(adjOffset) {
- domUtils.on(window, 'scroll', updateFixedOffset)
- domUtils.on(
- window,
- 'resize',
- baidu.editor.utils.defer(updateFixedOffset, 0, true)
- )
- }
- })()
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- EventBase = baidu.editor.EventBase,
- UIBase = (baidu.editor.ui.UIBase = function () {})
- UIBase.prototype = {
- className: '',
- uiName: '',
- initOptions: function (options) {
- var me = this
- for (var k in options) {
- me[k] = options[k]
- }
- this.id = this.id || 'edui' + uiUtils.uid()
- },
- initUIBase: function () {
- this._globalKey = utils.unhtml(uiUtils.setGlobal(this.id, this))
- },
- render: function (holder) {
- var html = this.renderHtml()
- var el = uiUtils.createElementByHtml(html)
-
- var list = domUtils.getElementsByTagName(el, '*')
- var theme = 'edui-' + (this.theme || this.editor.options.theme)
- var layer = document.getElementById('edui_fixedlayer')
- for (var i = 0, node; (node = list[i++]); ) {
- domUtils.addClass(node, theme)
- }
- domUtils.addClass(el, theme)
- if (layer) {
- layer.className = ''
- domUtils.addClass(layer, theme)
- }
- var seatEl = this.getDom()
- if (seatEl != null) {
- seatEl.parentNode.replaceChild(el, seatEl)
- uiUtils.copyAttributes(el, seatEl)
- } else {
- if (typeof holder == 'string') {
- holder = document.getElementById(holder)
- }
- holder = holder || uiUtils.getFixedLayer()
- domUtils.addClass(holder, theme)
- holder.appendChild(el)
- }
- this.postRender()
- },
- getDom: function (name) {
- if (!name) {
- return document.getElementById(this.id)
- } else {
- return document.getElementById(this.id + '_' + name)
- }
- },
- postRender: function () {
- this.fireEvent('postrender')
- },
- getHtmlTpl: function () {
- return ''
- },
- formatHtml: function (tpl) {
- var prefix = 'edui-' + this.uiName
- return tpl
- .replace(/##/g, this.id)
- .replace(/%%-/g, this.uiName ? prefix + '-' : '')
- .replace(/%%/g, (this.uiName ? prefix : '') + ' ' + this.className)
- .replace(/\$\$/g, this._globalKey)
- },
- renderHtml: function () {
- return this.formatHtml(this.getHtmlTpl())
- },
- dispose: function () {
- var box = this.getDom()
- if (box) baidu.editor.dom.domUtils.remove(box)
- uiUtils.unsetGlobal(this.id)
- }
- }
- utils.inherits(UIBase, EventBase)
- })()
-
- ;(function () {
- var utils = baidu.editor.utils,
- UIBase = baidu.editor.ui.UIBase,
- Separator = (baidu.editor.ui.Separator = function (options) {
- this.initOptions(options)
- this.initSeparator()
- })
- Separator.prototype = {
- uiName: 'separator',
- initSeparator: function () {
- this.initUIBase()
- },
- getHtmlTpl: function () {
- return '<div id="##" class="edui-box %%"></div>'
- }
- }
- utils.inherits(Separator, UIBase)
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- domUtils = baidu.editor.dom.domUtils,
- UIBase = baidu.editor.ui.UIBase,
- uiUtils = baidu.editor.ui.uiUtils
- var Mask = (baidu.editor.ui.Mask = function (options) {
- this.initOptions(options)
- this.initUIBase()
- })
- Mask.prototype = {
- getHtmlTpl: function () {
- return '<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>'
- },
- postRender: function () {
- var me = this
- domUtils.on(window, 'resize', function () {
- setTimeout(function () {
- if (!me.isHidden()) {
- me._fill()
- }
- })
- })
- },
- show: function (zIndex) {
- this._fill()
- this.getDom().style.display = ''
- this.getDom().style.zIndex = zIndex
- },
- hide: function () {
- this.getDom().style.display = 'none'
- this.getDom().style.zIndex = ''
- },
- isHidden: function () {
- return this.getDom().style.display == 'none'
- },
- _onMouseDown: function () {
- return false
- },
- _onClick: function (e, target) {
- this.fireEvent('click', e, target)
- },
- _fill: function () {
- var el = this.getDom()
- var vpRect = uiUtils.getViewportRect()
- el.style.width = vpRect.width + 'px'
- el.style.height = vpRect.height + 'px'
- }
- }
- utils.inherits(Mask, UIBase)
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- domUtils = baidu.editor.dom.domUtils,
- UIBase = baidu.editor.ui.UIBase,
- Popup = (baidu.editor.ui.Popup = function (options) {
- this.initOptions(options)
- this.initPopup()
- })
- var allPopups = []
- function closeAllPopup(evt, el) {
- for (var i = 0; i < allPopups.length; i++) {
- var pop = allPopups[i]
- if (!pop.isHidden()) {
- if (pop.queryAutoHide(el) !== false) {
- if (
- evt &&
- /scroll/gi.test(evt.type) &&
- pop.className == 'edui-wordpastepop'
- )
- return
- pop.hide()
- }
- }
- }
- if (allPopups.length) pop.editor.fireEvent('afterhidepop')
- }
- Popup.postHide = closeAllPopup
- var ANCHOR_CLASSES = [
- 'edui-anchor-topleft',
- 'edui-anchor-topright',
- 'edui-anchor-bottomleft',
- 'edui-anchor-bottomright'
- ]
- Popup.prototype = {
- SHADOW_RADIUS: 5,
- content: null,
- _hidden: false,
- autoRender: true,
- canSideLeft: true,
- canSideUp: true,
- initPopup: function () {
- this.initUIBase()
- allPopups.push(this)
- },
- getHtmlTpl: function () {
- return (
- '<div id="##" class="edui-popup %%" onmousedown="return false;">' +
- ' <div id="##_body" class="edui-popup-body">' +
- ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
- ' <div class="edui-shadow"></div>' +
- ' <div id="##_content" class="edui-popup-content">' +
- this.getContentHtmlTpl() +
- ' </div>' +
- ' </div>' +
- '</div>'
- )
- },
- getContentHtmlTpl: function () {
- if (this.content) {
- if (typeof this.content == 'string') {
- return this.content
- }
- return this.content.renderHtml()
- } else {
- return ''
- }
- },
- _UIBase_postRender: UIBase.prototype.postRender,
- postRender: function () {
- if (this.content instanceof UIBase) {
- this.content.postRender()
- }
-
- if (this.captureWheel && !this.captured) {
- this.captured = true
- var winHeight =
- (document.documentElement.clientHeight ||
- document.body.clientHeight) - 80,
- _height = this.getDom().offsetHeight,
- _top = uiUtils.getClientRect(this.combox.getDom()).top,
- content = this.getDom('content'),
- ifr = this.getDom('body').getElementsByTagName('iframe'),
- me = this
- ifr.length && (ifr = ifr[0])
- while (_top + _height > winHeight) {
- _height -= 30
- }
- content.style.height = _height + 'px'
-
- ifr && (ifr.style.height = _height + 'px')
-
- if (window.XMLHttpRequest) {
- domUtils.on(
- content,
- 'onmousewheel' in document.body ? 'mousewheel' : 'DOMMouseScroll',
- function (e) {
- if (e.preventDefault) {
- e.preventDefault()
- } else {
- e.returnValue = false
- }
- if (e.wheelDelta) {
- content.scrollTop -= (e.wheelDelta / 120) * 60
- } else {
- content.scrollTop -= (e.detail / -3) * 60
- }
- }
- )
- } else {
-
- domUtils.on(this.getDom(), 'mousewheel', function (e) {
- e.returnValue = false
- me.getDom('content').scrollTop -= (e.wheelDelta / 120) * 60
- })
- }
- }
- this.fireEvent('postRenderAfter')
- this.hide(true)
- this._UIBase_postRender()
- },
- _doAutoRender: function () {
- if (!this.getDom() && this.autoRender) {
- this.render()
- }
- },
- mesureSize: function () {
- var box = this.getDom('content')
- return uiUtils.getClientRect(box)
- },
- fitSize: function () {
- if (this.captureWheel && this.sized) {
- return this.__size
- }
- this.sized = true
- var popBodyEl = this.getDom('body')
- popBodyEl.style.width = ''
- popBodyEl.style.height = ''
- var size = this.mesureSize()
- if (this.captureWheel) {
- popBodyEl.style.width = -(-20 - size.width) + 'px'
- var height = parseInt(this.getDom('content').style.height, 10)
- !window.isNaN(height) && (size.height = height)
- } else {
- popBodyEl.style.width = size.width + 'px'
- }
- popBodyEl.style.height = size.height + 'px'
- this.__size = size
- this.captureWheel && (this.getDom('content').style.overflow = 'auto')
- return size
- },
- showAnchor: function (element, hoz) {
- this.showAnchorRect(uiUtils.getClientRect(element), hoz)
- },
- showAnchorRect: function (rect, hoz, adj) {
- this._doAutoRender()
- var vpRect = uiUtils.getViewportRect()
- this.getDom().style.visibility = 'hidden'
- this._show()
- var popSize = this.fitSize()
- var sideLeft, sideUp, left, top
- if (hoz) {
- sideLeft =
- this.canSideLeft &&
- rect.right + popSize.width > vpRect.right &&
- rect.left > popSize.width
- sideUp =
- this.canSideUp &&
- rect.top + popSize.height > vpRect.bottom &&
- rect.bottom > popSize.height
- left = sideLeft ? rect.left - popSize.width : rect.right
- top = sideUp ? rect.bottom - popSize.height : rect.top
- } else {
- sideLeft =
- this.canSideLeft &&
- rect.right + popSize.width > vpRect.right &&
- rect.left > popSize.width
- sideUp =
- this.canSideUp &&
- rect.top + popSize.height > vpRect.bottom &&
- rect.bottom > popSize.height
- left = sideLeft ? rect.right - popSize.width : rect.left
- top = sideUp ? rect.top - popSize.height : rect.bottom
- }
- var popEl = this.getDom()
- uiUtils.setViewportOffset(popEl, {
- left: left,
- top: top
- })
- domUtils.removeClasses(popEl, ANCHOR_CLASSES)
- popEl.className +=
- ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]
- if (this.editor) {
- popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10
- baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex =
- popEl.style.zIndex - 1
- }
- this.getDom().style.visibility = 'visible'
- },
- showAt: function (offset) {
- var left = offset.left
- var top = offset.top
- var rect = {
- left: left,
- top: top,
- right: left,
- bottom: top,
- height: 0,
- width: 0
- }
- this.showAnchorRect(rect, false, true)
- },
- _show: function () {
- if (this._hidden) {
- var box = this.getDom()
- box.style.display = ''
- this._hidden = false
-
-
-
- this.fireEvent('show')
- }
- },
- isHidden: function () {
- return this._hidden
- },
- show: function () {
- this._doAutoRender()
- this._show()
- },
- hide: function (notNofity) {
- if (!this._hidden && this.getDom()) {
- this.getDom().style.display = 'none'
- this._hidden = true
- if (!notNofity) {
- this.fireEvent('hide')
- }
- }
- },
- queryAutoHide: function (el) {
- return !el || !uiUtils.contains(this.getDom(), el)
- }
- }
- utils.inherits(Popup, UIBase)
- domUtils.on(document, 'mousedown', function (evt) {
- var el = evt.target || evt.srcElement
- closeAllPopup(evt, el)
- })
- domUtils.on(window, 'scroll', function (evt, el) {
- closeAllPopup(evt, el)
- })
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- UIBase = baidu.editor.ui.UIBase,
- ColorPicker = (baidu.editor.ui.ColorPicker = function (options) {
- this.initOptions(options)
- this.noColorText = this.noColorText || this.editor.getLang('clearColor')
- this.initUIBase()
- })
- ColorPicker.prototype = {
- getHtmlTpl: function () {
- return genColorPicker(this.noColorText, this.editor)
- },
- _onTableClick: function (evt) {
- var tgt = evt.target || evt.srcElement
- var color = tgt.getAttribute('data-color')
- if (color) {
- this.fireEvent('pickcolor', color)
- }
- },
- _onTableOver: function (evt) {
- var tgt = evt.target || evt.srcElement
- var color = tgt.getAttribute('data-color')
- if (color) {
- this.getDom('preview').style.backgroundColor = color
- }
- },
- _onTableOut: function () {
- this.getDom('preview').style.backgroundColor = ''
- },
- _onPickNoColor: function () {
- this.fireEvent('picknocolor')
- }
- }
- utils.inherits(ColorPicker, UIBase)
- var COLORS = (
- 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' +
- 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' +
- 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' +
- 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' +
- 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' +
- '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' +
- 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,'
- ).split(',')
- function genColorPicker(noColorText, editor) {
- var html =
- '<div id="##" class="edui-colorpicker %%">' +
- '<div class="edui-colorpicker-topbar edui-clearfix">' +
- '<div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div>' +
- '<div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">' +
- noColorText +
- '</div>' +
- '</div>' +
- '<table class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0">' +
- '<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">' +
- editor.getLang('themeColor') +
- '</td> </tr>' +
- '<tr class="edui-colorpicker-tablefirstrow" >'
- for (var i = 0; i < COLORS.length; i++) {
- if (i && i % 10 === 0) {
- html +=
- '</tr>' +
- (i == 60
- ? '<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">' +
- editor.getLang('standardColor') +
- '</td></tr>'
- : '') +
- '<tr' +
- (i == 60 ? ' class="edui-colorpicker-tablefirstrow"' : '') +
- '>'
- }
- html +=
- i < 70
- ? '<td style="padding: 0 2px;"><a hidefocus title="' +
- COLORS[i] +
- '" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell"' +
- ' data-color="#' +
- COLORS[i] +
- '"' +
- ' style="background-color:#' +
- COLORS[i] +
- ';border:solid #ccc;' +
- (i < 10 || i >= 60
- ? 'border-width:1px;'
- : i >= 10 && i < 20
- ? 'border-width:1px 1px 0 1px;'
- : 'border-width:0 1px 0 1px;') +
- '"' +
- '></a></td>'
- : ''
- }
- html += '</tr></table></div>'
- return html
- }
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- UIBase = baidu.editor.ui.UIBase
- var TablePicker = (baidu.editor.ui.TablePicker = function (options) {
- this.initOptions(options)
- this.initTablePicker()
- })
- TablePicker.prototype = {
- defaultNumRows: 10,
- defaultNumCols: 10,
- maxNumRows: 20,
- maxNumCols: 20,
- numRows: 10,
- numCols: 10,
- lengthOfCellSide: 22,
- initTablePicker: function () {
- this.initUIBase()
- },
- getHtmlTpl: function () {
- var me = this
- return (
- '<div id="##" class="edui-tablepicker %%">' +
- '<div class="edui-tablepicker-body">' +
- '<div class="edui-infoarea">' +
- '<span id="##_label" class="edui-label"></span>' +
- '</div>' +
- '<div class="edui-pickarea"' +
- ' onmousemove="$$._onMouseMove(event, this);"' +
- ' onmouseover="$$._onMouseOver(event, this);"' +
- ' onmouseout="$$._onMouseOut(event, this);"' +
- ' onclick="$$._onClick(event, this);"' +
- '>' +
- '<div id="##_overlay" class="edui-overlay"></div>' +
- '</div>' +
- '</div>' +
- '</div>'
- )
- },
- _UIBase_render: UIBase.prototype.render,
- render: function (holder) {
- this._UIBase_render(holder)
- this.getDom('label').innerHTML =
- '0' +
- this.editor.getLang('t_row') +
- ' x 0' +
- this.editor.getLang('t_col')
- },
- _track: function (numCols, numRows) {
- var style = this.getDom('overlay').style
- var sideLen = this.lengthOfCellSide
- style.width = numCols * sideLen + 'px'
- style.height = numRows * sideLen + 'px'
- var label = this.getDom('label')
- label.innerHTML =
- numCols +
- this.editor.getLang('t_col') +
- ' x ' +
- numRows +
- this.editor.getLang('t_row')
- this.numCols = numCols
- this.numRows = numRows
- },
- _onMouseOver: function (evt, el) {
- var rel = evt.relatedTarget || evt.fromElement
- if (!uiUtils.contains(el, rel) && el !== rel) {
- this.getDom('label').innerHTML =
- '0' +
- this.editor.getLang('t_col') +
- ' x 0' +
- this.editor.getLang('t_row')
- this.getDom('overlay').style.visibility = ''
- }
- },
- _onMouseOut: function (evt, el) {
- var rel = evt.relatedTarget || evt.toElement
- if (!uiUtils.contains(el, rel) && el !== rel) {
- this.getDom('label').innerHTML =
- '0' +
- this.editor.getLang('t_col') +
- ' x 0' +
- this.editor.getLang('t_row')
- this.getDom('overlay').style.visibility = 'hidden'
- }
- },
- _onMouseMove: function (evt, el) {
- var style = this.getDom('overlay').style
- var offset = uiUtils.getEventOffset(evt)
- var sideLen = this.lengthOfCellSide
- var numCols = Math.ceil(offset.left / sideLen)
- var numRows = Math.ceil(offset.top / sideLen)
- this._track(numCols, numRows)
- },
- _onClick: function () {
- this.fireEvent('picktable', this.numCols, this.numRows)
- }
- }
- utils.inherits(TablePicker, UIBase)
- })()
-
- ;(function () {
- var browser = baidu.editor.browser,
- domUtils = baidu.editor.dom.domUtils,
- uiUtils = baidu.editor.ui.uiUtils
- var TPL_STATEFUL =
- 'onmousedown="$$.Stateful_onMouseDown(event, this);"' +
- ' onmouseup="$$.Stateful_onMouseUp(event, this);"' +
- (browser.ie
- ? ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' +
- ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"'
- : ' onmouseover="$$.Stateful_onMouseOver(event, this);"' +
- ' onmouseout="$$.Stateful_onMouseOut(event, this);"')
- baidu.editor.ui.Stateful = {
- alwalysHoverable: false,
- target: null,
- Stateful_init: function () {
- this._Stateful_dGetHtmlTpl = this.getHtmlTpl
- this.getHtmlTpl = this.Stateful_getHtmlTpl
- },
- Stateful_getHtmlTpl: function () {
- var tpl = this._Stateful_dGetHtmlTpl()
-
- return tpl.replace(/stateful/g, function () {
- return TPL_STATEFUL
- })
- },
- Stateful_onMouseEnter: function (evt, el) {
- this.target = el
- if (!this.isDisabled() || this.alwalysHoverable) {
- this.addState('hover')
- this.fireEvent('over')
- }
- },
- Stateful_onMouseLeave: function (evt, el) {
- if (!this.isDisabled() || this.alwalysHoverable) {
- this.removeState('hover')
- this.removeState('active')
- this.fireEvent('out')
- }
- },
- Stateful_onMouseOver: function (evt, el) {
- var rel = evt.relatedTarget
- if (!uiUtils.contains(el, rel) && el !== rel) {
- this.Stateful_onMouseEnter(evt, el)
- }
- },
- Stateful_onMouseOut: function (evt, el) {
- var rel = evt.relatedTarget
- if (!uiUtils.contains(el, rel) && el !== rel) {
- this.Stateful_onMouseLeave(evt, el)
- }
- },
- Stateful_onMouseDown: function (evt, el) {
- if (!this.isDisabled()) {
- this.addState('active')
- }
- },
- Stateful_onMouseUp: function (evt, el) {
- if (!this.isDisabled()) {
- this.removeState('active')
- }
- },
- Stateful_postRender: function () {
- if (this.disabled && !this.hasState('disabled')) {
- this.addState('disabled')
- }
- },
- hasState: function (state) {
- return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state)
- },
- addState: function (state) {
- if (!this.hasState(state)) {
- this.getStateDom().className += ' edui-state-' + state
- }
- },
- removeState: function (state) {
- if (this.hasState(state)) {
- domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state])
- }
- },
- getStateDom: function () {
- return this.getDom('state')
- },
- isChecked: function () {
- return this.hasState('checked')
- },
- setChecked: function (checked) {
- if (!this.isDisabled() && checked) {
- this.addState('checked')
- } else {
- this.removeState('checked')
- }
- },
- isDisabled: function () {
- return this.hasState('disabled')
- },
- setDisabled: function (disabled) {
- if (disabled) {
- this.removeState('hover')
- this.removeState('checked')
- this.removeState('active')
- this.addState('disabled')
- } else {
- this.removeState('disabled')
- }
- }
- }
- })()
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- UIBase = baidu.editor.ui.UIBase,
- Stateful = baidu.editor.ui.Stateful,
- Button = (baidu.editor.ui.Button = function (options) {
- if (options.name) {
- var btnName = options.name
- var cssRules = options.cssRules
- if (!options.className) {
- options.className = 'edui-for-' + btnName
- }
- options.cssRules =
- '.edui-default .edui-for-' +
- btnName +
- ' .edui-icon {' +
- cssRules +
- '}'
- }
- this.initOptions(options)
- this.initButton()
- })
- Button.prototype = {
- uiName: 'button',
- label: '',
- title: '',
- showIcon: true,
- showText: true,
- cssRules: '',
- initButton: function () {
- this.initUIBase()
- this.Stateful_init()
- if (this.cssRules) {
- utils.cssRule('edui-customize-' + this.name + '-style', this.cssRules)
- }
- },
- getHtmlTpl: function () {
- return (
- '<div id="##" class="edui-box %%">' +
- '<div id="##_state" stateful>' +
- '<div class="%%-wrap"><div id="##_body" unselectable="on" ' +
- (this.title ? 'title="' + this.title + '"' : '') +
- ' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">' +
- (this.showIcon ? '<div class="edui-box edui-icon"></div>' : '') +
- (this.showText
- ? '<div class="edui-box edui-label">' + this.label + '</div>'
- : '') +
- '</div>' +
- '</div>' +
- '</div></div>'
- )
- },
- postRender: function () {
- this.Stateful_postRender()
- this.setDisabled(this.disabled)
- },
- _onMouseDown: function (e) {
- var target = e.target || e.srcElement,
- tagName = target && target.tagName && target.tagName.toLowerCase()
- if (tagName == 'input' || tagName == 'object' || tagName == 'object') {
- return false
- }
- },
- _onClick: function () {
- if (!this.isDisabled()) {
- this.fireEvent('click')
- }
- },
- setTitle: function (text) {
- var label = this.getDom('label')
- label.innerHTML = text
- }
- }
- utils.inherits(Button, UIBase)
- utils.extend(Button.prototype, Stateful)
- })()
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- domUtils = baidu.editor.dom.domUtils,
- UIBase = baidu.editor.ui.UIBase,
- Stateful = baidu.editor.ui.Stateful,
- SplitButton = (baidu.editor.ui.SplitButton = function (options) {
- this.initOptions(options)
- this.initSplitButton()
- })
- SplitButton.prototype = {
- popup: null,
- uiName: 'splitbutton',
- title: '',
- initSplitButton: function () {
- this.initUIBase()
- this.Stateful_init()
- var me = this
- if (this.popup != null) {
- var popup = this.popup
- this.popup = null
- this.setPopup(popup)
- }
- },
- _UIBase_postRender: UIBase.prototype.postRender,
- postRender: function () {
- this.Stateful_postRender()
- this._UIBase_postRender()
- },
- setPopup: function (popup) {
- if (this.popup === popup) return
- if (this.popup != null) {
- this.popup.dispose()
- }
- popup.addListener('show', utils.bind(this._onPopupShow, this))
- popup.addListener('hide', utils.bind(this._onPopupHide, this))
- popup.addListener(
- 'postrender',
- utils.bind(function () {
- popup
- .getDom('body')
- .appendChild(
- uiUtils.createElementByHtml(
- '<div id="' +
- this.popup.id +
- '_bordereraser" class="edui-bordereraser edui-background" style="width:' +
- (uiUtils.getClientRect(this.getDom()).width + 20) +
- 'px"></div>'
- )
- )
- popup.getDom().className += ' ' + this.className
- }, this)
- )
- this.popup = popup
- },
- _onPopupShow: function () {
- this.addState('opened')
- },
- _onPopupHide: function () {
- this.removeState('opened')
- },
- getHtmlTpl: function () {
- return (
- '<div id="##" class="edui-box %%">' +
- '<div ' +
- (this.title ? 'title="' + this.title + '"' : '') +
- ' id="##_state" stateful><div class="%%-body">' +
- '<div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);">' +
- '<div class="edui-box edui-icon"></div>' +
- '</div>' +
- '<div class="edui-box edui-splitborder"></div>' +
- '<div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div>' +
- '</div></div></div>'
- )
- },
- showPopup: function () {
-
- var rect = uiUtils.getClientRect(this.getDom())
- rect.top -= this.popup.SHADOW_RADIUS
- rect.height += this.popup.SHADOW_RADIUS
- this.popup.showAnchorRect(rect)
- },
- _onArrowClick: function (event, el) {
- if (!this.isDisabled()) {
- this.showPopup()
- }
- },
- _onButtonClick: function () {
- if (!this.isDisabled()) {
- this.fireEvent('buttonclick')
- }
- }
- }
- utils.inherits(SplitButton, UIBase)
- utils.extend(SplitButton.prototype, Stateful, true)
- })()
-
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- ColorPicker = baidu.editor.ui.ColorPicker,
- Popup = baidu.editor.ui.Popup,
- SplitButton = baidu.editor.ui.SplitButton,
- ColorButton = (baidu.editor.ui.ColorButton = function (options) {
- this.initOptions(options)
- this.initColorButton()
- })
- ColorButton.prototype = {
- initColorButton: function () {
- var me = this
- this.popup = new Popup({
- content: new ColorPicker({
- noColorText: me.editor.getLang('clearColor'),
- editor: me.editor,
- onpickcolor: function (t, color) {
- me._onPickColor(color)
- },
- onpicknocolor: function (t, color) {
- me._onPickNoColor(color)
- }
- }),
- editor: me.editor
- })
- this.initSplitButton()
- },
- _SplitButton_postRender: SplitButton.prototype.postRender,
- postRender: function () {
- this._SplitButton_postRender()
- this.getDom('button_body').appendChild(
- uiUtils.createElementByHtml(
- '<div id="' + this.id + '_colorlump" class="edui-colorlump"></div>'
- )
- )
- this.getDom().className += ' edui-colorbutton'
- },
- setColor: function (color) {
- this.getDom('colorlump').style.backgroundColor = color
- this.color = color
- },
- _onPickColor: function (color) {
- if (this.fireEvent('pickcolor', color) !== false) {
- this.setColor(color)
- this.popup.hide()
- }
- },
- _onPickNoColor: function (color) {
- if (this.fireEvent('picknocolor') !== false) {
- this.popup.hide()
- }
- }
- }
- utils.inherits(ColorButton, SplitButton)
- })()
-
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- Popup = baidu.editor.ui.Popup,
- TablePicker = baidu.editor.ui.TablePicker,
- SplitButton = baidu.editor.ui.SplitButton,
- TableButton = (baidu.editor.ui.TableButton = function (options) {
- this.initOptions(options)
- this.initTableButton()
- })
- TableButton.prototype = {
- initTableButton: function () {
- var me = this
- this.popup = new Popup({
- content: new TablePicker({
- editor: me.editor,
- onpicktable: function (t, numCols, numRows) {
- me._onPickTable(numCols, numRows)
- }
- }),
- editor: me.editor
- })
- this.initSplitButton()
- },
- _onPickTable: function (numCols, numRows) {
- if (this.fireEvent('picktable', numCols, numRows) !== false) {
- this.popup.hide()
- }
- }
- }
- utils.inherits(TableButton, SplitButton)
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- UIBase = baidu.editor.ui.UIBase
- var AutoTypeSetPicker = (baidu.editor.ui.AutoTypeSetPicker = function (
- options
- ) {
- this.initOptions(options)
- this.initAutoTypeSetPicker()
- })
- AutoTypeSetPicker.prototype = {
- initAutoTypeSetPicker: function () {
- this.initUIBase()
- },
- getHtmlTpl: function () {
- var me = this.editor,
- opt = me.options.autotypeset,
- lang = me.getLang('autoTypeSet')
- var textAlignInputName = 'textAlignValue' + me.uid,
- imageBlockInputName = 'imageBlockLineValue' + me.uid,
- symbolConverInputName = 'symbolConverValue' + me.uid
- return (
- '<div id="##" class="edui-autotypesetpicker %%">' +
- '<div class="edui-autotypesetpicker-body">' +
- '<table >' +
- '<tr><td nowrap><input type="checkbox" name="mergeEmptyline" ' +
- (opt['mergeEmptyline'] ? 'checked' : '') +
- '>' +
- lang.mergeLine +
- '</td><td colspan="2"><input type="checkbox" name="removeEmptyline" ' +
- (opt['removeEmptyline'] ? 'checked' : '') +
- '>' +
- lang.delLine +
- '</td></tr>' +
- '<tr><td nowrap><input type="checkbox" name="removeClass" ' +
- (opt['removeClass'] ? 'checked' : '') +
- '>' +
- lang.removeFormat +
- '</td><td colspan="2"><input type="checkbox" name="indent" ' +
- (opt['indent'] ? 'checked' : '') +
- '>' +
- lang.indent +
- '</td></tr>' +
- '<tr>' +
- '<td nowrap><input type="checkbox" name="textAlign" ' +
- (opt['textAlign'] ? 'checked' : '') +
- '>' +
- lang.alignment +
- '</td>' +
- '<td colspan="2" id="' +
- textAlignInputName +
- '">' +
- '<input type="radio" name="' +
- textAlignInputName +
- '" value="left" ' +
- (opt['textAlign'] && opt['textAlign'] == 'left' ? 'checked' : '') +
- '>' +
- me.getLang('justifyleft') +
- '<input type="radio" name="' +
- textAlignInputName +
- '" value="center" ' +
- (opt['textAlign'] && opt['textAlign'] == 'center' ? 'checked' : '') +
- '>' +
- me.getLang('justifycenter') +
- '<input type="radio" name="' +
- textAlignInputName +
- '" value="right" ' +
- (opt['textAlign'] && opt['textAlign'] == 'right' ? 'checked' : '') +
- '>' +
- me.getLang('justifyright') +
- '</td>' +
- '</tr>' +
- '<tr>' +
- '<td nowrap><input type="checkbox" name="imageBlockLine" ' +
- (opt['imageBlockLine'] ? 'checked' : '') +
- '>' +
- lang.imageFloat +
- '</td>' +
- '<td nowrap id="' +
- imageBlockInputName +
- '">' +
- '<input type="radio" name="' +
- imageBlockInputName +
- '" value="none" ' +
- (opt['imageBlockLine'] && opt['imageBlockLine'] == 'none'
- ? 'checked'
- : '') +
- '>' +
- me.getLang('default') +
- '<input type="radio" name="' +
- imageBlockInputName +
- '" value="left" ' +
- (opt['imageBlockLine'] && opt['imageBlockLine'] == 'left'
- ? 'checked'
- : '') +
- '>' +
- me.getLang('justifyleft') +
- '<input type="radio" name="' +
- imageBlockInputName +
- '" value="center" ' +
- (opt['imageBlockLine'] && opt['imageBlockLine'] == 'center'
- ? 'checked'
- : '') +
- '>' +
- me.getLang('justifycenter') +
- '<input type="radio" name="' +
- imageBlockInputName +
- '" value="right" ' +
- (opt['imageBlockLine'] && opt['imageBlockLine'] == 'right'
- ? 'checked'
- : '') +
- '>' +
- me.getLang('justifyright') +
- '</td>' +
- '</tr>' +
- '<tr><td nowrap><input type="checkbox" name="clearFontSize" ' +
- (opt['clearFontSize'] ? 'checked' : '') +
- '>' +
- lang.removeFontsize +
- '</td><td colspan="2"><input type="checkbox" name="clearFontFamily" ' +
- (opt['clearFontFamily'] ? 'checked' : '') +
- '>' +
- lang.removeFontFamily +
- '</td></tr>' +
- '<tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" ' +
- (opt['removeEmptyNode'] ? 'checked' : '') +
- '>' +
- lang.removeHtml +
- '</td></tr>' +
- '<tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" ' +
- (opt['pasteFilter'] ? 'checked' : '') +
- '>' +
- lang.pasteFilter +
- '</td></tr>' +
- '<tr>' +
- '<td nowrap><input type="checkbox" name="symbolConver" ' +
- (opt['bdc2sb'] || opt['tobdc'] ? 'checked' : '') +
- '>' +
- lang.symbol +
- '</td>' +
- '<td id="' +
- symbolConverInputName +
- '">' +
- '<input type="radio" name="bdc" value="bdc2sb" ' +
- (opt['bdc2sb'] ? 'checked' : '') +
- '>' +
- lang.bdc2sb +
- '<input type="radio" name="bdc" value="tobdc" ' +
- (opt['tobdc'] ? 'checked' : '') +
- '>' +
- lang.tobdc +
- '' +
- '</td>' +
- '<td nowrap align="right"><button >' +
- lang.run +
- '</button></td>' +
- '</tr>' +
- '</table>' +
- '</div>' +
- '</div>'
- )
- },
- _UIBase_render: UIBase.prototype.render
- }
- utils.inherits(AutoTypeSetPicker, UIBase)
- })()
-
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- Popup = baidu.editor.ui.Popup,
- AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker,
- SplitButton = baidu.editor.ui.SplitButton,
- AutoTypeSetButton = (baidu.editor.ui.AutoTypeSetButton = function (
- options
- ) {
- this.initOptions(options)
- this.initAutoTypeSetButton()
- })
- function getPara(me) {
- var opt = {},
- cont = me.getDom(),
- editorId = me.editor.uid,
- inputType = null,
- attrName = null,
- ipts = domUtils.getElementsByTagName(cont, 'input')
- for (var i = ipts.length - 1, ipt; (ipt = ipts[i--]); ) {
- inputType = ipt.getAttribute('type')
- if (inputType == 'checkbox') {
- attrName = ipt.getAttribute('name')
- opt[attrName] && delete opt[attrName]
- if (ipt.checked) {
- var attrValue = document.getElementById(
- attrName + 'Value' + editorId
- )
- if (attrValue) {
- if (/input/gi.test(attrValue.tagName)) {
- opt[attrName] = attrValue.value
- } else {
- var iptChilds = attrValue.getElementsByTagName('input')
- for (
- var j = iptChilds.length - 1, iptchild;
- (iptchild = iptChilds[j--]);
- ) {
- if (iptchild.checked) {
- opt[attrName] = iptchild.value
- break
- }
- }
- }
- } else {
- opt[attrName] = true
- }
- } else {
- opt[attrName] = false
- }
- } else {
- opt[ipt.getAttribute('value')] = ipt.checked
- }
- }
- var selects = domUtils.getElementsByTagName(cont, 'select')
- for (var i = 0, si; (si = selects[i++]); ) {
- var attr = si.getAttribute('name')
- opt[attr] = opt[attr] ? si.value : ''
- }
- utils.extend(me.editor.options.autotypeset, opt)
- me.editor.setPreferences('autotypeset', opt)
- }
- AutoTypeSetButton.prototype = {
- initAutoTypeSetButton: function () {
- var me = this
- this.popup = new Popup({
-
- content: new AutoTypeSetPicker({ editor: me.editor }),
- editor: me.editor,
- hide: function () {
- if (!this._hidden && this.getDom()) {
- getPara(this)
- this.getDom().style.display = 'none'
- this._hidden = true
- this.fireEvent('hide')
- }
- }
- })
- var flag = 0
- this.popup.addListener('postRenderAfter', function () {
- var popupUI = this
- if (flag) return
- var cont = this.getDom(),
- btn = cont.getElementsByTagName('button')[0]
- btn.onclick = function () {
- getPara(popupUI)
- me.editor.execCommand('autotypeset')
- popupUI.hide()
- }
- domUtils.on(cont, 'click', function (e) {
- var target = e.target || e.srcElement,
- editorId = me.editor.uid
- if (target && target.tagName == 'INPUT') {
-
- if (
- target.name == 'imageBlockLine' ||
- target.name == 'textAlign' ||
- target.name == 'symbolConver'
- ) {
- var checked = target.checked,
- radioTd = document.getElementById(
- target.name + 'Value' + editorId
- ),
- radios = radioTd.getElementsByTagName('input'),
- defalutSelect = {
- imageBlockLine: 'none',
- textAlign: 'left',
- symbolConver: 'tobdc'
- }
- for (var i = 0; i < radios.length; i++) {
- if (checked) {
- if (radios[i].value == defalutSelect[target.name]) {
- radios[i].checked = 'checked'
- }
- } else {
- radios[i].checked = false
- }
- }
- }
-
- if (
- target.name == 'imageBlockLineValue' + editorId ||
- target.name == 'textAlignValue' + editorId ||
- target.name == 'bdc'
- ) {
- var checkboxs =
- target.parentNode.previousSibling.getElementsByTagName(
- 'input'
- )
- checkboxs && (checkboxs[0].checked = true)
- }
- getPara(popupUI)
- }
- })
- flag = 1
- })
- this.initSplitButton()
- }
- }
- utils.inherits(AutoTypeSetButton, SplitButton)
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- Popup = baidu.editor.ui.Popup,
- Stateful = baidu.editor.ui.Stateful,
- UIBase = baidu.editor.ui.UIBase
-
- var CellAlignPicker = (baidu.editor.ui.CellAlignPicker = function (
- options
- ) {
- this.initOptions(options)
- this.initSelected()
- this.initCellAlignPicker()
- })
- CellAlignPicker.prototype = {
-
- initSelected: function () {
- var status = {
- valign: {
- top: 0,
- middle: 1,
- bottom: 2
- },
- align: {
- left: 0,
- center: 1,
- right: 2
- },
- count: 3
- },
- result = -1
- if (this.selected) {
- this.selectedIndex =
- status.valign[this.selected.valign] * status.count +
- status.align[this.selected.align]
- }
- },
- initCellAlignPicker: function () {
- this.initUIBase()
- this.Stateful_init()
- },
- getHtmlTpl: function () {
- var alignType = ['left', 'center', 'right'],
- COUNT = 9,
- tempClassName = null,
- tempIndex = -1,
- tmpl = []
- for (var i = 0; i < COUNT; i++) {
- tempClassName =
- this.selectedIndex === i ? ' class="edui-cellalign-selected" ' : ''
- tempIndex = i % 3
- tempIndex === 0 && tmpl.push('<tr>')
- tmpl.push(
- '<td index="' +
- i +
- '" ' +
- tempClassName +
- ' stateful><div class="edui-icon edui-' +
- alignType[tempIndex] +
- '"></div></td>'
- )
- tempIndex === 2 && tmpl.push('</tr>')
- }
- return (
- '<div id="##" class="edui-cellalignpicker %%">' +
- '<div class="edui-cellalignpicker-body">' +
- '<table onclick="$$._onClick(event);">' +
- tmpl.join('') +
- '</table>' +
- '</div>' +
- '</div>'
- )
- },
- getStateDom: function () {
- return this.target
- },
- _onClick: function (evt) {
- var target = evt.target || evt.srcElement
- if (/icon/.test(target.className)) {
- this.items[target.parentNode.getAttribute('index')].onclick()
- Popup.postHide(evt)
- }
- },
- _UIBase_render: UIBase.prototype.render
- }
- utils.inherits(CellAlignPicker, UIBase)
- utils.extend(CellAlignPicker.prototype, Stateful, true)
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- Stateful = baidu.editor.ui.Stateful,
- uiUtils = baidu.editor.ui.uiUtils,
- UIBase = baidu.editor.ui.UIBase
- var PastePicker = (baidu.editor.ui.PastePicker = function (options) {
- this.initOptions(options)
- this.initPastePicker()
- })
- PastePicker.prototype = {
- initPastePicker: function () {
- this.initUIBase()
- this.Stateful_init()
- },
- getHtmlTpl: function () {
- return (
- '<div class="edui-pasteicon" onclick="$$._onClick(this)"></div>' +
- '<div class="edui-pastecontainer">' +
- '<div class="edui-title">' +
- this.editor.getLang('pasteOpt') +
- '</div>' +
- '<div class="edui-button">' +
- '<div title="' +
- this.editor.getLang('pasteSourceFormat') +
- '" onclick="$$.format(false)" stateful>' +
- '<div class="edui-richtxticon"></div></div>' +
- '<div title="' +
- this.editor.getLang('tagFormat') +
- '" onclick="$$.format(2)" stateful>' +
- '<div class="edui-tagicon"></div></div>' +
- '<div title="' +
- this.editor.getLang('pasteTextFormat') +
- '" onclick="$$.format(true)" stateful>' +
- '<div class="edui-plaintxticon"></div></div>' +
- '</div>' +
- '</div>' +
- '</div>'
- )
- },
- getStateDom: function () {
- return this.target
- },
- format: function (param) {
- this.editor.ui._isTransfer = true
- this.editor.fireEvent('pasteTransfer', param)
- },
- _onClick: function (cur) {
- var node = domUtils.getNextDomNode(cur),
- screenHt = uiUtils.getViewportRect().height,
- subPop = uiUtils.getClientRect(node)
- if (subPop.top + subPop.height > screenHt)
- node.style.top = -subPop.height - cur.offsetHeight + 'px'
- else node.style.top = ''
- if (/hidden/gi.test(domUtils.getComputedStyle(node, 'visibility'))) {
- node.style.visibility = 'visible'
- domUtils.addClass(cur, 'edui-state-opened')
- } else {
- node.style.visibility = 'hidden'
- domUtils.removeClasses(cur, 'edui-state-opened')
- }
- },
- _UIBase_render: UIBase.prototype.render
- }
- utils.inherits(PastePicker, UIBase)
- utils.extend(PastePicker.prototype, Stateful, true)
- })()
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- UIBase = baidu.editor.ui.UIBase,
- Toolbar = (baidu.editor.ui.Toolbar = function (options) {
- this.initOptions(options)
- this.initToolbar()
- })
- Toolbar.prototype = {
- items: null,
- initToolbar: function () {
- this.items = this.items || []
- this.initUIBase()
- },
- add: function (item, index) {
- if (index === undefined) {
- this.items.push(item)
- } else {
- this.items.splice(index, 0, item)
- }
- },
- getHtmlTpl: function () {
- var buff = []
- for (var i = 0; i < this.items.length; i++) {
- buff[i] = this.items[i].renderHtml()
- }
- return (
- '<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">' +
- buff.join('') +
- '</div>'
- )
- },
- postRender: function () {
- var box = this.getDom()
- for (var i = 0; i < this.items.length; i++) {
- this.items[i].postRender()
- }
- uiUtils.makeUnselectable(box)
- },
- _onMouseDown: function (e) {
- var target = e.target || e.srcElement,
- tagName = target && target.tagName && target.tagName.toLowerCase()
- if (tagName == 'input' || tagName == 'object' || tagName == 'object') {
- return false
- }
- }
- }
- utils.inherits(Toolbar, UIBase)
- })()
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- domUtils = baidu.editor.dom.domUtils,
- uiUtils = baidu.editor.ui.uiUtils,
- UIBase = baidu.editor.ui.UIBase,
- Popup = baidu.editor.ui.Popup,
- Stateful = baidu.editor.ui.Stateful,
- CellAlignPicker = baidu.editor.ui.CellAlignPicker,
- Menu = (baidu.editor.ui.Menu = function (options) {
- this.initOptions(options)
- this.initMenu()
- })
- var menuSeparator = {
- renderHtml: function () {
- return '<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>'
- },
- postRender: function () {},
- queryAutoHide: function () {
- return true
- }
- }
- Menu.prototype = {
- items: null,
- uiName: 'menu',
- initMenu: function () {
- this.items = this.items || []
- this.initPopup()
- this.initItems()
- },
- initItems: function () {
- for (var i = 0; i < this.items.length; i++) {
- var item = this.items[i]
- if (item == '-') {
- this.items[i] = this.getSeparator()
- } else if (!(item instanceof MenuItem)) {
- item.editor = this.editor
- item.theme = this.editor.options.theme
- this.items[i] = this.createItem(item)
- }
- }
- },
- getSeparator: function () {
- return menuSeparator
- },
- createItem: function (item) {
-
- item.menu = this
- return new MenuItem(item)
- },
- _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl,
- getContentHtmlTpl: function () {
- if (this.items.length == 0) {
- return this._Popup_getContentHtmlTpl()
- }
- var buff = []
- for (var i = 0; i < this.items.length; i++) {
- var item = this.items[i]
- buff[i] = item.renderHtml()
- }
- return '<div class="%%-body">' + buff.join('') + '</div>'
- },
- _Popup_postRender: Popup.prototype.postRender,
- postRender: function () {
- var me = this
- for (var i = 0; i < this.items.length; i++) {
- var item = this.items[i]
- item.ownerMenu = this
- item.postRender()
- }
- domUtils.on(this.getDom(), 'mouseover', function (evt) {
- evt = evt || event
- var rel = evt.relatedTarget || evt.fromElement
- var el = me.getDom()
- if (!uiUtils.contains(el, rel) && el !== rel) {
- me.fireEvent('over')
- }
- })
- this._Popup_postRender()
- },
- queryAutoHide: function (el) {
- if (el) {
- if (uiUtils.contains(this.getDom(), el)) {
- return false
- }
- for (var i = 0; i < this.items.length; i++) {
- var item = this.items[i]
- if (item.queryAutoHide(el) === false) {
- return false
- }
- }
- }
- },
- clearItems: function () {
- for (var i = 0; i < this.items.length; i++) {
- var item = this.items[i]
- clearTimeout(item._showingTimer)
- clearTimeout(item._closingTimer)
- if (item.subMenu) {
- item.subMenu.destroy()
- }
- }
- this.items = []
- },
- destroy: function () {
- if (this.getDom()) {
- domUtils.remove(this.getDom())
- }
- this.clearItems()
- },
- dispose: function () {
- this.destroy()
- }
- }
- utils.inherits(Menu, Popup)
-
- var MenuItem = (baidu.editor.ui.MenuItem = function (options) {
- this.initOptions(options)
- this.initUIBase()
- this.Stateful_init()
- if (this.subMenu && !(this.subMenu instanceof Menu)) {
- if (options.className && options.className.indexOf('aligntd') != -1) {
- var me = this
-
- this.subMenu.selected = this.editor.queryCommandValue('cellalignment')
- this.subMenu = new Popup({
- content: new CellAlignPicker(this.subMenu),
- parentMenu: me,
- editor: me.editor,
- destroy: function () {
- if (this.getDom()) {
- domUtils.remove(this.getDom())
- }
- }
- })
- this.subMenu.addListener('postRenderAfter', function () {
- domUtils.on(this.getDom(), 'mouseover', function () {
- me.addState('opened')
- })
- })
- } else {
- this.subMenu = new Menu(this.subMenu)
- }
- }
- })
- MenuItem.prototype = {
- label: '',
- subMenu: null,
- ownerMenu: null,
- uiName: 'menuitem',
- alwalysHoverable: true,
- getHtmlTpl: function () {
- return (
- '<div id="##" class="%%" stateful onclick="$$._onClick(event, this);">' +
- '<div class="%%-body">' +
- this.renderLabelHtml() +
- '</div>' +
- '</div>'
- )
- },
- postRender: function () {
- var me = this
- this.addListener('over', function () {
- me.ownerMenu.fireEvent('submenuover', me)
- if (me.subMenu) {
- me.delayShowSubMenu()
- }
- })
- if (this.subMenu) {
- this.getDom().className += ' edui-hassubmenu'
- this.subMenu.render()
- this.addListener('out', function () {
- me.delayHideSubMenu()
- })
- this.subMenu.addListener('over', function () {
- clearTimeout(me._closingTimer)
- me._closingTimer = null
- me.addState('opened')
- })
- this.ownerMenu.addListener('hide', function () {
- me.hideSubMenu()
- })
- this.ownerMenu.addListener('submenuover', function (t, subMenu) {
- if (subMenu !== me) {
- me.delayHideSubMenu()
- }
- })
- this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide
- this.subMenu.queryAutoHide = function (el) {
- if (el && uiUtils.contains(me.getDom(), el)) {
- return false
- }
- return this._bakQueryAutoHide(el)
- }
- }
- this.getDom().style.tabIndex = '-1'
- uiUtils.makeUnselectable(this.getDom())
- this.Stateful_postRender()
- },
- delayShowSubMenu: function () {
- var me = this
- if (!me.isDisabled()) {
- me.addState('opened')
- clearTimeout(me._showingTimer)
- clearTimeout(me._closingTimer)
- me._closingTimer = null
- me._showingTimer = setTimeout(function () {
- me.showSubMenu()
- }, 250)
- }
- },
- delayHideSubMenu: function () {
- var me = this
- if (!me.isDisabled()) {
- me.removeState('opened')
- clearTimeout(me._showingTimer)
- if (!me._closingTimer) {
- me._closingTimer = setTimeout(function () {
- if (!me.hasState('opened')) {
- me.hideSubMenu()
- }
- me._closingTimer = null
- }, 400)
- }
- }
- },
- renderLabelHtml: function () {
- return (
- '<div class="edui-arrow"></div>' +
- '<div class="edui-box edui-icon"></div>' +
- '<div class="edui-box edui-label %%-label">' +
- (this.label || '') +
- '</div>'
- )
- },
- getStateDom: function () {
- return this.getDom()
- },
- queryAutoHide: function (el) {
- if (this.subMenu && this.hasState('opened')) {
- return this.subMenu.queryAutoHide(el)
- }
- },
- _onClick: function (event, this_) {
- if (this.hasState('disabled')) return
- if (this.fireEvent('click', event, this_) !== false) {
- if (this.subMenu) {
- this.showSubMenu()
- } else {
- Popup.postHide(event)
- }
- }
- },
- showSubMenu: function () {
- var rect = uiUtils.getClientRect(this.getDom())
- rect.right -= 5
- rect.left += 2
- rect.width -= 7
- rect.top -= 4
- rect.bottom += 4
- rect.height += 8
- this.subMenu.showAnchorRect(rect, true, true)
- },
- hideSubMenu: function () {
- this.subMenu.hide()
- }
- }
- utils.inherits(MenuItem, UIBase)
- utils.extend(MenuItem.prototype, Stateful, true)
- })()
-
-
-
-
-
- ;(function () {
-
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- Menu = baidu.editor.ui.Menu,
- SplitButton = baidu.editor.ui.SplitButton,
- Combox = (baidu.editor.ui.Combox = function (options) {
- this.initOptions(options)
- this.initCombox()
- })
- Combox.prototype = {
- uiName: 'combox',
- onbuttonclick: function () {
- this.showPopup()
- },
- initCombox: function () {
- var me = this
- this.items = this.items || []
- for (var i = 0; i < this.items.length; i++) {
- var item = this.items[i]
- item.uiName = 'listitem'
- item.index = i
- item.onclick = function () {
- me.selectByIndex(this.index)
- }
- }
- this.popup = new Menu({
- items: this.items,
- uiName: 'list',
- editor: this.editor,
- captureWheel: true,
- combox: this
- })
- this.initSplitButton()
- },
- _SplitButton_postRender: SplitButton.prototype.postRender,
- postRender: function () {
- this._SplitButton_postRender()
- this.setLabel(this.label || '')
- this.setValue(this.initValue || '')
- },
- showPopup: function () {
- var rect = uiUtils.getClientRect(this.getDom())
- rect.top += 1
- rect.bottom -= 1
- rect.height -= 2
- this.popup.showAnchorRect(rect)
- },
- getValue: function () {
- return this.value
- },
- setValue: function (value) {
- var index = this.indexByValue(value)
- if (index != -1) {
- this.selectedIndex = index
- this.setLabel(this.items[index].label)
- this.value = this.items[index].value
- } else {
- this.selectedIndex = -1
- this.setLabel(this.getLabelForUnknowValue(value))
- this.value = value
- }
- },
- setLabel: function (label) {
- this.getDom('button_body').innerHTML = label
- this.label = label
- },
- getLabelForUnknowValue: function (value) {
- return value
- },
- indexByValue: function (value) {
- for (var i = 0; i < this.items.length; i++) {
- if (value == this.items[i].value) {
- return i
- }
- }
- return -1
- },
- getItem: function (index) {
- return this.items[index]
- },
- selectByIndex: function (index) {
- if (
- index < this.items.length &&
- this.fireEvent('select', index) !== false
- ) {
- this.selectedIndex = index
- this.value = this.items[index].value
- this.setLabel(this.items[index].label)
- }
- }
- }
- utils.inherits(Combox, SplitButton)
- })()
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- domUtils = baidu.editor.dom.domUtils,
- uiUtils = baidu.editor.ui.uiUtils,
- Mask = baidu.editor.ui.Mask,
- UIBase = baidu.editor.ui.UIBase,
- Button = baidu.editor.ui.Button,
- Dialog = (baidu.editor.ui.Dialog = function (options) {
- if (options.name) {
- var name = options.name
- var cssRules = options.cssRules
- if (!options.className) {
- options.className = 'edui-for-' + name
- }
- if (cssRules) {
- options.cssRules =
- '.edui-default .edui-for-' +
- name +
- ' .edui-dialog-content {' +
- cssRules +
- '}'
- }
- }
- this.initOptions(
- utils.extend(
- {
- autoReset: true,
- draggable: true,
- onok: function () {},
- oncancel: function () {},
- onclose: function (t, ok) {
- return ok ? this.onok() : this.oncancel()
- },
-
- holdScroll: false
- },
- options
- )
- )
- this.initDialog()
- })
- var modalMask
- var dragMask
- var activeDialog
- Dialog.prototype = {
- draggable: false,
- uiName: 'dialog',
- initDialog: function () {
- var me = this,
- theme = this.editor.options.theme
- if (this.cssRules) {
- utils.cssRule('edui-customize-' + this.name + '-style', this.cssRules)
- }
- this.initUIBase()
- this.modalMask =
- modalMask ||
- (modalMask = new Mask({
- className: 'edui-dialog-modalmask',
- theme: theme,
- onclick: function () {
- activeDialog && activeDialog.close(false)
- }
- }))
- this.dragMask =
- dragMask ||
- (dragMask = new Mask({
- className: 'edui-dialog-dragmask',
- theme: theme
- }))
- this.closeButton = new Button({
- className: 'edui-dialog-closebutton',
- title: me.closeDialog,
- theme: theme,
- onclick: function () {
- me.close(false)
- }
- })
- this.fullscreen && this.initResizeEvent()
- if (this.buttons) {
- for (var i = 0; i < this.buttons.length; i++) {
- if (!(this.buttons[i] instanceof Button)) {
- this.buttons[i] = new Button(
- utils.extend(
- this.buttons[i],
- {
- editor: this.editor
- },
- true
- )
- )
- }
- }
- }
- },
- initResizeEvent: function () {
- var me = this
- domUtils.on(window, 'resize', function () {
- if (me._hidden || me._hidden === undefined) {
- return
- }
- if (me.__resizeTimer) {
- window.clearTimeout(me.__resizeTimer)
- }
- me.__resizeTimer = window.setTimeout(function () {
- me.__resizeTimer = null
- var dialogWrapNode = me.getDom(),
- contentNode = me.getDom('content'),
- wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode),
- contentRect = UE.ui.uiUtils.getClientRect(contentNode),
- vpRect = uiUtils.getViewportRect()
- contentNode.style.width =
- vpRect.width - wrapRect.width + contentRect.width + 'px'
- contentNode.style.height =
- vpRect.height - wrapRect.height + contentRect.height + 'px'
- dialogWrapNode.style.width = vpRect.width + 'px'
- dialogWrapNode.style.height = vpRect.height + 'px'
- me.fireEvent('resize')
- }, 100)
- })
- },
- fitSize: function () {
- var popBodyEl = this.getDom('body')
-
-
-
-
- var size = this.mesureSize()
- popBodyEl.style.width = size.width + 'px'
- popBodyEl.style.height = size.height + 'px'
- return size
- },
- safeSetOffset: function (offset) {
- var me = this
- var el = me.getDom()
- var vpRect = uiUtils.getViewportRect()
- var rect = uiUtils.getClientRect(el)
- var left = offset.left
- if (left + rect.width > vpRect.right) {
- left = vpRect.right - rect.width
- }
- var top = offset.top
- if (top + rect.height > vpRect.bottom) {
- top = vpRect.bottom - rect.height
- }
- el.style.left = Math.max(left, 0) + 'px'
- el.style.top = Math.max(top, 0) + 'px'
- },
- showAtCenter: function () {
- var vpRect = uiUtils.getViewportRect()
- if (!this.fullscreen) {
- this.getDom().style.display = ''
- var popSize = this.fitSize()
- var titleHeight = this.getDom('titlebar').offsetHeight | 0
- var left = vpRect.width / 2 - popSize.width / 2
- var top =
- vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight
- var popEl = this.getDom()
- this.safeSetOffset({
- left: Math.max(left | 0, 0),
- top: Math.max(top | 0, 0)
- })
- if (!domUtils.hasClass(popEl, 'edui-state-centered')) {
- popEl.className += ' edui-state-centered'
- }
- } else {
- var dialogWrapNode = this.getDom(),
- contentNode = this.getDom('content')
- dialogWrapNode.style.display = 'block'
- var wrapRect = UE.ui.uiUtils.getClientRect(dialogWrapNode),
- contentRect = UE.ui.uiUtils.getClientRect(contentNode)
- dialogWrapNode.style.left = '-100000px'
- contentNode.style.width =
- vpRect.width - wrapRect.width + contentRect.width + 'px'
- contentNode.style.height =
- vpRect.height - wrapRect.height + contentRect.height + 'px'
- dialogWrapNode.style.width = vpRect.width + 'px'
- dialogWrapNode.style.height = vpRect.height + 'px'
- dialogWrapNode.style.left = 0
-
- this._originalContext = {
- html: {
- overflowX: document.documentElement.style.overflowX,
- overflowY: document.documentElement.style.overflowY
- },
- body: {
- overflowX: document.body.style.overflowX,
- overflowY: document.body.style.overflowY
- }
- }
- document.documentElement.style.overflowX = 'hidden'
- document.documentElement.style.overflowY = 'hidden'
- document.body.style.overflowX = 'hidden'
- document.body.style.overflowY = 'hidden'
- }
- this._show()
- },
- getContentHtml: function () {
- var contentHtml = ''
- if (typeof this.content == 'string') {
- contentHtml = this.content
- } else if (this.iframeUrl) {
- contentHtml =
- '<span id="' +
- this.id +
- '_contmask" class="dialogcontmask"></span><iframe id="' +
- this.id +
- '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="' +
- this.iframeUrl +
- '"></iframe>'
- }
- return contentHtml
- },
- getHtmlTpl: function () {
- var footHtml = ''
- if (this.buttons) {
- var buff = []
- for (var i = 0; i < this.buttons.length; i++) {
- buff[i] = this.buttons[i].renderHtml()
- }
- footHtml =
- '<div class="%%-foot">' +
- '<div id="##_buttons" class="%%-buttons">' +
- buff.join('') +
- '</div>' +
- '</div>'
- }
- return (
- '<div id="##" class="%%"><div ' +
- (!this.fullscreen
- ? 'class="%%"'
- : 'class="%%-wrap edui-dialog-fullscreen-flag"') +
- '><div id="##_body" class="%%-body">' +
- '<div class="%%-shadow"></div>' +
- '<div id="##_titlebar" class="%%-titlebar">' +
- '<div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);">' +
- '<span class="%%-caption">' +
- (this.title || '') +
- '</span>' +
- '</div>' +
- this.closeButton.renderHtml() +
- '</div>' +
- '<div id="##_content" class="%%-content">' +
- (this.autoReset ? '' : this.getContentHtml()) +
- '</div>' +
- footHtml +
- '</div></div></div>'
- )
- },
- postRender: function () {
-
- if (!this.modalMask.getDom()) {
- this.modalMask.render()
- this.modalMask.hide()
- }
- if (!this.dragMask.getDom()) {
- this.dragMask.render()
- this.dragMask.hide()
- }
- var me = this
- this.addListener('show', function () {
- me.modalMask.show(this.getDom().style.zIndex - 2)
- })
- this.addListener('hide', function () {
- me.modalMask.hide()
- })
- if (this.buttons) {
- for (var i = 0; i < this.buttons.length; i++) {
- this.buttons[i].postRender()
- }
- }
- domUtils.on(window, 'resize', function () {
- setTimeout(function () {
- if (!me.isHidden()) {
- me.safeSetOffset(uiUtils.getClientRect(me.getDom()))
- }
- })
- })
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this._hide()
- },
- mesureSize: function () {
- var body = this.getDom('body')
- var width = uiUtils.getClientRect(this.getDom('content')).width
- var dialogBodyStyle = body.style
- dialogBodyStyle.width = width
- return uiUtils.getClientRect(body)
- },
- _onTitlebarMouseDown: function (evt, el) {
- if (this.draggable) {
- var rect
- var vpRect = uiUtils.getViewportRect()
- var me = this
- uiUtils.startDrag(evt, {
- ondragstart: function () {
- rect = uiUtils.getClientRect(me.getDom())
- me.getDom('contmask').style.visibility = 'visible'
- me.dragMask.show(me.getDom().style.zIndex - 1)
- },
- ondragmove: function (x, y) {
- var left = rect.left + x
- var top = rect.top + y
- me.safeSetOffset({
- left: left,
- top: top
- })
- },
- ondragstop: function () {
- me.getDom('contmask').style.visibility = 'hidden'
- domUtils.removeClasses(me.getDom(), ['edui-state-centered'])
- me.dragMask.hide()
- }
- })
- }
- },
- reset: function () {
- this.getDom('content').innerHTML = this.getContentHtml()
- this.fireEvent('dialogafterreset')
- },
- _show: function () {
- if (this._hidden) {
- this.getDom().style.display = ''
-
- this.editor.container.style.zIndex &&
- (this.getDom().style.zIndex =
- this.editor.container.style.zIndex * 1 + 10)
- this._hidden = false
- this.fireEvent('show')
- baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex =
- this.getDom().style.zIndex - 4
- }
- },
- isHidden: function () {
- return this._hidden
- },
- _hide: function () {
- if (!this._hidden) {
- var wrapNode = this.getDom()
- wrapNode.style.display = 'none'
- wrapNode.style.zIndex = ''
- wrapNode.style.width = ''
- wrapNode.style.height = ''
- this._hidden = true
- this.fireEvent('hide')
- }
- },
- open: function () {
- if (this.autoReset) {
-
- try {
- this.reset()
- } catch (e) {
- this.render()
- this.open()
- }
- }
- this.showAtCenter()
- if (this.iframeUrl) {
- try {
- this.getDom('iframe').focus()
- } catch (ex) {}
- }
- activeDialog = this
- },
- _onCloseButtonClick: function (evt, el) {
- this.close(false)
- },
- close: function (ok) {
- if (this.fireEvent('close', ok) !== false) {
-
- if (this.fullscreen) {
- document.documentElement.style.overflowX =
- this._originalContext.html.overflowX
- document.documentElement.style.overflowY =
- this._originalContext.html.overflowY
- document.body.style.overflowX = this._originalContext.body.overflowX
- document.body.style.overflowY = this._originalContext.body.overflowY
- delete this._originalContext
- }
- this._hide()
-
- var content = this.getDom('content')
- var iframe = this.getDom('iframe')
- if (content && iframe) {
- var doc = iframe.contentDocument || iframe.contentWindow.document
- doc && (doc.body.innerHTML = '')
- domUtils.remove(content)
- }
- }
- }
- }
- utils.inherits(Dialog, UIBase)
- })()
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- Menu = baidu.editor.ui.Menu,
- SplitButton = baidu.editor.ui.SplitButton,
- MenuButton = (baidu.editor.ui.MenuButton = function (options) {
- this.initOptions(options)
- this.initMenuButton()
- })
- MenuButton.prototype = {
- initMenuButton: function () {
- var me = this
- this.uiName = 'menubutton'
- this.popup = new Menu({
- items: me.items,
- className: me.className,
- editor: me.editor
- })
- this.popup.addListener('show', function () {
- var list = this
- for (var i = 0; i < list.items.length; i++) {
- list.items[i].removeState('checked')
- if (list.items[i].value == me._value) {
- list.items[i].addState('checked')
- this.value = me._value
- }
- }
- })
- this.initSplitButton()
- },
- setValue: function (value) {
- this._value = value
- }
- }
- utils.inherits(MenuButton, SplitButton)
- })()
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- Popup = baidu.editor.ui.Popup,
- SplitButton = baidu.editor.ui.SplitButton,
- MultiMenuPop = (baidu.editor.ui.MultiMenuPop = function (options) {
- this.initOptions(options)
- this.initMultiMenu()
- })
- MultiMenuPop.prototype = {
- initMultiMenu: function () {
- var me = this
- this.popup = new Popup({
- content: '',
- editor: me.editor,
- iframe_rendered: false,
- onshow: function () {
- if (!this.iframe_rendered) {
- this.iframe_rendered = true
- this.getDom('content').innerHTML =
- '<iframe id="' +
- me.id +
- '_iframe" src="' +
- me.iframeUrl +
- '" frameborder="0"></iframe>'
- me.editor.container.style.zIndex &&
- (this.getDom().style.zIndex =
- me.editor.container.style.zIndex * 1 + 1)
- }
- }
-
-
- })
- this.onbuttonclick = function () {
- this.showPopup()
- }
- this.initSplitButton()
- }
- }
- utils.inherits(MultiMenuPop, SplitButton)
- })()
-
- ;(function () {
- var UI = baidu.editor.ui,
- UIBase = UI.UIBase,
- uiUtils = UI.uiUtils,
- utils = baidu.editor.utils,
- domUtils = baidu.editor.dom.domUtils
- var allMenus = [],
- timeID,
- isSubMenuShow = false
- var ShortCutMenu = (UI.ShortCutMenu = function (options) {
- this.initOptions(options)
- this.initShortCutMenu()
- })
- ShortCutMenu.postHide = hideAllMenu
- ShortCutMenu.prototype = {
- isHidden: true,
- SPACE: 5,
- initShortCutMenu: function () {
- this.items = this.items || []
- this.initUIBase()
- this.initItems()
- this.initEvent()
- allMenus.push(this)
- },
- initEvent: function () {
- var me = this,
- doc = me.editor.document
- domUtils.on(doc, 'mousemove', function (e) {
- if (me.isHidden === false) {
-
- if (me.getSubMenuMark() || me.eventType == 'contextmenu') return
- var flag = true,
- el = me.getDom(),
- wt = el.offsetWidth,
- ht = el.offsetHeight,
- distanceX = wt / 2 + me.SPACE,
- distanceY = ht / 2,
- x = Math.abs(e.screenX - me.left),
- y = Math.abs(e.screenY - me.top)
- clearTimeout(timeID)
- timeID = setTimeout(function () {
- if (y > 0 && y < distanceY) {
- me.setOpacity(el, '1')
- } else if (y > distanceY && y < distanceY + 70) {
- me.setOpacity(el, '0.5')
- flag = false
- } else if (y > distanceY + 70 && y < distanceY + 140) {
- me.hide()
- }
- if (flag && x > 0 && x < distanceX) {
- me.setOpacity(el, '1')
- } else if (x > distanceX && x < distanceX + 70) {
- me.setOpacity(el, '0.5')
- } else if (x > distanceX + 70 && x < distanceX + 140) {
- me.hide()
- }
- })
- }
- })
-
- if (browser.chrome) {
- domUtils.on(doc, 'mouseout', function (e) {
- var relatedTgt = e.relatedTarget || e.toElement
- if (relatedTgt == null || relatedTgt.tagName == 'HTML') {
- me.hide()
- }
- })
- }
- me.editor.addListener('afterhidepop', function () {
- if (!me.isHidden) {
- isSubMenuShow = true
- }
- })
- },
- initItems: function () {
- if (utils.isArray(this.items)) {
- for (var i = 0, len = this.items.length; i < len; i++) {
- var item = this.items[i].toLowerCase()
- if (UI[item]) {
- this.items[i] = new UI[item](this.editor)
- this.items[i].className += ' edui-shortcutsubmenu '
- }
- }
- }
- },
- setOpacity: function (el, value) {
- if (browser.ie && browser.version < 9) {
- el.style.filter = 'alpha(opacity = ' + parseFloat(value) * 100 + ');'
- } else {
- el.style.opacity = value
- }
- },
- getSubMenuMark: function () {
- isSubMenuShow = false
- var layerEle = uiUtils.getFixedLayer()
- var list = domUtils.getElementsByTagName(
- layerEle,
- 'div',
- function (node) {
- return domUtils.hasClass(node, 'edui-shortcutsubmenu edui-popup')
- }
- )
- for (var i = 0, node; (node = list[i++]); ) {
- if (node.style.display != 'none') {
- isSubMenuShow = true
- }
- }
- return isSubMenuShow
- },
- show: function (e, hasContextmenu) {
- var me = this,
- offset = {},
- el = this.getDom(),
- fixedlayer = uiUtils.getFixedLayer()
- function setPos(offset) {
- if (offset.left < 0) {
- offset.left = 0
- }
- if (offset.top < 0) {
- offset.top = 0
- }
- el.style.cssText =
- 'position:absolute;left:' +
- offset.left +
- 'px;top:' +
- offset.top +
- 'px;'
- }
- function setPosByCxtMenu(menu) {
- if (!menu.tagName) {
- menu = menu.getDom()
- }
- offset.left = parseInt(menu.style.left)
- offset.top = parseInt(menu.style.top)
- offset.top -= el.offsetHeight + 15
- setPos(offset)
- }
- me.eventType = e.type
- el.style.cssText = 'display:block;left:-9999px'
- if (e.type == 'contextmenu' && hasContextmenu) {
- var menu = domUtils.getElementsByTagName(
- fixedlayer,
- 'div',
- 'edui-contextmenu'
- )[0]
- if (menu) {
- setPosByCxtMenu(menu)
- } else {
- me.editor.addListener(
- 'aftershowcontextmenu',
- function (type, menu) {
- setPosByCxtMenu(menu)
- }
- )
- }
- } else {
- offset = uiUtils.getViewportOffsetByEvent(e)
- offset.top -= el.offsetHeight + me.SPACE
- offset.left += me.SPACE + 20
- setPos(offset)
- me.setOpacity(el, 0.2)
- }
- me.isHidden = false
- me.left = e.screenX + el.offsetWidth / 2 - me.SPACE
- me.top = e.screenY - el.offsetHeight / 2 - me.SPACE
- if (me.editor) {
- el.style.zIndex = me.editor.container.style.zIndex * 1 + 10
- fixedlayer.style.zIndex = el.style.zIndex - 1
- }
- },
- hide: function () {
- if (this.getDom()) {
- this.getDom().style.display = 'none'
- }
- this.isHidden = true
- },
- postRender: function () {
- if (utils.isArray(this.items)) {
- for (var i = 0, item; (item = this.items[i++]); ) {
- item.postRender()
- }
- }
- },
- getHtmlTpl: function () {
- var buff
- if (utils.isArray(this.items)) {
- buff = []
- for (var i = 0; i < this.items.length; i++) {
- buff[i] = this.items[i].renderHtml()
- }
- buff = buff.join('')
- } else {
- buff = this.items
- }
- return (
- '<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >' +
- buff +
- '</div>'
- )
- }
- }
- utils.inherits(ShortCutMenu, UIBase)
- function hideAllMenu(e) {
- var tgt = e.target || e.srcElement,
- cur = domUtils.findParent(
- tgt,
- function (node) {
- return (
- domUtils.hasClass(node, 'edui-shortcutmenu') ||
- domUtils.hasClass(node, 'edui-popup')
- )
- },
- true
- )
- if (!cur) {
- for (var i = 0, menu; (menu = allMenus[i++]); ) {
- menu.hide()
- }
- }
- }
- domUtils.on(document, 'mousedown', function (e) {
- hideAllMenu(e)
- })
- domUtils.on(window, 'scroll', function (e) {
- hideAllMenu(e)
- })
- })()
-
- ;(function () {
- var utils = baidu.editor.utils,
- UIBase = baidu.editor.ui.UIBase,
- Breakline = (baidu.editor.ui.Breakline = function (options) {
- this.initOptions(options)
- this.initSeparator()
- })
- Breakline.prototype = {
- uiName: 'Breakline',
- initSeparator: function () {
- this.initUIBase()
- },
- getHtmlTpl: function () {
- return '<br/>'
- }
- }
- utils.inherits(Breakline, UIBase)
- })()
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- domUtils = baidu.editor.dom.domUtils,
- UIBase = baidu.editor.ui.UIBase,
- Message = (baidu.editor.ui.Message = function (options) {
- this.initOptions(options)
- this.initMessage()
- })
- Message.prototype = {
- initMessage: function () {
- this.initUIBase()
- },
- getHtmlTpl: function () {
- return (
- '<div id="##" class="edui-message %%">' +
- ' <div id="##_closer" class="edui-message-closer">×</div>' +
- ' <div id="##_body" class="edui-message-body edui-message-type-info">' +
- ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
- ' <div class="edui-shadow"></div>' +
- ' <div id="##_content" class="edui-message-content">' +
- ' </div>' +
- ' </div>' +
- '</div>'
- )
- },
- reset: function (opt) {
- var me = this
- if (!opt.keepshow) {
- clearTimeout(this.timer)
- me.timer = setTimeout(function () {
- me.hide()
- }, opt.timeout || 4000)
- }
- opt.content !== undefined && me.setContent(opt.content)
- opt.type !== undefined && me.setType(opt.type)
- me.show()
- },
- postRender: function () {
- var me = this,
- closer = this.getDom('closer')
- closer &&
- domUtils.on(closer, 'click', function () {
- me.hide()
- })
- },
- setContent: function (content) {
- this.getDom('content').innerHTML = content
- },
- setType: function (type) {
- type = type || 'info'
- var body = this.getDom('body')
- body.className = body.className.replace(
- /edui-message-type-[\w-]+/,
- 'edui-message-type-' + type
- )
- },
- getContent: function () {
- return this.getDom('content').innerHTML
- },
- getType: function () {
- var arr = this.getDom('body').match(/edui-message-type-([\w-]+)/)
- return arr ? arr[1] : ''
- },
- show: function () {
- this.getDom().style.display = 'block'
- },
- hide: function () {
- var dom = this.getDom()
- if (dom) {
- dom.style.display = 'none'
- dom.parentNode && dom.parentNode.removeChild(dom)
- }
- }
- }
- utils.inherits(Message, UIBase)
- })()
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils
- var editorui = baidu.editor.ui
- var _Dialog = editorui.Dialog
- editorui.buttons = {}
- editorui.Dialog = function (options) {
- var dialog = new _Dialog(options)
- dialog.addListener('hide', function () {
- if (dialog.editor) {
- var editor = dialog.editor
- try {
- if (browser.gecko) {
- var y = editor.window.scrollY,
- x = editor.window.scrollX
- editor.body.focus()
- editor.window.scrollTo(x, y)
- } else {
- editor.focus()
- }
- } catch (ex) {}
- }
- })
- return dialog
- }
- var iframeUrlMap = {
- anchor: '~/dialogs/anchor/anchor.html',
- insertimage: '~/dialogs/image/image.html',
- link: '~/dialogs/link/link.html',
- spechars: '~/dialogs/spechars/spechars.html',
- searchreplace: '~/dialogs/searchreplace/searchreplace.html',
- map: '~/dialogs/map/map.html',
- gmap: '~/dialogs/gmap/gmap.html',
- insertvideo: '~/dialogs/video/video.html',
- help: '~/dialogs/help/help.html',
- preview: '~/dialogs/preview/preview.html',
- emotion: '~/dialogs/emotion/emotion.html',
- wordimage: '~/dialogs/wordimage/wordimage.html',
- attachment: '~/dialogs/attachment/attachment.html',
- insertframe: '~/dialogs/insertframe/insertframe.html',
- edittip: '~/dialogs/table/edittip.html',
- edittable: '~/dialogs/table/edittable.html',
- edittd: '~/dialogs/table/edittd.html',
- webapp: '~/dialogs/webapp/webapp.html',
- snapscreen: '~/dialogs/snapscreen/snapscreen.html',
- scrawl: '~/dialogs/scrawl/scrawl.html',
- music: '~/dialogs/music/music.html',
- template: '~/dialogs/template/template.html',
- background: '~/dialogs/background/background.html',
- charts: '~/dialogs/charts/charts.html'
- }
-
- var btnCmds = [
- 'undo',
- 'redo',
- 'formatmatch',
- 'bold',
- 'italic',
- 'underline',
- 'fontborder',
- 'touppercase',
- 'tolowercase',
- 'strikethrough',
- 'subscript',
- 'superscript',
- 'source',
- 'indent',
- 'outdent',
- 'blockquote',
- 'pasteplain',
- 'pagebreak',
- 'selectall',
- 'print',
- 'horizontal',
- 'removeformat',
- 'time',
- 'date',
- 'unlink',
- 'insertparagraphbeforetable',
- 'insertrow',
- 'insertcol',
- 'mergeright',
- 'mergedown',
- 'deleterow',
- 'deletecol',
- 'splittorows',
- 'splittocols',
- 'splittocells',
- 'mergecells',
- 'deletetable',
- 'drafts'
- ]
- for (var i = 0, ci; (ci = btnCmds[i++]); ) {
- ci = ci.toLowerCase()
- editorui[ci] = (function (cmd) {
- return function (editor) {
- var ui = new editorui.Button({
- className: 'edui-for-' + cmd,
- title:
- editor.options.labelMap[cmd] ||
- editor.getLang('labelMap.' + cmd) ||
- '',
- onclick: function () {
- editor.execCommand(cmd)
- },
- theme: editor.options.theme,
- showText: false
- })
- editorui.buttons[cmd] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- var state = editor.queryCommandState(cmd)
- if (state == -1) {
- ui.setDisabled(true)
- ui.setChecked(false)
- } else {
- if (!uiReady) {
- ui.setDisabled(false)
- ui.setChecked(state)
- }
- }
- }
- )
- return ui
- }
- })(ci)
- }
-
- editorui.cleardoc = function (editor) {
- var ui = new editorui.Button({
- className: 'edui-for-cleardoc',
- title:
- editor.options.labelMap.cleardoc ||
- editor.getLang('labelMap.cleardoc') ||
- '',
- theme: editor.options.theme,
- onclick: function () {
- if (confirm(editor.getLang('confirmClear'))) {
- editor.execCommand('cleardoc')
- }
- }
- })
- editorui.buttons['cleardoc'] = ui
- editor.addListener('selectionchange', function () {
- ui.setDisabled(editor.queryCommandState('cleardoc') == -1)
- })
- return ui
- }
-
- var typeset = {
- justify: ['left', 'right', 'center', 'justify'],
- imagefloat: ['none', 'left', 'center', 'right'],
- directionality: ['ltr', 'rtl']
- }
- for (var p in typeset) {
- ;(function (cmd, val) {
- for (var i = 0, ci; (ci = val[i++]); ) {
- ;(function (cmd2) {
- editorui[cmd.replace('float', '') + cmd2] = function (editor) {
- var ui = new editorui.Button({
- className: 'edui-for-' + cmd.replace('float', '') + cmd2,
- title:
- editor.options.labelMap[cmd.replace('float', '') + cmd2] ||
- editor.getLang(
- 'labelMap.' + cmd.replace('float', '') + cmd2
- ) ||
- '',
- theme: editor.options.theme,
- onclick: function () {
- editor.execCommand(cmd, cmd2)
- }
- })
- editorui.buttons[cmd] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- ui.setDisabled(editor.queryCommandState(cmd) == -1)
- ui.setChecked(
- editor.queryCommandValue(cmd) == cmd2 && !uiReady
- )
- }
- )
- return ui
- }
- })(ci)
- }
- })(p, typeset[p])
- }
-
- for (var i = 0, ci; (ci = ['backcolor', 'forecolor'][i++]); ) {
- editorui[ci] = (function (cmd) {
- return function (editor) {
- var ui = new editorui.ColorButton({
- className: 'edui-for-' + cmd,
- color: 'default',
- title:
- editor.options.labelMap[cmd] ||
- editor.getLang('labelMap.' + cmd) ||
- '',
- editor: editor,
- onpickcolor: function (t, color) {
- editor.execCommand(cmd, color)
- },
- onpicknocolor: function () {
- editor.execCommand(cmd, 'default')
- this.setColor('transparent')
- this.color = 'default'
- },
- onbuttonclick: function () {
- editor.execCommand(cmd, this.color)
- }
- })
- editorui.buttons[cmd] = ui
- editor.addListener('selectionchange', function () {
- ui.setDisabled(editor.queryCommandState(cmd) == -1)
- })
- return ui
- }
- })(ci)
- }
- var dialogBtns = {
- noOk: ['searchreplace', 'help', 'spechars', 'webapp', 'preview'],
- ok: [
- 'attachment',
- 'anchor',
- 'link',
- 'insertimage',
- 'map',
- 'gmap',
- 'insertframe',
- 'wordimage',
- 'insertvideo',
- 'insertframe',
- 'edittip',
- 'edittable',
- 'edittd',
- 'scrawl',
- 'template',
- 'music',
- 'background',
- 'charts'
- ]
- }
- for (var p in dialogBtns) {
- ;(function (type, vals) {
- for (var i = 0, ci; (ci = vals[i++]); ) {
-
- if (browser.opera && ci === 'searchreplace') {
- continue
- }
- ;(function (cmd) {
- editorui[cmd] = function (editor, iframeUrl, title) {
- iframeUrl =
- iframeUrl ||
- (editor.options.iframeUrlMap || {})[cmd] ||
- iframeUrlMap[cmd]
- title =
- editor.options.labelMap[cmd] ||
- editor.getLang('labelMap.' + cmd) ||
- ''
- var dialog
-
- if (iframeUrl) {
- dialog = new editorui.Dialog(
- utils.extend(
- {
- iframeUrl: editor.ui.mapUrl(iframeUrl),
- editor: editor,
- className: 'edui-for-' + cmd,
- title: title,
- holdScroll: cmd === 'insertimage',
- fullscreen: /charts|preview/.test(cmd),
- closeDialog: editor.getLang('closeDialog')
- },
- type == 'ok'
- ? {
- buttons: [
- {
- className: 'edui-okbutton',
- label: editor.getLang('ok'),
- editor: editor,
- onclick: function () {
- dialog.close(true)
- }
- },
- {
- className: 'edui-cancelbutton',
- label: editor.getLang('cancel'),
- editor: editor,
- onclick: function () {
- dialog.close(false)
- }
- }
- ]
- }
- : {}
- )
- )
- editor.ui._dialogs[cmd + 'Dialog'] = dialog
- }
- var ui = new editorui.Button({
- className: 'edui-for-' + cmd,
- title: title,
- onclick: function () {
- if (dialog) {
- switch (cmd) {
- case 'wordimage':
- var images = editor.execCommand('wordimage')
- if (images && images.length) {
- dialog.render()
- dialog.open()
- }
- break
- case 'scrawl':
- if (editor.queryCommandState('scrawl') != -1) {
- dialog.render()
- dialog.open()
- }
- break
- default:
- dialog.render()
- dialog.open()
- }
- }
- },
- theme: editor.options.theme,
- disabled:
- (cmd == 'scrawl' &&
- editor.queryCommandState('scrawl') == -1) ||
- cmd == 'charts'
- })
- editorui.buttons[cmd] = ui
- editor.addListener('selectionchange', function () {
-
- var unNeedCheckState = { edittable: 1 }
- if (cmd in unNeedCheckState) return
- var state = editor.queryCommandState(cmd)
- if (ui.getDom()) {
- ui.setDisabled(state == -1)
- ui.setChecked(state)
- }
- })
- return ui
- }
- })(ci.toLowerCase())
- }
- })(p, dialogBtns[p])
- }
- editorui.snapscreen = function (editor, iframeUrl, title) {
- title =
- editor.options.labelMap['snapscreen'] ||
- editor.getLang('labelMap.snapscreen') ||
- ''
- var ui = new editorui.Button({
- className: 'edui-for-snapscreen',
- title: title,
- onclick: function () {
- editor.execCommand('snapscreen')
- },
- theme: editor.options.theme
- })
- editorui.buttons['snapscreen'] = ui
- iframeUrl =
- iframeUrl ||
- (editor.options.iframeUrlMap || {})['snapscreen'] ||
- iframeUrlMap['snapscreen']
- if (iframeUrl) {
- var dialog = new editorui.Dialog({
- iframeUrl: editor.ui.mapUrl(iframeUrl),
- editor: editor,
- className: 'edui-for-snapscreen',
- title: title,
- buttons: [
- {
- className: 'edui-okbutton',
- label: editor.getLang('ok'),
- editor: editor,
- onclick: function () {
- dialog.close(true)
- }
- },
- {
- className: 'edui-cancelbutton',
- label: editor.getLang('cancel'),
- editor: editor,
- onclick: function () {
- dialog.close(false)
- }
- }
- ]
- })
- dialog.render()
- editor.ui._dialogs['snapscreenDialog'] = dialog
- }
- editor.addListener('selectionchange', function () {
- ui.setDisabled(editor.queryCommandState('snapscreen') == -1)
- })
- return ui
- }
- editorui.insertcode = function (editor, list, title) {
- list = editor.options['insertcode'] || []
- title =
- editor.options.labelMap['insertcode'] ||
- editor.getLang('labelMap.insertcode') ||
- ''
-
- var items = []
- utils.each(list, function (key, val) {
- items.push({
- label: key,
- value: val,
- theme: editor.options.theme,
- renderLabelHtml: function () {
- return (
- '<div class="edui-label %%-label" >' +
- (this.label || '') +
- '</div>'
- )
- }
- })
- })
- var ui = new editorui.Combox({
- editor: editor,
- items: items,
- onselect: function (t, index) {
- editor.execCommand('insertcode', this.items[index].value)
- },
- onbuttonclick: function () {
- this.showPopup()
- },
- title: title,
- initValue: title,
- className: 'edui-for-insertcode',
- indexByValue: function (value) {
- if (value) {
- for (var i = 0, ci; (ci = this.items[i]); i++) {
- if (ci.value.indexOf(value) != -1) return i
- }
- }
- return -1
- }
- })
- editorui.buttons['insertcode'] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- if (!uiReady) {
- var state = editor.queryCommandState('insertcode')
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue('insertcode')
- if (!value) {
- ui.setValue(title)
- return
- }
-
- value && (value = value.replace(/['"]/g, '').split(',')[0])
- ui.setValue(value)
- }
- }
- }
- )
- return ui
- }
- editorui.fontfamily = function (editor, list, title) {
- list = editor.options['fontfamily'] || []
- title =
- editor.options.labelMap['fontfamily'] ||
- editor.getLang('labelMap.fontfamily') ||
- ''
- if (!list.length) return
- for (var i = 0, ci, items = []; (ci = list[i]); i++) {
- var langLabel = editor.getLang('fontfamily')[ci.name] || ''
- ;(function (key, val) {
- items.push({
- label: key,
- value: val,
- theme: editor.options.theme,
- renderLabelHtml: function () {
- return (
- '<div class="edui-label %%-label" style="font-family:' +
- utils.unhtml(this.value) +
- '">' +
- (this.label || '') +
- '</div>'
- )
- }
- })
- })(ci.label || langLabel, ci.val)
- }
- var ui = new editorui.Combox({
- editor: editor,
- items: items,
- onselect: function (t, index) {
- editor.execCommand('FontFamily', this.items[index].value)
- },
- onbuttonclick: function () {
- this.showPopup()
- },
- title: title,
- initValue: title,
- className: 'edui-for-fontfamily',
- indexByValue: function (value) {
- if (value) {
- for (var i = 0, ci; (ci = this.items[i]); i++) {
- if (ci.value.indexOf(value) != -1) return i
- }
- }
- return -1
- }
- })
- editorui.buttons['fontfamily'] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- if (!uiReady) {
- var state = editor.queryCommandState('FontFamily')
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue('FontFamily')
-
- value && (value = value.replace(/['"]/g, '').split(',')[0])
- ui.setValue(value)
- }
- }
- }
- )
- return ui
- }
- editorui.fontsize = function (editor, list, title) {
- title =
- editor.options.labelMap['fontsize'] ||
- editor.getLang('labelMap.fontsize') ||
- ''
- list = list || editor.options['fontsize'] || []
- if (!list.length) return
- var items = []
- for (var i = 0; i < list.length; i++) {
- var size = list[i] + 'px'
- items.push({
- label: size,
- value: size,
- theme: editor.options.theme,
- renderLabelHtml: function () {
- return (
- '<div class="edui-label %%-label" style="line-height:1;font-size:' +
- this.value +
- '">' +
- (this.label || '') +
- '</div>'
- )
- }
- })
- }
- var ui = new editorui.Combox({
- editor: editor,
- items: items,
- title: title,
- initValue: title,
- onselect: function (t, index) {
- editor.execCommand('FontSize', this.items[index].value)
- },
- onbuttonclick: function () {
- this.showPopup()
- },
- className: 'edui-for-fontsize'
- })
- editorui.buttons['fontsize'] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- if (!uiReady) {
- var state = editor.queryCommandState('FontSize')
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- ui.setValue(editor.queryCommandValue('FontSize'))
- }
- }
- }
- )
- return ui
- }
- editorui.paragraph = function (editor, list, title) {
- title =
- editor.options.labelMap['paragraph'] ||
- editor.getLang('labelMap.paragraph') ||
- ''
- list = editor.options['paragraph'] || []
- if (utils.isEmptyObject(list)) return
- var items = []
- for (var i in list) {
- items.push({
- value: i,
- label: list[i] || editor.getLang('paragraph')[i],
- theme: editor.options.theme,
- renderLabelHtml: function () {
- return (
- '<div class="edui-label %%-label"><span class="edui-for-' +
- this.value +
- '">' +
- (this.label || '') +
- '</span></div>'
- )
- }
- })
- }
- var ui = new editorui.Combox({
- editor: editor,
- items: items,
- title: title,
- initValue: title,
- className: 'edui-for-paragraph',
- onselect: function (t, index) {
- editor.execCommand('Paragraph', this.items[index].value)
- },
- onbuttonclick: function () {
- this.showPopup()
- }
- })
- editorui.buttons['paragraph'] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- if (!uiReady) {
- var state = editor.queryCommandState('Paragraph')
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue('Paragraph')
- var index = ui.indexByValue(value)
- if (index != -1) {
- ui.setValue(value)
- } else {
- ui.setValue(ui.initValue)
- }
- }
- }
- }
- )
- return ui
- }
-
- editorui.customstyle = function (editor) {
- var list = editor.options['customstyle'] || [],
- title =
- editor.options.labelMap['customstyle'] ||
- editor.getLang('labelMap.customstyle') ||
- ''
- if (!list.length) return
- var langCs = editor.getLang('customstyle')
- for (var i = 0, items = [], t; (t = list[i++]); ) {
- ;(function (t) {
- var ck = {}
- ck.label = t.label ? t.label : langCs[t.name]
- ck.style = t.style
- ck.className = t.className
- ck.tag = t.tag
- items.push({
- label: ck.label,
- value: ck,
- theme: editor.options.theme,
- renderLabelHtml: function () {
- return (
- '<div class="edui-label %%-label">' +
- '<' +
- ck.tag +
- ' ' +
- (ck.className ? ' class="' + ck.className + '"' : '') +
- (ck.style ? ' style="' + ck.style + '"' : '') +
- '>' +
- ck.label +
- '</' +
- ck.tag +
- '>' +
- '</div>'
- )
- }
- })
- })(t)
- }
- var ui = new editorui.Combox({
- editor: editor,
- items: items,
- title: title,
- initValue: title,
- className: 'edui-for-customstyle',
- onselect: function (t, index) {
- editor.execCommand('customstyle', this.items[index].value)
- },
- onbuttonclick: function () {
- this.showPopup()
- },
- indexByValue: function (value) {
- for (var i = 0, ti; (ti = this.items[i++]); ) {
- if (ti.label == value) {
- return i - 1
- }
- }
- return -1
- }
- })
- editorui.buttons['customstyle'] = ui
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- if (!uiReady) {
- var state = editor.queryCommandState('customstyle')
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue('customstyle')
- var index = ui.indexByValue(value)
- if (index != -1) {
- ui.setValue(value)
- } else {
- ui.setValue(ui.initValue)
- }
- }
- }
- }
- )
- return ui
- }
- editorui.inserttable = function (editor, iframeUrl, title) {
- title =
- editor.options.labelMap['inserttable'] ||
- editor.getLang('labelMap.inserttable') ||
- ''
- var ui = new editorui.TableButton({
- editor: editor,
- title: title,
- className: 'edui-for-inserttable',
- onpicktable: function (t, numCols, numRows) {
- editor.execCommand('InsertTable', {
- numRows: numRows,
- numCols: numCols,
- border: 1
- })
- },
- onbuttonclick: function () {
- this.showPopup()
- }
- })
- editorui.buttons['inserttable'] = ui
- editor.addListener('selectionchange', function () {
- ui.setDisabled(editor.queryCommandState('inserttable') == -1)
- })
- return ui
- }
- editorui.lineheight = function (editor) {
- var val = editor.options.lineheight || []
- if (!val.length) return
- for (var i = 0, ci, items = []; (ci = val[i++]); ) {
- items.push({
-
- label: ci,
- value: ci,
- theme: editor.options.theme,
- onclick: function () {
- editor.execCommand('lineheight', this.value)
- }
- })
- }
- var ui = new editorui.MenuButton({
- editor: editor,
- className: 'edui-for-lineheight',
- title:
- editor.options.labelMap['lineheight'] ||
- editor.getLang('labelMap.lineheight') ||
- '',
- items: items,
- onbuttonclick: function () {
- var value = editor.queryCommandValue('LineHeight') || this.value
- editor.execCommand('LineHeight', value)
- }
- })
- editorui.buttons['lineheight'] = ui
- editor.addListener('selectionchange', function () {
- var state = editor.queryCommandState('LineHeight')
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue('LineHeight')
- value && ui.setValue((value + '').replace(/cm/, ''))
- ui.setChecked(state)
- }
- })
- return ui
- }
- var rowspacings = ['top', 'bottom']
- for (var r = 0, ri; (ri = rowspacings[r++]); ) {
- ;(function (cmd) {
- editorui['rowspacing' + cmd] = function (editor) {
- var val = editor.options['rowspacing' + cmd] || []
- if (!val.length) return null
- for (var i = 0, ci, items = []; (ci = val[i++]); ) {
- items.push({
- label: ci,
- value: ci,
- theme: editor.options.theme,
- onclick: function () {
- editor.execCommand('rowspacing', this.value, cmd)
- }
- })
- }
- var ui = new editorui.MenuButton({
- editor: editor,
- className: 'edui-for-rowspacing' + cmd,
- title:
- editor.options.labelMap['rowspacing' + cmd] ||
- editor.getLang('labelMap.rowspacing' + cmd) ||
- '',
- items: items,
- onbuttonclick: function () {
- var value =
- editor.queryCommandValue('rowspacing', cmd) || this.value
- editor.execCommand('rowspacing', value, cmd)
- }
- })
- editorui.buttons[cmd] = ui
- editor.addListener('selectionchange', function () {
- var state = editor.queryCommandState('rowspacing', cmd)
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue('rowspacing', cmd)
- value && ui.setValue((value + '').replace(/%/, ''))
- ui.setChecked(state)
- }
- })
- return ui
- }
- })(ri)
- }
-
- var lists = ['insertorderedlist', 'insertunorderedlist']
- for (var l = 0, cl; (cl = lists[l++]); ) {
- ;(function (cmd) {
- editorui[cmd] = function (editor) {
- var vals = editor.options[cmd],
- _onMenuClick = function () {
- editor.execCommand(cmd, this.value)
- },
- items = []
- for (var i in vals) {
- items.push({
- label: vals[i] || editor.getLang()[cmd][i] || '',
- value: i,
- theme: editor.options.theme,
- onclick: _onMenuClick
- })
- }
- var ui = new editorui.MenuButton({
- editor: editor,
- className: 'edui-for-' + cmd,
- title: editor.getLang('labelMap.' + cmd) || '',
- items: items,
- onbuttonclick: function () {
- var value = editor.queryCommandValue(cmd) || this.value
- editor.execCommand(cmd, value)
- }
- })
- editorui.buttons[cmd] = ui
- editor.addListener('selectionchange', function () {
- var state = editor.queryCommandState(cmd)
- if (state == -1) {
- ui.setDisabled(true)
- } else {
- ui.setDisabled(false)
- var value = editor.queryCommandValue(cmd)
- ui.setValue(value)
- ui.setChecked(state)
- }
- })
- return ui
- }
- })(cl)
- }
- editorui.fullscreen = function (editor, title) {
- title =
- editor.options.labelMap['fullscreen'] ||
- editor.getLang('labelMap.fullscreen') ||
- ''
- var ui = new editorui.Button({
- className: 'edui-for-fullscreen',
- title: title,
- theme: editor.options.theme,
- onclick: function () {
- if (editor.ui) {
- editor.ui.setFullScreen(!editor.ui.isFullScreen())
- }
- this.setChecked(editor.ui.isFullScreen())
- }
- })
- editorui.buttons['fullscreen'] = ui
- editor.addListener('selectionchange', function () {
- var state = editor.queryCommandState('fullscreen')
- ui.setDisabled(state == -1)
- ui.setChecked(editor.ui.isFullScreen())
- })
- return ui
- }
-
- editorui['emotion'] = function (editor, iframeUrl) {
- var cmd = 'emotion'
- var ui = new editorui.MultiMenuPop({
- title:
- editor.options.labelMap[cmd] ||
- editor.getLang('labelMap.' + cmd + '') ||
- '',
- editor: editor,
- className: 'edui-for-' + cmd,
- iframeUrl: editor.ui.mapUrl(
- iframeUrl ||
- (editor.options.iframeUrlMap || {})[cmd] ||
- iframeUrlMap[cmd]
- )
- })
- editorui.buttons[cmd] = ui
- editor.addListener('selectionchange', function () {
- ui.setDisabled(editor.queryCommandState(cmd) == -1)
- })
- return ui
- }
- editorui.autotypeset = function (editor) {
- var ui = new editorui.AutoTypeSetButton({
- editor: editor,
- title:
- editor.options.labelMap['autotypeset'] ||
- editor.getLang('labelMap.autotypeset') ||
- '',
- className: 'edui-for-autotypeset',
- onbuttonclick: function () {
- editor.execCommand('autotypeset')
- }
- })
- editorui.buttons['autotypeset'] = ui
- editor.addListener('selectionchange', function () {
- ui.setDisabled(editor.queryCommandState('autotypeset') == -1)
- })
- return ui
- }
-
- editorui['simpleupload'] = function (editor) {
- var name = 'simpleupload',
- ui = new editorui.Button({
- className: 'edui-for-' + name,
- title:
- editor.options.labelMap[name] ||
- editor.getLang('labelMap.' + name) ||
- '',
- onclick: function () {},
- theme: editor.options.theme,
- showText: false
- })
- editorui.buttons[name] = ui
- editor.addListener('ready', function () {
- var b = ui.getDom('body'),
- iconSpan = b.children[0]
- editor.fireEvent('simpleuploadbtnready', iconSpan)
- })
- editor.addListener(
- 'selectionchange',
- function (type, causeByUi, uiReady) {
- var state = editor.queryCommandState(name)
- if (state == -1) {
- ui.setDisabled(true)
- ui.setChecked(false)
- } else {
- if (!uiReady) {
- ui.setDisabled(false)
- ui.setChecked(state)
- }
- }
- }
- )
- return ui
- }
- })()
-
-
-
-
-
- ;(function () {
- var utils = baidu.editor.utils,
- uiUtils = baidu.editor.ui.uiUtils,
- UIBase = baidu.editor.ui.UIBase,
- domUtils = baidu.editor.dom.domUtils
- var nodeStack = []
- function EditorUI(options) {
- this.initOptions(options)
- this.initEditorUI()
- }
- EditorUI.prototype = {
- uiName: 'editor',
- initEditorUI: function () {
- this.editor.ui = this
- this._dialogs = {}
- this.initUIBase()
- this._initToolbars()
- var editor = this.editor,
- me = this
- editor.addListener('ready', function () {
-
- editor.getDialog = function (name) {
- return editor.ui._dialogs[name + 'Dialog']
- }
- domUtils.on(editor.window, 'scroll', function (evt) {
- baidu.editor.ui.Popup.postHide(evt)
- })
-
- editor.ui._actualFrameWidth = editor.options.initialFrameWidth
- UE.browser.ie &&
- UE.browser.version === 6 &&
- editor.container.ownerDocument.execCommand(
- 'BackgroundImageCache',
- false,
- true
- )
-
- if (editor.options.elementPathEnabled) {
- editor.ui.getDom('elementpath').innerHTML =
- '<div class="edui-editor-breadcrumb">' +
- editor.getLang('elementPathTip') +
- ':</div>'
- }
- if (editor.options.wordCount) {
- function countFn() {
- setCount(editor, me)
- domUtils.un(editor.document, 'click', arguments.callee)
- }
- domUtils.on(editor.document, 'click', countFn)
- editor.ui.getDom('wordcount').innerHTML =
- editor.getLang('wordCountTip')
- }
- editor.ui._scale()
- if (editor.options.scaleEnabled) {
- if (editor.autoHeightEnabled) {
- editor.disableAutoHeight()
- }
- me.enableScale()
- } else {
- me.disableScale()
- }
- if (
- !editor.options.elementPathEnabled &&
- !editor.options.wordCount &&
- !editor.options.scaleEnabled
- ) {
- editor.ui.getDom('elementpath').style.display = 'none'
- editor.ui.getDom('wordcount').style.display = 'none'
- editor.ui.getDom('scale').style.display = 'none'
- }
- if (!editor.selection.isFocus()) return
- editor.fireEvent('selectionchange', false, true)
- })
- editor.addListener('mousedown', function (t, evt) {
- var el = evt.target || evt.srcElement
- baidu.editor.ui.Popup.postHide(evt, el)
- baidu.editor.ui.ShortCutMenu.postHide(evt)
- })
- editor.addListener('delcells', function () {
- if (UE.ui['edittip']) {
- new UE.ui['edittip'](editor)
- }
- editor.getDialog('edittip').open()
- })
- var pastePop,
- isPaste = false,
- timer
- editor.addListener('afterpaste', function () {
- if (editor.queryCommandState('pasteplain')) return
- if (baidu.editor.ui.PastePicker) {
- pastePop = new baidu.editor.ui.Popup({
- content: new baidu.editor.ui.PastePicker({ editor: editor }),
- editor: editor,
- className: 'edui-wordpastepop'
- })
- pastePop.render()
- }
- isPaste = true
- })
- editor.addListener('afterinserthtml', function () {
- clearTimeout(timer)
- timer = setTimeout(function () {
- if (pastePop && (isPaste || editor.ui._isTransfer)) {
- if (pastePop.isHidden()) {
- var span = domUtils.createElement(editor.document, 'span', {
- style: 'line-height:0px;',
- innerHTML: '\ufeff'
- }),
- range = editor.selection.getRange()
- range.insertNode(span)
- var tmp = getDomNode(span, 'firstChild', 'previousSibling')
- tmp &&
- pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp)
- domUtils.remove(span)
- } else {
- pastePop.show()
- }
- delete editor.ui._isTransfer
- isPaste = false
- }
- }, 200)
- })
- editor.addListener('contextmenu', function (t, evt) {
- baidu.editor.ui.Popup.postHide(evt)
- })
- editor.addListener('keydown', function (t, evt) {
- if (pastePop) pastePop.dispose(evt)
- var keyCode = evt.keyCode || evt.which
- if (evt.altKey && keyCode == 90) {
- UE.ui.buttons['fullscreen'].onclick()
- }
- })
- editor.addListener('wordcount', function (type) {
- setCount(this, me)
- })
- function setCount(editor, ui) {
- editor.setOpt({
- wordCount: true,
- maximumWords: 10000,
- wordCountMsg:
- editor.options.wordCountMsg || editor.getLang('wordCountMsg'),
- wordOverFlowMsg:
- editor.options.wordOverFlowMsg ||
- editor.getLang('wordOverFlowMsg')
- })
- var opt = editor.options,
- max = opt.maximumWords,
- msg = opt.wordCountMsg,
- errMsg = opt.wordOverFlowMsg,
- countDom = ui.getDom('wordcount')
- if (!opt.wordCount) {
- return
- }
- var count = editor.getContentLength(true)
- if (count > max) {
- countDom.innerHTML = errMsg
- editor.fireEvent('wordcountoverflow')
- } else {
- countDom.innerHTML = msg
- .replace('{#leave}', max - count)
- .replace('{#count}', count)
- }
- }
- editor.addListener('selectionchange', function () {
- if (editor.options.elementPathEnabled) {
- me[
- (editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') +
- 'ableElementPath'
- ]()
- }
- if (editor.options.scaleEnabled) {
- me[
- (editor.queryCommandState('scale') == -1 ? 'dis' : 'en') +
- 'ableScale'
- ]()
- }
- })
- var popup = new baidu.editor.ui.Popup({
- editor: editor,
- content: '',
- className: 'edui-bubble',
- _onEditButtonClick: function () {
- this.hide()
- editor.ui._dialogs.linkDialog.open()
- },
- _onImgEditButtonClick: function (name) {
- this.hide()
- editor.ui._dialogs[name] && editor.ui._dialogs[name].open()
- },
- _onImgSetFloat: function (value) {
- this.hide()
- editor.execCommand('imagefloat', value)
- },
- _setIframeAlign: function (value) {
- var frame = popup.anchorEl
- var newFrame = frame.cloneNode(true)
- switch (value) {
- case -2:
- newFrame.setAttribute('align', '')
- break
- case -1:
- newFrame.setAttribute('align', 'left')
- break
- case 1:
- newFrame.setAttribute('align', 'right')
- break
- }
- frame.parentNode.insertBefore(newFrame, frame)
- domUtils.remove(frame)
- popup.anchorEl = newFrame
- popup.showAnchor(popup.anchorEl)
- },
- _updateIframe: function () {
- var frame = (editor._iframe = popup.anchorEl)
- if (domUtils.hasClass(frame, 'ueditor_baidumap')) {
- editor.selection.getRange().selectNode(frame).select()
- editor.ui._dialogs.mapDialog.open()
- popup.hide()
- } else {
- editor.ui._dialogs.insertframeDialog.open()
- popup.hide()
- }
- },
- _onRemoveButtonClick: function (cmdName) {
- editor.execCommand(cmdName)
- this.hide()
- },
- queryAutoHide: function (el) {
- if (el && el.ownerDocument == editor.document) {
- if (
- el.tagName.toLowerCase() == 'img' ||
- domUtils.findParentByTagName(el, 'a', true)
- ) {
- return el !== popup.anchorEl
- }
- }
- return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el)
- }
- })
- popup.render()
- if (editor.options.imagePopup) {
- editor.addListener('mouseover', function (t, evt) {
- evt = evt || window.event
- var el = evt.target || evt.srcElement
- if (
- editor.ui._dialogs.insertframeDialog &&
- /iframe/gi.test(el.tagName)
- ) {
- var html = popup.formatHtml(
- '<nobr>' +
- editor.getLang('property') +
- ': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">' +
- editor.getLang('default') +
- '</span> <span onclick=$$._setIframeAlign(-1) class="edui-clickable">' +
- editor.getLang('justifyleft') +
- '</span> <span onclick=$$._setIframeAlign(1) class="edui-clickable">' +
- editor.getLang('justifyright') +
- '</span> ' +
- ' <span onclick="$$._updateIframe( this);" class="edui-clickable">' +
- editor.getLang('modify') +
- '</span></nobr>'
- )
- if (html) {
- popup.getDom('content').innerHTML = html
- popup.anchorEl = el
- popup.showAnchor(popup.anchorEl)
- } else {
- popup.hide()
- }
- }
- })
- editor.addListener('selectionchange', function (t, causeByUi) {
- if (!causeByUi) return
- var html = '',
- str = '',
- img = editor.selection.getRange().getClosedNode(),
- dialogs = editor.ui._dialogs
- if (img && img.tagName == 'IMG') {
- var dialogName = 'insertimageDialog'
- if (
- img.className.indexOf('edui-faked-video') != -1 ||
- img.className.indexOf('edui-upload-video') != -1
- ) {
- dialogName = 'insertvideoDialog'
- }
- if (img.className.indexOf('edui-faked-webapp') != -1) {
- dialogName = 'webappDialog'
- }
- if (img.src.indexOf('http://api.map.baidu.com') != -1) {
- dialogName = 'mapDialog'
- }
- if (img.className.indexOf('edui-faked-music') != -1) {
- dialogName = 'musicDialog'
- }
- if (
- img.src.indexOf('http://maps.google.com/maps/api/staticmap') !=
- -1
- ) {
- dialogName = 'gmapDialog'
- }
- if (img.getAttribute('anchorname')) {
- dialogName = 'anchorDialog'
- html = popup.formatHtml(
- '<nobr>' +
- editor.getLang('property') +
- ': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">' +
- editor.getLang('modify') +
- '</span> ' +
- '<span onclick=$$._onRemoveButtonClick(\'anchor\') class="edui-clickable">' +
- editor.getLang('delete') +
- '</span></nobr>'
- )
- }
- if (img.getAttribute('word_img')) {
-
- editor.word_img = [img.getAttribute('word_img')]
- dialogName = 'wordimageDialog'
- }
- if (
- domUtils.hasClass(img, 'loadingclass') ||
- domUtils.hasClass(img, 'loaderrorclass')
- ) {
- dialogName = ''
- }
- if (!dialogs[dialogName]) {
- return
- }
- str =
- '<nobr>' +
- editor.getLang('property') +
- ': ' +
- '<span onclick=$$._onImgSetFloat("none") class="edui-clickable">' +
- editor.getLang('default') +
- '</span> ' +
- '<span onclick=$$._onImgSetFloat("left") class="edui-clickable">' +
- editor.getLang('justifyleft') +
- '</span> ' +
- '<span onclick=$$._onImgSetFloat("right") class="edui-clickable">' +
- editor.getLang('justifyright') +
- '</span> ' +
- '<span onclick=$$._onImgSetFloat("center") class="edui-clickable">' +
- editor.getLang('justifycenter') +
- '</span> ' +
- '<span onclick="$$._onImgEditButtonClick(\'' +
- dialogName +
- '\');" class="edui-clickable">' +
- editor.getLang('modify') +
- '</span></nobr>'
- !html && (html = popup.formatHtml(str))
- }
- if (editor.ui._dialogs.linkDialog) {
- var link = editor.queryCommandValue('link')
- var url
- if (
- link &&
- (url =
- link.getAttribute('_href') || link.getAttribute('href', 2))
- ) {
- var txt = url
- if (url.length > 30) {
- txt = url.substring(0, 20) + '...'
- }
- if (html) {
- html += '<div style="height:5px;"></div>'
- }
- html += popup.formatHtml(
- '<nobr>' +
- editor.getLang('anthorMsg') +
- ': <a target="_blank" href="' +
- url +
- '" title="' +
- url +
- '" >' +
- txt +
- '</a>' +
- ' <span class="edui-clickable" onclick="$$._onEditButtonClick();">' +
- editor.getLang('modify') +
- '</span>' +
- ' <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> ' +
- editor.getLang('clear') +
- '</span></nobr>'
- )
- popup.showAnchor(link)
- }
- }
- if (html) {
- popup.getDom('content').innerHTML = html
- popup.anchorEl = img || link
- popup.showAnchor(popup.anchorEl)
- } else {
- popup.hide()
- }
- })
- }
- },
- _initToolbars: function () {
- var editor = this.editor
- var toolbars = this.toolbars || []
- var toolbarUis = []
- for (var i = 0; i < toolbars.length; i++) {
- var toolbar = toolbars[i]
- var toolbarUi = new baidu.editor.ui.Toolbar({
- theme: editor.options.theme
- })
- for (var j = 0; j < toolbar.length; j++) {
- var toolbarItem = toolbar[j]
- var toolbarItemUi = null
- if (typeof toolbarItem == 'string') {
- toolbarItem = toolbarItem.toLowerCase()
- if (toolbarItem == '|') {
- toolbarItem = 'Separator'
- }
- if (toolbarItem == '||') {
- toolbarItem = 'Breakline'
- }
- if (baidu.editor.ui[toolbarItem]) {
- toolbarItemUi = new baidu.editor.ui[toolbarItem](editor)
- }
-
- if (toolbarItem == 'fullscreen') {
- if (toolbarUis && toolbarUis[0]) {
- toolbarUis[0].items.splice(0, 0, toolbarItemUi)
- } else {
- toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi)
- }
- continue
- }
- } else {
- toolbarItemUi = toolbarItem
- }
- if (toolbarItemUi && toolbarItemUi.id) {
- toolbarUi.add(toolbarItemUi)
- }
- }
- toolbarUis[i] = toolbarUi
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- for (var key in UE._customizeUI) {
- var obj = UE._customizeUI[key]
- var itemUI, index
- if (!obj.id || obj.id == editor.key) {
- itemUI = obj.execFn.call(editor, editor, key)
- if (itemUI) {
- index = obj.index
- if (index === undefined) {
- index = toolbarUi.items.length
- }
- toolbarUi.add(itemUI, index)
- }
- }
- }
- this.toolbars = toolbarUis
- },
- getHtmlTpl: function () {
- return (
- '<div id="##" class="%%">' +
- '<div id="##_toolbarbox" class="%%-toolbarbox">' +
- (this.toolbars.length
- ? '<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">' +
- this.renderToolbarBoxHtml() +
- '</div></div>'
- : '') +
- '<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;">' +
- '<div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">' +
- this.editor.getLang('clickToUpload') +
- '</div>' +
- '<div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div>' +
- '<div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div>' +
- '<div style="height:0;overflow:hidden;clear:both;"></div>' +
- '</div>' +
- '<div id="##_message_holder" class="%%-messageholder"></div>' +
- '</div>' +
- '<div id="##_iframeholder" class="%%-iframeholder">' +
- '</div>' +
-
- '<div id="##_bottombar" class="%%-bottomContainer"><table><tr>' +
- '<td id="##_elementpath" class="%%-bottombar"></td>' +
- '<td id="##_wordcount" class="%%-wordcount"></td>' +
- '<td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td>' +
- '</tr></table></div>' +
- '<div id="##_scalelayer"></div>' +
- '</div>'
- )
- },
- showWordImageDialog: function () {
- this._dialogs['wordimageDialog'].open()
- },
- renderToolbarBoxHtml: function () {
- var buff = []
- for (var i = 0; i < this.toolbars.length; i++) {
- buff.push(this.toolbars[i].renderHtml())
- }
- return buff.join('')
- },
- setFullScreen: function (fullscreen) {
- var editor = this.editor,
- container = editor.container.parentNode.parentNode
- if (this._fullscreen != fullscreen) {
- this._fullscreen = fullscreen
- this.editor.fireEvent('beforefullscreenchange', fullscreen)
- if (baidu.editor.browser.gecko) {
- var bk = editor.selection.getRange().createBookmark()
- }
- if (fullscreen) {
- while (container.tagName != 'BODY') {
- var position = baidu.editor.dom.domUtils.getComputedStyle(
- container,
- 'position'
- )
- nodeStack.push(position)
- container.style.position = 'static'
- container = container.parentNode
- }
- this._bakHtmlOverflow = document.documentElement.style.overflow
- this._bakBodyOverflow = document.body.style.overflow
- this._bakAutoHeight = this.editor.autoHeightEnabled
- this._bakScrollTop = Math.max(
- document.documentElement.scrollTop,
- document.body.scrollTop
- )
- this._bakEditorContaninerWidth =
- editor.iframe.parentNode.offsetWidth
- if (this._bakAutoHeight) {
-
- editor.autoHeightEnabled = false
- this.editor.disableAutoHeight()
- }
- document.documentElement.style.overflow = 'hidden'
-
- window.scrollTo(0, window.scrollY)
- this._bakCssText = this.getDom().style.cssText
- this._bakCssText1 = this.getDom('iframeholder').style.cssText
- editor.iframe.parentNode.style.width = ''
- this._updateFullScreen()
- } else {
- while (container.tagName != 'BODY') {
- container.style.position = nodeStack.shift()
- container = container.parentNode
- }
- this.getDom().style.cssText = this._bakCssText
- this.getDom('iframeholder').style.cssText = this._bakCssText1
- if (this._bakAutoHeight) {
- editor.autoHeightEnabled = true
- this.editor.enableAutoHeight()
- }
- document.documentElement.style.overflow = this._bakHtmlOverflow
- document.body.style.overflow = this._bakBodyOverflow
- editor.iframe.parentNode.style.width =
- this._bakEditorContaninerWidth + 'px'
- window.scrollTo(0, this._bakScrollTop)
- }
- if (browser.gecko && editor.body.contentEditable === 'true') {
- var input = document.createElement('input')
- document.body.appendChild(input)
- editor.body.contentEditable = false
- setTimeout(function () {
- input.focus()
- setTimeout(function () {
- editor.body.contentEditable = true
- editor.fireEvent('fullscreenchanged', fullscreen)
- editor.selection.getRange().moveToBookmark(bk).select(true)
- baidu.editor.dom.domUtils.remove(input)
- fullscreen && window.scroll(0, 0)
- }, 0)
- }, 0)
- }
- if (editor.body.contentEditable === 'true') {
- this.editor.fireEvent('fullscreenchanged', fullscreen)
- this.triggerLayout()
- }
- }
- },
- _updateFullScreen: function () {
- if (this._fullscreen) {
- var vpRect = uiUtils.getViewportRect()
- this.getDom().style.cssText =
- 'border:0;position:absolute;left:0;top:' +
- (this.editor.options.topOffset || 0) +
- 'px;width:' +
- vpRect.width +
- 'px;height:' +
- vpRect.height +
- 'px;z-index:' +
- (this.getDom().style.zIndex * 1 + 100)
- uiUtils.setViewportOffset(this.getDom(), {
- left: 0,
- top: this.editor.options.topOffset || 0
- })
- this.editor.setHeight(
- vpRect.height -
- this.getDom('toolbarbox').offsetHeight -
- this.getDom('bottombar').offsetHeight -
- (this.editor.options.topOffset || 0),
- true
- )
-
- if (browser.gecko) {
- try {
- window.onresize()
- } catch (e) {}
- }
- }
- },
- _updateElementPath: function () {
- var bottom = this.getDom('elementpath'),
- list
- if (
- this.elementPathEnabled &&
- (list = this.editor.queryCommandValue('elementpath'))
- ) {
- var buff = []
- for (var i = 0, ci; (ci = list[i]); i++) {
- buff[i] = this.formatHtml(
- '<span unselectable="on" onclick="$$.editor.execCommand("elementpath", "' +
- i +
- '");">' +
- ci +
- '</span>'
- )
- }
- bottom.innerHTML =
- '<div class="edui-editor-breadcrumb" onmousedown="return false;">' +
- this.editor.getLang('elementPathTip') +
- ': ' +
- buff.join(' > ') +
- '</div>'
- } else {
- bottom.style.display = 'none'
- }
- },
- disableElementPath: function () {
- var bottom = this.getDom('elementpath')
- bottom.innerHTML = ''
- bottom.style.display = 'none'
- this.elementPathEnabled = false
- },
- enableElementPath: function () {
- var bottom = this.getDom('elementpath')
- bottom.style.display = ''
- this.elementPathEnabled = true
- this._updateElementPath()
- },
- _scale: function () {
- var doc = document,
- editor = this.editor,
- editorHolder = editor.container,
- editorDocument = editor.document,
- toolbarBox = this.getDom('toolbarbox'),
- bottombar = this.getDom('bottombar'),
- scale = this.getDom('scale'),
- scalelayer = this.getDom('scalelayer')
- var isMouseMove = false,
- position = null,
- minEditorHeight = 0,
- minEditorWidth = editor.options.minFrameWidth,
- pageX = 0,
- pageY = 0,
- scaleWidth = 0,
- scaleHeight = 0
- function down() {
- position = domUtils.getXY(editorHolder)
- if (!minEditorHeight) {
- minEditorHeight =
- editor.options.minFrameHeight +
- toolbarBox.offsetHeight +
- bottombar.offsetHeight
- }
- scalelayer.style.cssText =
- 'position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:' +
- editorHolder.offsetWidth +
- 'px;height:' +
- editorHolder.offsetHeight +
- 'px;z-index:' +
- (editor.options.zIndex + 1)
- domUtils.on(doc, 'mousemove', move)
- domUtils.on(editorDocument, 'mouseup', up)
- domUtils.on(doc, 'mouseup', up)
- }
- var me = this
-
- this.editor.addListener('fullscreenchanged', function (e, fullScreen) {
- if (fullScreen) {
- me.disableScale()
- } else {
- if (me.editor.options.scaleEnabled) {
- me.enableScale()
- var tmpNode = me.editor.document.createElement('span')
- me.editor.body.appendChild(tmpNode)
- me.editor.body.style.height =
- Math.max(
- domUtils.getXY(tmpNode).y,
- me.editor.iframe.offsetHeight - 20
- ) + 'px'
- domUtils.remove(tmpNode)
- }
- }
- })
- function move(event) {
- clearSelection()
- var e = event || window.event
- pageX = e.pageX || doc.documentElement.scrollLeft + e.clientX
- pageY = e.pageY || doc.documentElement.scrollTop + e.clientY
- scaleWidth = pageX - position.x
- scaleHeight = pageY - position.y
- if (scaleWidth >= minEditorWidth) {
- isMouseMove = true
- scalelayer.style.width = scaleWidth + 'px'
- }
- if (scaleHeight >= minEditorHeight) {
- isMouseMove = true
- scalelayer.style.height = scaleHeight + 'px'
- }
- }
- function up() {
- if (isMouseMove) {
- isMouseMove = false
- editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2
- editorHolder.style.width = editor.ui._actualFrameWidth + 'px'
- editor.setHeight(
- scalelayer.offsetHeight -
- bottombar.offsetHeight -
- toolbarBox.offsetHeight -
- 2,
- true
- )
- }
- if (scalelayer) {
- scalelayer.style.display = 'none'
- }
- clearSelection()
- domUtils.un(doc, 'mousemove', move)
- domUtils.un(editorDocument, 'mouseup', up)
- domUtils.un(doc, 'mouseup', up)
- }
- function clearSelection() {
- if (browser.ie) doc.selection.clear()
- else window.getSelection().removeAllRanges()
- }
- this.enableScale = function () {
-
- if (editor.queryCommandState('source') == 1) return
- scale.style.display = ''
- this.scaleEnabled = true
- domUtils.on(scale, 'mousedown', down)
- }
- this.disableScale = function () {
- scale.style.display = 'none'
- this.scaleEnabled = false
- domUtils.un(scale, 'mousedown', down)
- }
- },
- isFullScreen: function () {
- return this._fullscreen
- },
- postRender: function () {
- UIBase.prototype.postRender.call(this)
- for (var i = 0; i < this.toolbars.length; i++) {
- this.toolbars[i].postRender()
- }
- var me = this
- var timerId,
- domUtils = baidu.editor.dom.domUtils,
- updateFullScreenTime = function () {
- clearTimeout(timerId)
- timerId = setTimeout(function () {
- me._updateFullScreen()
- })
- }
- domUtils.on(window, 'resize', updateFullScreenTime)
- me.addListener('destroy', function () {
- domUtils.un(window, 'resize', updateFullScreenTime)
- clearTimeout(timerId)
- })
- },
- showToolbarMsg: function (msg, flag) {
- this.getDom('toolbarmsg_label').innerHTML = msg
- this.getDom('toolbarmsg').style.display = ''
-
- if (!flag) {
- var w = this.getDom('upload_dialog')
- w.style.display = 'none'
- }
- },
- hideToolbarMsg: function () {
- this.getDom('toolbarmsg').style.display = 'none'
- },
- mapUrl: function (url) {
- return url
- ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '')
- : ''
- },
- triggerLayout: function () {
- var dom = this.getDom()
- if (dom.style.zoom == '1') {
- dom.style.zoom = '100%'
- } else {
- dom.style.zoom = '1'
- }
- }
- }
- utils.inherits(EditorUI, baidu.editor.ui.UIBase)
- var instances = {}
- UE.ui.Editor = function (options) {
- var editor = new UE.Editor(options)
- editor.options.editor = editor
- utils.loadFile(document, {
- href:
- editor.options.themePath + editor.options.theme + '/css/ueditor.css',
- tag: 'link',
- type: 'text/css',
- rel: 'stylesheet'
- })
- var oldRender = editor.render
- editor.render = function (holder) {
- if (holder.constructor === String) {
- editor.key = holder
- instances[holder] = editor
- }
- utils.domReady(function () {
- editor.langIsReady
- ? renderUI()
- : editor.addListener('langReady', renderUI)
- function renderUI() {
- editor.setOpt({
- labelMap: editor.options.labelMap || editor.getLang('labelMap')
- })
- new EditorUI(editor.options)
- if (holder) {
- if (holder.constructor === String) {
- holder = document.getElementById(holder)
- }
- holder &&
- holder.getAttribute('name') &&
- (editor.options.textarea = holder.getAttribute('name'))
- if (holder && /script|textarea/gi.test(holder.tagName)) {
- var newDiv = document.createElement('div')
- holder.parentNode.insertBefore(newDiv, holder)
- var cont = holder.value || holder.innerHTML
- editor.options.initialContent = /^[\t\r\n ]*$/.test(cont)
- ? editor.options.initialContent
- : cont
- .replace(/>[\n\r\t]+([ ]{4})+/g, '>')
- .replace(/[\n\r\t]+([ ]{4})+</g, '<')
- .replace(/>[\n\r\t]+</g, '><')
- holder.className && (newDiv.className = holder.className)
- holder.style.cssText &&
- (newDiv.style.cssText = holder.style.cssText)
- if (/textarea/i.test(holder.tagName)) {
- editor.textarea = holder
- editor.textarea.style.display = 'none'
- } else {
- holder.parentNode.removeChild(holder)
- }
- if (holder.id) {
- newDiv.id = holder.id
- domUtils.removeAttributes(holder, 'id')
- }
- holder = newDiv
- holder.innerHTML = ''
- }
- }
- domUtils.addClass(holder, 'edui-' + editor.options.theme)
- editor.ui.render(holder)
- var opt = editor.options
-
- editor.container = editor.ui.getDom()
- var parents = domUtils.findParents(holder, true)
- var displays = []
- for (var i = 0, ci; (ci = parents[i]); i++) {
- displays[i] = ci.style.display
- ci.style.display = 'block'
- }
- if (opt.initialFrameWidth) {
- opt.minFrameWidth = opt.initialFrameWidth
- } else {
- opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth
- var styleWidth = holder.style.width
- if (/%$/.test(styleWidth)) {
- opt.initialFrameWidth = styleWidth
- }
- }
- if (opt.initialFrameHeight) {
- opt.minFrameHeight = opt.initialFrameHeight
- } else {
- opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight
- }
- for (var i = 0, ci; (ci = parents[i]); i++) {
- ci.style.display = displays[i]
- }
-
-
- if (holder.style.height) {
- holder.style.height = ''
- }
- editor.container.style.width =
- opt.initialFrameWidth +
- (/%$/.test(opt.initialFrameWidth) ? '' : 'px')
- editor.container.style.zIndex = opt.zIndex
- oldRender.call(editor, editor.ui.getDom('iframeholder'))
- editor.fireEvent('afteruiready')
- }
- })
- }
- return editor
- }
-
-
- UE.getEditor = function (id, opt) {
- var editor = instances[id]
- if (!editor) {
- editor = instances[id] = new UE.ui.Editor(opt)
- editor.render(id)
- }
- return editor
- }
- UE.delEditor = function (id) {
- var editor
- if ((editor = instances[id])) {
- editor.key && editor.destroy()
- delete instances[id]
- }
- }
- UE.registerUI = function (uiName, fn, index, editorId) {
- utils.each(uiName.split(/\s+/), function (name) {
- UE._customizeUI[name] = {
- id: editorId,
- execFn: fn,
- index: index
- }
- })
- }
- })()
-
- UE.registerUI('message', function (editor) {
- var editorui = baidu.editor.ui
- var Message = editorui.Message
- var holder
- var _messageItems = []
- var me = editor
- me.addListener('ready', function () {
- holder = document.getElementById(me.ui.id + '_message_holder')
- updateHolderPos()
-
-
-
-
- })
- me.addListener('showmessage', function (type, opt) {
- opt = utils.isString(opt)
- ? {
- content: opt
- }
- : opt
- var message = new Message({
- timeout: opt.timeout,
- type: opt.type,
- content: opt.content,
- keepshow: opt.keepshow,
- editor: me
- }),
- mid = opt.id || 'msg_' + (+new Date()).toString(36)
- message.render(holder)
- _messageItems[mid] = message
- message.reset(opt)
- updateHolderPos()
- return mid
- })
- me.addListener('updatemessage', function (type, id, opt) {
- opt = utils.isString(opt)
- ? {
- content: opt
- }
- : opt
- var message = _messageItems[id]
- message.render(holder)
- message && message.reset(opt)
- })
- me.addListener('hidemessage', function (type, id) {
- var message = _messageItems[id]
- message && message.hide()
- })
- function updateHolderPos() {
- var toolbarbox = me.ui.getDom('toolbarbox')
- if (toolbarbox) {
- holder.style.top = toolbarbox.offsetHeight + 3 + 'px'
- }
- holder.style.zIndex =
- Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1
- }
- })
-
- UE.registerUI('autosave', function (editor) {
- var timer = null,
- uid = null
- editor.on('afterautosave', function () {
- clearTimeout(timer)
- timer = setTimeout(function () {
- if (uid) {
- editor.trigger('hidemessage', uid)
- }
- uid = editor.trigger('showmessage', {
- content: editor.getLang('autosave.success'),
- timeout: 2000
- })
- }, 2000)
- })
- })
- })()
|