mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 06:12:43 +00:00 
			
		
		
		
	LibWeb: Move type derivation of CSS::Length into seperate function
That way this can (and will) be used in other places.
This commit is contained in:
		
							parent
							
								
									7a4c8e0b76
								
							
						
					
					
						commit
						e3b68039bf
					
				
					 1 changed files with 83 additions and 42 deletions
				
			
		|  | @ -146,66 +146,107 @@ static Optional<float> try_parse_float(const StringView& string) | |||
|     return is_negative ? -value : value; | ||||
| } | ||||
| 
 | ||||
| static CSS::Length::Type length_type_from_unit(const StringView& view) | ||||
| { | ||||
|     if (view.ends_with('%')) | ||||
|         return CSS::Length::Type::Percentage; | ||||
|     if (view.ends_with("px", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Px; | ||||
|     if (view.ends_with("pt", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Pt; | ||||
|     if (view.ends_with("pc", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Pc; | ||||
|     if (view.ends_with("mm", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Mm; | ||||
|     if (view.ends_with("rem", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Rem; | ||||
|     if (view.ends_with("em", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Em; | ||||
|     if (view.ends_with("ex", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Ex; | ||||
|     if (view.ends_with("vw", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Vw; | ||||
|     if (view.ends_with("vh", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Vh; | ||||
|     if (view.ends_with("vmax", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Vmax; | ||||
|     if (view.ends_with("vmin", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Vmin; | ||||
|     if (view.ends_with("cm", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Cm; | ||||
|     if (view.ends_with("in", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::In; | ||||
|     if (view.ends_with("Q", CaseSensitivity::CaseInsensitive)) | ||||
|         return CSS::Length::Type::Q; | ||||
|     if (view == "0") | ||||
|         return CSS::Length::Type::Px; | ||||
| 
 | ||||
|     return CSS::Length::Type::Undefined; | ||||
| } | ||||
| 
 | ||||
| static CSS::Length parse_length(const CSS::DeprecatedParsingContext& context, const StringView& view, bool& is_bad_length) | ||||
| { | ||||
|     CSS::Length::Type type = CSS::Length::Type::Undefined; | ||||
|     CSS::Length::Type type = length_type_from_unit(view); | ||||
|     Optional<float> value; | ||||
| 
 | ||||
|     if (view.ends_with('%')) { | ||||
|         type = CSS::Length::Type::Percentage; | ||||
|     switch (type) { | ||||
|     case CSS::Length::Type::Percentage: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 1)); | ||||
|     } else if (view.ends_with("px", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Px; | ||||
|         break; | ||||
|     case CSS::Length::Type::Px: | ||||
|         if (view == "0") | ||||
|             value = 0; | ||||
|         else | ||||
|             value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|         break; | ||||
|     case CSS::Length::Type::Pt: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("pt", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Pt; | ||||
|         break; | ||||
|     case CSS::Length::Type::Pc: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("pc", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Pc; | ||||
|         break; | ||||
|     case CSS::Length::Type::Mm: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("mm", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Mm; | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("rem", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Rem; | ||||
|         break; | ||||
|     case CSS::Length::Type::Rem: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 3)); | ||||
|     } else if (view.ends_with("em", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Em; | ||||
|         break; | ||||
|     case CSS::Length::Type::Em: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("ex", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Ex; | ||||
|         break; | ||||
|     case CSS::Length::Type::Ex: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("vw", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Vw; | ||||
|         break; | ||||
|     case CSS::Length::Type::Vw: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("vh", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Vh; | ||||
|         break; | ||||
|     case CSS::Length::Type::Vh: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("vmax", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Vmax; | ||||
|         break; | ||||
|     case CSS::Length::Type::Vmax: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 4)); | ||||
|     } else if (view.ends_with("vmin", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Vmin; | ||||
|         break; | ||||
|     case CSS::Length::Type::Vmin: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 4)); | ||||
|     } else if (view.ends_with("cm", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Cm; | ||||
|         break; | ||||
|     case CSS::Length::Type::Cm: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("in", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::In; | ||||
|         break; | ||||
|     case CSS::Length::Type::In: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 2)); | ||||
|     } else if (view.ends_with("Q", CaseSensitivity::CaseInsensitive)) { | ||||
|         type = CSS::Length::Type::Q; | ||||
|         break; | ||||
|     case CSS::Length::Type::Q: | ||||
|         value = try_parse_float(view.substring_view(0, view.length() - 1)); | ||||
|     } else if (view == "0") { | ||||
|         type = CSS::Length::Type::Px; | ||||
|         value = 0; | ||||
|     } else if (context.in_quirks_mode()) { | ||||
|         type = CSS::Length::Type::Px; | ||||
|         value = try_parse_float(view); | ||||
|     } else { | ||||
|         value = try_parse_float(view); | ||||
|         if (value.has_value()) | ||||
|             is_bad_length = true; | ||||
|         break; | ||||
|     default: | ||||
|         if (context.in_quirks_mode()) { | ||||
|             type = CSS::Length::Type::Px; | ||||
|             value = try_parse_float(view); | ||||
|         } else { | ||||
|             value = try_parse_float(view); | ||||
|             if (value.has_value()) | ||||
|                 is_bad_length = true; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (!value.has_value()) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tobias Christiansen
						Tobias Christiansen