mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 13:52:43 +00:00 
			
		
		
		
	 e2e7c4d574
			
		
	
	
		e2e7c4d574
		
	
	
	
	
		
			
			In a bunch of cases, this actually ends up simplifying the code as
to_number will handle something such as:
```
Optional<I> opt;
if constexpr (IsSigned<I>)
    opt = view.to_int<I>();
else
    opt = view.to_uint<I>();
```
For us.
The main goal here however is to have a single generic number conversion
API between all of the String classes.
		
	
			
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <AK/CharacterTypes.h>
 | |
| #include <AK/GenericLexer.h>
 | |
| #include <AK/Optional.h>
 | |
| #include <AK/StringView.h>
 | |
| #include <LibWeb/SVG/ViewBox.h>
 | |
| 
 | |
| namespace Web::SVG {
 | |
| 
 | |
| Optional<ViewBox> try_parse_view_box(StringView string)
 | |
| {
 | |
|     // FIXME: This should handle all valid viewBox values.
 | |
| 
 | |
|     GenericLexer lexer(string);
 | |
| 
 | |
|     enum State {
 | |
|         MinX,
 | |
|         MinY,
 | |
|         Width,
 | |
|         Height,
 | |
|     };
 | |
|     int state { State::MinX };
 | |
|     ViewBox view_box;
 | |
| 
 | |
|     while (!lexer.is_eof()) {
 | |
|         lexer.consume_while([](auto ch) { return is_ascii_space(ch); });
 | |
|         auto token = lexer.consume_until([](auto ch) { return is_ascii_space(ch) && ch != ','; });
 | |
|         auto maybe_number = token.to_number<float>();
 | |
|         if (!maybe_number.has_value())
 | |
|             return {};
 | |
|         switch (state) {
 | |
|         case State::MinX:
 | |
|             view_box.min_x = maybe_number.value();
 | |
|             break;
 | |
|         case State::MinY:
 | |
|             view_box.min_y = maybe_number.value();
 | |
|             break;
 | |
|         case State::Width:
 | |
|             view_box.width = maybe_number.value();
 | |
|             break;
 | |
|         case State::Height:
 | |
|             view_box.height = maybe_number.value();
 | |
|             break;
 | |
|         default:
 | |
|             return {};
 | |
|         }
 | |
|         state += 1;
 | |
|     }
 | |
| 
 | |
|     return view_box;
 | |
| }
 | |
| 
 | |
| }
 |