Source code for tibiawikisql.utils

#  Copyright 2018 Allan Galarza
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

import re

min_max_pattern = re.compile(r"(\d+)-(\d+)")
loot_stats_pattern = re.compile(r"\|([\s\w]+),\s*times:(\d+)(?:,\s*amount:([\d-]+))?")
kills_pattern = re.compile(r"kills=(\d+)")
int_pattern = re.compile(r"[+-]?\d+")
float_pattern = re.compile(r'[+-]?(\d*[.])?\d+')
named_links_pattern = re.compile(r'\[\[[^]|]+\|([^]]+)\]\]')
file_pattern = re.compile(r'\[\[(?:File|Image):[^\]]+\]\]')

links_pattern = re.compile(r'\[\[([^]]+)\]\]')
external_links_pattern = re.compile(r'\[[^]]+\]')
no_wiki_pattern = re.compile(r'<nowiki>([^<]+)</nowiki>')





[docs]def convert_tibiawiki_position(pos): """Converts from TibiaWiki position system to regular numeric coordinates TibiaWiki takes the coordinates and splits in two bytes, represented in decimal, separated by a period. Parameters ---------- pos : :class:`str` A string containing a coordinate. Returns ------- :class:`int` The coordinate value. """ position_splits = pos.strip().split(".") try: coordinate = int(position_splits[0]) << 8 if len(position_splits) > 1 and position_splits[1].strip(): coordinate += int(position_splits[1]) return coordinate except (ValueError, IndexError): return 0
[docs]def parse_boolean(value: str, default=False, invert=False): """ Parses a boolean value from a string. String must contain "yes" to be considered True. Parameters ---------- value: :class:`str` The string containing an integer. default: :class:`bool`, optional The value to return if no boolean string is found. invert: :class:`bool`, optional Whether to invert the value or not. Returns ------- :class:`bool` The boolean value parsed in the string, or default if it doesn't match yes or no. """ value = value.strip().lower() if value == "yes": return not invert elif value == "no": return invert else: return default
[docs]def parse_float(value, default=0): """ From a string, parses a floating value. Parameters ---------- value: :class:`str` The string containing the floating number. default: :class:`float`, optional The value to return if no float is found. Returns ------- :class:`float` The floating number found, or the default value provided. """ if value is None: return default match = float_pattern.search(value) if match: return float(match.group(0)) else: return default
[docs]def parse_integer(value, default=0): """ Parses an integer from a string. Extra characters are ignored. Parameters ---------- value: :class:`str` The string containing an integer. default: :class:`int`, optional The value to return if no integer is found. Returns ------- :class:`int`: The numeric value found, or the default value provided. """ if value is None: return default match = int_pattern.search(value) if match: return int(match.group(0)) else: return default
[docs]def parse_loot_statistics(value): """ Gets every dropped item from a creature's loot statistics. Parameters ---------- value: :class:`str` A string containing a creature's loot statistics. Returns ------- tuple: A tuple containing the total kills and a list of entries. """ match = kills_pattern.search(value) if match: return int(match.group(1)), loot_stats_pattern.findall(value) else: return 0, None
[docs]def parse_min_max(value): """ Parses the mininum and maximum amounts of a loot drop. They consist of two numbers separated by a hyphen, e.g. ``0-40`` Parameters ---------- value: :class:`str` A string containing minimum and maximum values. Returns ------- tuple: The minimum and maximum amounts. """ match = min_max_pattern.search(value) if match: return int(match.group(1)), int(match.group(2)) else: return 0, parse_integer(value, 1)