diff options
| -rw-r--r-- | ChangeLog | 2 | ||||
| -rw-r--r-- | src/domhelpers.h | 2 | ||||
| -rw-r--r-- | src/tags.h | 4 | ||||
| -rw-r--r-- | src/xmlcomposer.cpp | 62 | 
4 files changed, 51 insertions, 19 deletions
@@ -7,7 +7,7 @@ Version 0.9.6   - Now has option for pretty printing output XML   - Displays version with '-v' argument   - Fixed problems with Unicode - - Support for bookmarks. + - Support for bookmarks and links to bookmarks.  Version 0.9.5   - Allow conversions on stdin and stdout diff --git a/src/domhelpers.h b/src/domhelpers.h index 2c29da0..7d3a94d 100644 --- a/src/domhelpers.h +++ b/src/domhelpers.h @@ -43,6 +43,7 @@  #include <map>  #include <stack>  #include <set> +#include <vector>  /*   * DOMHelpers @@ -101,6 +102,7 @@ public:  // Some other handy types  typedef std::set<string> StringSet; +typedef std::vector<string> StringArray;  typedef std::stack<DOM::Node> NodeStack;  /* @@ -89,7 +89,6 @@ static const char* kElBookmark = "bookmark";  static const char* kElRef = "ref";  static const char* kElFont = "font";  static const char* kElOptions = "options"; -static const char* kElLink = "link";  // Attributes  static const char* kAtName = "name"; @@ -105,7 +104,6 @@ static const char* kAtStart = "start";  static const char* kAtId = "id";  static const char* kAtTo = "to";  static const char* kAtSize = "size"; -static const char* kAtHref = "href";  static const char* kAtAlign = "align";  static const char* kAtIndent = "indent"; @@ -118,6 +116,8 @@ static const char* kValUpperRoman = "upper-roman";  static const char* kValArabic = "arabic";  static const char* kValNull = "";  static const char* kValFootNote = "footnote"; +static const char* kValBookmark = "bookmark"; +static const char* kValHyperlink = "hyperlink";  static const char* kValList = "list";  static const char* kValPara = "para";  static const char* kValTable = "table"; diff --git a/src/xmlcomposer.cpp b/src/xmlcomposer.cpp index b23a06c..36d9728 100644 --- a/src/xmlcomposer.cpp +++ b/src/xmlcomposer.cpp @@ -51,6 +51,36 @@ string formatInt(int num)    return string(buff);  } +void tokenize(const string& str, StringArray& tokens, +			  const string& delim = " ", bool trim = false) +{ +    // Skip delimiters at beginning. +    string::size_type lp = str.find_first_not_of(delim, 0); + +    // Find first "non-delimiter". +    string::size_type p = str.find_first_of(delim, lp); + +    while(string::npos != p || string::npos != lp) +    { +		string s = str.substr(lp, p - lp); + +		if(trim) +		{ +			string::size_type b = s.find_first_not_of(" \t"); +			if(b != string::npos) +				s.erase(0, b); +			string::size_type e = s.find_last_not_of(" \t"); +			if(e != string::npos) +				s.erase(e + 1); +		} + +        tokens.push_back(s); + +        lp = str.find_first_not_of(delim, p); +        p = str.find_first_of(delim, lp); +    } +} +  /* ----------------------------------------------------------------------------------   *  CONSTRUCTION   */ @@ -1054,26 +1084,26 @@ ON_CONTROLWORD(Field)  	// And now we get to the precalculated field result...  	else if(cw == "fldrslt")  	{ -		// If we have a field code that we want to mess with ... -		if(!fieldCode.empty()) +		StringArray codes; +		tokenize(fieldCode, codes, "\"", true); + +		if(codes.size() >= 2 && codes[0].compare(kFieldHyperlink) == 0)  		{ -			// Try to find a field code we recognize -			wstring::size_type p = fieldCode.find_first_not_of(" \t"); +			AN_ELEMENT(kElRef); -			if(fieldCode.compare(p, kFieldHyperlink.size(), kFieldHyperlink) == 0) +			// is it a bookmark link? +			if(codes.size() >= 4 && codes[1] == "\\l" && +			   !codes[2].empty())  			{ -				p += kFieldHyperlink.size(); - -				// Find first quote -				p = fieldCode.find('"', p); -				p = (p == string::npos) ? 0 : p + 1; - -				// And the end quote -				wstring::size_type e = fieldCode.find('"', p); -				e = (e == string::npos) ? string::npos : e - p; +				AN_ATTRIBUTE(kAtType, "bookmark"); +				AN_ATTRIBUTE(kAtTo, codes[2]); +			} -				AN_ELEMENT(kElLink); -				AN_ATTRIBUTE(kAtHref, fieldCode.substr(p, e)); +			// A normal hyperlink +			else +			{ +				AN_ATTRIBUTE(kAtType, "hyperlink"); +				AN_ATTRIBUTE(kAtTo, codes[1]);  			}  		}  	}  | 
