package Ġnet . shar pl ab . ep ub translator . core . service Ċ Ċ import Ġnet . shar pl ab . ep ub translator . core . driver . translator . Translator Ċ import Ġnet . shar pl ab . ep ub translator . core . model . E Pub Chapter Ċ import Ġnet . shar pl ab . ep ub translator . core . model . E Pub Content File Ċ import Ġnet . shar pl ab . ep ub translator . core . model . E Pub File Ċ import Ġnet . shar pl ab . ep ub translator . core . util . Xml Utils . parse Xml StringTo Document Ċ import Ġnet . shar pl ab . ep ub translator . core . util . Xml Utils . parse Xml StringTo Document Fragment Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . w 3 c . dom . Document Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . w 3 c . dom . ls . DOM Implementation LS Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Consumer Ċ import Ġjava . util . function . Predicate Ċ import Ġjavax . enterprise . context . Dependent Ċ Ċ @ Dependent Ċ class ĠE Pub Translator ServiceImpl ( private Ġval Ġtranslator : ĠTrans lator ) Ġ: ĠE Pub Translator Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( E Pub Translator ServiceImpl :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġtranslate ( e Pub File : ĠE Pub File , Ġsrc Lang : ĠString , Ġdst Lang : ĠString ): ĠE Pub File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Files Ġ= Ġe Pub File . content Files ĊĠĠĠĠĠĠĠ Ġval Ġtranslated Content Files Ġ= Ġcontent Files . map Ġ{ Ġcontent File : ĠE Pub Content File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content File Ġis ĠE Pub Chapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontents Ġ= Ġcontent File . data AsString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslated Contents Ġ= Ġtranslate Xml String ( contents , Ġsrc Lang , Ġdst Lang ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Pub Chapter Ġ= ĠE Pub Chapter ( content File . name , Ġtranslated Contents . toByteArray ( StandardCharsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("{} Ġis Ġtranslated .", Ġe Pub Chapter . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġe Pub Chapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġcontent File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠE Pub File ( translated Content Files ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate Xml String ( xml String : ĠString , Ġsrc Lang : ĠString , Ġdst Lang : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġparse Xml StringTo Document ( xml String ) ĊĠĠĠĠĠĠĠ Ġval Ġtranslated Document Ġ= Ġtranslate Document ( document , Ġsrc Lang , Ġdst Lang ) ĊĠĠĠĠĠĠĠ Ġval Ġdom Implementation Ġ= Ġtranslated Document . implementation Ġas ĠDOM Implementation LS ĊĠĠĠĠĠĠĠ Ġval Ġls Serializer Ġ= Ġdom Implementation . create LS Serializer () ĊĠĠĠĠĠĠĠ Ġls Serializer . dom Config . setParameter (" xml - declaration ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġls Serializer . dom Config . setParameter (" element - content - whitespace ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġls Serializer . dom Config . setParameter (" canonical - form ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġls Serializer . write ToString ( translated Document ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Document ( document : ĠDocument , Ġsrc Lang : ĠString , Ġdst Lang : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġpre Process Node ( document ) ĊĠĠĠĠĠĠĠ Ġval Ġtranslate Requests Ġ= Ġgenerate Translate Requests ( document ) ĊĠĠĠĠĠĠĠ Ġval Ġtranslate Request Chunks Ġ= Ġform Translate Request Chunks ( translate Requests ) ĊĠĠĠĠĠĠĠ Ġreplace With Translated Text ( translate Request Chunks , Ġsrc Lang , Ġdst Lang ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdocument ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥªãĤ¹ãĥĪ ãĤĴä½ľæĪĲ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdocument Ġ ç¿» è¨ ³ åħĥ ãģ® XML æĸĩ æĽ¸ ĊĠĠĠĠ Ġ* Ġ@ return Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥªãĤ¹ãĥĪ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Translate Requests ( document : ĠDocument ): ĠList < Translate Request > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtranslate Requests : ĠMutable List < Translate Request > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġw ip Ġ= ĠTranslate Request ( document , ĠArrayList ()) ĊĠĠĠĠĠĠĠ Ġtranslate Requests . add ( w ip ) ĊĠĠĠĠĠĠĠ Ġwalk To Generate Translate Requests ( document , ĠHashSet (), Ġtranslate Requests ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtranslate Requests . filter Ġ{ Ġit . source Xml String . trim (' Ġ'). isNotEmpty () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠXML æĸĩ æĽ¸ ãĤĴ èµ° æŁ » ãģĹãģ¦ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥªãĤ¹ãĥĪ ãĤĴä½ľæĪĲ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ èµ° æŁ » å¯¾è±¡ ãģ® ãĥİ ãĥ¼ãĥī ĊĠĠĠĠ Ġ* Ġ@ param Ġprocessed Set ĠĠĠĠĠ Ġ åĩ¦çĲĨ æ¸ Ī ãĥİ ãĥ¼ãĥī ãģ® ãĤ»ãĥĥãĥĪ ĊĠĠĠĠ Ġ* Ġ@ param Ġtranslate Requests Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥªãĤ¹ãĥĪ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwalk To Generate Translate Requests ( node : ĠNode , Ġprocessed Set : ĠMutable Set < Node >, Ġtranslate Requests : ĠMutable List < Translate Request >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġnode . owner Document ĊĠĠĠĠĠĠĠ Ġ// åĩ¦çĲĨ æ¸ Ī ãģ® Node ãģ¯ ãĤ¹ ãĤŃ ãĥĥãĥĹ ĊĠĠĠĠĠĠĠ Ġif Ġ( processed Set . contains ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Excluded Node ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġw ip Ġ= Ġtranslate Requests . last () ĊĠĠĠĠĠĠĠ Ġ// ç¿» è¨ ³ å¯¾è±¡ ãĥİ ãĥ¼ãĥī ãģ® åł´åĲĪ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Translation Target Node ( node )) Ġ{ Ġ// ãĥĨ ãĤŃ ãĤ¹ãĥĪ ä¸Ń ãģª ãģ®ãģ§ ãĢģ ãĥªãĤ¹ãĥĪ ãģ« è¿½åĬł ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw ip . target . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĲĮ ä¸Ģ éļ İ å± ¤ ãģ® æ¬¡ ä»¥ éĻį ãģ® ãĥİ ãĥ¼ãĥī ãģ® æİ¢ ç´¢ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Node Ġ= Ġnode . next Sibling ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( next Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¿» è¨ ³ å¯¾è±¡ Node ãģª ãĤī ãĥªãĤ¹ãĥĪ ãģ« è¿½åĬł ãĢģ åĩ¦çĲĨ æ¸ Ī ãĤ»ãĥĥãĥĪ ãģ« è¿½åĬł ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Translation Target Node ( next Node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ip . target . add ( next Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Set . add ( next Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( w ip . target . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ip Ġ= ĠTranslate Request ( document , ĠArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Requests . add ( w ip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Node Ġ= Ġnext Node . next Sibling ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¦ ª ãĥİ ãĥ¼ãĥī ãģĮ ãĢģ ç¿» è¨ ³ å¯¾è±¡ ãĥİ ãĥ¼ãĥī ä»¥ å¤ĸ ãģ® åł´åĲĪ ãĢģ ãĥĨ ãĤŃ ãĤ¹ãĥĪ ãģ® æľ« å°¾ ãģª ãģ®ãģ§ æ¬¡ãģ® Translate Request ãĤĴ æºĸ åĤ Ļ ãĢģ ä½Ĩ ãģĹ WIP ãģĮ 0 ä»¶ ãģ§ ãģªãģĦ åł´åĲĪ ãģ« éĻĲ ãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Translation Target Node ( node . parentNode ) Ġ&& Ġw ip . target . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ip Ġ= ĠTranslate Request ( document , ĠArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Requests . add ( w ip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// åŃĲ ãĥİ ãĥ¼ãĥī ãĤĴ èµ° æŁ » ãģĹ ãĢģ åĨį å¸ ° åĩ¦çĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Nodes Ġ= Ġnode . childNodes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Nodes . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchild Nodes . item ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwalk To Generate Translate Requests ( child , Ġprocessed Set , Ġtranslate Requests ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¿» è¨ ³ éĻ¤ å¤ĸ ãĥİ ãĥ¼ãĥī ãģĭ åĪ¤ å®ļ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġ åĪ¤ å®ļ å¯¾è±¡ ãĥİ ãĥ¼ãĥī ĊĠĠĠĠ Ġ* Ġ@ return Ġ ç¿» è¨ ³ éĻ¤ å¤ĸ ãĥİ ãĥ¼ãĥī ãģ® åł´åĲĪ ãĢģ true ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Excluded Node ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠEX CL UDE D _ ELEMENT _ NAMES . contains ( node . nodeName ) Ġ|| Ġis Translation Target Node ( node ) Ġ&& Ġlookup Node ( node , ĠPredicate Ġ{ Ġis Excluded Node ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥªãĤ¹ãĥĪ ãĤĴ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥģ ãĥ£ ãĥ³ ãĤ¯ ãģ« æ§ĭæĪĲ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtranslate Requests Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥªãĤ¹ãĥĪ ĊĠĠĠĠ Ġ* Ġ@ return Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥģ ãĥ£ ãĥ³ ãĤ¯ ãģ® ãĥªãĤ¹ãĥĪ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġform Translate Request Chunks ( translate Requests : ĠList < Translate Request >): ĠList < Translate Request Chunk > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext Length Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtranslate Request Chunks : ĠMutable List < Translate Request Chunk > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġvar Ġworking Translate Request List : ĠMutable List < Translate Request > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( translate Request Ġin Ġtranslate Requests ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Xml String Ġ= Ġtranslate Request . source Xml String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Length Counter Ġ+ Ġsource Xml String . length Ġ> ĠMAX _ REQUEST ABLE _ TEXT _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Request Chunks . add ( Translate Request Chunk ( working Translate Request List )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Translate Request List Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Length Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworking Translate Request List . add ( translate Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Length Counter Ġ+= Ġsource Xml String . length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtranslate Request Chunks . add ( Translate Request Chunk ( working Translate Request List )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtranslate Request Chunks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠXML æĸĩ æĽ¸ ä¸Ń ãģ® ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģ® ãĥģ ãĥ£ ãĥ³ ãĤ¯ ãģ§ æĮĩå®ļ ãģķãĤĮãģŁ ç® ĩ æīĢ ãĤĴ ç¿» è¨ ³ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtranslate Request Chunks Ġ ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãĥģ ãĥ£ ãĥ³ ãĤ¯ ãģ® ãĥªãĤ¹ãĥĪ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreplace With Translated Text ( translate Request Chunks : ĠList < Translate Request Chunk >, Ġsrc Lang : ĠString , Ġdst Lang : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtranslate Request Chunks . forEach ( Consumer Ġ{ Ġtranslate Request Chunk : ĠTranslate Request Chunk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslate Requests Ġ= Ġtranslate Request Chunk . translate Requests ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslate Response Ġ= Ġtranslator . translate ( translate Requests . map ( Translate Request :: source Xml String ), Ġsrc Lang , Ġdst Lang ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtranslate Requests . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslate Request Ġ= Ġtranslate Requests [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġtranslate Request . document ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Node Ġ= Ġtranslate Request . target [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Fragment Ġ= Ġparse Xml StringTo Document Fragment ( document , Ġtranslate Response [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslated Text Container Div Ġ= Ġdocument . createElement (" div ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslated Text Container Div . appendChild ( document Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Node . parentNode . insertBefore ( translated Text Container Div , Ġfirst Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Text Container Div Ġ= Ġdocument . createElement (" div ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslated Text Container Div . parentNode . insertBefore ( original Text Container Div , Ġtranslated Text Container Div ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Nodes Ġ= Ġtranslate Request . target ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( target Node Ġin Ġtarget Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Text Container Div . appendChild ( target Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpre Process Node ( node : ĠNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġnode . childNodes ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchildren . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchildren . item ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty Element ( child )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . appendChild ( node . owner Document . create Comment (" place Ġholder ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Process Node ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¿» è¨ ³ å¯¾è±¡ ãĥİ ãĥ¼ãĥī ãģĭ åĪ¤ å®ļ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġ åĪ¤ å®ļ å¯¾è±¡ ãĥİ ãĥ¼ãĥī ĊĠĠĠĠ Ġ* Ġ@ return Ġ ç¿» è¨ ³ å¯¾è±¡ ãĥİ ãĥ¼ãĥī ãģ® åł´åĲĪ ãĢģ true ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Translation Target Node ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . nodeType Ġ== ĠNode . TEXT _ NODE Ġ|| Ġnode . nodeType Ġ== ĠNode . ELEMENT _ NODE Ġ&& ĠINLINE _ ELEMENT _ NAMES . contains ( node . nodeName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisEmpty Element ( node : ĠNode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . nodeType Ġ== ĠNode . ELEMENT _ NODE Ġ&& Ġ! node . has Child Nodes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlookup Node ( node : ĠNode , Ġcondition : ĠPredicate < Node >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Nodes Ġ= Ġnode . childNodes ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Nodes . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchild Nodes . item ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( condition . test ( child )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lookup Node ( child , Ġcondition )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġä¸Ģ ãģ¤ ãģ® ç¿» è¨ ³ ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãĥģ ãĥ£ ãĥ³ ãĤ¯ ãģ« åĲ« ãĤģ ãĤĭ ãģĵãģ¨ ãģĮ åı¯èĥ½ ãģª æľĢå¤§ æĸĩåŃĹ æķ° ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Spell Checking Inspection ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ REQUEST ABLE _ TEXT _ LENGTH Ġ= Ġ 5 0 0 0 ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ãĤ¤ãĥ³ ãĥ© ãĤ¤ãĥ³ è¦ģ ç´ł ãģ® ãĤ¿ ãĤ° ãĥªãĤ¹ãĥĪ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠINLINE _ ELEMENT _ NAMES Ġ= ĠlistOf (" a ", Ġ" abbr ", Ġ" b ", Ġ" b di ", Ġ" b do ", Ġ" br ", Ġ" cite ", Ġ" code ", Ġ" data ", Ġ" dfn ", Ġ" em ", Ġ" i ", Ġ" kbd ", Ġ" mark ", Ġ" q ", Ġ" rp ", Ġ" rt ", Ġ" rtc ", Ġ" ruby ", Ġ" s ", Ġ" samp ", Ġ" small ", Ġ" span ", Ġ" strong ", Ġ" sub ", Ġ" sup ", Ġ" time ", Ġ" u ", Ġ" var ", Ġ" w br ") ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ç¿» è¨ ³ éĻ¤ å¤ĸ è¦ģ ç´ł ãģ® ãĥªãĤ¹ãĥĪ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠEX CL UDE D _ ELEMENT _ NAMES Ġ= ĠlistOf (" head ", Ġ" pre ", Ġ" tt ") ĊĠĠĠ Ġ} Ċ Ċ }