From 17e6d815049c9ddd385c2df419f4720807e4fbdc Mon Sep 17 00:00:00 2001 From: Kyle Shockey Date: Thu, 2 Nov 2017 15:13:10 -0700 Subject: [PATCH] Format XML with `xml-but-prettier` --- package.json | 1 + src/core/components/response-body.jsx | 6 ++- src/core/utils.js | 70 --------------------------- test/core/utils.js | 11 ----- 4 files changed, 5 insertions(+), 83 deletions(-) diff --git a/package.json b/package.json index 50a0a51d..17ba6a80 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "whatwg-fetch": "0.11.1", "worker-loader": "^0.7.1", "xml": "1.0.1", + "xml-but-prettier": "^1.0.1", "yaml-js": "0.2.0" }, "devDependencies": { diff --git a/src/core/components/response-body.jsx b/src/core/components/response-body.jsx index c55c1d6d..e3c2aeb1 100644 --- a/src/core/components/response-body.jsx +++ b/src/core/components/response-body.jsx @@ -1,6 +1,6 @@ import React from "react" import PropTypes from "prop-types" -import { formatXml } from "core/utils" +import formatXml from "xml-but-prettier" import lowerCase from "lodash/lowerCase" export default class ResponseBody extends React.Component { @@ -31,7 +31,9 @@ export default class ResponseBody extends React.Component { // XML } else if (/xml/i.test(contentType)) { - body = formatXml(content) + body = formatXml(content, { + textNodesOnSameLine: true + }) bodyEl = // HTML or Plain Text diff --git a/src/core/utils.js b/src/core/utils.js index 6f72b9c0..6ac9eb29 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -155,76 +155,6 @@ export function getList(iterable, keys) { return Im.List.isList(val) ? val : Im.List() } -// Adapted from http://stackoverflow.com/a/2893259/454004 -// Note: directly ported from CoffeeScript -export function formatXml (xml) { - var contexp, fn, formatted, indent, l, lastType, len, lines, ln, reg, transitions, wsexp - reg = /(>)(<)(\/*)/g - wsexp = /[ ]*(.*)[ ]+\n/g - contexp = /(<.+>)(.+\n)/g - xml = xml.replace(/\r\n/g, "\n").replace(reg, "$1\n$2$3").replace(wsexp, "$1\n").replace(contexp, "$1\n$2") - formatted = "" - lines = xml.split("\n") - indent = 0 - lastType = "other" - 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 - } - fn = function(ln) { - var fromTo, padding, type - - if (ln.match(/<.+\/>/)) { - type = "single" - } else if (ln.match(/<\/.+>/)) { - type = "closing" - } else if (ln.match(/<[^!?].*>/)) { - type = "opening" - } else { - type = "other" - } - fromTo = lastType + "->" + type - lastType = type - padding = "" - indent += transitions[fromTo] - padding = ((function() { - /* eslint-disable no-unused-vars */ - var m, ref1, results, j - results = [] - for (j = m = 0, ref1 = indent; 0 <= ref1 ? m < ref1 : m > ref1; j = 0 <= ref1 ? ++m : --m) { - results.push(" ") - } - /* eslint-enable no-unused-vars */ - return results - })()).join("") - if (fromTo === "opening->closing") { - formatted = formatted.substr(0, formatted.length - 1) + ln + "\n" - } else { - formatted += padding + ln + "\n" - } - } - for (l = 0, len = lines.length; l < len; l++) { - ln = lines[l] - fn(ln) - } - return formatted -} - - /** * Adapted from http://github.com/asvd/microlight * @copyright 2016 asvd diff --git a/test/core/utils.js b/test/core/utils.js index e50eb092..1068aab4 100644 --- a/test/core/utils.js +++ b/test/core/utils.js @@ -17,7 +17,6 @@ import { getAcceptControllingResponse, createDeepLinkPath, escapeDeepLinkPath, - formatXml, sanitizeUrl } from "core/utils" import win from "core/window" @@ -888,16 +887,6 @@ describe("utils", function() { }) }) - describe("formatXml", function() { - it("simple xml formatting", function() { - const startTime = Date.now() - const result = formatXml("john doe") - let duration = Date.now() - startTime - expect(result).toEqual("\n john doe\n\n") - expect(duration).toBeLessThan(5) - }) - }) - describe("sanitizeUrl", function() { it("should sanitize a `javascript:` url", function() { const res = sanitizeUrl("javascript:alert('bam!')")