소스코드의 <, >, & 를 &lt;, &gt;, &amp;로 변환해주는 프로그램

카테고리 없음

2019. 1. 16. 21:36

01. 서론

블로그에 소스코드를 삽입하다 보니 문제점에 봉착했다. 티스토리 블로그에 코드를 삽입할 때 html 형태로 들어가게 되는데, html에서는 <, > 그리고 &의 특수문자들을 다른 방식으로 해석하기 때문에 코드 삽입에 오류가 생긴다. 그래서 간단하게 이 특수문자들을 html에서 인식할 수 있게끔 소스코드를 변환시켜주는 프로그램을 만들어 보기로 했다.


02. 구상

- 사용할 언어 : C++

- 처음에는 단어 단위로 변환해보려고 하다가 tab이나 space 등을 처리하는데에 문제가 생겨서 getline을 통해 문장단위로 읽어들여 char 하나씩 검사하고 변환하는 방식으로 프로그램 하였다.


03. 실행

$ g++ code-translate.cpp -o code-translate
$ ./code-translate example.cpp example-out.cpp

* example.cpp

#include<iostream>
using namespace std;

// this code has a lot of <, >, &

int main(void)
{
	string one;
	string &two = one;
	string &three = two;

	int a = 1;
	int b = 2;
	int c = (a > b) ? a : b;
	int d = (b < c) ? b : c;

	return 0;
}

*example-out.cpp


04. 코드

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main(int argc, char* argv[])
{
	ifstream inp;
	ofstream out;
	vector<string> code;

	if(argc != 3) {
		cout << "how to use : ";
		cout << "./codetranslate <inputfilename> <outputfilename>" << endl;
		return 0;
	}

	inp.open(argv[1]);
	out.open(argv[2]);	

	for(string line; getline(inp, line); ) {
		for(int i=0; i<line.length(); ++i) {
			switch(line[i]) {
				case '<':
					line.replace(i, 1, "&lt;");
					i += 3;
					break;
				case '>':
					line.replace(i, 1, "&gt;");
					i += 3;
					break;
				case '&':
					line.replace(i, 1, "&amp;");
					i += 4;
					break;
				default:
					break;
			}
		}
		code.push_back(line);
	}

	for(auto it=code.begin(); it!=code.end(); ++it)
		out << *it << endl;

	inp.close();
	out.close();

	return 0;
}

05. 결론

간단한 프로그램이지만 스스로 필요성을 느끼고 직접 만들었다는 점이 뿌듯하고 이 프로그램을 사용하여 코드를 편하게 블로그에 포스팅 할 수 있음에 행복하다. 이 블로그에 놀러오는 블로거 분들중 필요하면 얼마든지 사용하시길 바란다.