root/trunk/0030_RegularExpression/RegularExpressionTest.cpp

User picture

Author: Setsu

Revision: 348 («Previous)


File Size: 5.2 KB

(June 16, 2010 11:10 UTC) Almost 2 years ago

0030_RegularExpression

 
Show/hide line numbers
//
//  RegularExpressionTest.cpp
//
//  Created by Setsu on 6/13/2010.
//  Copyright 2010 RoundSquare Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
// 
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//

//----------------------------------------
//	include
//----------------------------------------
#include <Poco/Logger.h>
#include <Poco/PatternFormatter.h>
#include <Poco/FormattingChannel.h>
#include <Poco/ConsoleChannel.h>
#include <Poco/Format.h>
#include <Poco/Net/HTTPStreamFactory.h>
#include <Poco/FileStream.h>
#include <Poco/StreamCopier.h>
#include <Poco/URI.h>
#include <Poco/URIStreamOpener.h>
#include <Poco/RegularExpression.h>
#include <Poco/String.h>

#include <string>
#include <sstream>

#include "ScopedLogMessage.h"

//----------------------------------------
//	const
//----------------------------------------
const char* kOutputFileName = "RegularExpression.html";
const char* kSourceFileName = "http://pocoproject.org/docs/Poco.RegularExpression.html";

const char* LeadingHTML =
	"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>\n"
	"<html xmlns='http://www.w3.org/1999/xhtml'>\n"
	"<head>\n"
	"<title>Class Poco::RegularExpression</title>\n"
	"</head>\n"
	"<body>\n"
	"<table border='1'>\n"
	"<th>Method/Enumeration</th><th>Description</th>\n";

const char* TrailingHTML =
	"</table>\n"
	"</body>\n";

//----------------------------------------
//	PrepareConsoleLogger
//----------------------------------------
void PrepareConsoleLogger(const std::string& name, int level=Poco::Message::PRIO_INFORMATION)
{
	Poco::FormattingChannel* pFCConsole = new Poco::FormattingChannel(new Poco::PatternFormatter("%t"));
	pFCConsole->setChannel(new Poco::ConsoleChannel);
	pFCConsole->open();

	Poco::Logger::create(name, pFCConsole, level);
}

//----------------------------------------
//	main
//----------------------------------------
int main(int /*argc*/, char** /*argv*/)
{
	PrepareConsoleLogger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION);

	ScopedLogMessage msg("RegularExpressionTest ", "start", "end");

	{
		Poco::FileOutputStream ostr(kOutputFileName);

		ostr << LeadingHTML;

		Poco::Net::HTTPStreamFactory::registerFactory();
		Poco::URI uri(kSourceFileName);
		try
		{
			std::auto_ptr<std::istream> pStr(Poco::URIStreamOpener::defaultOpener().open(uri));
			std::stringstream ss;
			Poco::StreamCopier::copyStream(*pStr.get(), ss);

			msg.Message(Poco::format(" Finding out methods/enumerations from \"%s\".", std::string(kSourceFileName)));
			Poco::RegularExpression re("<a name=\"[0-9]+\">[A-Za-z]+</a>");
			Poco::RegularExpression::Match match;
			match.offset = 0;
			while(0 != re.match(ss.str(), match.offset, match))
			{
				std::string foundStr(ss.str().substr(match.offset, match.length));

				std::string numStr;
				Poco::RegularExpression re_num("[0-9]+");
				re_num.extract(foundStr, 0, numStr);
				
				std::string nameStr;
				Poco::RegularExpression re_name("[A-Za-z]+");
				re_name.extract(foundStr, std::strlen("<a name=\"\">")+numStr.length(), nameStr);

				msg.Message(Poco::format("  found \"%s\"", nameStr));

				ostr << "<tr><td><a href='" << uri.toString() << "#" << numStr << "' target='_blank'>"
					 << nameStr << "</a></td>";

				std::string descStr;
				Poco::RegularExpression re_desc("(description\">\n<p>)(.*)(</p>)");
				Poco::RegularExpression::Match match_desc;
				if(re_desc.match(ss.str(), match.offset, match_desc))
				{
					descStr = ss.str().substr(match_desc.offset, match_desc.length);
					re_desc.subst(descStr, "$2");
					Poco::replaceInPlace(descStr, "\"", "'");
					Poco::replaceInPlace(descStr, "href='Poco.", "href='http://pocoproject.org/docs/Poco.");
				}
				ostr << "<td>" << descStr << "</td></tr>" << std::endl;

				match.offset += match.length;
			}
		}
		catch(Poco::Exception& exc)
		{
			msg.Message(exc.displayText());
		}

		ostr << TrailingHTML;
	}
	msg.Message(Poco::format(" HTML file \"%s\" created.", std::string(kOutputFileName)));

	return 0;
}