ใƒ‘ใ‚ฟใƒผใƒณใฎใŸใจใˆ

-ใ“ใ‚“ใซใกใฏ*้ก”*ๅ‹ไบบใซๆ‰‹ใ‚’ๆŒฏใฃใฆ็ฌ‘้ก”ใงใ€‚
-ใƒฏใ‚ฆ๏ผ *ๅคงใใ้–‹ใ„ใŸ็›ฎใงๆ˜Žใ‚‹ใ„่ผใใง*ใ‚ขใ‚ทใƒฃใŠใฐใ•ใ‚“ใŒๅˆฐ็€ใ—ใพใ—ใŸ๏ผ
-ใฏใ„ใ€็งใฏใ‚ใชใŸใฎใŸใ‚ใซๆ–ฐใ—ใ„ใŠใจใŽ่ฉฑใ‚’ๆŒใฃใฆใ„ใพใ™*ๅบงใฃใฆใ€่…•ใง่ตคใกใ‚ƒใ‚“ใ‚’้€ฃใ‚Œใฆ่กŒใใพใ—ใŸ*่žใใŸใ„ใงใ™ใ‹๏ผŸ
-ใ‚‚ใกใ‚ใ‚“๏ผ *ๅฐ‘ใ—ๆฅใšใ‹ใ—ใใฆ็›ฎใ‚’ใใ‚‰ใ—ใŸ*ๅ”็ˆถใฏ็งใซใใฎใ‚ˆใ†ใชๆใ‚ใ—ใ„่ฉฑใ‚’่จ€ใฃใŸ...
-ใพใ‚ใ€็งใฎ่ฉฑใŒใ‚ใชใŸใ‚’ๆ€–ใŒใ‚‰ใชใ„ใ“ใจใ‚’้ก˜ใฃใฆใ„ใพใ™*ๅฝผใฎ้ซชใ‚’่ปฝใใŸใŸใใพใ—ใŸ*ๅฝผๅฅณใฏใ‚ใชใŸใซใƒ‘ใ‚ฟใƒผใƒณๅŒ–ใ•ใ‚ŒใŸๆ–นๆณ•ใง่€ƒใˆใ‚‹ๆ–นๆณ•ใ‚’ๆ•™ใˆใ‚‹ในใใงใ™ใ€‚
-ใˆ๏ผŸ *่ชค่งฃใ‹ใ‚‰ใญใ˜ใ‚ŒใŸ้ก”*ใฉใ†๏ผŸ
-M ...ไปŠใ€ใ‚ใชใŸใฏ็Ÿฅใฃใฆใ„ใพใ™*ใ‚ฆใ‚ฃใƒณใ‚ฏใ—ใฆใใ‚Œใ‚’ๆ‹พใ„ใพใ—ใŸ*ใ“ใ“ใงๅค‰ๆ•ฐใ‚’ๆ–‡ๅญ—ๅˆ—ใซๆŒฟๅ…ฅใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใจใ-ใ‚ใชใŸใฏไฝ•ใ‚’ใ—ใพใ™ใ‹๏ผŸ
-ใ•ใฆ... *่ฟ‘ใใซๆจชใŸใ‚ใฃใฆใ„ใ‚‹็ด™ใซ้‰›็ญ†ใจใƒใƒซใ‚ซใƒŒใƒซใ‚’ๅ–ใ‚Šใพใ—ใŸ*ใ“ใฎใ‚ˆใ†ใชใ‚‚ใฎ๏ผš
var query= 'xxx'
var resultCount= 512
var message= ' <kbd>' + query + '</kbd> : ' + resultCount

 โ€”   ? *  *
 โ€”   โ€ฆ *   ,     *
 โ€” ,   โ€ฆ *    *
<iframe src="javascript:alert('ahtung')"></iframe>

 โ€” ,   *  *
var message= ' <kbd>' + query.escapeHTML() + '</kbd> : ' + resultCount

 โ€” โ€ฆ * *    โ€”    ,   ..,        ?
 โ€” โ€ฆ *      *    :
var texts= [ ' <kbd>', '</kbd> : ' ]
var message= texts[0] + query.escapeHTML() + texts[1] + resultCount

 โ€”     texts[n],    ? *  ,   ,  * ,    :
var template= TT.template( ' <kbd>{0}</kbd> : {1}' )
var message= template([ query.escapeHTML(), resultCount ])

 โ€”  * * โ€ฆ
 โ€”      โ€”  *   *  :
