Skip to content

kovchiy/jblock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 
Β 
Β 

Repository files navigation

jBlock

ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ для прСобразования BEM-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ JSON ΠΈΠ»ΠΈ XML Π² HTML. Π£ΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅, разворачивая Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² HTML.

Hello world

ΠŸΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ описаниСм сразу простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ index.html:

<script src="jblock.js"></script>
<script src="foo.jblock.js"></script>
<b:foo/>

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ foo.jblock.js:

jBlock.match('foo', function ()
{
    this.tag('h1')
        .append({
            e_wrap: 'Hello, world'
        })
})

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы:

<script src="jblock.js"></script>
<script src="foo.jblock.js"></script>
<h1 class="foo"><div class="foo__wrap">Hello, world</div></h1>

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ищутся ΡƒΠ·Π»Ρ‹ с прСфиксом Β«b:Β», ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² JSON, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌ измСняСтся ΠΈ дополнятСся шаблонами, Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ JSON прСобразуСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² HTML.

BEM-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ JSON

ВсС рСбята Π·Π½Π°ΡŽΡ‚ ΠΈΠ»ΠΈ Π΄Π°Π²Π½ΠΎ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎ интСрфСйс сСмантичСски ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π±Π»ΠΎΠΊΠΈ, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ зависимыС элСмСнты ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ нСзависимыС Π±Π»ΠΎΠΊΠΈ; Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, Ρƒ Π±Π»ΠΎΠΊΠΎΠ² ΠΈ элСмСнтов Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, внСшний Π²ΠΈΠ΄ ΠΈ Ρ‚.Π΄.

jBlock ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²Π°Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ HTML, Ρ‚Π°ΠΊ ΠΈ JSON. Но, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ основным Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ всС-Ρ‚Π°ΠΊΠΈ являСтся JSON, с Π½Π΅Π³ΠΎ ΠΈ Π½Π°Ρ‡Π½Π΅ΠΌ:

{
    b_button: {e_label:'Найти'}
    m_size:'L'
}

Бмысл прСфиксов ΠΏΠΎΠ»Π΅ΠΉ b_, e_, m_ — это имя Π±Π»ΠΎΠΊΠ°, элСмСнта ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° соотвСтствСнно. Π’Π½ΡƒΡ‚Ρ€ΠΈ поля с прСфиксом b_ ΠΈΠ»ΠΈ e_ располоТСны Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΈ элСмСнтами (Π² Ρ‚ΠΎΠΌ числС, ΠΈΡ… массивами), Ρ‚Π°ΠΊ ΠΈ простым тСкстом.

Для ситуаций, ΠΊΠΎΠ³Π΄Π° Ρƒ Π±Π»ΠΎΠΊΠ° объСмноС содСрТимоС, Π° имя Π±Π»ΠΎΠΊΠ° Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΡ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΉ (ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, миксы ΠΈ ΠΏΡ€.), прСдусмотрСн ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ content:

{
    b_button:'', m_size:'L',
    content:[
        {e_label:'Найти'},
        ...
    ]
}

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список стандартных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

{
    b_blockName: Object | Array | String, //имя блока
    e_elemName: Object | Array | String, //Π»ΠΈΠ±ΠΎ имя элСмСнта (Π½Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ вмСстС)
    m_modName: String | Boolean, //ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

    content: Object | Array | String, //Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ содСрТимого
    tag: String, //имя Ρ‚Π΅Π³Π°
    attr: Object, //Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ скопированы Π² html-ΡƒΠ·Π΅Π»
    mix: Array | String, //классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄ΠΌΠ΅ΡˆΠ°Π½Ρ‹ ΠΊ классам Π±Π»ΠΎΠΊΠ°
    css: Object, //список CSS-свойств html-ΡƒΠ·Π»Π°
    js: Boolean, //Ρ„Π»Π°Π³ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (Π½ΡƒΠΆΠ½ΠΎ для Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° i-bem.js)
    block: Ctx, //явноС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ элСмСнт (см. this.ctx())
}

