def read_extra_commands(custom_tags_file): """ @param custom_tags_file: Filename of the custom tags file. @type custom_tags_file: C{str} """ if not os.access(custom_tags_file, os.R_OK): # Failed to open custom_tags.txt, ignore this return line_no = 0 with open(generic.find_file(custom_tags_file), "r", encoding="utf-8") as fh: for line in fh: line_no += 1 line = line.strip() if len(line) == 0 or line[0] == "#": continue i = line.find(":") if i == -1: raise generic.ScriptError("Line has no ':' delimiter.", generic.LinePosition(custom_tags_file, line_no)) name = line[:i].strip() value = line[i + 1 :] if name in commands: generic.print_warning( 'Overwriting existing tag "' + name + '".', generic.LinePosition(custom_tags_file, line_no) ) commands[name] = {"unicode": value} if is_ascii_string(value): commands[name]["ascii"] = value
def parse_file(filename, default): """ Read and parse a single language file. @param filename: The filename of the file to parse. @type filename: C{str} @param default: True iff this is the default language. @type default: C{bool} """ lang = Language(False) try: with open(generic.find_file(filename), "r", encoding="utf-8") as fh: for idx, line in enumerate(fh): pos = generic.LinePosition(filename, idx + 1) line = line.rstrip("\n\r").lstrip("\uFEFF") # The default language is processed twice here. Once as fallback langauge # and once as normal language. if default: default_lang.handle_string(line, pos) lang.handle_string(line, pos) except UnicodeDecodeError: pos = generic.LanguageFilePosition(filename) if default: raise generic.ScriptError("The default language file contains non-utf8 characters.", pos) generic.print_warning("Language file contains non-utf8 characters. Ignoring (part of) the contents.", pos) except generic.ScriptError as err: if default: raise generic.print_warning(err.value, err.pos) else: if lang.langid is None: generic.print_warning( "Language file does not contain a ##grflangid pragma", generic.LanguageFilePosition(filename) ) else: for lng in langs: if lng[0] == lang.langid: msg = "Language file has the same ##grflangid (with number {:d}) as another language file".format( lang.langid ) raise generic.ScriptError(msg, generic.LanguageFilePosition(filename)) langs.append((lang.langid, lang))
def set_position(self, fname, line): """ @note: The lexer.lineno contains a Position object. """ self.lexer.lineno = generic.LinePosition(fname, line, self.includes[:])