mastodonpp  0.5.7
C++ wrapper for the Mastodon and Pleroma APIs.
Classes | Typedefs | Enumerations | Functions
mastodonpp Namespace Reference

C++ wrapper for the Mastodon API. More...

Classes

class  API
 Holds API endpoints. More...
 
struct  event_type
 A stream event. More...
 
class  Connection
 Represents a connection to an instance. Used for requests. More...
 
class  CURLWrapper
 Handles the details of network connections. More...
 
class  CURLException
 Exception for libcurl errors. More...
 
class  Instance
 Holds the access data of an instance. More...
 
struct  answer_type
 Return type for Requests. More...
 

Typedefs

using endpoint_variant = variant< API::endpoint_type, string_view >
 An endpoint. Either API::endpoint_type or std::string_view. More...
 
using parametermap = map< string_view, variant< string_view, vector< string_view > >>
 std::map of parameters for API calls. More...
 
using parameterpair = pair< string_view, variant< string_view, vector< string_view > >>
 A single parameter of a parametermap. More...
 

Enumerations

enum class  http_method {
  GET , POST , PATCH , PUT ,
  DELETE
}
 The HTTP method. More...
 

Functions

string unescape_html (string html)
 Replaces HTML entities with UTF-8 characters. More...
 
std::ostream & operator<< (std::ostream &out, const answer_type &answer)
 

Detailed Description

C++ wrapper for the Mastodon API.

Since
0.1.0

Typedef Documentation

◆ endpoint_variant

using mastodonpp::endpoint_variant = typedef variant<API::endpoint_type, string_view>

An endpoint. Either API::endpoint_type or std::string_view.

Since
0.1.0

◆ parametermap

using mastodonpp::parametermap = typedef map<string_view, variant<string_view, vector<string_view> >>

std::map of parameters for API calls.

Note that arrays always have to be specified as vectors, even if they have only 1 element. To send a file, use “@file:” followed by the file name as value.

Example:

parametermap parameters
{
{"poll[expires_in]", "86400"},
{"poll[options]", vector<string_view>{"Yes", "No", "Maybe"}},
{"status", "How is the weather?"}
};
map< string_view, variant< string_view, vector< string_view > >> parametermap
std::map of parameters for API calls.
Definition: types.hpp:64
Since
0.1.0

◆ parameterpair

using mastodonpp::parameterpair = typedef pair<string_view, variant<string_view, vector<string_view> >>

A single parameter of a parametermap.

Since
0.1.0

Enumeration Type Documentation

◆ http_method

The HTTP method.

Since
0.1.0
40 {
41  GET, // NOLINT(readability-identifier-naming)
42  POST, // NOLINT(readability-identifier-naming)
43  PATCH, // NOLINT(readability-identifier-naming)
44  PUT, // NOLINT(readability-identifier-naming)
45  DELETE // NOLINT(readability-identifier-naming)
46 };

Function Documentation

◆ operator<<()

std::ostream& mastodonpp::operator<< ( std::ostream &  out,
const answer_type answer 
)
Since
0.1.0
41 {
42  out << answer.body;
43  return out;
44 }

◆ unescape_html()

string mastodonpp::unescape_html ( string  html)

Replaces HTML entities with UTF-8 characters.

Supports named and numbered entities, decimal and hexadecimal.

Example:

