ДействиеСценарий / Говнокод #5334 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 wvxvw, (Updated )

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8