quest » 20 сен 2013, 14:13
У меня сейчас так
$engine JScript
$uname assert__rewrite
$dname assert
$addin global
$addin stdlib
$addin stdcommands
stdlib.require('TextWindow.js', SelfScript);
stdlib.require('SyntaxAnalysis.js', SelfScript);
global.connectGlobals(SelfScript);
// из formAutoVersion.s
function onFileSave(cmd)
{
if(cmd.isBefore) // Обработчик вызван перед выполнением команды
{
// Получим объект метаданных текущего окна
var mdObj, av = windows.getActiveView()
if(!av || !(mdObj = av.mdObj))
return
// Посмотрим, не внешний ли отчет/обработка сохраняется.
if(mdObj.container != mdObj.container.masterContainer)
rewriteAssert();
}
}
function rewriteAssert(){
var tw = GetTextWindow();
//debugger;
if (!tw) return;
var prgText = tw.text().replace(/\/\/\{\<assert assertCode=\"([^\/])+\/\/\<\/assert assertCode=\"([^\}])+\}\n/g,'');
var parser = snegopat.parseSources(prgText)
var assertPos = [];
var curScope = "";
for(var i = 0, c = parser.lexemCount; i < c; i++)
{
var lex = parser.lexem(i)
if(lex.type==1 && lex.text.indexOf("//@assert")==0)
assertPos.push({'scopeName':curScope,'start':lex.start, 'data':lex.text, 'line':lex.line})
if(lex.type==40 )
curScope = parser.lexem(i+1).text;
}
var last = prgText.length;
var result = "";
var accum = 0;
while (assertPos.length !=0)
{
lex = assertPos.pop();
result = prgText.substring(lex.start+lex.data.length,last) + result;
last = lex.start;
result = prgText.substring(lex.start,lex.start+lex.data.length)+'\n'+writeAssert(lex) + result;
}
result = prgText.substring(0,last) + result;
Message(result);
tw.SetSelection(1, 1, tw.linesCount(), tw.GetLine(tw.linesCount()).length + 1);
tw.SetSelectedText(result);
}
function writeAssert(lex){
var data = lex.data.replace("//@assert","");
var scopeName = lex.scopeName;
var line = new String(lex.line);
var tmpt = '//{<assert assertCode="@1"> \ntry if not (@1) then raise "Не выполнено условие assert @1 в @2 (строка @3)"; endif; except raise "Не выполнено условие assert @1 в @2 (строка @3)"; endtry;\n//</assert assertCode="@2">}'
return tmpt.replace(/@1/g,data).replace(/@2/g,scopeName).replace(/@3/g,line);
}
// Добавим обработчик команды сохранения файла
stdcommands.Frame.FileSave.addHandler(SelfScript.self, "onFileSave")
Проблема в том что после сохранения выгляди некрасиво код
например
//@assert(Кнопка=Неопределено)
раскрывается в
//@assert(Кнопка=Неопределено)
//{<assert assertCode="(Кнопка=Неопределено)">
try if not ((Кнопка=Неопределено)) then raise "Не выполнено условие assert (Кнопка=Неопределено) в КнопкаВыполнитьНажатие1 (строка 4)"; endif; except raise "Не выполнено условие assert (Кнопка=Неопределено) в КнопкаВыполнитьНажатие1 (строка 4)"; endtry;
//</assert assertCode="КнопкаВыполнитьНажатие1">}
при этом еще ломаются отступы :(
а вот если вписаться в компиляцию, то во первых не будет уродливого текста, во ввторых - макросы это не только assert :)
У меня сейчас так
$engine JScript
$uname assert__rewrite
$dname assert
$addin global
$addin stdlib
$addin stdcommands
stdlib.require('TextWindow.js', SelfScript);
stdlib.require('SyntaxAnalysis.js', SelfScript);
global.connectGlobals(SelfScript);
// из formAutoVersion.s
function onFileSave(cmd)
{
if(cmd.isBefore) // Обработчик вызван перед выполнением команды
{
// Получим объект метаданных текущего окна
var mdObj, av = windows.getActiveView()
if(!av || !(mdObj = av.mdObj))
return
// Посмотрим, не внешний ли отчет/обработка сохраняется.
if(mdObj.container != mdObj.container.masterContainer)
rewriteAssert();
}
}
function rewriteAssert(){
var tw = GetTextWindow();
//debugger;
if (!tw) return;
var prgText = tw.text().replace(/\/\/\{\<assert assertCode=\"([^\/])+\/\/\<\/assert assertCode=\"([^\}])+\}\n/g,'');
var parser = snegopat.parseSources(prgText)
var assertPos = [];
var curScope = "";
for(var i = 0, c = parser.lexemCount; i < c; i++)
{
var lex = parser.lexem(i)
if(lex.type==1 && lex.text.indexOf("//@assert")==0)
assertPos.push({'scopeName':curScope,'start':lex.start, 'data':lex.text, 'line':lex.line})
if(lex.type==40 )
curScope = parser.lexem(i+1).text;
}
var last = prgText.length;
var result = "";
var accum = 0;
while (assertPos.length !=0)
{
lex = assertPos.pop();
result = prgText.substring(lex.start+lex.data.length,last) + result;
last = lex.start;
result = prgText.substring(lex.start,lex.start+lex.data.length)+'\n'+writeAssert(lex) + result;
}
result = prgText.substring(0,last) + result;
Message(result);
tw.SetSelection(1, 1, tw.linesCount(), tw.GetLine(tw.linesCount()).length + 1);
tw.SetSelectedText(result);
}
function writeAssert(lex){
var data = lex.data.replace("//@assert","");
var scopeName = lex.scopeName;
var line = new String(lex.line);
var tmpt = '//{<assert assertCode="@1"> \ntry if not (@1) then raise "Не выполнено условие assert @1 в @2 (строка @3)"; endif; except raise "Не выполнено условие assert @1 в @2 (строка @3)"; endtry;\n//</assert assertCode="@2">}'
return tmpt.replace(/@1/g,data).replace(/@2/g,scopeName).replace(/@3/g,line);
}
// Добавим обработчик команды сохранения файла
stdcommands.Frame.FileSave.addHandler(SelfScript.self, "onFileSave")
Проблема в том что после сохранения выгляди некрасиво код
например
//@assert(Кнопка=Неопределено)
раскрывается в
//@assert(Кнопка=Неопределено)
//{<assert assertCode="(Кнопка=Неопределено)">
try if not ((Кнопка=Неопределено)) then raise "Не выполнено условие assert (Кнопка=Неопределено) в КнопкаВыполнитьНажатие1 (строка 4)"; endif; except raise "Не выполнено условие assert (Кнопка=Неопределено) в КнопкаВыполнитьНажатие1 (строка 4)"; endtry;
//</assert assertCode="КнопкаВыполнитьНажатие1">}
при этом еще ломаются отступы :(
а вот если вписаться в компиляцию, то во первых не будет уродливого текста, во ввторых - макросы это не только assert :)