Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ 자료실
[14] [自作]src2html 0.1 : C++ 등의 소스 코드를 문법 강조(Syntax-Highlighted)된 HTML로...
김백일 [cedar] 8404 읽음    2002-08-24 14:52
cpp.stx 1.7KB 문법 정의 파일(C++용)
src2html.exe 424KB C++Builder 6로 컴파일한 실행 파일
header2=

http://www.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_tip&no=36 에 올린 팁에 있는 C++ 소스코드를 Syntax-Highlighted HTML로 변환하는 코드를 약간 수정했습니다.

정규표현식이 소스 코드내에 하드 코딩된 것을 수정하여, 별도의 텍스트 파일(cpp.stx)에서 읽어들이는 방식으로 고쳤습니다.

소스 코드를 수정하실 필요없이 cpp.stx 파일만 수정하면 HTML의 양식을 고칠 수 있고, cpp.stx 뿐만 아니라, pas.stx와 같이 다른 언어도 변환할 수 있도록 고쳐봤습니다.

문법 정의 파일은 src2html.exe와 같은 폴더에 넣어 두시면 됩니다.

IDE나 에디터에서 외부 프로그램으로 등록시켜서 사용해도 좋고, 웹 프로그래밍하시는 분들은 CGI에 응용하셔도 좋겠네요.

 
/*
 *   FILE:        src2html.cpp
 *   VERSION:     0.1
 *   DESCRIPTION: Converts a source file to syntax highlighted HTML.
 */
 
 
//---------------------------------------------------------------------------
 
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#pragma hdrstop
#include <iterator>
#include <map>
#include <boost/regex.hpp>
 
//---------------------------------------------------------------------------
 
using namespace std;
 
inline string extract_filepath(const string& filename)
{   // 윈도가 아닌 OS에서 수정 필요.
    return filename.substr(0, filename.rfind('\\'));
}
 
inline string extract_fileext(const string& filename)
{
    return filename.substr(filename.rfind('.') + 1, filename.length());
}
 
void load_syntax(map<string, string>& syntax, const string& filename);
string make_expression(map<string, string>& syntax);
string make_format(map<string, string>& syntax);
 
int main(int argc, char* argv[])
{
    if (argc < 1) exit(-1);
 
    try{
        string syntax_filename = extract_filepath(string(argv[0])) + '\\' +
                                 extract_fileext(string(argv[1])) + ".stx";
        map<string, string> syntax;
        load_syntax(syntax, syntax_filename);
 
        string header1 = syntax["header1"], header2 = syntax["header2"],
               footer = syntax["footer"], pre_format = syntax["pre_format"],
               s_expression = make_expression(syntax),
               s_format = make_format(syntax);
 
        cout << header1 << argv[1] << header2 << endl
             << s_expression << endl << s_format << endl
             << footer << endl;
 
        boost::regex pre_expression(syntax["pre_expression"]),
                     expression(s_expression);
 
        ifstream fin; ofstream fout;
        ostringstream t(ios::out | ios::binary);
        string in_filename, out_filename, in_filedata;
 
        for (int i = 1; i < argc; ++i)
        {
            in_filename = argv[i];
            cout << "Processing file " << in_filename << endl;
            syntax.clear();
 
            fin.open(in_filename.c_str());
            in_filedata.assign((istreambuf_iterator<char>(fin)),
                                istreambuf_iterator<char>());
            fin.close();
            out_filename = in_filename + ".htm";
            fout.open(out_filename.c_str());
            fout << header1 << in_filename << header2;
 
            // strip '<' and '>' first by outputting to a
            // temporary string stream
            boost::regex_merge(ostream_iterator<char>(t),
                                in_filedata.begin(), in_filedata.end(),
                                pre_expression, pre_format);
 
            // then output to final output stream
            // adding syntax highlighting:
            string s(t.str());
            boost::regex_merge(ostream_iterator<char>(fout),
                                s.begin(), s.end(), expression, s_format);
 
            fout << "footer";
            fout.close();
            system(out_filename.c_str());  // 윈도가 아닌 OS에서 수정 필요.
        }
    }
    catch(...) { return -1; }
    return 0;
}
//---------------------------------------------------------------------------
 
 
void load_syntax(map<string, string>& syntax, const string& filename)
{
 
    ifstream fin(filename.c_str());
    if (!fin) exit(0);
    string line, key, value;
    int pos;
    while (getline(fin, line)) {
        if (line.length() < 3 || line[0] == ';')                    continue;
        pos = line.find('=');
        if (pos < 2 || pos == string::npos)                         continue;
        key = line.substr(0, pos);
        value = line.substr(pos + 1, line.length());
        if (value.length() < 1)                                     continue;
        syntax.insert(map<string, string>::value_type(key, value));
    }
}
 
string make_expression(map<string, string>& syntax)
{
    string expression_num = "expression1", expressions = syntax[expression_num];
 
    for (char i = '2'; i <= '9'; ++i) {
        expression_num[10] = i;
        if (!syntax.count(expression_num)) break;
        expressions += '|' + syntax[expression_num];
    }
 
 
    return expressions;
}
 
string make_format(map<string, string>& syntax)
{
    string format_num = "format#", formats;
 
    for (char i = '1'; i <= '9'; ++i) {
        format_num[6] = i;
        if (!syntax.count(format_num)) break;
        formats += "(?" + (i + syntax[format_num] + ')');
    }
 
 
    return formats;
}
김백일.cedar [cedar]   2002-08-24 14:57 X
위의 cpp.stx을 웹 브라우저에서 보면 이상한 모양으로 나옵니다. -_-;
김백일.cedar [cedar]   2002-08-24 14:58 X
다운 받으셔서 텍스트 에디터로 보시거나, IE의 경우 [보기]-[소스]를 선택해서 보세요.
김백일.cedar [cedar]   2002-08-24 15:02 X
명령행 인자로 여러개의 파일을 받아 변환하는 기능이 있지만, 문법 파일은 첫번째 파일의 확장자로 선택됩니다.
김백일.cedar [cedar]   2002-08-24 15:03 X
두번째 파일의 확장자로 다른 것이 와도, 전혀 고려하지 않습니다. -_-;;
김백일.cedar [cedar]   2002-08-24 15:04 X
저작권(?)은 없습니다. 맘대로 퍼가세요. *^^*
김백일.cedar [cedar]   2002-08-30 23:43 X
참고: cpp.stx에는 C++Builder 용으로 확장된 키워드도 들어있습니다.

+ -

관련 글 리스트
14 [自作]src2html 0.1 : C++ 등의 소스 코드를 문법 강조(Syntax-Highlighted)된 HTML로... 김백일 8404 2002/08/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.