Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > e4xu

Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
Оценить эту запись

XML - Serious Business

Запись от wvxvw размещена 24.04.2011 в 21:50

Когда-то давно я хотел написать програму для подсветки синтаксиса в AS3. Чего-то сделал, чего-то не доделал, оставил на полпути потому что E4X оказался слишком сложным, и не захотелось возиться. Сейчас решил вернуться и все-таки сделать. Особенно захотелось это сделать потому, что нет ни одного AS3 редактора, который бы делал это правильно, а иногда хочется, чтобы исходники выглядели красиво.
Да, я знаю, что FDT умеет даже автокомплитить E4X, и тем не менее, он тоже не идеален в плане покраски - а все вот почему: Adobe нигде никогда не публиковала своего стандарта или хотябы каких-нибудь правил, которых они придерживаются в реализации E4X. Единственное, что они предлагают почитать по этому поводу - вот. Да, вы, возможно, знали о его существовании, но заглядывали ли вы когда-нибудь вовнутрь? Реализация Adobe ну, как минимум на четверть не соответствует тому, что там написано. Например, toXMLString() по задумке авторов должна была принимать параметры - отступы и пространства имен, из которых собирать XML. Но это мелочи.
Я стал разбираться с этим документом потому, что в парсере нужно было выяснить, где можно ожидать фигурные скобки. Оказалось, что мнения компилятора и стандарта практически не совпадают. Так, например, по стандарту в CData фигурные скобки должны интерпретироваться как управляющий элемент, внути processing instruction - тоже, и так же внутри комментариев. А оппаньки...
Еще, интересный момент - очевидно изза того, что $ знак можно использовать в названиях сущностей AS3, этот символ вдруг стал валидным для начала XML имени, и это в то время как вполне себе валидный символ : (двоеточие) оказался "вне закона". Вобщем, стою на асфальте, чешу затылок...

