parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Отладка (debug) Parser в Firefox

gik 16.05.2009 14:20

Давно хотелось заполучить удобный инструмент для отладки Parser.

В основном использую плугин к Firefox - FireBug.
В нем удобно работать с версткой и JavaScript.

И случайно наткнулся на расширение к FireBug - FirePHP
он имеет готовые либы для отладки PHP, но по сути легко расширяем под любой язык.

скриншот

По сути передача отладочной информации происходит через заголовки страницы в формате JSON.

Требования:
Firefox + FireBug + FirePHP + Parser )

Класс для Parser позволяет отправлять сообщения с дампом
переменной (int, double, string, hash, table)

Использование:

@USE
FireBug.p


###########################################################################
@main[]
^FireBug:group[test group;[
$.sColor[#880000]
$.sCollapsed[true]
]]
^FireBug:log[proc started;$status:rusage]
^FireBug:log[memory at start;$status:memory]

$table[^table::create{id name
1 test1
2 test2
}]

^FireBug:table[test dump;$table]


^FireBug:info[date now;^date::now[];[
$.sFile[test.p]
$.sLine[10]
]]

^FireBug:log[proc ended;$status:rusage]
^FireBug:log[memory at end;$status:memory]
^FireBug:group_end[]


^FireBug:group[test group]

^FireBug:warn[warning message]

^FireBug:error[error, html is empty )]

^try{
^throw[test exception;]

}{
$exception.handled(1)
^FireBug:exception[$exception]
}

^FireBug:group_end[]

###########################################################################
@postprocess[sBody]
$result[$sBody]
^FireBug:print[]

###########################################################################



теперь о недостатках )

у меня не захотел работать с кириллицей в UTF-8
(глюк на стороне FirePHP, в заголовках все ОК).

TODO:
не реализован перенос строки при длине > 5000 символов
не реализована замена символов перевода строки в string
(данные должны быть в одну строчку)
не реализована обертка к SqlLog и Erusage )


###########################################################################
# $Id: FireBug.p,v 0.1 2009-05-15 08:08:45 gik Exp $
# JSON based on misha JSHttpRequest Class
###########################################################################

@CLASS
FireBug

