summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
author Vas Crabb <cuavas@users.noreply.github.com>2021-10-09 12:16:17 +1100
committer GitHub <noreply@github.com>2021-10-09 12:16:17 +1100
commit38082ccbee749d650ccea886ae376a5d1dec337c (patch)
tree9ba9a900ba826bda58832834278025ced17f42f5 /scripts
parent34b3bf701098082feb9077db49987507962c1578 (diff)
Overdue internal UI enhancements (#8674)
* frontend: Added support for message context to localisations. * frontend: Added string_view versions of the message lookup functions. * frontend: Added a few more folder options to the internal UI. * emu/softlist.cpp: Use more appropriate containers. * Switched to Python 3 by default - this will become a requirement. * Updated msgfmt.py for message context support. * frontend: Show all software item info in the internal UI. * frontend: Search alternate titles in software selection menu. * 3rdparty/utf8proc: Updated to v2.6.1 (has several fixes). * frontend: Added software filters for common info fields. * frontend: Allow UI manager to hold onto persistent session data. * frontend: Cache software lists for eight machines. * frontend: Added support for loading localised system names. * frontend: Add UI for selecting localised system names.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/build/complay.py9
-rw-r--r--scripts/build/msgfmt.py116
-rw-r--r--scripts/build/png2bdc.py10
-rw-r--r--scripts/genie.lua2
-rw-r--r--scripts/src/3rdparty.lua5
-rw-r--r--scripts/src/lib.lua6
6 files changed, 48 insertions, 100 deletions
diff --git a/scripts/build/complay.py b/scripts/build/complay.py
index 445d25fe8ab..81516bc3ee7 100755
--- a/scripts/build/complay.py
+++ b/scripts/build/complay.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
##
## license:BSD-3-Clause
## copyright-holders:Vas Crabb
@@ -12,11 +12,6 @@ import xml.sax.saxutils
import zlib
-# workaround for version incompatibility
-if sys.version_info > (3, ):
- long = int
-
-
class ErrorHandler(object):
def __init__(self, **kwargs):
super(ErrorHandler, self).__init__(**kwargs)
@@ -347,7 +342,7 @@ class LayoutChecker(Minifyer):
self.handleError('Element mamelayout missing attribute version')
else:
try:
- long(attrs['version'])
+ int(attrs['version'])
except:
self.handleError('Element mamelayout attribute version "%s" is not an integer' % (attrs['version'], ))
self.have_script = None
diff --git a/scripts/build/msgfmt.py b/scripts/build/msgfmt.py
index 4147d5becb9..3f731e941ea 100644
--- a/scripts/build/msgfmt.py
+++ b/scripts/build/msgfmt.py
@@ -1,12 +1,12 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
+#! /usr/bin/env python3
# Written by Martin v. Löwis <loewis@informatik.hu-berlin.de>
"""Generate binary message catalog from textual translation description.
This program converts a textual Uniforum-style message catalog (.po file) into
a binary GNU catalog (.mo file). This is essentially the same function as the
-GNU msgfmt program, however, it is a simpler implementation.
+GNU msgfmt program, however, it is a simpler implementation. Currently it
+does not handle plural forms but it does handle message contexts.
Usage: msgfmt.py [OPTIONS] filename.po
@@ -25,14 +25,12 @@ Options:
Display version information and exit.
"""
-from __future__ import print_function
import os
import sys
+import ast
import getopt
import struct
import array
-import re
-import codecs
from email.parser import HeaderParser
__version__ = "1.2"
@@ -40,7 +38,6 @@ __version__ = "1.2"
MESSAGES = {}
-
def usage(code, msg=''):
print(__doc__, file=sys.stderr)
if msg:
@@ -48,33 +45,14 @@ def usage(code, msg=''):
sys.exit(code)
-
-def add(id, str, fuzzy):
+def add(ctxt, id, str, fuzzy):
"Add a non-fuzzy translation to the dictionary."
global MESSAGES
if not fuzzy and str:
- MESSAGES[id] = str
-
-def dequote(s):
- if (s[0] == s[-1]) and s.startswith(("'", '"')):
- return s[1:-1]
- return s
-
-# decode_escapes from http://stackoverflow.com/a/24519338
-ESCAPE_SEQUENCE_RE = re.compile(r'''
- ( \\U........ # 8-digit hex escapes
- | \\u.... # 4-digit hex escapes
- | \\x.. # 2-digit hex escapes
- | \\[0-7]{1,3} # Octal escapes
- | \\N\{[^}]+\} # Unicode characters by name
- | \\[\\'"abfnrtv] # Single-character escapes
- )''', re.UNICODE | re.VERBOSE)
-
-def decode_escapes(s):
- def decode_match(match):
- return codecs.decode(match.group(0), 'unicode-escape')
-
- return ESCAPE_SEQUENCE_RE.sub(decode_match, s)
+ if ctxt is None:
+ MESSAGES[id] = str
+ else:
+ MESSAGES[b"%b\x04%b" % (ctxt, id)] = str
def generate():
@@ -112,17 +90,16 @@ def generate():
7*4, # start of key index
7*4+len(keys)*8, # start of value index
0, 0) # size and offset of hash table
- offsdata = array.array("i", offsets)
- output += offsdata.tobytes() if hasattr(offsdata, "tobytes") else offsdata.tostring()
+ output += array.array("i", offsets).tobytes()
output += ids
output += strs
return output
-
def make(filename, outfile):
ID = 1
STR = 2
+ CTXT = 3
# Compute .mo name from .po name and arguments
if filename.endswith('.po'):
@@ -133,31 +110,28 @@ def make(filename, outfile):
outfile = os.path.splitext(infile)[0] + '.mo'
try:
- lines = open(infile, 'rb').readlines()
+ with open(infile, 'rb') as f:
+ lines = f.readlines()
except IOError as msg:
print(msg, file=sys.stderr)
sys.exit(1)
- section = None
+ section = msgctxt = None
fuzzy = 0
- empty = 0
- header_attempted = False
-
- # Start off assuming Latin-1, so everything decodes without failure,
- # until we know the exact encoding
- encoding = 'latin-1'
# Start off assuming Latin-1, so everything decodes without failure,
# until we know the exact encoding
encoding = 'latin-1'
# Parse the catalog
- for lno, l in enumerate(lines):
+ lno = 0
+ for l in lines:
l = l.decode(encoding)
+ lno += 1
# If we get a comment line after a msgstr, this is a new entry
if l[0] == '#' and section == STR:
- add(msgid, msgstr, fuzzy)
- section = None
+ add(msgctxt, msgid, msgstr, fuzzy)
+ section = msgctxt = None
fuzzy = 0
# Record a fuzzy mark
if l[:2] == '#,' and 'fuzzy' in l:
@@ -165,10 +139,16 @@ def make(filename, outfile):
# Skip comments
if l[0] == '#':
continue
- # Now we are in a msgid section, output previous section
- if l.startswith('msgid') and not l.startswith('msgid_plural'):
+ # Now we are in a msgid or msgctxt section, output previous section
+ if l.startswith('msgctxt'):
if section == STR:
- add(msgid, msgstr, fuzzy)
+ add(msgctxt, msgid, msgstr, fuzzy)
+ section = CTXT
+ l = l[7:]
+ msgctxt = b''
+ elif l.startswith('msgid') and not l.startswith('msgid_plural'):
+ if section == STR:
+ add(msgctxt, msgid, msgstr, fuzzy)
if not msgid:
# See whether there is an encoding declaration
p = HeaderParser()
@@ -179,14 +159,6 @@ def make(filename, outfile):
l = l[5:]
msgid = msgstr = b''
is_plural = False
- if l.strip() == '""':
- # Check if next line is msgstr. If so, this is a multiline msgid.
- if lines[lno+1].decode(encoding).startswith('msgstr'):
- # If this is the first empty msgid and is followed by msgstr, this is the header, which may contain the encoding declaration.
- # Otherwise this file is not valid
- if empty > 1:
- print("Found multiple empty msgids on line " + str(lno) + ", not valid!")
- empty += 1
# This is a message with plural forms
elif l.startswith('msgid_plural'):
if section != ID:
@@ -208,26 +180,6 @@ def make(filename, outfile):
if msgstr:
msgstr += b'\0' # Separator of the various plural forms
else:
- if (l[6:].strip() == '""') and (empty == 1) and (not header_attempted):
- header = ""
- # parse up until next empty line = end of header
- hdrno = lno
- while(hdrno < len(lines)-1):
- # This is a roundabout way to strip non-ASCII unicode characters from the header.
- # As we are only parsing out the encoding, we don't need any unicode chars in it.
- l = lines[hdrno+1].decode('unicode_escape').encode('ascii','ignore').decode(encoding)
- if l.strip():
- header += decode_escapes(dequote(l.strip()))
- else:
- break
- hdrno += 1
- # See whether there is an encoding declaration
- if(hdrno > lno):
- p = HeaderParser()
- charset = p.parsestr(str(header)).get_content_charset()
- header_attempted = True
- if charset:
- encoding = charset
if is_plural:
print('indexed msgstr required for plural on %s:%d' % (infile, lno),
file=sys.stderr)
@@ -237,8 +189,10 @@ def make(filename, outfile):
l = l.strip()
if not l:
continue
- l = decode_escapes(dequote(l)) # strip quotes and replace newlines if present
- if section == ID:
+ l = ast.literal_eval(l)
+ if section == CTXT:
+ msgctxt += l.encode(encoding)
+ elif section == ID:
msgid += l.encode(encoding)
elif section == STR:
msgstr += l.encode(encoding)
@@ -249,18 +203,18 @@ def make(filename, outfile):
sys.exit(1)
# Add last entry
if section == STR:
- add(msgid, msgstr, fuzzy)
+ add(msgctxt, msgid, msgstr, fuzzy)
# Compute output
output = generate()
try:
- open(outfile,"wb").write(output)
+ with open(outfile,"wb") as f:
+ f.write(output)
except IOError as msg:
print(msg, file=sys.stderr)
-
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'hVo:',
diff --git a/scripts/build/png2bdc.py b/scripts/build/png2bdc.py
index a1be5c552d0..adc4b185f44 100644
--- a/scripts/build/png2bdc.py
+++ b/scripts/build/png2bdc.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
##
## license:BSD-3-Clause
## copyright-holders:Aaron Giles, Andrew Gardner
@@ -59,12 +59,8 @@ import os
import png
import sys
-if sys.version_info >= (3,):
- def b2p(v):
- return bytes([v])
-else:
- def b2p(v):
- return chr(v)
+def b2p(v):
+ return bytes([v])
########################################
diff --git a/scripts/genie.lua b/scripts/genie.lua
index 4f443116ebb..2d53bda770b 100644
--- a/scripts/genie.lua
+++ b/scripts/genie.lua
@@ -435,7 +435,7 @@ else
LIBTYPE = "StaticLib"
end
-PYTHON = "python"
+PYTHON = "python3"
if _OPTIONS["PYTHON_EXECUTABLE"]~=nil then
PYTHON = _OPTIONS["PYTHON_EXECUTABLE"]
diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua
index c39d5f0b21f..fff3b94f0c8 100644
--- a/scripts/src/3rdparty.lua
+++ b/scripts/src/3rdparty.lua
@@ -2209,7 +2209,7 @@ project "utf8proc"
kind "StaticLib"
defines {
- "UTF8PROC_DLLEXPORT="
+ "UTF8PROC_STATIC",
}
configuration "Debug"
@@ -2223,9 +2223,6 @@ project "utf8proc"
}
configuration { }
- defines {
- "ZLIB_CONST",
- }
files {
MAME_DIR .. "3rdparty/utf8proc/utf8proc.c"
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index 0f3d637d131..6b1bd29e3ea 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -25,6 +25,12 @@ project "utils"
ext_includedir("utf8proc"),
}
+if not _OPTIONS["with-system-utf8proc"] then
+ defines {
+ "UTF8PROC_STATIC",
+ }
+end
+
files {
MAME_DIR .. "src/lib/util/abi.h",
MAME_DIR .. "src/lib/util/avhuff.cpp",