Код:
package tests
{
	import flash.display.Sprite;
	import flash.utils.getQualifiedClassName;
	
	public class TestXML extends Sprite
	{
		public function TestXML()
		{
			super();
			this.testE4XImplementation();
		}
		
		private function testE4XImplementation():void
		{
//			http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf page 10
//			The left curly brace ({) and right curly brace (}) are used  to delimit expressions that may be embedded in tags or 
//			element content to dynamically compute portions of the XML initialiser. The curly braces may appear in literal form 
//			inside an attribute value, a CDATA, PI, or XML Comment. In all other cases, the character reference { shall 
//			be used to represent the left curly brace  ({) and the character reference } shall be used to represent the 
//			right curly brace (}).
			
			var xml:XML = <![CDATA[let's see... {getQualifiedClassName(this)}]]>;
			// I had no doubt, srsly
			//<![CDATA[let's see... {getQualifiedClassName(this)}]]>
			trace(xml.toXMLString());
			XML.ignoreProcessingInstructions = false;
			// ZOMG!!! no autocompletion in Flash Builder 4.5 after this line
			xml = <?{"foo"} could it be true?>; //<?{"foo"} could it be true?>
			trace(xml.toXMLString());
			xml = <foo>should this work? { "tee-hee" } or maybe not?</foo>;
			// <foo>should this work? tee-hee or maybe not?</foo>
			trace(xml.toXMLString());
			XML.ignoreComments = false;
			xml = <!-- unmöglich! { "impossible in German language" } -->;
			// <!-- unmöglich! { "impossible in German language" } -->
			trace(xml.toXMLString());
			
//			http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-357.pdf page 11
//			XMLName :: 
//				XMLNameStart 
//				XMLName XMLNamePart 
//			XMLNameStart  :: 
//				UnicodeLetter 
//				underscore _ 
//				colon : 
			
//			http://www.w3.org/TR/xml/#NT-NameStartChar
//			[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | 
//				[#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | 
//				[#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | 
//				[#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
			try
			{
				xml = <_this-shouldnt-be-valid />;
				// <_this-shouldnt-be-valid/>
				trace(xml.toXMLString());
			}
			catch (error:TypeError)
			{
				trace(error.getStackTrace());
			}
			try
			{
				xml = <$how-about-this />;
				// <$how-about-this/>
				trace(xml.toXMLString());
				trace("$".charCodeAt().toString(16)); //24
			}
			catch (error:TypeError)
			{
				trace(error.getStackTrace());
			}
			try
			{
				xml = <:go-colon-go />;
				trace(xml.toXMLString());
			}
			catch (error:TypeError)
			{
//				TypeError: Error #1090: XML parser failure: element is malformed.
//				
//				at tests::TestProto/testE4XImplementation()[/home/wvxvw/Projects/e4xu/src/tests/TestProto.as:75]
//				at tests::TestProto()[/home/wvxvw/Projects/e4xu/src/tests/TestProto.as:11]
				trace(error.getStackTrace());
			}
			xml = <öhow-about-this />;
			// <öhow-about-this/>
			trace(xml.toXMLString());
			xml = <text> la-la-la, &#x7B; moooaha-ha! &#x7D; ke-ke-ke </text>;
			// <text>la-la-la, { moooaha-ha! } ke-ke-ke</text>
			trace(xml.toXMLString());
		}
	}
}
Всего комментариев 10

Комментарии

Старый 26.04.2011 01:53 fish_r вне форума
fish_r
 
Аватар для fish_r
Да-к чем кончится то?! Опять забросишь? Публика то ждет
Старый 26.04.2011 23:18 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
За один день не сделается, но долгими зимними вечерами...
А вообще, если чесно, я еще пытаюсь выяснить, какой из вариантов правильный. Например, <?{"foo"}?> должен ли парсер подсвечивать "foo" как строку или нет - по спецификации, да, должен, но MXMLC не делает замены в этом месте - и вот теперь поди знай как надо...
Старый 26.04.2011 23:29 iNils вне форума
iNils
 
Аватар для iNils
Года два назад, я задавался тем же вопросом. Написал два кода, отличия в них были только в пробелах и переводах строк, компилились они по разному. Так что, в спорных моментах, нужно ориентироваться на то, как код интерпретируется адобом.
PS. Автоформатор в Flash IDE сломался как раз после появления E4X
Старый 26.04.2011 23:44 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Так а может наоборот, надо им баг оформить, что они не по стандарту сделали, и делать самому по стандарту. Того и глядишь, к следующей версии поправят - а у меня ужЕ работает!
Фишка еще и в том, что если, например, тяжело представить, что кто-то всерьез когда-нибудь пользовался скобками в PI, то в CData - очень даже может быть... и если Адоби действительно пофиксят, и сделают по стандарту, тогда какой-то старый код не будет компилироваться. Т.е. по стандарту: <![CDATA[{"hello"} {"world"}]]> должно скомпилироваться в <![CDATA[hello world]]> но оно совсем даже так не работает... (типичная ситуация - люди так записывали длинные яваскриптовые функции - и в них как раз скобок достаточно...)
Старый 26.04.2011 23:55 iNils вне форума
iNils
 
Аватар для iNils
Олег, ты шутишь, да?
Старый 27.04.2011 03:19 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Ой блииин... я чет совсем заработался... нда...

Хотя все равно остается открытым вопрос:
<foo{ "bar" } /> является валидным, или нет? Не скомпилируется, пробовал, но я не вижу явных ограничений...
Обновил(-а) wvxvw 27.04.2011 в 03:23
Старый 27.04.2011 11:56 arkadattx вне форума
arkadattx
Грядет эра валидного as-кода...
Старый 27.04.2011 13:55 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
кстати спорный вопрос в использовании {}-конструкций внутри XML.
Код AS3:
xml = <node />;
xml.@f = "asd";
Код:
  //     xml = <node />;
getlocal0 
findpropstrict XML
getproperty XML
pushstring <node/>
construct 1
initproperty test:xml
debugline 31
  //     xml.@f = "asd";
getlocal0 
getproperty test:xml
pushstring asd
setproperty f
debugline 33

Код AS3:
xml = <node f={ "asd" } />;
Код:
  //     xml = <node f={ "asd" } />;
getlocal0 
findpropstrict XML
getproperty XML
pushstring <node f="
pushstring asd
esc_xattr 
add 
pushstring "/>
add 
construct 1
initproperty test:xml
debugline 34
то есть во втором случаи мы сперва собираем очень большую строку, а потом делаем вызов конструктора XML с переданной в него собранной строкой. плюс при сборки строки вызывается оператор esc_xattr, который в первым случаи вызывается в недрах нативного кода.

исходя из всего этого я не очень верю в производительность данной штуки.
Старый 27.04.2011 20:19 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Это мелочи по сравнению с тем, как компилируется фильтр, если по сравнению с форычем. Там и мертвый код и лишние лейблы и создание второго списка, даже если он не используется... Так просто удобнее, но к сожалению за удобство ничего хорошего не будет (хотя могло бы...).
Старый 28.04.2011 13:23 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
кстати ... двоеточие не совсем валиден в именах. это разделитель QName.
 

 


Часовой пояс GMT +4, время: 03:35.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.