33#include < odr/internal/abstract/filesystem.hpp>
44#include < odr/internal/common/path.hpp>
55#include < odr/internal/html/common.hpp>
6+ #include < odr/internal/util/string_util.hpp>
67#include < odr/internal/util/xml_util.hpp>
78
89#include < cstring>
@@ -50,31 +51,52 @@ ooxml::read_half_point_attribute(pugi::xml_attribute attribute) {
5051 if (!attribute) {
5152 return {};
5253 }
53- return Measure (attribute.as_float () * 0 .5f , DynamicUnit (" pt" ));
54+ return Measure (attribute.as_double () * 0.5 , DynamicUnit (" pt" ));
5455}
5556
5657std::optional<Measure>
5758ooxml::read_hundredth_point_attribute (pugi::xml_attribute attribute) {
5859 if (!attribute) {
5960 return {};
6061 }
61- return Measure (attribute.as_float () * 0 .01f , DynamicUnit (" pt" ));
62+ return Measure (attribute.as_double () * 0.01 , DynamicUnit (" pt" ));
6263}
6364
6465std::optional<Measure>
6566ooxml::read_emus_attribute (pugi::xml_attribute attribute) {
6667 if (!attribute) {
6768 return {};
6869 }
69- return Measure (attribute.as_float () / 914400 .0f , DynamicUnit (" in" ));
70+ return Measure (attribute.as_double () / 914400.0 , DynamicUnit (" in" ));
7071}
7172
7273std::optional<Measure>
7374ooxml::read_twips_attribute (pugi::xml_attribute attribute) {
7475 if (!attribute) {
7576 return {};
7677 }
77- return Measure (attribute.as_float () / 1440 .0f , DynamicUnit (" in" ));
78+ return Measure (attribute.as_double () / 1440.0 , DynamicUnit (" in" ));
79+ }
80+
81+ std::optional<Measure>
82+ ooxml::read_pct_attribute (pugi::xml_attribute attribute) {
83+ if (!attribute) {
84+ return {};
85+ }
86+
87+ // handle percentage which is not always a percentage for tables
88+ // http://officeopenxml.com/WPtableWidth.php
89+ // potentially this should be moved to a table parser
90+
91+ std::string val = attribute.value ();
92+ util::string::trim (val);
93+
94+ if (val.find (' %' ) != std::string::npos) {
95+ util::string::replace_all (val, " %" , " " );
96+ return Measure (std::stod (val), DynamicUnit (" %" ));
97+ }
98+
99+ return Measure (attribute.as_double () / 50.0 , DynamicUnit (" %" ));
78100}
79101
80102std::optional<Measure> ooxml::read_width_attribute (pugi::xml_node node) {
@@ -92,7 +114,7 @@ std::optional<Measure> ooxml::read_width_attribute(pugi::xml_node node) {
92114 return Measure (0 , DynamicUnit (" " ));
93115 }
94116 if (std::strcmp (" pct" , type) == 0 ) {
95- return Measure (node.attribute (" w:w" ). as_float (), DynamicUnit ( " % " ));
117+ return read_pct_attribute (node.attribute (" w:w" ));
96118 }
97119 return {};
98120}
0 commit comments