mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 16:02:43 +01:00 
			
		
		
		
	utils: add sanitize_str to encode '&' etc.
gtk requires some chars (<>&"') to be encoded for them to render properly. `sanitize_str` sanitizes raw strings that have such chars and returns a properly encoded string
This commit is contained in:
		
							
								
								
									
										6
									
								
								include/util/sanitize_str.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								include/util/sanitize_str.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
|  | ||||
| namespace waybar::util { | ||||
| std::string sanitize_string(std::string str); | ||||
| }  // namespace waybar::util | ||||
| @@ -154,7 +154,8 @@ src_files = files( | ||||
|     'src/client.cpp', | ||||
|     'src/config.cpp', | ||||
|     'src/group.cpp', | ||||
|     'src/util/ustring_clen.cpp' | ||||
|     'src/util/ustring_clen.cpp', | ||||
|     'src/util/sanitize_str.cpp' | ||||
| ) | ||||
|  | ||||
| if is_linux | ||||
|   | ||||
| @@ -4,6 +4,8 @@ | ||||
| #include <xkbcommon/xkbcommon.h> | ||||
| #include <xkbcommon/xkbregistry.h> | ||||
|  | ||||
| #include <util/sanitize_str.hpp> | ||||
|  | ||||
| #include "modules/hyprland/backend.hpp" | ||||
|  | ||||
| namespace waybar::modules::hyprland { | ||||
| @@ -48,16 +50,6 @@ void Language::onEvent(const std::string& ev) { | ||||
|   if (config_.isMember("keyboard-name") && keebName != config_["keyboard-name"].asString()) | ||||
|     return;  // ignore | ||||
|  | ||||
|   auto replaceAll = [](std::string str, const std::string& from, | ||||
|                        const std::string& to) -> std::string { | ||||
|     size_t start_pos = 0; | ||||
|     while ((start_pos = str.find(from, start_pos)) != std::string::npos) { | ||||
|       str.replace(start_pos, from.length(), to); | ||||
|       start_pos += to.length(); | ||||
|     } | ||||
|     return str; | ||||
|   }; | ||||
|  | ||||
|   const auto BRIEFNAME = getShortFrom(layoutName); | ||||
|  | ||||
|   if (config_.isMember("format-" + BRIEFNAME)) { | ||||
| @@ -67,7 +59,7 @@ void Language::onEvent(const std::string& ev) { | ||||
|     layoutName = fmt::format(format_, layoutName); | ||||
|   } | ||||
|  | ||||
|   layoutName = replaceAll(layoutName, "&", "&"); | ||||
|   layoutName = waybar::util::sanitize_string(layoutName); | ||||
|  | ||||
|   if (layoutName == layoutName_) return; | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,8 @@ | ||||
|  | ||||
| #include <spdlog/spdlog.h> | ||||
|  | ||||
| #include <util/sanitize_str.hpp> | ||||
|  | ||||
| #include "modules/hyprland/backend.hpp" | ||||
|  | ||||
| namespace waybar::modules::hyprland { | ||||
| @@ -39,17 +41,7 @@ void Window::onEvent(const std::string& ev) { | ||||
|   std::lock_guard<std::mutex> lg(mutex_); | ||||
|   auto windowName = ev.substr(ev.find_first_of(',') + 1).substr(0, 256); | ||||
|  | ||||
|   auto replaceAll = [](std::string str, const std::string& from, | ||||
|                        const std::string& to) -> std::string { | ||||
|     size_t start_pos = 0; | ||||
|     while ((start_pos = str.find(from, start_pos)) != std::string::npos) { | ||||
|       str.replace(start_pos, from.length(), to); | ||||
|       start_pos += to.length(); | ||||
|     } | ||||
|     return str; | ||||
|   }; | ||||
|  | ||||
|   windowName = replaceAll(windowName, "&", "&"); | ||||
|   windowName = waybar::util::sanitize_string(windowName); | ||||
|  | ||||
|   if (windowName == lastView) return; | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,9 @@ | ||||
| #include <glibmm/ustring.h> | ||||
| #include <spdlog/spdlog.h> | ||||
|  | ||||
| #include <util/sanitize_str.hpp> | ||||
| using namespace waybar::util; | ||||
|  | ||||
| #include "modules/mpd/state.hpp" | ||||
| #if defined(MPD_NOINLINE) | ||||
| namespace waybar::modules { | ||||
| @@ -135,12 +138,12 @@ void waybar::modules::MPD::setLabel() { | ||||
|  | ||||
|     stateIcon = getStateIcon(); | ||||
|  | ||||
|     artist = getTag(MPD_TAG_ARTIST); | ||||
|     album_artist = getTag(MPD_TAG_ALBUM_ARTIST); | ||||
|     album = getTag(MPD_TAG_ALBUM); | ||||
|     title = getTag(MPD_TAG_TITLE); | ||||
|     date = getTag(MPD_TAG_DATE); | ||||
|     filename = getFilename(); | ||||
|     artist = sanitize_string(getTag(MPD_TAG_ARTIST)); | ||||
|     album_artist = sanitize_string(getTag(MPD_TAG_ALBUM_ARTIST)); | ||||
|     album = sanitize_string(getTag(MPD_TAG_ALBUM)); | ||||
|     title = sanitize_string(getTag(MPD_TAG_TITLE)); | ||||
|     date = sanitize_string(getTag(MPD_TAG_DATE)); | ||||
|     filename = sanitize_string(getFilename()); | ||||
|     song_pos = mpd_status_get_song_pos(status_.get()) + 1; | ||||
|     volume = mpd_status_get_volume(status_.get()); | ||||
|     if (volume < 0) { | ||||
|   | ||||
							
								
								
									
										24
									
								
								src/util/sanitize_str.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/util/sanitize_str.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| #include <array> | ||||
| #include <string> | ||||
| #include <util/sanitize_str.hpp> | ||||
| #include <utility> | ||||
|  | ||||
| namespace waybar::util { | ||||
| // replaces ``<>&"'`` with their encoded counterparts | ||||
| std::string sanitize_string(std::string str) { | ||||
|   // note: it's important that '&' is replaced first; therefor we *can't* use std::map | ||||
|   const std::pair<char, std::string> replacement_table[] = { | ||||
|       {'&', "&"}, {'<', "<"}, {'>', ">"}, {'"', """}, {'\'', "'"}}; | ||||
|   size_t startpoint; | ||||
|   for (size_t i = 0; i < (sizeof(replacement_table) / sizeof(replacement_table[0])); ++i) { | ||||
|     startpoint = 0; | ||||
|     std::pair pair = replacement_table[i]; | ||||
|     while ((startpoint = str.find(pair.first, startpoint)) != std::string::npos) { | ||||
|       str.replace(startpoint, 1, pair.second); | ||||
|       startpoint += pair.second.length(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return str; | ||||
| } | ||||
| }  // namespace waybar::util | ||||
		Reference in New Issue
	
	Block a user
	 Mika Braunschweig
					Mika Braunschweig