# Programmatically get InputText of box structure without spaces

I am looking for a way to get something similar to the "Input Text" form of an arbitrary box structure, but without the extra whitespaces.

Before I explain the requirements in a bit more detail, let's look at two examples:

cell1 = Cell[BoxData[
RowBox[{
RowBox[{"f", "[", RowBox[{"a", ",", "b"}], "]"}],
"+",
RowBox[{"g", "[", RowBox[{"c", ",", "d"}], "]"}]
}]
], "Input"];

cell2 = Cell[BoxData[
SuperscriptBox[
RowBox[{"f", "[", RowBox[{
RowBox[{"(", GridBox[{{"a", "b"}, {"c", "d"}}], ")"}],
",", "3"}], "]"}],
"2"
]
], "Input"];

cells = {cell1, cell2};


These cells look like this:

The function I'm looking for (let's call it toInputString in the following) should return the following:

toInputString /@ cells
(* {
"f[a,b]+g[c,d]",
"f[({{a,b},{c,d}}),3]^2"
} *)


### Requirements

These are the properties of toInputString that I'm looking for, in order of priority:

• I need to do "Box structure IN" -> "String STR" -> "Box structure OUT" in the end. This question is about the first step (the second is done using MathLinkCallFrontEnd[FrontEndUndocumentedTestFEParserPacket[STR,False]])
• The two box structures IN and OUT must be semantically equivalent, i.e. evaluating either of them should yield the same result. (This rules out FrontEndExecute@FrontEndExportPacket[IN,"PlainText"])
• The string STR should be as readable as possible, i.e. no embedded box structures in the string if possible
• The two box structures IN and OUT should be as similar as possible:
• For example, postfix notation and line breaks should be preserved
• No extraneous whitespaces should be present in STR (which are typically added by Mathematica when converting to text), as they will then be present in OUT as well.
• The GridBox in the example above can be removed for instance, since the string would be harder to read otherwise.

### Attempts

Here are some of my attempts:

(* generates too many whitespaces that get kept in OUT *)
toInputString[box_]:=FrontEndExecute@FrontEndExportPacket[box, "InputText"]

(* gives the same result as the first one *)
toInputString[box_]:=FrontEndExecute@FrontEndExportPacket[
Append[TextClipboardType -> "Package"]@box,
"InputText"
]

(* gives the same result as the first one *)
toInputString[box_]:=FrontEndExecute@FrontEndExportPacket[
Append[AutoSpacing -> False]@box,
"InputText"
]

(* doesn't preserve semantics, e.g. cell2 breaks with this *)
toInputString[box_]:=FrontEndExecute@FrontEndExportPacket[box, "PlainText"]
`

One possibility might be to post-process the string to strip out any superfluous whitespace (ignoring those within strings), but that seems a bit hacky…