// Will output: 2€ = 2€ = 2€
std::cout << mastodonpp::unescape_html("2&euro; = 2&#8364; = 2&#x20ac;");
string unescape_html(string html)
Replaces HTML entities with UTF-8 characters.
Definition: helpers.cpp:39
Parameters
htmlThe HTML to unescape.
Since
0.4.0
40 {
41  string buffer{move(html)};
42  string output;
43 
44  // Source: https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_
45  // entity_references#Character_entity_references_in_HTML
46  const map<string_view, char32_t>
47  names{{"exclamation", 0x0021}, {"quot", 0x0022}, {"percent", 0x0025},
48  {"amp", 0x0026}, {"apos", 0x0027}, {"add", 0x002B},
49  {"lt", 0x003C}, {"equal", 0x003D}, {"gt", 0x003E},
50  {"nbsp", 0x00A0}, {"iexcl", 0x00A1}, {"cent", 0x00A2},
51  {"pound", 0x00A3}, {"curren", 0x00A4}, {"yen", 0x00A5},
52  {"brvbar", 0x00A6}, {"sect", 0x00A7}, {"uml", 0x00A8},
53  {"copy", 0x00A9}, {"ordf", 0x00AA}, {"laquo", 0x00AB},
54  {"not", 0x00AC}, {"shy", 0x00AD}, {"reg", 0x00AE},
55  {"macr", 0x00AF}, {"deg", 0x00B0}, {"plusmn", 0x00B1},
56  {"sup2", 0x00B2}, {"sup3", 0x00B3}, {"acute", 0x00B4},
57  {"micro", 0x00B5}, {"para", 0x00B6}, {"middot", 0x00B7},
58  {"cedil", 0x00B8}, {"sup1", 0x00B9}, {"ordm", 0x00BA},
59  {"raquo", 0x00BB}, {"frac14", 0x00BC}, {"frac12", 0x00BD},
60  {"frac34", 0x00BE}, {"iquest", 0x00BF}, {"Agrave", 0x00C0},
61  {"Aacute", 0x00C1}, {"Acirc", 0x00C2}, {"Atilde", 0x00C3},
62  {"Auml", 0x00C4}, {"Aring", 0x00C5}, {"AElig", 0x00C6},
63  {"Ccedil", 0x00C7}, {"Egrave", 0x00C8}, {"Eacute", 0x00C9},
64  {"Ecirc", 0x00CA}, {"Euml", 0x00CB}, {"Igrave", 0x00CC},
65  {"Iacute", 0x00CD}, {"Icirc", 0x00CE}, {"Iuml", 0x00CF},
66  {"ETH", 0x00D0}, {"Ntilde", 0x00D1}, {"Ograve", 0x00D2},
67  {"Oacute", 0x00D3}, {"Ocirc", 0x00D4}, {"Otilde", 0x00D5},
68  {"Ouml", 0x00D6}, {"times", 0x00D7}, {"Oslash", 0x00D8},
69  {"Ugrave", 0x00D9}, {"Uacute", 0x00DA}, {"Ucirc", 0x00DB},
70  {"Uuml", 0x00DC}, {"Yacute", 0x00DD}, {"THORN", 0x00DE},
71  {"szlig", 0x00DF}, {"agrave", 0x00E0}, {"aacute", 0x00E1},
72  {"acirc", 0x00E2}, {"atilde", 0x00E3}, {"auml", 0x00E4},
73  {"aring", 0x00E5}, {"aelig", 0x00E6}, {"ccedil", 0x00E7},
74  {"egrave", 0x00E8}, {"eacute", 0x00E9}, {"ecirc", 0x00EA},
75  {"euml", 0x00EB}, {"igrave", 0x00EC}, {"iacute", 0x00ED},
76  {"icirc", 0x00EE}, {"iuml", 0x00EF}, {"eth", 0x00F0},
77  {"ntilde", 0x00F1}, {"ograve", 0x00F2}, {"oacute", 0x00F3},
78  {"ocirc", 0x00F4}, {"otilde", 0x00F5}, {"ouml", 0x00F6},
79  {"divide", 0x00F7}, {"oslash", 0x00F8}, {"ugrave", 0x00F9},
80  {"uacute", 0x00FA}, {"ucirc", 0x00FB}, {"uuml", 0x00FC},
81  {"yacute", 0x00FD}, {"thorn", 0x00FE}, {"yuml", 0x00FF},
82  {"OElig", 0x0152}, {"oelig", 0x0153}, {"Scaron", 0x0160},
83  {"scaron", 0x0161}, {"Yuml", 0x0178}, {"fnof", 0x0192},
84  {"circ", 0x02C6}, {"tilde", 0x02DC}, {"Alpha", 0x0391},
85  {"Beta", 0x0392}, {"Gamma", 0x0393}, {"Delta", 0x0394},
86  {"Epsilon", 0x0395}, {"Zeta", 0x0396}, {"Eta", 0x0397},
87  {"Theta", 0x0398}, {"Iota", 0x0399}, {"Kappa", 0x039A},
88  {"Lambda", 0x039B}, {"Mu", 0x039C}, {"Nu", 0x039D},
89  {"Xi", 0x039E}, {"Omicron", 0x039F}, {"Pi", 0x03A0},
90  {"Rho", 0x03A1}, {"Sigma", 0x03A3}, {"Tau", 0x03A4},
91  {"Upsilon", 0x03A5}, {"Phi", 0x03A6}, {"Chi", 0x03A7},
92  {"Psi", 0x03A8}, {"Omega", 0x03A9}, {"alpha", 0x03B1},
93  {"beta", 0x03B2}, {"gamma", 0x03B3}, {"delta", 0x03B4},
94  {"epsilon", 0x03B5}, {"zeta", 0x03B6}, {"eta", 0x03B7},
95  {"theta", 0x03B8}, {"iota", 0x03B9}, {"kappa", 0x03BA},
96  {"lambda", 0x03BB}, {"mu", 0x03BC}, {"nu", 0x03BD},
97  {"xi", 0x03BE}, {"omicron", 0x03BF}, {"pi", 0x03C0},
98  {"rho", 0x03C1}, {"sigmaf", 0x03C2}, {"sigma", 0x03C3},
99  {"tau", 0x03C4}, {"upsilon", 0x03C5}, {"phi", 0x03C6},
100  {"chi", 0x03C7}, {"psi", 0x03C8}, {"omega", 0x03C9},
101  {"thetasym", 0x03D1}, {"upsih", 0x03D2}, {"piv", 0x03D6},
102  {"ensp", 0x2002}, {"emsp", 0x2003}, {"thinsp", 0x2009},
103  {"zwnj", 0x200C}, {"zwj", 0x200D}, {"lrm", 0x200E},
104  {"rlm", 0x200F}, {"ndash", 0x2013}, {"mdash", 0x2014},
105  {"horbar", 0x2015}, {"lsquo", 0x2018}, {"rsquo", 0x2019},
106  {"sbquo", 0x201A}, {"ldquo", 0x201C}, {"rdquo", 0x201D},
107  {"bdquo", 0x201E}, {"dagger", 0x2020}, {"Dagger", 0x2021},
108  {"bull", 0x2022}, {"hellip", 0x2026}, {"permil", 0x2030},
109  {"prime", 0x2032}, {"Prime", 0x2033}, {"lsaquo", 0x2039},
110  {"rsaquo", 0x203A}, {"oline", 0x203E}, {"frasl", 0x2044},
111  {"euro", 0x20AC}, {"image", 0x2111}, {"weierp", 0x2118},
112  {"real", 0x211C}, {"trade", 0x2122}, {"alefsym", 0x2135},
113  {"larr", 0x2190}, {"uarr", 0x2191}, {"rarr", 0x2192},
114  {"darr", 0x2193}, {"harr", 0x2194}, {"crarr", 0x21B5},
115  {"lArr", 0x21D0}, {"uArr", 0x21D1}, {"rArr", 0x21D2},
116  {"dArr", 0x21D3}, {"hArr", 0x21D4}, {"forall", 0x2200},
117  {"part", 0x2202}, {"exist", 0x2203}, {"empty", 0x2205},
118  {"nabla", 0x2207}, {"isin", 0x2208}, {"notin", 0x2209},
119  {"ni", 0x220B}, {"prod", 0x220F}, {"sum", 0x2211},
120  {"minus", 0x2212}, {"lowast", 0x2217}, {"radic", 0x221A},
121  {"prop", 0x221D}, {"infin", 0x221E}, {"ang", 0x2220},
122  {"and", 0x2227}, {"or", 0x2228}, {"cap", 0x2229},
123  {"cup", 0x222A}, {"int", 0x222B}, {"there4", 0x2234},
124  {"sim", 0x223C}, {"cong", 0x2245}, {"asymp", 0x2248},
125  {"ne", 0x2260}, {"equiv", 0x2261}, {"le", 0x2264},
126  {"ge", 0x2265}, {"sub", 0x2282}, {"sup", 0x2283},
127  {"nsub", 0x2284}, {"sube", 0x2286}, {"supe", 0x2287},
128  {"oplus", 0x2295}, {"otimes", 0x2297}, {"perp", 0x22A5},
129  {"sdot", 0x22C5}, {"lceil", 0x2308}, {"rceil", 0x2309},
130  {"lfloor", 0x230A}, {"rfloor", 0x230B}, {"lang", 0x2329},
131  {"rang", 0x232A}, {"loz", 0x25CA}, {"spades", 0x2660},
132  {"clubs", 0x2663}, {"hearts", 0x2665}, {"diams", 0x2666}};
133 
134  // Used to convert number to utf-8 char.
135  wstring_convert<codecvt_utf8<char32_t>, char32_t> u8c;
136  // Matches numbered entities between 1 and 8 digits, decimal or hexadecimal,
137  // or named entities.
138  const regex re_entity{"&(#(x)?([[:alnum:]]{1,8})"
139  "|[^;[:space:][:punct:]]+);"};
140  smatch match;
141 
142  while (regex_search(buffer, match, re_entity))
143  {
144  output += match.prefix().str();
145  try
146  {
147  // clang-format off
148  const char32_t codepoint{[&match, &names]
149  {
150  // clang-format on
151  // If it doesn't start with a '#' it is a named entity.
152  if (match[1].str()[0] != '#')
153  {
154  return names.at(match[1].str());
155  }
156  // 'x' after '#' means the number is hexadecimal.
157  if (match[2].length() == 1)
158  {
159  return static_cast<char32_t>(
160  stoul(match[3].str(), nullptr, 16));
161  }
162  // '#' without 'x' means the number is decimal.
163  return static_cast<char32_t>(
164  stoul(match[3].str(), nullptr, 10));
165  }()};
166  output += u8c.to_bytes(codepoint);
167  }
168  catch (const std::out_of_range &) // Named entity could not be found.
169  {
170  output += match.str();
171  }
172  buffer = match.suffix().str();
173  }
174  output += buffer;
175 
176  return output;
177 }