JSON описанного Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° прСобразуСтся Π² HTML ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ jBlock.json2html(<JSON>):String.

BEM-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ HTML

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π±Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с HTML, Ссли ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΡˆΠΊΠ°Π»ΠΈΠ²Π°Π΅Ρ‚, ΠΈΠ»ΠΈ стоит Π·Π°Π΄Π°Ρ‡Π° быстро ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ интСрфСйса. Если ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ jblock.js ΠΊ html-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ, Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ магия: ΡƒΠ·Π»Ρ‹ с нСймспСйсом b: прСвратятся Π² Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Π΅ html-Π±Π»ΠΎΠΊΠΈ (ΠΊ Π½ΠΈΠΌ примСнится ΠΌΠ΅Ρ‚ΠΎΠ΄ jBlock.json2html).

Π’ Ρ†Π΅Π»ΠΎΠΌ BEM-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ HTML Π²ΠΎ-ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚ свойства описанного Π²Ρ‹ΡˆΠ΅ JSON:

<b:block m:mod="value" tag="span" mix="block2 block3__elem" param="value">
    <elem>Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅</elem>
</b:block>

Ρ€Π°Π²Π½ΠΎ

{
    b_block:{e_elem:'Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅'},
    m_mod:'value',
    tag:'span',
    mix:['block2', 'block3__elem'],
    param:'value'
}

Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ содСрТимоС:

<html>
    <head>
        <meta charset="utf8"/>
        <script src="jblock.js"></script>
    </head>
    <body>
        <h1>Hello, world</h1>
        <b:button>OK</b:button>
    </body>
</html>

ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

<html>
    <head>
        <meta charset="utf8"/>
        <script src="jblock.js"></script>
    </head>
    <body>
        <h1>Hello, world</h1>
        <div class="button">Кнопка</div>
    </body>
