mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Fix formspec escaping, add escaping to info.txt for texture packs.
This commit is contained in:
parent
a97c085e9e
commit
7921fe2cd1
@ -39,11 +39,11 @@ function menu.render_favorite(spec,render_details)
|
|||||||
local text = ""
|
local text = ""
|
||||||
|
|
||||||
if spec.name ~= nil then
|
if spec.name ~= nil then
|
||||||
text = text .. fs_escape_string(spec.name:trim())
|
text = text .. engine.formspec_escape(spec.name:trim())
|
||||||
|
|
||||||
-- if spec.description ~= nil and
|
-- if spec.description ~= nil and
|
||||||
-- fs_escape_string(spec.description):trim() ~= "" then
|
-- engine.formspec_escape(spec.description):trim() ~= "" then
|
||||||
-- text = text .. " (" .. fs_escape_string(spec.description) .. ")"
|
-- text = text .. " (" .. engine.formspec_escape(spec.description) .. ")"
|
||||||
-- end
|
-- end
|
||||||
else
|
else
|
||||||
if spec.address ~= nil then
|
if spec.address ~= nil then
|
||||||
@ -93,7 +93,7 @@ function menu.render_favorite(spec,render_details)
|
|||||||
string.format("%03d",spec.clients_max) .. " "
|
string.format("%03d",spec.clients_max) .. " "
|
||||||
end
|
end
|
||||||
|
|
||||||
return playercount .. fs_escape_string(details) .. text
|
return playercount .. engine.formspec_escape(details) .. text
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -900,7 +900,7 @@ function tabbuilder.tab_multiplayer()
|
|||||||
if menu.fav_selected ~= nil and
|
if menu.fav_selected ~= nil and
|
||||||
menu.favorites[menu.fav_selected].description ~= nil then
|
menu.favorites[menu.fav_selected].description ~= nil then
|
||||||
retval = retval ..
|
retval = retval ..
|
||||||
fs_escape_string(menu.favorites[menu.fav_selected].description,true)
|
engine.formspec_escape(menu.favorites[menu.fav_selected].description,true)
|
||||||
end
|
end
|
||||||
|
|
||||||
retval = retval ..
|
retval = retval ..
|
||||||
@ -1040,7 +1040,7 @@ function tabbuilder.tab_TP()
|
|||||||
menu.render_TP_list(TPlist) ..
|
menu.render_TP_list(TPlist) ..
|
||||||
";" .. index .. "]" ..
|
";" .. index .. "]" ..
|
||||||
"image[0.65,0.25;4.0,3.7;"..(menu.TPscreen or no_screenshot).."]"..
|
"image[0.65,0.25;4.0,3.7;"..(menu.TPscreen or no_screenshot).."]"..
|
||||||
"textarea[1.0,3.25;3.7,1.5;;"..(menu.TPinfo or "")..";]"
|
"textarea[1.0,3.25;3.7,1.5;;"..engine.formspec_escape(menu.TPinfo or "")..";]"
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -99,10 +99,3 @@ function minetest.setting_get_pos(name)
|
|||||||
return minetest.string_to_pos(value)
|
return minetest.string_to_pos(value)
|
||||||
end
|
end
|
||||||
|
|
||||||
function minetest.formspec_escape(str)
|
|
||||||
str = string.gsub(str, "\\", "\\\\")
|
|
||||||
str = string.gsub(str, "%[", "\\[")
|
|
||||||
str = string.gsub(str, "%]", "\\]")
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
|
|
||||||
|
@ -184,6 +184,18 @@ function cleanup_path(temppath)
|
|||||||
return temppath
|
return temppath
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local tbl = engine or minetest
|
||||||
|
function tbl.formspec_escape(text)
|
||||||
|
if text ~= nil then
|
||||||
|
text = string.gsub(text,"\\","\\\\")
|
||||||
|
text = string.gsub(text,"%]","\\]")
|
||||||
|
text = string.gsub(text,"%[","\\[")
|
||||||
|
text = string.gsub(text,";","\\;")
|
||||||
|
text = string.gsub(text,",","\\,")
|
||||||
|
end
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- mainmenu only functions
|
-- mainmenu only functions
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -197,41 +209,7 @@ if engine ~= nil then
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function fs_escape_string(text)
|
|
||||||
if text ~= nil then
|
|
||||||
while (text:find("\r\n") ~= nil) do
|
|
||||||
local newtext = text:sub(1,text:find("\r\n")-1)
|
|
||||||
newtext = newtext .. " " .. text:sub(text:find("\r\n")+3)
|
|
||||||
|
|
||||||
text = newtext
|
|
||||||
end
|
|
||||||
|
|
||||||
while (text:find("\n") ~= nil) do
|
|
||||||
local newtext = text:sub(1,text:find("\n")-1)
|
|
||||||
newtext = newtext .. " " .. text:sub(text:find("\n")+1)
|
|
||||||
|
|
||||||
text = newtext
|
|
||||||
end
|
|
||||||
|
|
||||||
while (text:find("\r") ~= nil) do
|
|
||||||
local newtext = text:sub(1,text:find("\r")-1)
|
|
||||||
newtext = newtext .. " " .. text:sub(text:find("\r")+1)
|
|
||||||
|
|
||||||
text = newtext
|
|
||||||
end
|
|
||||||
|
|
||||||
text = string.gsub(text,"\\","\\\\")
|
|
||||||
text = string.gsub(text,"%]","\\]")
|
|
||||||
text = string.gsub(text,"%[","\\[")
|
|
||||||
text = string.gsub(text,";","\\;")
|
|
||||||
text = string.gsub(text,",","\\,")
|
|
||||||
end
|
|
||||||
return text
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- core only fct
|
-- core only fct
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -241,3 +219,4 @@ if minetest ~= nil then
|
|||||||
return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
|
return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -233,12 +233,12 @@ function modstore.getmodlist(list)
|
|||||||
|
|
||||||
--title + author
|
--title + author
|
||||||
retval = retval .."label[2.75," .. screenshot_ypos .. ";" ..
|
retval = retval .."label[2.75," .. screenshot_ypos .. ";" ..
|
||||||
fs_escape_string(details.title) .. " (" .. details.author .. ")]"
|
engine.formspec_escape(details.title) .. " (" .. details.author .. ")]"
|
||||||
|
|
||||||
--description
|
--description
|
||||||
local descriptiony = screenshot_ypos + 0.5
|
local descriptiony = screenshot_ypos + 0.5
|
||||||
retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.55;;" ..
|
retval = retval .. "textarea[3," .. descriptiony .. ";6.5,1.55;;" ..
|
||||||
fs_escape_string(details.description) .. ";]"
|
engine.formspec_escape(details.description) .. ";]"
|
||||||
--rating
|
--rating
|
||||||
local ratingy = screenshot_ypos + 0.6
|
local ratingy = screenshot_ypos + 0.6
|
||||||
retval = retval .."label[10.1," .. ratingy .. ";Rating: " .. details.rating .."]"
|
retval = retval .."label[10.1," .. ratingy .. ";Rating: " .. details.rating .."]"
|
||||||
|
@ -143,51 +143,34 @@ int GUIFormSpecMenu::getListboxIndex(std::string listboxname) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> split(const std::string &s, char delim, bool escape=false) {
|
std::vector<std::string> split(const std::string &s, char delim) {
|
||||||
std::vector<std::string> tokens;
|
std::vector<std::string> tokens;
|
||||||
|
|
||||||
if (!escape) {
|
std::string current = "";
|
||||||
int startpos = 0;
|
bool last_was_escape = false;
|
||||||
size_t nextpos = s.find(delim);
|
for(unsigned int i=0; i < s.size(); i++) {
|
||||||
|
if (last_was_escape) {
|
||||||
while(nextpos != std::string::npos) {
|
current += '\\';
|
||||||
std::string toadd = s.substr(startpos,nextpos-startpos);
|
current += s.c_str()[i];
|
||||||
tokens.push_back(toadd);
|
last_was_escape = false;
|
||||||
startpos = nextpos+1;
|
|
||||||
nextpos = s.find(delim,nextpos+1);
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
//push last element
|
if (s.c_str()[i] == delim) {
|
||||||
tokens.push_back(s.substr(startpos));
|
tokens.push_back(current);
|
||||||
}
|
current = "";
|
||||||
else {
|
last_was_escape = false;
|
||||||
std::string current = "";
|
}
|
||||||
current += s.c_str()[0];
|
else if (s.c_str()[i] == '\\'){
|
||||||
bool last_was_escape = false;
|
last_was_escape = true;
|
||||||
for(unsigned int i=1; i < s.size(); i++) {
|
}
|
||||||
if (last_was_escape) {
|
else {
|
||||||
current += '\\';
|
|
||||||
current += s.c_str()[i];
|
current += s.c_str()[i];
|
||||||
last_was_escape = false;
|
last_was_escape = false;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (s.c_str()[i] == delim) {
|
|
||||||
tokens.push_back(current);
|
|
||||||
current = "";
|
|
||||||
last_was_escape = false;
|
|
||||||
}
|
|
||||||
else if (s.c_str()[i] == '\\'){
|
|
||||||
last_was_escape = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
current += s.c_str()[i];
|
|
||||||
last_was_escape = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//push last element
|
|
||||||
tokens.push_back(current);
|
|
||||||
}
|
}
|
||||||
|
//push last element
|
||||||
|
tokens.push_back(current);
|
||||||
|
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
@ -518,7 +501,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
|
|||||||
std::vector<std::string> v_pos = split(parts[0],',');
|
std::vector<std::string> v_pos = split(parts[0],',');
|
||||||
std::vector<std::string> v_geom = split(parts[1],',');
|
std::vector<std::string> v_geom = split(parts[1],',');
|
||||||
std::string name = parts[2];
|
std::string name = parts[2];
|
||||||
std::vector<std::string> items = split(parts[3],',',true);
|
std::vector<std::string> items = split(parts[3],',');
|
||||||
std::string str_initial_selection = "";
|
std::string str_initial_selection = "";
|
||||||
std::string str_transparent = "false";
|
std::string str_transparent = "false";
|
||||||
|
|
||||||
@ -911,7 +894,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,std::vector<std::string>& p
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GUIFormSpecMenu::parseField(parserData* data,std::string element,std::string type) {
|
void GUIFormSpecMenu::parseField(parserData* data,std::string element,std::string type) {
|
||||||
std::vector<std::string> parts = split(element,';',true);
|
std::vector<std::string> parts = split(element,';');
|
||||||
|
|
||||||
if (parts.size() == 3) {
|
if (parts.size() == 3) {
|
||||||
parseSimpleField(data,parts);
|
parseSimpleField(data,parts);
|
||||||
@ -1275,7 +1258,7 @@ void GUIFormSpecMenu::parseElement(parserData* data,std::string element) {
|
|||||||
if (element == "")
|
if (element == "")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::vector<std::string> parts = split(element,'[', true);
|
std::vector<std::string> parts = split(element,'[');
|
||||||
|
|
||||||
// ugly workaround to keep compatibility
|
// ugly workaround to keep compatibility
|
||||||
if (parts.size() > 2) {
|
if (parts.size() > 2) {
|
||||||
@ -1428,7 +1411,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
|
|||||||
m_boxes.clear();
|
m_boxes.clear();
|
||||||
|
|
||||||
|
|
||||||
std::vector<std::string> elements = split(m_formspec_string,']',true);
|
std::vector<std::string> elements = split(m_formspec_string,']');
|
||||||
|
|
||||||
for (unsigned int i=0;i< elements.size();i++) {
|
for (unsigned int i=0;i< elements.size();i++) {
|
||||||
parseElement(&mydata,elements[i]);
|
parseElement(&mydata,elements[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user