libabigail
abg-viz-common.cc
1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- mode: C++ -*-
3 //
4 // Copyright (C) 2013-2023 Red Hat, Inc.
5 
6 #include <stdexcept>
7 #include <fstream>
8 
9 #include "abg-internal.h"
10 // <headers defining libabigail's API go under here>
11 ABG_BEGIN_EXPORT_DECLARATIONS
12 
13 #include "abg-viz-svg.h"
14 
15 ABG_END_EXPORT_DECLARATIONS
16 // </headers defining libabigail's API>
17 
18 namespace abigail
19 {
20 
21 using std::ostream;
22 using std::ostringstream;
23 
24 // Constants.
25 
26 // Using pixels, units vs. representation
27 // const canvas ansi_letter_mm = { units::millimeter, 215.9, 279.4 };
28 // const canvas iso_a4_mm = { units::millimeter, 210, 297 };
29 // const canvas ansi_letter_px = { units::pixel, 765, 990 };
30 // const canvas iso_a4_px = { units::pixel, 765, 990 };
31 const canvas ansi_letter_canvas = { units::pixel, 765, 990 };
32 const canvas iso_a4_canvas = { units::pixel, 765, 990 };
33 
35  { "'ArialMT'", 12, color::black, R"(text-anchor="middle")"};
36 
37 const typography source_code_pro_typo = \
38  { "Source Code Pro Light", 12, color::black, R"(text-anchor="middle")"};
39 
40 const typography roboto_typo = \
41  { "Roboto Light", 12, color::black, R"(text-anchor="middle")"};
42 
43 const style primary_row_sty = { color::white, color::black, "" };
44 const style base_row_sty = { color::white, color::gray75, "" };
45 const style member_row_sty = { color::black, color::gray25, "" };
46 const style implementation_row_sty = { color::black, color::white, "" };
47 
48 
49 // XXX Do not export.
50 void
51 string_replace(std::string& target, const std::string& match,
52  const std::string& replace)
53 {
54  size_t pos = 0;
55  while((pos = target.find(match, pos)) != std::string::npos)
56  {
57  target.replace(pos, match.length(), replace);
58  pos += replace.length();
59  }
60 }
61 
62 std::string
63 units_to_string(units __val)
64 {
65  std::string ret;
66  switch (__val)
67  {
68  case units::millimeter:
69  ret = "mm";
70  break;
71  case units::pixel:
72  ret = "px";
73  break;
74  default:
75  throw std::logic_error("abigail::units_to_string units not recognized");
76  break;
77  }
78  return ret;
79 }
80 
81 std::string
82 color_to_string(color __val)
83 {
84  std::string ret;
85  switch (__val)
86  {
87  case color::white:
88  ret = "white";
89  break;
90  case color::gray25:
91  ret = "gainsboro";
92  break;
93  case color::gray75:
94  ret = "slategray";
95  break;
96  case color::black:
97  ret = "black";
98  break;
99  default:
100  throw std::logic_error("abigail::color_to_string color not recognized");
101  break;
102  }
103  return ret;
104 }
105 
106 std::string
107 typography::anchor_to_string(anchor __val) const
108 {
109  std::string ret;
110  switch (__val)
111  {
112  case start:
113  ret = "start";
114  break;
115  case middle:
116  ret = "middle";
117  break;
118  default:
119  throw std::logic_error("abigail::anchor_to_string anchor not recognized");
120  break;
121  }
122  return ret;
123 }
124 
125 
126 std::string
127 typography::to_attribute(anchor __a) const
128 {
129  const std::string name("__name");
130  const std::string size("__size");
131  const std::string anchor("__anchor");
132  std::string strip = R"(font-family="__name" font-size="__size" text-anchor="__anchor")";
133  string_replace(strip, name, _M_face);
134  string_replace(strip, size, std::to_string(_M_size));
135  string_replace(strip, anchor, anchor_to_string(__a));
136 
137  // NB: Add in extra _M_attributes if necessary.
138  return strip;
139 }
140 
141 }//end namespace abigail
bool match(const regex_t_sptr &r, const std::string &str)
See if a string matches a regex.
Definition: abg-regex.cc:127
Toplevel namespace for libabigail.
const style primary_row_sty
Useful row constants. Maybe just do enum->value map.
const canvas ansi_letter_canvas
Useful canvas constants.
units
Measurement abstraction type, conversion function.
const typography arial_typo
Useful typography constants.
color
Color, conversion function.
void string_replace(std::string &target, const std::string &match, const std::string &replace)
Utility function, like regex_replace.
Datum consolidating style preferences.