Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // tidyit.cpp
- //
- // 11Jun'17 cwhii
- // Improvements based upon Stack Exchange,
- // https://codereview.stackexchange.com/a/165231/2421
- // 4May'17 cwhii
- // New, based upon tidylib example,
- // http://api.html-tidy.org/tidy/tidylib_api_5.1.25/tidylib.html
- // ---------------------------------------------------------------------------------------------------
- #include <sstream>
- #include <iostream>
- #include <string>
- #include <tidy/tidy.h>
- #include <tidy/buffio.h>
- class TidyDocCPP {
- std::string file_name_;
- TidyDoc tdoc_;
- TidyBuffer errbuf_;
- TidyBuffer outbuf_;
- int rc_;
- public:
- TidyDocCPP(const std::string file_name_a):file_name_{file_name_a},tdoc_{tidyCreate()},errbuf_{0},outbuf_{0},rc_{-1} {
- tidyOptSetInt(tdoc_, TidyIndentContent, yes);
- tidyOptSetBool(tdoc_, TidyXhtmlOut, yes);
- tidyOptSetBool(tdoc_, TidyForceOutput,yes);
- }
- ~TidyDocCPP() {
- tidyBufFree(&outbuf_);
- tidyBufFree(&errbuf_);
- tidyRelease(tdoc_);
- }
- TidyDocCPP(TidyDocCPP const&) = delete; // Rule of 5.
- TidyDocCPP(TidyDocCPP&&) = delete;
- TidyDocCPP& operator=(TidyDocCPP const&) = delete;
- TidyDocCPP& operator=(TidyDocCPP&&) = delete;
- operator TidyDoc() const {return tdoc_;} // Convert object back to C for use in C tidy functions
- char* getErr(){return (char*)((errbuf_.bp)?(char*)(errbuf_.bp):"");}
- char* getOut(){return (char*)((outbuf_.bp)?(char*)(outbuf_.bp):"");}
- int getRc(){return rc_;}
- bool is_severe_error(int code_a){return ((rc_=code_a)<0);} // Change to auto in cevelop 1.8.
- bool tidy(){
- return is_severe_error(tidySetErrorBuffer(tdoc_,&errbuf_))
- || is_severe_error(tidyParseFile(tdoc_,file_name_.c_str()))
- || is_severe_error(tidyCleanAndRepair(tdoc_))
- || is_severe_error(tidyRunDiagnostics(tdoc_))
- || is_severe_error(tidySaveBuffer(tdoc_,&outbuf_));
- }
- };
- const std::string tidy_file(std::string file_name_a) { // Change to auto in cevelop 1.8.
- TidyDocCPP tDoc{file_name_a};
- if (tDoc.tidy()){
- std::cerr << "tidyit-A severe error (" << tDoc.getRc() << ") occurred.\n";
- }
- std::cerr << "tidyit-Diagnostics:\n\n" << tDoc.getErr() << "\n";
- const std::string outstr{tDoc.getOut()};
- return outstr;
- }
- int main(int argc, char **argv) {
- std::cout << "tidyit-version: so-2\n\n";
- for (std::string name : {"poor.html","good.html"}){
- std::cout << "\nInput file name: " + name << std::endl;
- std::cout << tidy_file(name);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement