Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Есть у кого-нить средство для распарсинга диалога? (число прочтений - 2386 )
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Есть у кого-нить средство для распарсинга диалога?
14. Декабря 2006 :: 12:08
Печать  
Имеется ввиду надо распарсить табличную часть, что-бы показать идентификаторы, флаги, формулы.
для скрита ExpandFoms.vbs. А то табличную часть он так и не понимает....
  
Наверх
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Есть у кого-нить средство для распарсинга диал
Ответ #1 - 14. Декабря 2006 :: 12:21
Печать  
есть некое подобие, думаю будет несложно доделать и приспособить

Код
Выбрать все
function AnalyseDialogControls(_)
{
	var DocFrm = Windows.ActiveWnd.Document;
	var Dialog;

	if( DocFrm == docWorkBook )
	{
		Dialog = DocFrm.Page(0);
	}
	/*
	else if( DocFrm == docText )
	{
		//попытаемcя получить форму для модуля, загруженного с помощью ЗагрузитьИзФайла
		Dialog = GetDocFromPath(DocFrm.Path)
		if( DocFrm == docWorkBook )
			Dialog = DocFrm.Page(0);
		else
			return false;
	}
	*/
	else
		return false;

	Parser.LC_AddVar('Форма', 'Форма');
	Parser.LC_AddVar('Контекст', 'ГрупповойКонтекст');

	var arrLines = Dialog.Stream.split(CrLf);

	var State = '';
	var nLines = arrLines.length;
	var i, ControlName, TypeLetter, TypeID;
	for( i = 0; i < nLines; i++ )
	{
		var line = arrLines[i];

		//определяем, в какой части формы мы находимся
		if( line == '{"Fixed",' )
		{
			State = 'Table';
			continue;
		}
		if( line == '{"Controls",' )
		{
			State = 'Controls';
			continue;
		}

		if( State == '' ) continue;

		//Message(line, 0);

		//--- начинаем разбор контрола ---
		var arrControl = line.split('","');

		if( State == 'Table' )
		{
			ControlName = arrControl[7];
			TypeLetter = arrControl[9];
			TypeID = Number(arrControl[12]);
		}
		else if( State == 'Controls' )
		{
			ControlName = arrControl[12];
			TypeLetter = arrControl[14];
			TypeID = Number(arrControl[17]);
		}

		if( ControlName == '0' ) continue;  //фиг знает, чего это, но явно что-то не то

		if( ControlName.length > 0 )
		{
			var WndClass = arrControl[1];

			if( WndClass == 'TABLE' )
			{
				TypeID = 'ТаблицаЗначений';
			}
			else if( WndClass == 'COMBOBOX' || WndClass == 'LISTBOX' )
			{
				TypeID = 'СписокЗначений';
			}
			else
			{
				if( TypeID > 0 )
				{
					MD = MetaData.FindObject(TypeID);
					if( MD != null )
						TypeID = MD.FullName;
					else
						TypeID = '';
				}
				else
				{
					TypeID = '';
				}
			}

			if( TypeID == '' )
			{
				if( TypeLetter == 'B' )
				{
					TypeID = 'Справочник';
				}
				else if( TypeLetter == 'O' )
				{
					TypeID = 'Документ';
				}
			}

			//Добавим контрол в локальный контекст
			Parser.LC_AddVarProperty('Форма', ControlName, 'ФормаАтрибут');
			if( TypeID.length > 0 )
				Parser.LC_AddVar(ControlName, TypeID);

			//Message('Control: '+ControlName+', type '+TypeLetter+':'+TypeID, 0);
		}


		//проверим завершение блока контролов
		if( State == 'Table' && line.substr(line.length - 5) == '"}}},' )
		{
			State = '';
		}
		if( State == 'Controls' && line.substr(line.length - 4) == '"}},' )
		{
			State = '';
		}
	}
}
 

  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Есть у кого-нить средство для распарсинга диал
Ответ #2 - 14. Декабря 2006 :: 12:34
Печать  
Parser - who is?
И чей это кусок, в смысле откуда?
  
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Есть у кого-нить средство для распарсинга диал
Ответ #3 - 14. Декабря 2006 :: 16:20
Печать  
Это кусок скрипта parser_test.js для быстрого парсера от Алексея
Лежит в репозитарии в одной из подпапок папки СистемныеФайлы
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать