1. ActionScript / Говнокод #5334

    −117

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    private function formatCallResult(data : String) : URLVariables 
    {
    	try
    	{
    		var urlVariables 	: URLVariables  = new URLVariables(data);
    		MonsterDebugger.trace(this,[urlVariables.msgdesc,urlVariables.msgbody]);
    		var pattern			: RegExp 		= /\[s](.+)\[\/s\]/ig  //*new RegExp("\\[s\\]([\\w\\s]+)\\[/s\\]", "ig");*/
    		var msgdescReady	: String 		= urlVariables.msgdesc.replace(pattern, "<b>$1</b>");
    		var msgbodyReady	: String 		= urlVariables.msgbody.replace(pattern, "<b>$1</b>");
    		var pattern2		: RegExp 		= /\[n](.+)\[\/n\]/ig;
    		//TODO Write nice regexp instead !
    		urlVariables.msgdesc = msgdescReady;				
    		urlVariables.msgbody = msgbodyReady;
    		msgdescReady 		= urlVariables.msgdesc.replace(pattern2, "<b>$1</b>");	
    		msgbodyReady 		= urlVariables.msgbody.replace(pattern2, "<b>$1</b>");	
    		urlVariables.msgdesc = msgdescReady;				
    		urlVariables.msgbody = msgbodyReady;				
    		MonsterDebugger.trace(this,[urlVariables.msgdesc,urlVariables.msgbody]);
    	}
    	catch (e : Error)
    	{
    		
    	}
    	return urlVariables;
    }

    Я уже минут 10 силюсь понять, что же оно должно было делать...

    Запостил: wvxvw, 19 Января 2011

    Комментарии (24) RSS

    • Код в процессе написания. Не финальный.
      Ответить
      • код в продакшене, им пользуются реальные люди.
        Ответить
        • >им пользуются реальные люди.
          Я бы удивился, если бы им пользовались виртуальные люди. )

          Впрочем, кто со мной хочет исправить эту досадную ситуацию? ))
          Ответить
        • Ну значит автора погнали кодить другое. Или он просто неряха, раз оставил отладочную трассировку и промежуточные переменные. Они нужны только для отладки.
          Ответить
          • Не, присмотритесь внимательнее: /\[n](.+)\[\/n\]/ig первая закрывающая квадратная скобка не заэкранирована. Т.е. это вообще никогда не могло работать, или работало непредсказуемо. Тут еще проблема в том, что AS3 компилятор не делает валидации литералам регулярных выражений... но это уже другое...
            Ответить
            • Закрывающую скобку не надо экранировать.
              Ответить
              • Perl и POSIX в таком случае выпадают с ошибкой "Delimiter must not be alphanumeric or backslash" (Perl). Если это случайно работало в какой-то версии плеера, то это именно случайно. Нет никаких явных указаний на то, что это можно не делать. С другой стороны справка явно говорит нам о том, что так оно работать не должно:
                http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ea5.html
                "For any of these characters to be recognized as literal characters (without the special metacharacter meaning), you must precede the character with the backslash escape character." (После таблицы, в которой присутствует ]).
                Ответить
                • Ошибка "Delimiter must not be alphanumeric or backslash" не имеет к этому отношения. Она диагностирует случай использования вместо "/abc/" например "xabcx".

                  "]" и "-" необходимо экранировать для представления в character classes (пример приведён). Собственно, так и называется этот раздел. А подраздел неожиданно называется Escape sequences in character classes.

                  Вы вообще читаете то, на что ссылаетесь?
                  Ответить
                  • Эта ошибка получается врезультате того, что парсер не понимает где выражение заканчивается или начинается. Это, в том числе и наш случай. И, что касается второй ссылки - объясните, в чем противоречие? Да, это character class, да если нужно записать квадратную скобку ее нужно экранировать, это именно то, что написано в справке.
                    Ответить
                    • Понимает. Начинается слешем, заканчивается тоже неэкранированым слешем.

                      И нет, это не character class.
                      Ответить
                  • Да, чтобы было понятнее, как в итоге переделалось:
                    private function formatCallResult(data:String):TipResponse 
                    		{
                    			// NOTE: URLVariables will throw if malformed
                    			var result:XML = URLUtils.parseArguments(data);
                    			return new TipResponse(this.replaceBBCodes(result.msgdesc[0]), 
                    				this.replaceBBCodes(result.msgbody[0]));
                    		}
                    		
                    		private function replaceBBCodes(input:String):String
                    		{
                    			return input.replace(/\[(\/)?[ns]\]/g, "<$1b>");
                    		}
                    Ответить
                    • А вот это уже говнокод. Предыдущий хоть и грязный, но работал, а этот -- нет.

                      Пример: "[/n]".
                      Ответить
                      • Что это? Пример чего? Код работает... и делает именно то, что требовалось. Т.е. требовалось заменить
                        "[n]" => "<b>", "[/n]" => "</b>", "" => "<b>", "" => "</b>"
                        . Почему такое требование - я не знаю, возможно, тяжелое наследие царского режима, но требование соблюдено в точности.

                        Для сведения - предыдущий код работал по-разному в разных плеерах, иногда вываливаясь с ошибкой, а иногда - нет. Поэтому автор и поставил его в try-catch.
                        Ответить
                        • Пример эксплойта. Лучше даже просто "[n]".
                          Ответить
                          • Это так было организовано общение между флешкой и сервером на Питоне. Почему был выбран именно такой формат - я не знаю, но это потом передается в параметрах гет запроса предварительно пройдя escapeMultibyte(). В чем была суть этих преобразований - я не знаю. Я просто взял ТЗ и сделал, как написано :)
                            Ответить
                      • Хехе, тут оказывается тож парсер умельцами написан :)
                        Ответить
                      • А... я понял о чем вы...
                        $ echo [/n] | egrep '\[(\/)?[ns]\]'
                        [/n] # верно
                        $ echo [/n] | egrep '\[n\](.+)\[\/n\]'
                        $ # не верно

                        т.е. это вообще не XML формируется, никакого отношения.
                        Ответить
                        • Если уж делать одним регэкспом, то я бы попробовал
                          replace(/\[([ns])](.*?)\[\/\1]/g, "<b>$2</b>")

                          Но это не тождественная замена (хотя в некотором отношении лучше). Нужно смотреть по данным, принятно ли, или придётся делать две замены.
                          Ответить
                          • Парность не нужна, и добиваться ее вредно. Т.е. в ТЗ это не указано (и, очевидно, не нужно). На сколько я вообще представляю весь процесс, эта строка не имеет никакого отношения к XML / HTML.
                            Человек просто скопировал регекс ис другого места, или как-то так.
                            Ответить
    • Потом ее перевернули на живот, и стали трахать в попу, снова один за другим, матерясь и нанося удар за ударом.
      Ответить

    Добавить комментарий