</html>

Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ шаблон button.jblock.js (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ раскроСт Π±Π»ΠΎΠΊ button:

jBlock.match('button', function ()
{
    this.tag('button')
        .append({
            e_label: this.copy(),
            tag: 'span'
        })
})

Π­Ρ‚ΠΎΡ‚ скрипт слСдуСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ html-Ρ„Π°ΠΉΠ»Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Ссли Π»Π΅Π½ΠΈΠ²ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Ρ‚ΡŒ Π΄ΠΎ максимума (Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ стСрпит):

<!-- Π‘Ρ‹Π»ΠΎ: -->
<meta charset="utf8"/>
<script src="jblock.js"></script>
<script src="button.jblock.js"></script>
<h1>Hello, world</h1>
<b:button>OK</b:button>

<!-- Π‘Ρ‚Π°Π»ΠΎ: -->
<meta charset="utf8"/>
<script src="jblock.js"></script>
<script src="button.jblock.js"></script>
<h1>Hello, world</h1>
<button class="button">
    <span class="button__label">ОК</span>
</button>

По-Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΌΡƒ, слСдуСт Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ HTML ΠΊ собствСнной BEM-сСмантикС:

<meta charset="utf8"/>
<script src="jblock-and-my-blocks.js"></script>

<b:page>
    <b:header>Hello, world</b:header>
    <b:button m:size="L">OK</b:button>
</b:page>

Π’Π°ΠΆΠ½ΠΎ: Π²Π½ΡƒΡ‚Ρ€ΠΈ ΡƒΠ·Π»ΠΎΠ² с прСфиксом b: ΡƒΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ HTML-Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ (Π½ΠΎ Ссли ΠΎΡ‡Π΅Π½ΡŒ Π½Π°Π΄ΠΎ, для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ самим Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ шаблон).

ΠœΠ΅Π΄ΠΎΡ‚Ρ‹ jBlock

  • json2html (json:Object):String β€”Β ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ BEM-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ JSON Π² HTML
  • json2xml (json:Object, isHtml:Boolean):String β€”Β ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ BEM-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ JSON Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ XML (ΠΈΠ»ΠΈ HTML as is)
  • match (selector:String, template:Function):jBlock — привязываСт ΠΊ сСлСктору шаблон (Π΄Π΅Ρ‚Π°Π»ΠΈ Π½ΠΈΠΆΠ΅)
  • onLoad (handler:Function) β€”Β handler, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ DOM ΠΈ всСх ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ

Π¨Π°Π±Π»ΠΎΠ½Ρ‹

Π Π°Π±ΠΎΡ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° jBlock.json2html() состоит ΠΈΠ· Π΄Π²ΡƒΡ… этапов:

  1. Π”Π΅Ρ€Π΅Π²ΠΎ обходится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ expand β€” это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, Π² этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ элСмСнты Π΄Π΅Ρ€Π΅Π²Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° Π½ΠΎΠ²Ρ‹Π΅.
  2. РаскрытоС Π΄Π΅Ρ€Π΅Π²ΠΎ обходится Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ html, ΠΈ, согласно описанным Π²Ρ‹ΡˆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, прСобразуСтся Π² HTML.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ β€” это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ контСкстам JSON-Π΄Π΅Ρ€Π΅Π²Π° Π²ΠΎ врСмя ΠΎΠ±Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ expand. Π’ Ρ‚Π΅Π»Π΅ шаблона ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ контСкста.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ шаблона:

jBlock.match('<Π‘Π•Π›Π•ΠšΠ’ΠžΠ  1>', '<Π‘Π•Π›Π•ΠšΠ’ΠžΠ  2>', ..., function () {
    //ВСло шаблона
})

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

  • block β€”Β ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ шаблон ΠΊ Π±Π»ΠΎΠΊΡƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«blockΒ»
  • block__elem β€” ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ элСмСнту Β«elemΒ»
  • block_mod_val β€”Β ΠΊ Π±Π»ΠΎΠΊΡƒ Β«blockΒ» с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ mod со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ val
  • block__elem_mod_val β€” Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎ элСмСнт
  • block__* β€” всС элСмСнты Π±Π»ΠΎΠΊΠ°

К ΠΎΠ΄Π½ΠΎΠΌΡƒ экзСпляру Π±Π»ΠΎΠΊΠ° примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ шаблон. Π­Ρ‚ΠΎ страхуСт ΠΎΡ‚ бСсконСчной рСкурсии, многочислСнных холостых ΠΎΠ±Ρ…ΠΎΠ΄ΠΎΠ² Π΄Π΅Ρ€Π΅Π²Π°, Π° Π³Π»Π°Π²Π½ΠΎΠ΅ — позволяСт ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΡƒΡ‚ΠΎΡ‡Π½ΡΡŽΡ‰ΠΈΠΌΠΈ сСлСкторами.

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ сСлСктора зависит, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΡ‚ Π΅Π³ΠΎ точности, Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ€Π°Π²Π½Ρ‹Ρ…, ΠΎΡ‚ порядка упоминания β€” послСдний ΠΏΠ΅Ρ€Π΅ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ контСкста:

  • append ([content:Array | Object | String, ...]) β€” опрСдСляСт содСрТимоС контСкста; Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ содСрТимоС
  • attr (name:String | list:Object, [value]) β€”Β Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ»ΠΈ устанавливаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹
  • blockMod (name:String) β€”Β Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (для элСмСнтов)
  • blockParam (name:String) β€”Β Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (для элСмСнтов)
  • copy (name:String, ...):Ctx β€”Β Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ копию Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов ('e_elemName', 'b_blockName')
  • css (name:String | list:Object, [value]) β€”Β Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ»ΠΈ устанавливаСт CSS-свойства
  • ctx () — ссылка Π½Π° контСкст (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ элСмСнта, см. Π½ΠΈΠΆΠ΅)
  • defMod (modifiers:Object) — устанавливаСт список допустимых ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΈΡ… Π·Π°Π½Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
  • escapeHtml () β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ символы содСрТимого < Π² тСкстовыС
  • has ([name:String]) β€” провСряСт контСкст Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ элСмСнта ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ° ('e_elemName', 'b_blockName'); Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² провСряСт контСкст Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ содСрТимого
  • index () β€” позиция контСкста срСди сосСдСй
  • js () β€” Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ Ρ„Π»Π°Π³ js
  • mix (class:String, ...) — добавляСт классы для смСшивания
  • mod (name:String | list:Object, [value]) β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ»ΠΈ устанавливаСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹
  • name () β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя элСмСнта ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ° (Π±Π΅Π· прСфиксов b_ ΠΈΠ»ΠΈ e_)
  • param (name:String | list:Object, [value]) β€”Β Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ»ΠΈ устанавливаСт абстрактныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (Π½Π΅Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ поля контСкста)
  • replaceWith (content:Object) β€”Β Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ контСкст Π½ΠΎΠ²Ρ‹ΠΌ содСрТимым
  • tag (name:String) — устанавливаСт имя Ρ‚Π΅Π³Π°
  • text ([selecor:String]) β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ тСкстовоС содСрТимоС контСкста ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ элСмСнта

ΠœΠ΅Ρ‚Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ:

jBlock.match('input', function ()
{
    this.tag('span')
        .defMod({
            size:'M',
            type:'normal',
            state:'release'
        })
        .append({
            e_input:'',
            tag:'input',
            attr: {
                size:1,
                autocomlete:'off',
                placeholder:this.param('hint'),
                value: this.param('value'),
                readonly: this.param('readonly') && 'yes'
            }
        })
})

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ содСрТимым контСкста

ΠœΠ΅Ρ‚ΠΎΠ΄ append() мСняСт содСрТимоС контСкста, добавляя ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΡƒΠ·Π»Ρ‹ Π² Π΅Π³ΠΎ ΠΊΠΎΠ½Π΅Ρ†. Π’Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ содСрТимоС Π±Π»ΠΎΠΊΠ° пСрСопрСдСляСтся. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ частично ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ содСрТимоС Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ copy(). Π’Π΅ΠΏΠ΅Ρ€ΡŒ нСсколько ΠΏΠΎΡΡΠ½ΡΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнтов ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ содСрТимому списка (copy() Π±Π΅Π· сСлСктора ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ всё содСрТимоС контСкста):

jBlock.match('foo', function ()
{
    this.append(
            {e_before:''}, // Π΄ΠΎ содСрТимого
            this.copy(),
            {e_after:''} // и послС
        )
})

ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ элСмСнтов:

jBlock.match('foo', function ()
{
    this.append({
            e_wrap: this.copy('foo__bar')
        })
})

ΠžΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ содСрТимого:

jBlock.match('foo', function ()
{
    this.append()
})

Π‘ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°Π΄Π°Ρ‡Π° Π² Π±Π»ΠΎΠΊΠ΅ «Письмо» Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ элСмСнтов: сначала Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΡ‚ΠΎΠΌ тСкст с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ подпись:

jBlock.match('letter', function ()
{
    this.append(
        this.copy('e_header'),
        this.copy('e_text', 'e_attach'),
        this.copy('e_sign')
    )
})

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Π²Π½Π΅ зависимости ΠΎΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… элСмСнтов, Π² Ρ‚Π΅Π»ΠΎ письма ΡΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΈ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС.

Или, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ сначала Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ΄Ρ‚ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π° ΠΏΠΎΡ‚ΠΎΠΌ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅:

jBlock.match('article', function ()
{
    this.append(
        this.copy('e_header'),
        this.copy('!e_header')
    )
})

ΠžΠ±Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ контСкста

ΠœΠ΅Ρ‚ΠΎΠ΄ replaceWith() ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π° мСсто контСкста ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠœΠ΅Ρ‚ΠΎΠ΄ ctx() Π²Π½ΡƒΡ‚Ρ€ΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° всС Π΅Ρ‰Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° старый контСкст:

jBlock.match('page', function ()
{
    this.tag('body')
        .replaceWith({
            e_html:'',
            tag:'html',
            content: [
                {e_head:'', tag:'head'},
                this.ctx()
            ]
        })
})

replaceWith() Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ шаблона, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ послС Π½Π΅Π³ΠΎ дСйствия Π½Π°Π΄ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ контСкстом Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹.

About

XML2JSON2HTML processor

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published