头文件定义
#pragma once
#include <string>
#define TAB_SPACE " "
#define NEW_LINE "\r\n"
class CFormat
{
public:
virtual int format(CString input, CString& output) = 0;
virtual int importDemo(CString &input) = 0;
std::string getLevelStr(int level);
};
enum OpenStatus { Open,Close };
getLevelStr函数
std::string CFormatJson::getLevelStr(int level)
{
std::string levelStr = "";
for (int i = 0; i < level; i++)
{
levelStr += TAB_SPACE;
}
return levelStr;
}
格式化代码实现
int CFormatXml::format(CString input, CString& output) {
std::string result = "";
std::string inputData;
OpenStatus beforeIsOpen = Open;
OpenStatus afterIsOpen = Open;
int openCnt = 0;
int closeCnt = 0;
int level = 0;
inputData = CT2A(input.GetString());
for (std::string::size_type index = 0; index < inputData.size(); index++)
{
char c = inputData[index];
if (level > 0 && '\r\n' == inputData[inputData.size() - 1])
{
result += getLevelStr(level);
}
switch (c)
{
case '<':
// xml头时
if (inputData[index + 1] == '?') {
result = result + c;
continue;
}
// 开<a>
if (inputData[index + 1] != '/') {
openCnt++;
afterIsOpen = Open;
}
else {
// 关 </a>
afterIsOpen = Close;
}
// 前开,后关不换行,无缩进
if (beforeIsOpen == Open && afterIsOpen == Close) {
}
else {
// 去除后面空格
result.erase(result.find_last_not_of(" ") + 1);
// 第一行不缩进
if (index > 0) {
// 换行
result += NEW_LINE;
level = openCnt - closeCnt - 1;
result += getLevelStr(level);
}
}
result = result + c;
// 保留状态放在最下面
if (inputData[index + 1] != '/') {
}
else {
// 关 </a>
closeCnt++;
}
beforeIsOpen = afterIsOpen;
break;
case '>':
// xml头时
if (inputData[index - 1] == '?') {
result = result + c;
continue;
}
// 关<a/>
if (inputData[index - 1] == '/') {
closeCnt++;
afterIsOpen = Close;
beforeIsOpen = afterIsOpen;
}
result = result + c;
break;
default:
// 回车键
if (c == '\r' || c == '\n') {
}
else {
result += c;
}
break;
}
}
// 输出
output = result.c_str();
return 1;
}