Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Генерация повторяющихся блоков кода с поддержкой плагина для Sublime Text 2

Anna | 16.06.2014 | нет комментариев

В своей работе мне непрерывно доводится копипастить огромное число однотипного кода связанного с разметкой, валидацией, форматированием и т.д. большого числа полей из СУБД. Давным-давно хотелось как то автоматизировать эту задачу.


Скажем имеется таблица:

id | field1 | field2 | field3

И необходимо получить разметку вида:

<tr>
<td><GEN:FIELDLABEL NAME="Field1Label" /></td>
<td style="white-space:nowrap;"><GEN:FIELDVALUE NAME="Field1" /></td>
</tr>
<tr>
<td><GEN:FIELDLABEL NAME="Field2Label" /></td>
<td style="white-space:nowrap;"><GEN:FIELDVALUE NAME="Field2" /></td>
</tr>
<tr>
<td><GEN:FIELDLABEL NAME="Field3Label" /></td>
<td style="white-space:nowrap;"><GEN:FIELDVALUE NAME="Field3" /></td>
</tr>

Отлично если полей 3, а если их 30 и кусков кода тоже не один десяток?

Первой мыслью было сделать все в sql. Сделать табличку со списком полей и запросом генерировать блок кода по образцу. Сказано-сделано, впрочем копировать всякий раз образец в sql server management studio и сгенерированный код обратно показалось не слишком комфортно, следственно решил испробовать написать плагин к Sublime Text 2.

Выходит итоговая задача:

Создаем список значений в виде двумерного массива, в моем случае в всякой строке я заношу:

[fieldName, signFieldName, fieldFullName, fieldMeasurment]

В редактируемом файле пишем образцы с плейсхолдерами {0},{1},{2} и {3} Скажем:

ValidateSignedField({0},{1});

Дальше выделяем несколько образцов с поддержкой множественного выделения, жмем Ctrl Shift z и получаем готовый код.

Реализация оказалась достаточно примитивный, рассматривая что это мой 1-й плагин к sublime text 2, а python я конечный раз ковырял крайне поверхностно огромнее года назад.

Создаем новейший плагин (Tools -> New Plugin) и сберегаем скажем как Codegen.py в соответствующую папку.

Код плагина:

# coding=utf-8

import sublime
import sublime_plugin

# список значений для подстановки в образец взамен {0},{1},{2} и {3}
field_rows = [
            ['dbField1','dbField1Sign','Field 1 full name','m/s'], 
            ['dbField2','dbField2Sign','Field 2 full name','kg/m*m'], 
            ['dbField3','dbField3Sign','Field 3 full name','V'], 
            ['dbField4','dbField4Sign','Field 4 full name','km/h']
             ]

class CodegenCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        # получаем объект view
        view = self.view
        # получаем массив координат выделенной области
        for curr_sel in view.sel():
            n = 0
            region = curr_sel
            if not region.empty():
                # если не пустой, берем следующий выбранный блок текста
                selection = view.substr(region)
                result = ''
                #пробегаем по строкам с комплектом значений и изготавливаем подстановку
                for field_row in field_rows:
                    result  = selection.replace('{0}',field_row[0]).replace('{1}',field_row[1]).replace('{2}',field_row[2]).replace('{3}',field_row[3]).replace('{n0}',str(n)).replace('{n1}',str(n 1))
                    result  = '\r\n'
                    n  = 1
                #заменяем образец на сгенерированный блок кода
                self.view.replace(edit, region, result)

field_rows — тот самый массив значений для подстановки в образец.
Теснее по ходу написания на статьи пришла в голову мысль добавить вероятность генерировать индексы с нуля либо с единицы, для этого добавил плейсхолдеры {n0} и {n1} соответственно.

Сейчас осталось добавить жгучую клавишу на вызов плагина. В Key Bindings — User пишем:
[ { "keys": ["ctrl shift z"], "command": "codegen" } ]

Верю что данный плагин поможет кому-нибудь сэкономить немножко времени.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB