aboutsummaryrefslogtreecommitdiff
path: root/mod
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-10-17 18:48:46 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-10-17 18:48:46 +0300
commitff96d28f969a6716cfc9ccefe94e70132bc4d6db (patch)
tree1fce38985479e9152fdbaf2348e03036ba487810 /mod
parent48d4ae50d57d58c35b25d2917faad6700783ac0d (diff)
Display package description as a pre-formatted text
Diffstat (limited to 'mod')
-rw-r--r--mod/mod-package-details.cxx15
-rw-r--r--mod/mod-package-version-details.cxx31
-rw-r--r--mod/mod-repository-details.cxx2
-rw-r--r--mod/page.cxx41
-rw-r--r--mod/page.hxx46
5 files changed, 83 insertions, 52 deletions
diff --git a/mod/mod-package-details.cxx b/mod/mod-package-details.cxx
index 68e6530..df69614 100644
--- a/mod/mod-package-details.cxx
+++ b/mod/mod-package-details.cxx
@@ -183,12 +183,17 @@ handle (request& rq, response& rs)
//
s << H2 << pkg->summary << ~H2;
- static const string id ("description");
- if (const auto& d = pkg->description)
+ if (const optional<string>& d = pkg->description)
+ {
+ const string id ("description");
+
s << (full
- ? P_DESCRIPTION (*d, id)
- : P_DESCRIPTION (*d, options_->package_description (),
- url (!full, squery, page, id)));
+ ? PRE_TEXT (*d, id)
+ : PRE_TEXT (*d,
+ options_->package_description (),
+ url (!full, squery, page, id),
+ id));
+ }
s << TABLE(CLASS="proplist", ID="package")
<< TBODY
diff --git a/mod/mod-package-version-details.cxx b/mod/mod-package-version-details.cxx
index bd06d76..b548b32 100644
--- a/mod/mod-package-version-details.cxx
+++ b/mod/mod-package-version-details.cxx
@@ -178,12 +178,17 @@ handle (request& rq, response& rs)
s << H2 << pkg->summary << ~H2;
- static const string id ("description");
- if (const auto& d = pkg->description)
+ if (const optional<string>& d = pkg->description)
+ {
+ const string id ("description");
+
s << (full
- ? P_DESCRIPTION (*d, id)
- : P_DESCRIPTION (*d, options_->package_description (),
- url (!full, id)));
+ ? PRE_TEXT (*d, id)
+ : PRE_TEXT (*d,
+ options_->package_description (),
+ url (!full, id),
+ id));
+ }
const repository_location& rl (pkg->internal_repository.load ()->location);
@@ -483,14 +488,20 @@ handle (request& rq, response& rs)
s << ~DIV;
}
- const auto& ch (pkg->changes);
+ const string& ch (pkg->changes);
+
if (!ch.empty ())
+ {
+ const string id ("changes");
+
s << H3 << "Changes" << ~H3
<< (full
- ? PRE_CHANGES (ch)
- : PRE_CHANGES (ch,
- options_->package_changes (),
- url (!full, "changes")));
+ ? PRE_TEXT (ch, id)
+ : PRE_TEXT (ch,
+ options_->package_changes (),
+ url (!full, "changes"),
+ id));
+ }
s << ~DIV
<< ~BODY
diff --git a/mod/mod-repository-details.cxx b/mod/mod-repository-details.cxx
index 6d3b8c1..d68a16e 100644
--- a/mod/mod-repository-details.cxx
+++ b/mod/mod-repository-details.cxx
@@ -130,7 +130,7 @@ handle (request& rq, response& rs)
<< ~P;
if (r.description)
- s << P_DESCRIPTION (*r.description);
+ s << P_TEXT (*r.description);
if (r.certificate)
{
diff --git a/mod/page.cxx b/mod/page.cxx
index 1b2faae..eab28c6 100644
--- a/mod/page.cxx
+++ b/mod/page.cxx
@@ -746,23 +746,23 @@ namespace brep
s << SPAN(CLASS=to_string (status_)) << status_ << ~SPAN;
}
- // P_DESCRIPTION
+ // P_TEXT
//
- void P_DESCRIPTION::
+ void P_TEXT::
operator() (serializer& s) const
{
- if (description_.empty ())
+ if (text_.empty ())
return;
- auto n (description_.find_first_of (" \t\n", length_));
- bool full (n == string::npos); // Description length is below the limit.
+ size_t n (text_.find_first_of (" \t\n", length_));
+ bool full (n == string::npos); // Text length is below the limit.
- // Truncate description if length exceed the limit.
+ // Truncate the text if length exceeds the limit.
//
- const string& d (full ? description_ : string (description_, 0, n));
+ const string& t (full ? text_ : string (text_, 0, n));
- // Format the description into paragraphs, recognizing a blank line as
- // paragraph separator, and replacing single newlines with a space.
+ // Format the text into paragraphs, recognizing a blank line as paragraph
+ // separator, and replacing single newlines with a space.
//
s << P;
@@ -770,7 +770,7 @@ namespace brep
s << ID(id_);
bool nl (false); // The previous character is '\n'.
- for (const auto& c: d)
+ for (const char& c: t)
{
if (c == '\n')
{
@@ -803,21 +803,26 @@ namespace brep
s << ~P;
}
- // PRE_CHANGES
+ // PRE_TEXT
//
- void PRE_CHANGES::
+ void PRE_TEXT::
operator() (serializer& s) const
{
- if (changes_.empty ())
+ if (text_.empty ())
return;
- auto n (changes_.find_first_of (" \t\n", length_));
- bool full (n == string::npos); // Changes length is below the limit.
+ size_t n (text_.find_first_of (" \t\n", length_));
+ bool full (n == string::npos); // Text length is below the limit.
- // Truncate changes if length exceed the limit.
+ // Truncate the text if length exceeds the limit.
//
- const string& c (full ? changes_ : string (changes_, 0, n));
- s << PRE(ID="changes") << c;
+ const string& t (full ? text_ : string (text_, 0, n));
+ s << PRE;
+
+ if (!id_.empty ())
+ s << ID(id_);
+
+ s << t;
if (!full)
{
diff --git a/mod/page.hxx b/mod/page.hxx
index 4b59e7d..f8d2830 100644
--- a/mod/page.hxx
+++ b/mod/page.hxx
@@ -520,53 +520,63 @@ namespace brep
const bbot::result_status& status_;
};
- // Generates package description element.
+ // Generates paragraph elements converting a plain text into XHTML5 applying
+ // some heuristics (see implementation for details). Truncate the text if
+ // requested.
//
- class P_DESCRIPTION
+ // Note that there is no way to specify that some text fragment must stay
+ // pre-formatted. Thus, don't use this type for text that can contain such
+ // kind of fragments and consider using PRE_TEXT instead.
+ //
+ class P_TEXT
{
public:
- // Genereate full description.
+ // Generate full text elements.
//
- P_DESCRIPTION (const string& d, const string& id = "")
- : description_ (d), length_ (d.size ()), url_ (nullptr), id_ (id) {}
+ P_TEXT (const string& t, const string& id = "")
+ : text_ (t), length_ (t.size ()), url_ (nullptr), id_ (id) {}
- // Genereate brief description.
+ // Generate brief text elements.
//
- P_DESCRIPTION (const string& d, size_t l, const string& u)
- : description_ (d), length_ (l), url_ (&u) {}
+ P_TEXT (const string& t, size_t l, const string& u, const string& id = "")
+ : text_ (t), length_ (l), url_ (&u), id_ (id) {}
void
operator() (xml::serializer&) const;
private:
- const string& description_;
+ const string& text_;
size_t length_;
const string* url_; // Full page url.
string id_;
};
- // Generates package description element.
+ // Generates pre-formatted text element. Truncate the text if requested.
//
- class PRE_CHANGES
+ class PRE_TEXT
{
public:
- // Genereate full changes info.
+ // Generate a full text element.
//
- PRE_CHANGES (const string& c)
- : changes_ (c), length_ (c.size ()), url_ (nullptr) {}
+ PRE_TEXT (const string& t, const string& id = "")
+ : text_ (t), length_ (t.size ()), url_ (nullptr), id_ (id) {}
- // Genereate brief changes info.
+ // Generate a brief text element.
//
- PRE_CHANGES (const string& c, size_t l, const string& u)
- : changes_ (c), length_ (l), url_ (&u) {}
+ PRE_TEXT (const string& t,
+ size_t l,
+ const string& u,
+ const string& id = "")
+ : text_ (t), length_ (l), url_ (&u), id_ (id) {}
void
operator() (xml::serializer&) const;
private:
- const string& changes_;
+ const string& text_;
size_t length_;
const string* url_; // Full page url.
+ string id_;
};
// Generates paging element.