00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00022
00023 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_UTIL_H_
00024 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_UTIL_H_
00025
00026 #include <vector>
00027
00028 #include "base/scoped_ptr.h"
00029 #include "net/instaweb/util/public/basictypes.h"
00030 #include "net/instaweb/util/public/string.h"
00031 #include "net/instaweb/util/public/string_util.h"
00032
00033 class UnicodeText;
00034
00035 namespace Css {
00036 class Declarations;
00037 }
00038 namespace net_instaweb {
00039 class HtmlElement;
00040
00043 namespace css_util {
00044
00045 static const char kAllMedia[] = "all";
00046 static const int kNoValue = -1;
00047
00048 enum DimensionState {
00049 kNoDimensions,
00050 kHasHeightOnly,
00051 kHasWidthOnly,
00052 kHasBothDimensions,
00053 kNotParsable
00054 };
00055
00063 DimensionState GetDimensions(Css::Declarations* decls, int* width, int* height);
00064
00065 class StyleExtractor {
00066 public:
00067 StyleExtractor(HtmlElement* element);
00068 virtual ~StyleExtractor();
00069
00070
00071 DimensionState state() const { return state_; }
00072
00074 int width() const { return width_px_; }
00075 int height() const { return height_px_; }
00076
00079 bool HasAnyDimensions() { return (state_ != kNoDimensions); }
00080
00081 DimensionState dimension_state() { return state_; }
00082
00083 private:
00084 static Css::Declarations* GetDeclsFromElement(HtmlElement* element);
00085 scoped_ptr<Css::Declarations> decls_;
00086 int width_px_;
00087 int height_px_;
00088 DimensionState state_;
00089 DISALLOW_COPY_AND_ASSIGN(StyleExtractor);
00090 };
00091
00096
00101 void VectorizeMediaAttribute(const StringPiece& input_media,
00102 StringVector* output_vector);
00103
00108 GoogleString StringifyMediaVector(const StringVector& import_media);
00109
00113 void ConvertUnicodeVectorToStringVector(
00114 const std::vector<UnicodeText>& in_vector,
00115 StringVector* out_vector);
00116
00119 void ConvertStringVectorToUnicodeVector(
00120 const StringVector& in_vector,
00121 std::vector<UnicodeText>* out_vector);
00122
00125 void ClearVectorIfContainsMediaAll(StringVector* media);
00126
00133 template<typename T>
00134 void EliminateElementsNotIn(std::vector<T>* sorted_inner,
00135 const std::vector<T>& sorted_outer) {
00136 if (!sorted_outer.empty()) {
00137 if (sorted_inner->empty()) {
00138 *sorted_inner = sorted_outer;
00139 } else {
00140 typename std::vector<T>::const_iterator outer_iter = sorted_outer.begin();
00141 typename std::vector<T>::iterator inner_iter = sorted_inner->begin();
00142
00143 while (inner_iter != sorted_inner->end()) {
00144 if (outer_iter == sorted_outer.end()) {
00146 inner_iter = sorted_inner->erase(inner_iter, sorted_inner->end());
00147 } else if (*outer_iter == *inner_iter) {
00149 ++outer_iter;
00150 ++inner_iter;
00151 } else if (*outer_iter < *inner_iter) {
00153 ++outer_iter;
00154 } else {
00156 inner_iter = sorted_inner->erase(inner_iter);
00157 }
00158 }
00159 }
00160 }
00161 }
00162
00163 }
00164
00165 }
00166
00167 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_UTIL_H_