diff --git a/src/main/coffeescript/view/OperationView.coffee b/src/main/coffeescript/view/OperationView.coffee index 5de4f1c5..76e034a2 100644 --- a/src/main/coffeescript/view/OperationView.coffee +++ b/src/main/coffeescript/view/OperationView.coffee @@ -130,6 +130,7 @@ class OperationView extends Backbone.View responseContentTypeField = $('.content > .content-type > div > select[name=contentType]', $(@el)).val() if responseContentTypeField + obj.headers = if obj.headers? then obj.headers else {} obj.headers.accept = responseContentTypeField jQuery.ajax(obj) @@ -146,7 +147,7 @@ class OperationView extends Backbone.View # Show response from server showResponse: (response) -> prettyJson = JSON.stringify(response, null, "\t").replace(/\n/g, "
") - $(".response_body", $(@el)).html prettyJson + $(".response_body", $(@el)).html escape(prettyJson) # Show error from server @@ -157,12 +158,74 @@ class OperationView extends Backbone.View showCompleteStatus: (data) -> @showStatus data + # Adapted from http://stackoverflow.com/a/2893259/454004 + formatXml: (xml) -> + reg = /(>)(<)(\/*)/g + wsexp = /[ ]*(.*)[ ]+\n/g + contexp = /(<.+>)(.+\n)/g + xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2') + pad = 0 + formatted = '' + lines = xml.split('\n') + indent = 0 + lastType = 'other' + # 4 types of tags - single, closing, opening, other (text, doctype, comment) - 4*4 = 16 transitions + transitions = + 'single->single': 0 + 'single->closing': -1 + 'single->opening': 0 + 'single->other': 0 + 'closing->single': 0 + 'closing->closing': -1 + 'closing->opening': 0 + 'closing->other': 0 + 'opening->single': 1 + 'opening->closing': 0 + 'opening->opening': 1 + 'opening->other': 1 + 'other->single': 0 + 'other->closing': -1 + 'other->opening': 0 + 'other->other': 0 + + for ln in lines + do (ln) -> + + types = + # is this line a single tag? ex.
+ single: Boolean(ln.match(/<.+\/>/)) + # is this a closing tag? ex. + closing: Boolean(ln.match(/<\/.+>/)) + # is this even a tag (that's not ) + opening: Boolean(ln.match(/<[^!?].*>/)) + + [type] = (key for key, value of types when value) + type = if type is undefined then 'other' else type + + fromTo = lastType + '->' + type + lastType = type + padding = '' + + indent += transitions[fromTo] + padding = (' ' for j in [0...(indent)]).join('') + if fromTo == 'opening->closing' + #substr removes line break (\n) from prev loop + formatted = formatted.substr(0, formatted.length - 1) + ln + '\n' + else + formatted += padding + ln + '\n' + + formatted + + # puts the response data in UI showStatus: (data) -> try - response_body = '
' + JSON.stringify(JSON.parse(data.responseText), null, 2) + "
" + code = $('').text(JSON.stringify(JSON.parse(data.responseText), null, 2)) + pre = $('
').append(code)
     catch error
-      response_body = "   [unable to parse as json; raw response below]
" + data.responseText + "
" + code = $('').text(@formatXml(data.responseText)) + pre = $('
').append(code)
+    response_body = pre
     $(".response_code", $(@el)).html "
" + data.status + "
" $(".response_body", $(@el)).html response_body $(".response_headers", $(@el)).html "
" + data.getAllResponseHeaders() + "
" @@ -172,5 +235,5 @@ class OperationView extends Backbone.View hljs.highlightBlock($('.response_body', $(@el))[0]) toggleOperationContent: -> - elem = $('#' + @model.resourceName + "_" + @model.nickname + "_" + @model.httpMethod + "_content"); + elem = $('#' + @model.resourceName + "_" + @model.nickname + "_" + @model.httpMethod + "_" + @model.number + "_content") if elem.is(':visible') then Docs.collapseOperation(elem) else Docs.expandOperation(elem)