summaryrefslogtreecommitdiff
path: root/libs/litehtml/src/css_length.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/litehtml/src/css_length.cpp')
-rw-r--r--libs/litehtml/src/css_length.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/libs/litehtml/src/css_length.cpp b/libs/litehtml/src/css_length.cpp
new file mode 100644
index 0000000000..d1c69d2612
--- /dev/null
+++ b/libs/litehtml/src/css_length.cpp
@@ -0,0 +1,77 @@
+#include "html.h"
+#include "css_length.h"
+
+void litehtml::css_length::fromString( const string& str, const string& predefs, int defValue )
+{
+ // TODO: Make support for calc
+ if(str.substr(0, 4) == "calc")
+ {
+ m_is_predefined = true;
+ m_predef = defValue;
+ return;
+ }
+
+ int predef = value_index(str, predefs, -1);
+ if(predef >= 0)
+ {
+ m_is_predefined = true;
+ m_predef = predef;
+ } else
+ {
+ m_is_predefined = false;
+
+ string num;
+ string un;
+ bool is_unit = false;
+ for(char chr : str)
+ {
+ if(!is_unit)
+ {
+ if(t_isdigit(chr) || chr == '.' || chr == '+' || chr == '-')
+ {
+ num += chr;
+ } else
+ {
+ is_unit = true;
+ }
+ }
+ if(is_unit)
+ {
+ un += chr;
+ }
+ }
+ if(!num.empty())
+ {
+ m_value = t_strtof(num);
+ m_units = (css_units) value_index(un, css_units_strings, css_units_none);
+ } else
+ {
+ // not a number so it is predefined
+ m_is_predefined = true;
+ m_predef = defValue;
+ }
+ }
+}
+
+litehtml::css_length litehtml::css_length::from_string(const string& str, const string& predefs, int defValue)
+{
+ css_length len;
+ len.fromString(str, predefs, defValue);
+ return len;
+}
+
+litehtml::string litehtml::css_length::to_string() const
+{
+ if(m_is_predefined)
+ {
+ return "def(" + std::to_string(m_predef) + ")";
+ }
+ return std::to_string(m_value) + "{" + index_value(m_units, css_units_strings) + "}";
+}
+
+litehtml::css_length litehtml::css_length::predef_value(int val)
+{
+ css_length len;
+ len.predef(val);
+ return len;
+}