lyx_mirror/development/tools/unicodesymbols.py
Günter Milde efa844702c unicodesymbols fixes.
force=utf8 is required for most characters provided by add-on packgages
and (almost) all mathematical characters, because these are not
set up for inputencs utf8

unicodesymbols.py failed here (python 2.7 under Linux) before the simple fix
included in this commit.
2016-10-08 16:57:52 +02:00

123 lines
3.0 KiB
Python
Executable File

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# file unciodesymbols.py
# This file is part of LyX, the document processor.
# Licence details can be found in the file COPYING.
# author Georg Baum
# Full author contact details are available in file CREDITS
# This script reads a unicode symbol file and completes it in the given range
from __future__ import print_function
import os, re, string, sys, unicodedata
import io
def usage(prog_name):
return ("Usage: %s start stop inputfile outputfile\n" % prog_name +
"or %s start stop <inputfile >outputfile" % prog_name)
def error(message):
sys.stderr.write(message + '\n')
sys.exit(1)
def trim_eol(line):
" Remove end of line char(s)."
if line[-1:] == '\n':
return line[:-1]
else:
# file with no EOL in last line
return line
def read(input):
" Read input file and strip lineendings."
lines = list()
while 1:
line = input.readline()
if not line:
break
line = trim_eol(line)
tokens = line.split()
char = -1
if len(tokens) > 0:
if tokens[0][0:2] == "0x":
char = int(tokens[0][2:], 16)
elif tokens[0][0:3] == "#0x":
char = int(tokens[0][3:], 16)
lines.append([char, line])
return lines
def write(output, lines):
" Write output file."
for line in lines:
output.write(line[1] + '\n')
def complete(lines, start, stop):
l = 0
for i in range(start, stop):
# This catches both comments (lines[l][0] == -1) and code points less than i
while l < len(lines) and lines[l][0] < i:
# print(lines[l])
l = l + 1
continue
if l >= len(lines) or lines[l][0] != i:
if sys.version_info[0] < 3:
c = unichr(i)
else:
c = chr(i)
name = unicodedata.name(c, "")
if name != "":
if unicodedata.combining(c):
combining = "combining"
else:
combining = ""
line = [i, '#0x%04x "" "" "%s" "" "" # %s' % (i, combining, name)]
lines.insert(l, line)
# print(lines[l])
l = l + 1
def main(argv):
# Open files
if len(argv) == 3:
input = sys.stdin
output = sys.stdout
elif len(argv) == 5:
input = io.open(argv[3], 'r', encoding='utf_8')
output = io.open(argv[4], 'w', encoding='utf_8')
else:
error(usage(argv[0]))
if argv[1][:2] == "0x":
start = int(argv[1][2:], 16)
else:
start = int(argv[1])
if argv[2][:2] == "0x":
stop = int(argv[2][2:], 16)
else:
stop = int(argv[2])
# Do the real work
lines = read(input)
complete(lines, start, stop)
write(output, lines)
# Close files
if len(argv) == 3:
input.close()
output.close()
return 0
if __name__ == "__main__":
main(sys.argv)