var template= TT.template( ' <kbd>{query}</kbd> : {count}' )
var message= template({ query: query.escapeHTML(), count: resultCount })

 โ€” ! * *  !
 โ€” ! *  *  :
var template= TT.html( ' <kbd>{query}</kbd> : {count}' )
var message= template({ query: query, count: resultCount })

 โ€”   โ€ฆ *   *        ?!7
 โ€” ! *   * , ,     :
var message= template({ query: TT.value( highLightedQuery ), count: resultCount })

 โ€”     *  * TT.value?
 โ€”    * ,    *    :
TT.value= function( data ){
        return function( ){
                return data
        }
}

 โ€”  ,    , ,   ,      ? * ,   * ?
 โ€” ! * * , ,   :
TT.pipe= function( list ){
        if( !list ) list= []
        var len= list.length
        return function( data ){
                for( var i= 0; i < len; ++i ) data= list[ i ]( data )
                return data
        }
}

 โ€”   ? *    *
 โ€”          *,      * , ,  :
var text= decodeURIComponent( encodeURIComponent( text ) )
var text= TT.pipe([ encodeURIComponent, decodeURIComponent ])( text )

 โ€” * *  -!
 โ€”   ! **  :
TT.template= new function( ){
        var searcher= /((?:[^\{\}]|\{\{|\}\})*)(?:\{|$)|([^\{\}]*)(?:\})/g
        return function( str, filter ){
                if( !filter ) filter= TT.pipe()
                var parts= []
                String( str ).replace
                (       searcher
                ,       function( str, val, sel ){
                                if( sel !== void 0 ){
                                        parts.push( function( data ){
                                                data= data[ sel ]
                                                switch( typeof data ){
                                                        case 'undefined': return '{' + sel + '}'
                                                        case 'function': return data()
                                                        default: return filter( data )
                                                }
                                        })
                                } else if( val ){
                                        val= val.split( '{{' ).join( '{' ).split( '}}' ).join( '}' )
                                        parts.push( TT.value( val ) )
                                }
                        }
                )
                return TT.concater( parts )
        }
}

 โ€” *   *     !
 โ€”   ! *  *       :
TT.uri= function( tpl ){
        return TT.template( tpl, TT.uri.encoder() )
}
TT.uri.encoder= TT.value( encodeURIComponent )
TT.uri.decoder= TT.value( decodeURIComponent )

 โ€”  ? *,  *
 โ€”    URI *    * :
var searchURI= TT.uri( '/search/?q={query}&count={count}' )
location.href= searchURI({ query: '&&&', count: 10 })

 โ€” โ€ฆ * *    html?
 โ€”    :
TT.html= function( tpl ){
        return TT.template( tpl, TT.html.encoder() )
}
TT.html.encoder= new function( ){
        var parent= document.createElement('div')
        var child= parent.appendChild( document.createTextNode( '' ) )
        return TT.value( function( data ){
                child.nodeValue= data
                return parent.innerHTML.split( '"' ).join( '&quot;' ).split( "'" ).join( '&apos;' )
        })
}
TT.html.decoder= new function( ){
        var parent= document.createElement('div')
        return TT.value( function( data ){
                parent.innerHTML= data
                return parent.firstChild.nodeValue
        })
}

 โ€” !
 โ€”      ! * *  html     ,    HTMLNode   :
TT.dom= function( tpl ){
        return TT.pipe([ TT.html( tpl ), TT.dom.parser() ])
}
TT.dom.parser= new function(){
        var parent= document.createElement( 'div' )
        return TT.value( function( html ){
                parent.innerHTML= html
                var childs= parent.childNodes
                if( childs.length === 1 ) return childs[0]
                var fragment= document.createDocumentFragment()
                while( childs[0] ) fragment.appendChild( childs[0] )
                return fragment
        })
}
TT.dom.serializer= new function(){
        var parent= document.createElement( 'div' )
        var child= parent.appendChild( document.createTextNode( '' ) )
        return TT.value( function( node ){
                parent.replaceChild( node.cloneNode( true ), parent.firstChild )
                return parent.innerHTML
        })
}

 โ€”   ? *   *
 โ€”    *   *
var link= TT.dom( '<a href="{uri}">{title}</a>' )({ uri: '/', title: ' ' }) // HTMLAnchorElement
var userName= TT.dom( '<b>{head}</b>{tail}' )({ head: 'T', tail: 'enshi' }) // HTMLFragment

 โ€” โ€ฆ *  *   โ€ฆ

______________________
ยฉ SoftCoder.ru


Source: https://habr.com/ru/post/J99005/


All Articles