Author: jreidinger
Date: Tue Apr 22 09:26:44 2008
New Revision: 9767
URL: http://svn.opensuse.org/viewcvs/zypp?rev=9767&view=rev
Log:
add richtext support to zypper info (bnc #224677).
Added:
trunk/zypper/src/zypper-richtext.cc
trunk/zypper/src/zypper-richtext.h
Modified:
trunk/zypper/src/CMakeLists.txt
trunk/zypper/src/zypper-info.cc
Modified: trunk/zypper/src/CMakeLists.txt
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/CMakeLists.txt?rev=9767&r1=9766&r2=9767&view=diff
==============================================================================
--- trunk/zypper/src/CMakeLists.txt (original)
+++ trunk/zypper/src/CMakeLists.txt Tue Apr 22 09:26:44 2008
@@ -16,6 +16,7 @@
zypper-search.h
zypper-info.h
zypper-prompt.h
+ zypper-richtext.h
zypper-tabulator.h
zypper-locks.h
zypper-keyring-callbacks.h
@@ -36,6 +37,7 @@
zypper-info.cc
zypper-tabulator.cc
zypper-prompt.cc
+ zypper-richtext.cc
zypper-locks.cc
${zypper_HEADERS}
)
Modified: trunk/zypper/src/zypper-info.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-info.cc?rev=9767&r1=9766&r2=9767&view=diff
==============================================================================
--- trunk/zypper/src/zypper-info.cc (original)
+++ trunk/zypper/src/zypper-info.cc Tue Apr 22 09:26:44 2008
@@ -14,6 +14,7 @@
#include "zypper-misc.h"
#include "zypper-tabulator.h"
#include "zypper-info.h"
+#include "zypper-richtext.h"
using namespace std;
using namespace zypp;
@@ -21,7 +22,6 @@
extern ZYpp::Ptr God;
-
void printNVA(const ResObject::constPtr & res)
{
cout << _("Name: ") << res->name() << endl;
@@ -34,7 +34,15 @@
{
cout << _("Summary: ") << res->summary() << endl;
cout << _("Description: ") << endl;
- cout << res->description() << endl;
+ const string& s = res->description();
+ if (s.find("DT:Rich")!=s.npos){
+ string ns = processRichText(s);
+ cout << ns << endl;
+ }
+ else
+ {
+ cout << s << endl;
+ }
}
/**
Added: trunk/zypper/src/zypper-richtext.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-richtext.cc?rev=9767&view=auto
==============================================================================
--- trunk/zypper/src/zypper-richtext.cc (added)
+++ trunk/zypper/src/zypper-richtext.cc Tue Apr 22 09:26:44 2008
@@ -0,0 +1,254 @@
+#include <sstream>
+#include <map>
+#include <vector>
+#include <string>
+
+#include "zypp/base/Logger.h"
+#include "zypp/base/String.h"
+
+using namespace std;
+
+enum tags {
+ PARAGRAPH,
+ PRE,
+ BLOCKQUOTE,
+ BOLD,
+ UNDERLINED,
+ ANCHOR,
+ HEADER1,
+ HEADER2,
+ HEADER3,
+ BREAK_LINE,
+ EM,
+ ITALIC,
+ HR,
+ LI,
+ OL,
+ UL,
+ TT,
+ QT,
+ BIG,
+ CODE,
+ CENTER,
+ //special for unknown tags
+ UNKNOWN
+};
+
+std::map _RTtagmap;
+
+bool pre;
+bool ordered;
+unsigned count_list_items;
+
+void fillTagmap()
+{
+ _RTtagmap["p"] = PARAGRAPH;
+ _RTtagmap["a"] = ANCHOR;
+ _RTtagmap["b"] = BOLD;
+ _RTtagmap["u"] = UNDERLINED;
+ _RTtagmap["i"] = ITALIC;
+ _RTtagmap["br"] = BREAK_LINE;
+ _RTtagmap["em"] = EM;
+ _RTtagmap["h1"] = HEADER1;
+ _RTtagmap["h2"] = HEADER2;
+ _RTtagmap["h3"] = HEADER3;
+ _RTtagmap["hr"] = HR;
+ _RTtagmap["li"] = LI;
+ _RTtagmap["ol"] = OL;
+ _RTtagmap["ul"] = UL;
+ _RTtagmap["qt"] = QT;
+ _RTtagmap["tt"] = TT;
+ _RTtagmap["big"] = BIG;
+ _RTtagmap["pre"] = PRE;
+ _RTtagmap["bold"] = BOLD;
+ _RTtagmap["code"] = CODE;
+ _RTtagmap["font"] = UNKNOWN; //not parsed in parser
+ _RTtagmap["large"] = UNKNOWN; //same as ncurses
+ _RTtagmap["small"] = UNKNOWN; // same as necurses
+ _RTtagmap["center"] = CENTER;
+ _RTtagmap["strong"] = BOLD; // same as necurses
+ _RTtagmap["blockquote"] = BLOCKQUOTE; // same as necurses
+
+}
+
+string closeTag(vector<tags>& tagStack)
+{
+ if(tagStack.empty())
+ {
+ WAR << "closing tag before any opening" << endl;;
+ }
+ tags t = tagStack.back();
+ tagStack.pop_back();
+ switch(t)
+ {
+ case PARAGRAPH:
+ return "\n\n";
+ case LI:
+ return "\n";
+ case PRE:
+ pre = false; //fall thrue
+ default:
+ return "";
+ }
+}
+
+string openTag(vector<tags>& tagStack, string& tag)
+{
+ tag = zypp::str::trim(tag);
+ std::map::const_iterator it = _RTtagmap.find(tag);
+ tags t;
+ if (it == _RTtagmap.end())
+ {
+ if (tag.size()>3 && tag[0]=='!' && tag[1]=='-' && tag[2]=='-')
+ return ""; //comment
+ WAR << "unknown rich text tag "<second;
+ }
+ tagStack.push_back(t);
+ switch(t)
+ {
+ case PARAGRAPH:
+ return "";
+ case BREAK_LINE:
+ return "\n";
+ case OL:
+ ordered = true;
+ count_list_items = 0;
+ return "\n";
+ case UL:
+ ordered = false;
+ return "\n";
+ case LI:
+ if (ordered)
+ {
+ ostringstream res;
+ res << ++count_list_items << ") ";
+ res.flush();
+ return res.str();
+ }
+ else
+ {
+ return "- ";
+ }
+ case PRE:
+ pre = true; //fall thrue
+ default:
+ return "";
+ }
+}
+
+std::map ampersmap;
+
+void fillAmpersmap()
+{
+ ampersmap["gt"]=">";
+ ampersmap["lt"]="<";
+ ampersmap["amp"]="&";
+ ampersmap["quot"]="\"";
+ ampersmap["nbsp"]=" "; //TODO REAL NBSP
+ ampersmap["product"]="product"; //TODO replace with real name
+}
+
+string getStringFromAmpr(const string& str)
+{
+ if (ampersmap.empty())
+ fillAmpersmap();
+
+ string::size_type end = str.find(';');
+ DBG << "val ampr is: " << str << endl;
+ if (str[0] == '#') //first is value
+ {
+ int res = 0;
+ istringstream sstr(str.substr(1,end));
+ sstr >> res;
+ DBG << res << endl;
+ if (res!=0)
+ {
+ return string(1,(char)res); //return char
+ }
+ else
+ {
+ WAR << "unknown number " << str << endl;
+ return "";
+ }
+ }
+
+ DBG << end <<" "<',pos);
+ res.append(closeTag(tagStack));
+ }
+ else
+ {
+ string::size_type tagEndPos = text.find('>',pos);
+ if(tagEndPos==text.npos)
+ {
+ WAR << "ended with non-closed tag " << endl;
+ return res;
+ }
+ string tagname = text.substr(pos+1,tagEndPos-pos-1);
+ pos = tagEndPos;
+ res.append(openTag(tagStack,tagname));
+ }
+ break;
+ case '&':
+ {
+ string::size_type semipos = text.find(';',pos);
+ string tmp = getStringFromAmpr(text.substr(pos+1,pos-semipos-1));
+ DBG << "tmp is: " << tmp << endl;
+ res.append(tmp);
+ pos = semipos;
+ break;
+ }
+ default:
+ res.push_back(text[pos]);
+ }
+
+ ++pos;
+ } while (pos!=text.size());
+ return res;
+}
+
Added: trunk/zypper/src/zypper-richtext.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-richtext.h?rev=9767&view=auto
==============================================================================
--- trunk/zypper/src/zypper-richtext.h (added)
+++ trunk/zypper/src/zypper-richtext.h Tue Apr 22 09:26:44 2008
@@ -0,0 +1,10 @@
+#ifndef ZYPPERRICHTEXT_H_
+#define ZYPPERRICHTEXT_H_
+
+
+#include <string>
+
+std::string processRichText(const std::string& text);
+
+#endif
+
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org