###########################################################################
@auto[]
$tLog[^table::create{str}]
$sProtocol[http://meta.wildfirehq.org/Protocol/JsonStream/0.2]
$sPlugin[http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3]
$sStructure[http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1]
$sType[]
#end @auto[]

###########################################################################
# start group
#
# hParam - hash
# $.sColor[string]
# $.sCollapsed[true/false]
#
@group[sGroupLabel;hParam]
^_append[GROUP_START;$sGroupLabel;;$hParam]
#end @group[]

###########################################################################
# close group
#
@group_end[]
^_append[GROUP_END]
#end @group_end[]

###########################################################################
# log message
#
# sLabel - label
# uVar - any variable
# hParam - hash
# $.sFile[string]
# $.sLine[integer]
#
@log[sLabel;uVar;hParam]
^_append[LOG;$sLabel;$uVar;$hParam]
#end @log[]

###########################################################################
# dump table (icon)
#
# sLabel - label
# uVar - table
# hParam - hash
# $.sFile[string]
# $.sLine[integer]
#
@table[sLabel;uVar;hParam]
^if($uVar is "table"){
^_append[TABLE;$sLabel;$uVar;$hParam]
}{
^_append[INFO;$sLabel;$uVar;$hParam]
}
#end @table[]

###########################################################################
# info message (icon)
#
# sLabel - label
# uVar - any variable
# hParam - hash
# $.sFile[string]
# $.sLine[integer]
#
@info[sLabel;uVar;hParam]
^_append[INFO;$sLabel;$uVar;$hParam]
#end @info[]

###########################################################################
# warning message (icon)
#
# sLabel - label
# uVar - any variable
# hParam - hash
# $.sFile[string]
# $.sLine[integer]
#
@warn[sLabel;uVar;hParam]
^_append[WARN;$sLabel;$uVar;$hParam]
#end @warn[]

###########################################################################
# error message (icon)
#
# sLabel - label
# uVar - any variable
# hParam - hash
# $.sFile[string]
# $.sLine[integer]
#
@error[sLabel;uVar;hParam]
^_append[ERROR;$sLabel;$uVar;$hParam]
#end @error[]

###########################################################################
# exception message (icon)
#
# hException - $exception
#
@exception[hException][sLine]
$sLine[[{"Type":"EXCEPTION"},{"Class": "$caller.CLASS_NAME ", "Message": "$hException.source ($hException.comment) ", "File": "$hException.file ", "Line": "(${hException.lineno}:$hException.colno) ", "Type": "$hException.type ", "Trace": []}]]
^tLog.append{^sLine.length[]|$sLine|}
#end @error[]

###########################################################################
@print[][sHeader]
$response:X-Wf-Protocol-1[$self.sProtocol]
$response:X-Wf-1-Plugin-1[$self.sPlugin]
$response:X-Wf-1-Structure-1[$self.sStructure]
^tLog.menu{
$sHeader[X-Wf-1-1-1-^tLog.line[]]
$response:$sHeader[$tLog.str]
}

###########################################################################
@_append[sTypeL;sLabel;uVar;hashParam][sLine]
$self.sType[$sTypeL]
$self.hParam[^hash::create[$hashParam]]
$sLine[[{"Type":"$sType"^if(def $sLabel){,"Label":"^taint[js][$sLabel]"}^if(def $hParam.sFile){,"File":"$hParam.sFile"}^if(def $hParam.sLine){,"Line":$hParam.sLine}^if(def $hParam.sColor){,"Color":"$hParam.sColor"}^if(def $hParam.sCollapsed){,"Collapsed":"$hParam.sCollapsed"}},^_object2js[$uVar]]]
^tLog.append{^sLine.length[]|$sLine|}
#end @_append[]

###########################################################################
# carefull: for empty strings returned 'null'
@_object2js[uVar]
$result[]
^if(!(
($uVar is "bool" && ($uVar && ^self._return[true] || ^self._return[false]))
|| (!def $uVar && ^self._return[null])
|| ($uVar is "string" && ^self._return[^self._string2js[$uVar]])
|| ($uVar is "double" && ^self._return[$uVar])
|| ($uVar is "int" && ^self._return[$uVar])
|| ($uVar is "table" && (($uVar && ^self._return[^if($sType eq "TABLE"){^self._table2js[$uVar]}{^self._array2js[$uVar]}]) || ^self._return[null]))
|| ($uVar is "hash" && (($uVar && ^self._return[^self._hash2js[$uVar]]) || ^self._return[null]))
|| ($uVar is "date" && ^self._return[new Date(^uVar.unix-timestamp[]000)])
)){
^self._return[null]
}
#end @_object2js[]

###########################################################################
@_return[sType]
$caller.result[$sType]
$result(1)
#end @_return[]

###########################################################################
@_string2js[sData]
$result["^taint[js][$sData]"]
#end @_string2js[]

###########################################################################
@_hash2js[hData][bIsHashOfBool;sKey;uValue]
$bIsHashOfBool(1)
# check if our hash is hash of bool with only 'true' values
^hData.foreach[sKey;uValue]{
^if($bIsHashOfBool && !($uValue is "bool" && $uValue)){
$bIsHashOfBool(0)
}
}

^if($bIsHashOfBool){
$result[[^hData.foreach[sKey;]{^self._string2js[$sKey]}[, ]]]
}{
^rem{ *** in other case return associated array *** }
$result[{^hData.foreach[sKey;uValue]{^self._string2js[$sKey]:^if($uValue is "double" || $uValue is "bool" || $uValue is "int"){^self._object2js($uValue)}{^self._object2js[$uValue]}}[, ]}]
}
#end @_hash2js[]



###########################################################################
@_table2js[tData][tKeys]
$tKeys[^tData.columns[]]
^if($tKeys){
$result[[[^tKeys.menu{^self._string2js[$tKeys.column]}[,]],^tData.menu{[^tKeys.menu{^self._string2js[$tData.[$tKeys.column]]}[, ]]}[, ]]]
}{
^rem{ *** nameless tables are deprecated, lah. *** }
$result[null]
}
#end @_table2js[]

###########################################################################
@t_table2js[tData][tKeys]
$tKeys[^tData.columns[]]
^if($tKeys){
$result[[^tKeys.menu{^self._string2js[$tKeys.column]}[,]],^tData.menu{[^tKeys.menu{^self._string2js[$tData.[$tKeys.column]]}[, ]]}[, ]]
}{
^rem{ *** nameless tables are deprecated, lah. *** }
$result[null]
}
#end @_table2js[]


###########################################################################
@_array2js[tData][tKeys]
$tKeys[^tData.columns[]]
^if($tKeys){
$result[[^tData.menu{{^tKeys.menu{^self._string2js[$tKeys.column]:^self._string2js[$tData.[$tKeys.column]]}[, ]}}[, ]]]
}{
^rem{ *** nameless tables are deprecated, lah. *** }
$result[null]
}
#end @_array2js[]