...

четверг, 28 ноября 2013 г.

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

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





Например имеется таблица:

id | field1 | field2 | field3


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



<tr>
<td class="fls"><GEN:FIELDLABEL NAME="Field1Label" /></td>
<td class="dfv" style="white-space:nowrap;"><GEN:FIELDVALUE NAME="Field1" /></td>
</tr>
<tr>
<td class="fls"><GEN:FIELDLABEL NAME="Field2Label" /></td>
<td class="dfv" style="white-space:nowrap;"><GEN:FIELDVALUE NAME="Field2" /></td>
</tr>
<tr>
<td class="fls"><GEN:FIELDLABEL NAME="Field3Label" /></td>
<td class="dfv" 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 и получаем готовый код.


Реализация оказалась довольно простой, учитывая что это мой первый плагин к 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" } ]


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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий