From 49703bea0aac8c06856a506b35bccf30cf0c2520 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 15 Aug 2015 23:55:17 +0100 Subject: [PATCH 1/2] jsre: bind the pretty printer to "inspect" in JS --- jsre/jsre.go | 1 + jsre/pretty.go | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/jsre/jsre.go b/jsre/jsre.go index bb0cc71ed..0db9e33fc 100644 --- a/jsre/jsre.go +++ b/jsre/jsre.go @@ -66,6 +66,7 @@ func New(assetPath string) *JSRE { re.loopWg.Add(1) go re.runEventLoop() re.Set("loadScript", re.loadScript) + re.Set("inspect", prettyPrintJS) return re } diff --git a/jsre/pretty.go b/jsre/pretty.go index cf04deec6..7300a5f37 100644 --- a/jsre/pretty.go +++ b/jsre/pretty.go @@ -54,6 +54,14 @@ func prettyPrint(vm *otto.Otto, value otto.Value) { ppctx{vm}.printValue(value, 0) } +func prettyPrintJS(call otto.FunctionCall) otto.Value { + for _, v := range call.ArgumentList { + prettyPrint(call.Otto, v) + fmt.Println() + } + return otto.UndefinedValue() +} + type ppctx struct{ vm *otto.Otto } func (ctx ppctx) indent(level int) string { From 1086e2f298215cb0d4973a2c10ae9c9c8fd38462 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 15 Aug 2015 23:56:05 +0100 Subject: [PATCH 2/2] jsre: fix annoying indentation when printing arrays of objects The pretty printer, dumb as it is, printed arrays of objects as [{ ... }] With this change, they now print as: [{ ... }] --- jsre/pretty.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/jsre/pretty.go b/jsre/pretty.go index 7300a5f37..99aa9b33e 100644 --- a/jsre/pretty.go +++ b/jsre/pretty.go @@ -51,7 +51,7 @@ var boringKeys = map[string]bool{ // prettyPrint writes value to standard output. func prettyPrint(vm *otto.Otto, value otto.Value) { - ppctx{vm}.printValue(value, 0) + ppctx{vm}.printValue(value, 0, false) } func prettyPrintJS(call otto.FunctionCall) otto.Value { @@ -68,10 +68,10 @@ func (ctx ppctx) indent(level int) string { return strings.Repeat(indentString, level) } -func (ctx ppctx) printValue(v otto.Value, level int) { +func (ctx ppctx) printValue(v otto.Value, level int, inArray bool) { switch { case v.IsObject(): - ctx.printObject(v.Object(), level) + ctx.printObject(v.Object(), level, inArray) case v.IsNull(): specialColor.Print("null") case v.IsUndefined(): @@ -92,7 +92,7 @@ func (ctx ppctx) printValue(v otto.Value, level int) { } } -func (ctx ppctx) printObject(obj *otto.Object, level int) { +func (ctx ppctx) printObject(obj *otto.Object, level int, inArray bool) { switch obj.Class() { case "Array": lv, _ := obj.Get("length") @@ -109,7 +109,7 @@ func (ctx ppctx) printObject(obj *otto.Object, level int) { for i := int64(0); i < len; i++ { el, err := obj.Get(strconv.FormatInt(i, 10)) if err == nil { - ctx.printValue(el, level+1) + ctx.printValue(el, level+1, true) } if i < len-1 { fmt.Printf(", ") @@ -137,12 +137,15 @@ func (ctx ppctx) printObject(obj *otto.Object, level int) { for i, k := range keys { v, _ := obj.Get(k) fmt.Printf("%s%s: ", ctx.indent(level+1), k) - ctx.printValue(v, level+1) + ctx.printValue(v, level+1, false) if i < len(keys)-1 { fmt.Printf(",") } fmt.Println() } + if inArray { + level-- + } fmt.Printf("%s}", ctx.indent(level)) case "Function":