Commit 0414a6e1 authored by Stefano Zacchiroli's avatar Stefano Zacchiroli

New upstream version 2.1.3

parent 53649fa3
repo: 26cf45c5599ff39ae649d05d52e820039256157e
node: 5a6ad02c213565a81a51d8a6d8e05fae18cefd83
branch: default
latesttag: 2.1.2
latesttagdistance: 80
changessincelatesttag: 104
syntax: glob
*.pyc
*.swp
*~
TAGS
build
dist
*.a
*.so
.noseids
examples/generated/*
beancount/parser/grammar.output
*.picklecache
*.DS_Store
.idea
beancount.egg-info
.cache
.pytest_cache/*
12b7f102ffbb8ae6d18fd6edf40f5cf2d354a4d6 v1
1f60a2293b600c4bc22926fb1cc0d4300145eba2 old-posting
da62959c106a3f06ffc4a1fcdb5e6ae97e77152d master
6d69f09be1d4ac9365432b2a8a4bc130b521ccda github/master
a85679977ede1586585ae0b92cd121e1b8835481 github/master
8af008648277cd9bf2a6699d6db550ad12d88453 2.0.0
e291c91b37e1d21c29645d93473a7917bb726699 2.1.0
c36d4fec6823ddbfbabbfde429f01175cdb4d661 2.1.1
2b20d301782528147e0aba744da9a014323ef630 2.1.2
This diff is collapsed.
language: python
python:
- "3.6"
addons:
apt:
packages:
- gnupg
- zip
install:
- pip install -r requirements.txt
script:
- make build
- NOSE=nosetests make test
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
Martin Blais (original author).
Contributors (in alphabetical order):
- Adrián Medraño Calvo (support for UTF-8)
- Alex Johnstone (bug fix)
- Alok Parlikar (bug fix)
- Christoph Sarnowski (bug fix)
- Daniel Clemente (early adoption and tickets)
- Dominik Aumayr (web-related bug fixes, static documentation, author of Fava)
- Ethan Glasser-Camp (improvements to grammar)
- Felix Eckhofer (bug fix)
- Hugo Ideler (bug fix price source0
- Jakob Schnitzer (bug fixes in plugins and SQL, co-author/maintainer of Fava)
- Jason Chu (bug fixes, plugins, lots of comments)
- Jeff Brantley (windows installation improvements)
- Johannes Harms (bug fixes, forecast plugin improvement)
- Mark Hansen (docs)
- Markus Teufelberger (bug fix / testing)
- Martin Michlmayr (numerous tickets, CI setup, bug fixes and improvements)
- Michael Droogleever (importer-related improvements)
- Mikhail Gusarov (parser / improvement for short account names)
- Patrick Ruckstuhl (bug fix importers)
- Robert Sesek (bug fix)
- Zhuoyun Wei (importers improvements)
- dave_stephens (web-related improvement)
- rkhwaja (windows installation improvement)
- Сергей Трофимов (bug fix, parser)
And all the other users on the mailing-list asking important questions, making
useful suggestions and engaging in productive discussions. Thank you!
#!/usr/bin/env make
# Just my big old fat ledger file.
INPUT = $(HOME)/q/office/accounting/blais.beancount
DOWNLOADS = $(HOME)/u/Downloads
GREP="grep --include="*.py" -srnE"
TOOLS=./tools
PYTHON?=python3
all: build
# Clean everything up.
clean:
rm -f core
rm -rf build
rm -f $(CROOT)/grammar.h $(CROOT)/grammar.c
rm -f $(CROOT)/lexer.h $(CROOT)/lexer.c
rm -f $(CROOT)/*.so
find . -name __pycache__ -exec rm -r "{}" \; -prune
# Targets to generate and compile the C parser.
CROOT = beancount/parser
# See
# https://www.owlfolio.org/possibly-useful/flex-input-scanner-rules-are-too-complicated/
#LEX = flex -Ca
LEX = flex
YACC = bison --report=itemset --verbose
FILTERYACC = sed -e 's@/\*[ \t]yacc\.c:.*\*/@@'
TMP=/tmp
$(CROOT)/grammar.c $(CROOT)/grammar.h: $(CROOT)/grammar.y
$(YACC) -o $(CROOT)/grammar.c $<
(cat $(CROOT)/grammar.c | $(FILTERYACC) > $(TMP)/grammar.c ; mv $(TMP)/grammar.c $(CROOT)/grammar.c )
(cat $(CROOT)/grammar.h | $(FILTERYACC) > $(TMP)/grammar.h ; mv $(TMP)/grammar.h $(CROOT)/grammar.h )
UNICODE_CATEGORY_RANGES_GENERATOR=$(TOOLS)/generate_unicode_category_regexps.py
UNICODE_CATEGORY_DIR = $(CROOT)/lexer
UNICODE_CATEGORIES = Lu Ll Lt Lo Nd Nl No
UNICODE_CATEGORY_SOURCES = $(patsubst %, $(UNICODE_CATEGORY_DIR)/%.l, $(UNICODE_CATEGORIES))
$(UNICODE_CATEGORY_SOURCES): $(UNICODE_CATEGORY_DIR)/%.l :
$(PYTHON) $(UNICODE_CATEGORY_RANGES_GENERATOR) \
--format=lex --name=UTF-8-$* --categories=$* >$@
# Note that flex parses the files in the given order.
#LEXER_SOURCES = $(UNICODE_CATEGORY_SOURCES) $(CROOT)/lexer.l
#$(CROOT)/lexer.c $(CROOT)/lexer.h: $(LEXER_SOURCES) $(CROOT)/grammar.h
# $(LEX) --outfile=$(CROOT)/lexer.c --header-file=$(CROOT)/lexer.h $(LEXER_SOURCES)
# patch -p1 < $(CROOT)/lexer.patch
FLEX_VERSION=$(shell $(LEX) -V)
$(CROOT)/lexer.c $(CROOT)/lexer.h: $(CROOT)/lexer.l $(CROOT)/grammar.h
$(LEX) --outfile=$(CROOT)/lexer.c --header-file=$(CROOT)/lexer.h $<
SOURCES = \
$(CROOT)/lexer.c \
$(CROOT)/lexer.h \
$(CROOT)/grammar.c \
$(CROOT)/grammar.h
.PHONY: build
build: $(SOURCES)
$(PYTHON) setup.py build_ext -i
build35: $(SOURCES)
python3.5 setup.py build_ext -i
# Dump the lexer parsed output. This can be used to check across languages.
dump_lexer:
bean-dump-lexer $(INPUT)
# Check for memory leaks.
grind:
valgrind --leak-check=full $(PYTHON) bean-sandbox $(INPUT)
# Regenerate the website.
html docs:
projects docs beancount
# Compute and plot inter-module dependencies.
# We want to insure a really strict set of relationships between the modules,
# and this is the high-level picture.
build/beancount.deps:
sfood -i bin beancount > $@
CLUSTERS_REGEXPS = \
beancount/core/.*_test\.py core/tests \
beancount/core core \
beancount/ops/.*_test\.py ops/tests \
beancount/ops ops \
beancount/parser/printer_test\.py printer/tests \
beancount/parser/printer.py printer \
beancount/parser/options_test\.py options/tests \
beancount/parser/options.py options \
beancount/parser/.*_test\.py parser/tests \
beancount/parser parser \
beancount/plugins/.*_test\.py plugins/tests \
beancount/plugins plugins \
beancount/reports/.*_test\.py reports/tests \
beancount/reports reports \
beancount/scripts/bake.*_test\.py scripts/bake/tests \
beancount/scripts/bake.* scripts/bake \
beancount/scripts/.*_test\.py scripts/tests \
beancount/scripts scripts \
beancount/utils/.*_test\.py utils/tests \
beancount/utils utils \
beancount/web/.*_test\.py web/tests \
beancount/web web \
beancount/query/.*_test\.py query/tests \
beancount/query query \
beancount/load.*_test\.py load/tests \
beancount/load.*\.py load \
beancount load
GRAPHER = dot
build/beancount.pdf: build/beancount.deps
cat $< | sfood-cluster-regexp $(CLUSTERS_REGEXPS) | grep -v /tests | sfood-graph | $(GRAPHER) -Tps | ps2pdf - $@
evince $@
build/beancount_tests.pdf: build/beancount.deps
cat $< | sfood-cluster-regexp $(CLUSTERS_REGEXPS) | sfood-graph | $(GRAPHER) -Tps | ps2pdf - $@
evince $@
# Compute ahd plot the dependencies within the core.
# We are considering a separation of the basic data structure and the basic operations.
# This provides the detail of the relationships between these sets of fils.
build/beancount-core.pdf: build/beancount-core.deps
sfood -ii beancount/core/*.py | sfood-graph | $(GRAPHER) -Tps | ps2pdf - $@
showdeps-core: build/beancount-core.pdf
evince $<
# Run in the debugger.
debug:
gdb --args $(PYTHON) /home/blais/p/beancount/bin/bean-sandbox $(INPUT)
# Push to github.
github:
hg bookmark -r default master
hg push git+ssh://git@github.com/blais/beancount
# Bake a release.
release:
$(PYTHON) setup.py register sdist upload
vtest vtests verbose-test verbose-tests:
$(PYTHON) -m pytest -v -s beancount examples
qtest qtests quiet-test quiet-tests test tests:
$(PYTHON) -m pytest beancount
test-last test-last-failed test-failed:
$(PYTHON) -m pytest --last-failed beancount
test-naked:
PATH=/bin:/usr/bin PYTHONPATH= $(PYTHON) -m pytest -x beancount
# Run the parser and measure its performance.
.PHONY: check
check:
bean-check $(INPUT)
# Run the demo program.
demo:
bin/bean-web --debug examples/demo.beancount
# Generate the tutorial files from the example file.
EXAMPLE=examples/example.beancount
example $(EXAMPLE):
./bin/bean-example --seed=0 -o $(EXAMPLE)
TUTORIAL=examples/tutorial
tutorial: $(EXAMPLE)
$(PYTHON) beancount/scripts/tutorial.py $(EXAMPLE) $(TUTORIAL)
# Run the web server.
.PHONY: web
web:
bean-web --debug $(INPUT)
.PHONY: web-incognito
web-incognito:
bean-web --incognito --debug $(INPUT)
# Run the importer.
.PHONY: import
import:
bean-import $(INPUT) $(DOWNLOADS)
# My development sandbox script. This is messy and it's okay.
.PHONY: sandbox
sandbox:
bean-sandbox $(INPUT)
missing-tests:
$(TOOLS)/find_missing_tests.py beancount
fixmes:
egrep -srn '\b(FIXME|TODO\()' beancount || true
filter-terms:
egrep --exclude-dir='.hg' --exclude-dir='__pycache__' -srn 'GOOGL?\b' $(PWD) | grep -v GOOGLE_APIS || true
multi-imports:
(egrep -srn '^(from.*)?import.*,' beancount | grep -v 'from typing') || true
# Check for unused imports.
sfood-checker:
sfood-checker bin beancount
# Check dependency constraints.
constraints dep-constraints: build/beancount.deps
$(TOOLS)/dependency_constraints.py $<
# Run the linter on all source code.
# To list all messages, call: "pylint --list-msgs"
LINT_SRCS = \
beancount \
examples/ingest/office/importers \
bin/* \
tools/*.py
# Note: Keeping to 3.5 because 3.6 pylint raises an exception (as of 2017-01-15).
#PYLINT = pylint
PYLINT = python3 $(shell which pylint)
pylint lint:
$(PYLINT) --rcfile=$(PWD)/etc/pylintrc $(LINT_SRCS)
LINT_TESTS=useless-suppression,empty-docstring
pylint-only:
$(PYLINT) --rcfile=$(PWD)/etc/pylintrc --disable=all --enable=$(LINT_TESTS) $(LINT_SRCS)
pyflakes:
pyflakes $(LINT_SRCS)
# Check everything.
status check: pylint pyflakes filter-terms missing-tests dep-constraints multi-imports test
# Experimental docs conversion.
download-pdf:
./tools/download_docs.py pdf $(HOME)/p/beancount-downloads/pdf
download-odt:
./tools/download_docs.py odt $(HOME)/p/beancount-downloads/odt
sphinx sphinx_odt2rst:
./tools/sphinx_odt2rst.py $(HOME)/p/beancount-downloads/odt $(HOME)/p/beancount-docs
convert_test:
./tools/convert_doc.py --cache=/tmp/convert_test.cache '1WjARst_cSxNE-Lq6JnJ5CC41T3WndEsiMw4d46r2694' /tmp/trading.md
# This does not work well; import errors just won't go away, it's slow, and it
# seems you have to pregenerate all .pyi to do anything useful.
pytype:
find $(PWD)/beancount -name '*.py' | parallel -j16 pytype --pythonpath=$(PWD) -o {}i {}
pytype1:
pytype --pythonpath=$(PWD) beancount/utils/net_utils.py
Metadata-Version: 1.1
Name: beancount
Version: 2.1.3
Summary: Command-line Double-Entry Accounting
Home-page: http://furius.ca/beancount
Author: Martin Blais
Author-email: blais@furius.ca
License: GNU GPLv2 only
Download-URL: http://bitbucket.org/blais/beancount
Description:
A double-entry accounting system that uses text files as input.
Beancount defines a simple data format or "language" that lets you define
financial transaction records in a text file, load them in memory and
generate and export a variety of reports, such as balance sheets or income
statements. It also provides a client with an SQL-like query language to
filter and aggregate financial data, and a web interface which renders
those reports to HTML. Finally, it provides the scaffolding required to
automate the conversion of external data into one's input file in
Beancount syntax.
Platform: UNKNOWN
Description: Command-line Double-Entry Accounting
Official-Homepage: http://furius.ca/beancount
Author: Martin Blais
Author-Email: blais@furius.ca
ChangeLog: http://furius.ca/beancount/CHANGES
Bugs-Reporting: mailto:blais@furius.ca
Download-Snapshots: http://bitbucket.org/blais/beancount
License: GNU GPLv2 only
This diff is collapsed.
environment:
matrix:
# For Python versions available on Appveyor, see
# http://www.appveyor.com/docs/installed-software#python
# The list here is complete (excluding Python 2.6, which
# isn't covered by this document) at the time of writing.
- PYTHON: "C:\\Python36-x64"
install:
# We need wheel installed to build wheels
- "%PYTHON%\\python.exe -m pip install wheel"
build: off
# test_script:
# Put your test command here.
# If you don't need to build C extensions on 64-bit Python 3.3 or 3.4,
# you can remove "build.cmd" from the front of the command, as it's
# only needed to support those cases.
# Note that you must use the environment variable %PYTHON% to refer to
# the interpreter you're using - Appveyor does not do anything special
# to put the Python evrsion you want to use on PATH.
# - "%PYTHON%\\python.exe setup.py test"
after_test:
# This step builds your wheels.
# Again, you only need build.cmd if you're building C extensions for
# 64-bit Python 3.3/3.4. And you need to use %PYTHON% to get the correct
# interpreter
- "%PYTHON%\\python.exe setup.py build_ext --compiler=msvc --define YY_NO_UNISTD_H"
- "%PYTHON%\\python.exe setup.py bdist_wheel"
artifacts:
# bdist_wheel puts your built wheel in the dist directory
- path: dist\*.whl
#on_success:
# You can use this step to upload your artifacts to a public website.
# See Appveyor's documentation for more details. Or you can simply
# access your wheels from the Appveyor "artifacts" tab for your build.
Metadata-Version: 1.1
Name: beancount
Version: 2.1.3
Summary: Command-line Double-Entry Accounting
Home-page: http://furius.ca/beancount
Author: Martin Blais
Author-email: blais@furius.ca
License: GNU GPLv2 only
Download-URL: http://bitbucket.org/blais/beancount
Description:
A double-entry accounting system that uses text files as input.
Beancount defines a simple data format or "language" that lets you define
financial transaction records in a text file, load them in memory and
generate and export a variety of reports, such as balance sheets or income
statements. It also provides a client with an SQL-like query language to
filter and aggregate financial data, and a web interface which renders
those reports to HTML. Finally, it provides the scaffolding required to
automate the conversion of external data into one's input file in
Beancount syntax.
Platform: UNKNOWN
This diff is collapsed.
pytest
python-dateutil
ply
bottle
lxml
python-magic
beautifulsoup4
requests
chardet
google-api-python-client
......@@ -3,7 +3,7 @@
This is v2, a complete rewrite of Beancount v1, simplified and improved
drastically.
"""
__copyright__ = "Copyright (C) 2013-2014, 2016 Martin Blais"
__copyright__ = "Copyright (C) 2013-2014, 2016-2018 Martin Blais"
__license__ = "GNU GPLv2"
......@@ -13,4 +13,4 @@ if (sys.version_info.major, sys.version_info.minor) < (3, 3):
raise ImportError("Python 3.3 or above is required")
__version__ = '2.1.3-devel'
__version__ = '2.1.3'
......@@ -98,7 +98,7 @@ def is_root_account(account_name, account_types=None):
return account_name in account_types
else:
return (account_name and
bool(re.match('([A-Z][A-Za-z0-9\-]+)$', account_name)))
bool(re.match(r'([A-Z][A-Za-z0-9\-]+)$', account_name)))
......
......@@ -456,7 +456,7 @@ class Inventory(dict):
# We need to split the comma-separated positions but ignore commas
# occurring within a {...cost...} specification.
position_strs = re.split(
'([-+]?[0-9,.]+\s+[A-Z]+\s*(?:{[^}]*})?)\s*,?\s*', string)[1::2]
r'([-+]?[0-9,.]+\s+[A-Z]+\s*(?:{[^}]*})?)\s*,?\s*', string)[1::2]
for position_str in position_strs:
new_inventory.add_position(position_from_string(position_str))
return new_inventory
......
......@@ -207,7 +207,7 @@ def contains(real_account, account_name):
def realize(entries, min_accounts=None, compute_balance=True):
"""Group entries by account, into a "tree" of realized accounts. RealAccount's
r"""Group entries by account, into a "tree" of realized accounts. RealAccount's
are essentially containers for lists of postings and the final balance of
each account, and may be non-leaf accounts (used strictly for organizing
accounts into a hierarchy). This is then used to issue reports.
......
This diff is collapsed.
This diff is collapsed.
diff -r c8b3a84e2006 beancount/parser/lexer.c
--- a/beancount/parser/lexer.c Tue May 01 23:18:54 2018 -0400
+++ b/beancount/parser/lexer.c Tue May 01 23:20:14 2018 -0400
@@ -1068,7 +1068,7 @@
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- size_t n; \
+ ssize_t n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
UTF-8-Ll-0 [\x61-\x7a]|\xc2\xb5|\xc3[\x9f-\xb6]|\xc3[\xb8-\xbf]|\xc4\x81|\xc4\x83|\xc4\x85|\xc4\x87|\xc4\x89|\xc4\x8b|\xc4\x8d|\xc4\x8f|\xc4\x91|\xc4\x93|\xc4\x95|\xc4\x97|\xc4\x99|\xc4\x9b|\xc4\x9d|\xc4\x9f|\xc4\xa1|\xc4\xa3|\xc4\xa5|\xc4\xa7|\xc4\xa9|\xc4\xab|\xc4\xad|\xc4\xaf|\xc4\xb1|\xc4\xb3|\xc4\xb5|\xc4[\xb7-\xb8]|\xc4\xba|\xc4\xbc|\xc4\xbe|\xc5\x80|\xc5\x82|\xc5\x84|\xc5\x86|\xc5[\x88-\x89]|\xc5\x8b|\xc5\x8d|\xc5\x8f|\xc5\x91|\xc5\x93|\xc5\x95|\xc5\x97|\xc5\x99|\xc5\x9b|\xc5\x9d
UTF-8-Ll-1 \xc5\x9f|\xc5\xa1|\xc5\xa3|\xc5\xa5|\xc5\xa7|\xc5\xa9|\xc5\xab|\xc5\xad|\xc5\xaf|\xc5\xb1|\xc5\xb3|\xc5\xb5|\xc5\xb7|\xc5\xba|\xc5\xbc|\xc5[\xbe-\xbf]|\xc6\x80|\xc6\x83|\xc6\x85|\xc6\x88|\xc6[\x8c-\x8d]|\xc6\x92|\xc6\x95|\xc6[\x99-\x9b]|\xc6\x9e|\xc6\xa1|\xc6\xa3|\xc6\xa5|\xc6\xa8|\xc6[\xaa-\xab]|\xc6\xad|\xc6\xb0|\xc6\xb4|\xc6\xb6|\xc6[\xb9-\xba]|\xc6[\xbd-\xbf]|\xc7\x86|\xc7\x89|\xc7\x8c|\xc7\x8e|\xc7\x90|\xc7\x92|\xc7\x94|\xc7\x96|\xc7\x98|\xc7\x9a|\xc7[\x9c-\x9d]|\xc7\x9f|\xc7\xa1|\xc7\xa3
UTF-8-Ll-2 \xc7\xa5|\xc7\xa7|\xc7\xa9|\xc7\xab|\xc7\xad|\xc7[\xaf-\xb0]|\xc7\xb3|\xc7\xb5|\xc7\xb9|\xc7\xbb|\xc7\xbd|\xc7\xbf|\xc8\x81|\xc8\x83|\xc8\x85|\xc8\x87|\xc8\x89|\xc8\x8b|\xc8\x8d|\xc8\x8f|\xc8\x91|\xc8\x93|\xc8\x95|\xc8\x97|\xc8\x99|\xc8\x9b|\xc8\x9d|\xc8\x9f|\xc8\xa1|\xc8\xa3|\xc8\xa5|\xc8\xa7|\xc8\xa9|\xc8\xab|\xc8\xad|\xc8\xaf|\xc8\xb1|\xc8[\xb3-\xb9]|\xc8\xbc|\xc8\xbf|\xc9\x80|\xc9\x82|\xc9\x87|\xc9\x89|\xc9\x8b|\xc9\x8d|\xc9[\x8f-\xbf]|\xca[\x80-\x93]|\xca[\x95-\xaf]|\xcd\xb1
UTF-8-Ll-3 \xcd\xb3|\xcd\xb7|\xcd[\xbb-\xbd]|\xce\x90|\xce[\xac-\xbf]|\xcf[\x80-\x8e]|\xcf[\x90-\x91]|\xcf[\x95-\x97]|\xcf\x99|\xcf\x9b|\xcf\x9d|\xcf\x9f|\xcf\xa1|\xcf\xa3|\xcf\xa5|\xcf\xa7|\xcf\xa9|\xcf\xab|\xcf\xad|\xcf[\xaf-\xb3]|\xcf\xb5|\xcf\xb8|\xcf[\xbb-\xbc]|\xd0[\xb0-\xbf]|\xd1[\x80-\x9f]|\xd1\xa1|\xd1\xa3|\xd1\xa5|\xd1\xa7|\xd1\xa9|\xd1\xab|\xd1\xad|\xd1\xaf|\xd1\xb1|\xd1\xb3|\xd1\xb5|\xd1\xb7|\xd1\xb9|\xd1\xbb|\xd1\xbd|\xd1\xbf|\xd2\x81|\xd2\x8b|\xd2\x8d|\xd2\x8f|\xd2\x91|\xd2\x93|\xd2\x95|\xd2\x97|\xd2\x99
UTF-8-Ll-4 \xd2\x9b|\xd2\x9d|\xd2\x9f|\xd2\xa1|\xd2\xa3|\xd2\xa5|\xd2\xa7|\xd2\xa9|\xd2\xab|\xd2\xad|\xd2\xaf|\xd2\xb1|\xd2\xb3|\xd2\xb5|\xd2\xb7|\xd2\xb9|\xd2\xbb|\xd2\xbd|\xd2\xbf|\xd3\x82|\xd3\x84|\xd3\x86|\xd3\x88|\xd3\x8a|\xd3\x8c|\xd3[\x8e-\x8f]|\xd3\x91|\xd3\x93|\xd3\x95|\xd3\x97|\xd3\x99|\xd3\x9b|\xd3\x9d|\xd3\x9f|\xd3\xa1|\xd3\xa3|\xd3\xa5|\xd3\xa7|\xd3\xa9|\xd3\xab|\xd3\xad|\xd3\xaf|\xd3\xb1|\xd3\xb3|\xd3\xb5|\xd3\xb7|\xd3\xb9|\xd3\xbb|\xd3\xbd|\xd3\xbf
UTF-8-Ll-5 \xd4\x81|\xd4\x83|\xd4\x85|\xd4\x87|\xd4\x89|\xd4\x8b|\xd4\x8d|\xd4\x8f|\xd4\x91|\xd4\x93|\xd4\x95|\xd4\x97|\xd4\x99|\xd4\x9b|\xd4\x9d|\xd4\x9f|\xd4\xa1|\xd4\xa3|\xd4\xa5|\xd4\xa7|\xd4\xa9|\xd4\xab|\xd4\xad|\xd4\xaf|\xd5[\xa1-\xbf]|\xd6[\x80-\x87]|\xe1\x8f[\xb8-\xbd]|\xe1\xb2[\x80-\x88]|\xe1\xb4[\x80-\xab]|\xe1\xb5[\xab-\xb7]|\xe1\xb5[\xb9-\xbf]|\xe1\xb6[\x80-\x9a]|\xe1\xb8\x81|\xe1\xb8\x83|\xe1\xb8\x85|\xe1\xb8\x87|\xe1\xb8\x89|\xe1\xb8\x8b|\xe1\xb8\x8d|\xe1\xb8\x8f|\xe1\xb8\x91|\xe1\xb8\x93|\xe1\xb8\x95|\xe1\xb8\x97|\xe1\xb8\x99|\xe1\xb8\x9b|\xe1\xb8\x9d|\xe1\xb8\x9f|\xe1\xb8\xa1|\xe1\xb8\xa3
UTF-8-Ll-6 \xe1\xb8\xa5|\xe1\xb8\xa7|\xe1\xb8\xa9|\xe1\xb8\xab|\xe1\xb8\xad|\xe1\xb8\xaf|\xe1\xb8\xb1|\xe1\xb8\xb3|\xe1\xb8\xb5|\xe1\xb8\xb7|\xe1\xb8\xb9|\xe1\xb8\xbb|\xe1\xb8\xbd|\xe1\xb8\xbf|\xe1\xb9\x81|\xe1\xb9\x83|\xe1\xb9\x85|\xe1\xb9\x87|\xe1\xb9\x89|\xe1\xb9\x8b|\xe1\xb9\x8d|\xe1\xb9\x8f|\xe1\xb9\x91|\xe1\xb9\x93|\xe1\xb9\x95|\xe1\xb9\x97|\xe1\xb9\x99|\xe1\xb9\x9b|\xe1\xb9\x9d|\xe1\xb9\x9f|\xe1\xb9\xa1|\xe1\xb9\xa3|\xe1\xb9\xa5|\xe1\xb9\xa7|\xe1\xb9\xa9|\xe1\xb9\xab|\xe1\xb9\xad|\xe1\xb9\xaf|\xe1\xb9\xb1|\xe1\xb9\xb3|\xe1\xb9\xb5|\xe1\xb9\xb7|\xe1\xb9\xb9|\xe1\xb9\xbb|\xe1\xb9\xbd|\xe1\xb9\xbf|\xe1\xba\x81|\xe1\xba\x83|\xe1\xba\x85|\xe1\xba\x87
UTF-8-Ll-7 \xe1\xba\x89|\xe1\xba\x8b|\xe1\xba\x8d|\xe1\xba\x8f|\xe1\xba\x91|\xe1\xba\x93|\xe1\xba[\x95-\x9d]|\xe1\xba\x9f|\xe1\xba\xa1|\xe1\xba\xa3|\xe1\xba\xa5|\xe1\xba\xa7|\xe1\xba\xa9|\xe1\xba\xab|\xe1\xba\xad|\xe1\xba\xaf|\xe1\xba\xb1|\xe1\xba\xb3|\xe1\xba\xb5|\xe1\xba\xb7|\xe1\xba\xb9|\xe1\xba\xbb|\xe1\xba\xbd|\xe1\xba\xbf|\xe1\xbb\x81|\xe1\xbb\x83|\xe1\xbb\x85|\xe1\xbb\x87|\xe1\xbb\x89|\xe1\xbb\x8b|\xe1\xbb\x8d|\xe1\xbb\x8f|\xe1\xbb\x91|\xe1\xbb\x93|\xe1\xbb\x95|\xe1\xbb\x97|\xe1\xbb\x99|\xe1\xbb\x9b|\xe1\xbb\x9d|\xe1\xbb\x9f|\xe1\xbb\xa1|\xe1\xbb\xa3|\xe1\xbb\xa5|\xe1\xbb\xa7|\xe1\xbb\xa9|\xe1\xbb\xab|\xe1\xbb\xad|\xe1\xbb\xaf|\xe1\xbb\xb1|\xe1\xbb\xb3
UTF-8-Ll-8 \xe1\xbb\xb5|\xe1\xbb\xb7|\xe1\xbb\xb9|\xe1\xbb\xbb|\xe1\xbb\xbd|\xe1\xbb\xbf|\xe1\xbc[\x80-\x87]|\xe1\xbc[\x90-\x95]|\xe1\xbc[\xa0-\xa7]|\xe1\xbc[\xb0-\xb7]|\xe1\xbd[\x80-\x85]|\xe1\xbd[\x90-\x97]|\xe1\xbd[\xa0-\xa7]|\xe1\xbd[\xb0-\xbd]|\xe1\xbe[\x80-\x87]|\xe1\xbe[\x90-\x97]|\xe1\xbe[\xa0-\xa7]|\xe1\xbe[\xb0-\xb4]|\xe1\xbe[\xb6-\xb7]|\xe1\xbe\xbe|\xe1\xbf[\x82-\x84]|\xe1\xbf[\x86-\x87]|\xe1\xbf[\x90-\x93]|\xe1\xbf[\x96-\x97]|\xe1\xbf[\xa0-\xa7]|\xe1\xbf[\xb2-\xb4]|\xe1\xbf[\xb6-\xb7]|\xe2\x84\x8a|\xe2\x84[\x8e-\x8f]|\xe2\x84\x93|\xe2\x84\xaf|\xe2\x84\xb4|\xe2\x84\xb9|\xe2\x84[\xbc-\xbd]|\xe2\x85[\x86-\x89]|\xe2\x85\x8e|\xe2\x86\x84|\xe2\xb0[\xb0-\xbf]|\xe2\xb1[\x80-\x9e]|\xe2\xb1\xa1|\xe2\xb1[\xa5-\xa6]|\xe2\xb1\xa8|\xe2\xb1\xaa|\xe2\xb1\xac|\xe2\xb1\xb1|\xe2\xb1[\xb3-\xb4]|\xe2\xb1[\xb6-\xbb]|\xe2\xb2\x81|\xe2\xb2\x83|\xe2\xb2\x85
UTF-8-Ll-9 \xe2\xb2\x87|\xe2\xb2\x89|\xe2\xb2\x8b|\xe2\xb2\x8d|\xe2\xb2\x8f|\xe2\xb2\x91|\xe2\xb2\x93|\xe2\xb2\x95|\xe2\xb2\x97|\xe2\xb2\x99|\xe2\xb2\x9b|\xe2\xb2\x9d|\xe2\xb2\x9f|\xe2\xb2\xa1|\xe2\xb2\xa3|\xe2\xb2\xa5|\xe2\xb2\xa7|\xe2\xb2\xa9|\xe2\xb2\xab|\xe2\xb2\xad|\xe2\xb2\xaf|\xe2\xb2\xb1|\xe2\xb2\xb3|\xe2\xb2\xb5|\xe2\xb2\xb7|\xe2\xb2\xb9|\xe2\xb2\xbb|\xe2\xb2\xbd|\xe2\xb2\xbf|\xe2\xb3\x81|\xe2\xb3\x83|\xe2\xb3\x85|\xe2\xb3\x87|\xe2\xb3\x89|\xe2\xb3\x8b|\xe2\xb3\x8d|\xe2\xb3\x8f|\xe2\xb3\x91|\xe2\xb3\x93|\xe2\xb3\x95|\xe2\xb3\x97|\xe2\xb3\x99|\xe2\xb3\x9b|\xe2\xb3\x9d|\xe2\xb3\x9f|\xe2\xb3\xa1|\xe2\xb3[\xa3-\xa4]|\xe2\xb3\xac|\xe2\xb3\xae|\xe2\xb3\xb3
UTF-8-Ll-10 \xe2\xb4[\x80-\xa5]|\xe2\xb4\xa7|\xe2\xb4\xad|\xea\x99\x81|\xea\x99\x83|\xea\x99\x85|\xea\x99\x87|\xea\x99\x89|\xea\x99\x8b|\xea\x99\x8d|\xea\x99\x8f|\xea\x99\x91|\xea\x99\x93|\xea\x99\x95|\xea\x99\x97|\xea\x99\x99|\xea\x99\x9b|\xea\x99\x9d|\xea\x99\x9f|\xea\x99\xa1|\xea\x99\xa3|\xea\x99\xa5|\xea\x99\xa7|\xea\x99\xa9|\xea\x99\xab|\xea\x99\xad|\xea\x9a\x81|\xea\x9a\x83|\xea\x9a\x85|\xea\x9a\x87|\xea\x9a\x89|\xea\x9a\x8b|\xea\x9a\x8d|\xea\x9a\x8f|\xea\x9a\x91|\xea\x9a\x93|\xea\x9a\x95|\xea\x9a\x97|\xea\x9a\x99|\xea\x9a\x9b|\xea\x9c\xa3|\xea\x9c\xa5|\xea\x9c\xa7|\xea\x9c\xa9|\xea\x9c\xab|\xea\x9c\xad|\xea\x9c[\xaf-\xb1]|\xea\x9c\xb3|\xea\x9c\xb5|\xea\x9c\xb7
UTF-8-Ll-11 \xea\x9c\xb9|\xea\x9c\xbb|\xea\x9c\xbd|\xea\x9c\xbf|\xea\x9d\x81|\xea\x9d\x83|\xea\x9d\x85|\xea\x9d\x87|\xea\x9d\x89|\xea\x9d\x8b|\xea\x9d\x8d|\xea\x9d\x8f|\xea\x9d\x91|\xea\x9d\x93|\xea\x9d\x95|\xea\x9d\x97|\xea\x9d\x99|\xea\x9d\x9b|\xea\x9d\x9d|\xea\x9d\x9f|\xea\x9d\xa1|\xea\x9d\xa3|\xea\x9d\xa5|\xea\x9d\xa7|\xea\x9d\xa9|\xea\x9d\xab|\xea\x9d\xad|\xea\x9d\xaf|\xea\x9d[\xb1-\xb8]|\xea\x9d\xba|\xea\x9d\xbc|\xea\x9d\xbf|\xea\x9e\x81|\xea\x9e\x83|\xea\x9e\x85|\xea\x9e\x87|\xea\x9e\x8c|\xea\x9e\x8e|\xea\x9e\x91|\xea\x9e[\x93-\x95]|\xea\x9e\x97|\xea\x9e\x99|\xea\x9e\x9b|\xea\x9e\x9d|\xea\x9e\x9f|\xea\x9e\xa1|\xea\x9e\xa3|\xea\x9e\xa5|\xea\x9e\xa7|\xea\x9e\xa9
UTF-8-Ll-12 \xea\x9e\xb5|\xea\x9e\xb7|\xea\x9f\xba|\xea\xac[\xb0-\xbf]|\xea\xad[\x80-\x9a]|\xea\xad[\xa0-\xa5]|\xea\xad[\xb0-\xbf]|\xea\xae[\x80-\xbf]|\xef\xac[\x80-\x86]|\xef\xac[\x93-\x97]|\xef\xbd[\x81-\x9a]|\xf0\x90\x90[\xa8-\xbf]|\xf0\x90\x91[\x80-\x8f]|\xf0\x90\x93[\x98-\xbb]|\xf0\x90\xb3[\x80-\xb2]|\xf0\x91\xa3[\x80-\x9f]|\xf0\x9d\x90[\x9a-\xb3]|\xf0\x9d\x91[\x8e-\x94]|\xf0\x9d\x91[\x96-\xa7]|\xf0\x9d\x92[\x82-\x9b]|\xf0\x9d\x92[\xb6-\xb9]|\xf0\x9d\x92\xbb|\xf0\x9d\x92[\xbd-\xbf]|\xf0\x9d\x93[\x80-\x83]|\xf0\x9d\x93[\x85-\x8f]|\xf0\x9d\x93[\xaa-\xbf]|\xf0\x9d\x94[\x80-\x83]|\xf0\x9d\x94[\x9e-\xb7]|\xf0\x9d\x95[\x92-\xab]|\xf0\x9d\x96[\x86-\x9f]|\xf0\x9d\x96[\xba-\xbf]|\xf0\x9d\x97[\x80-\x93]|\xf0\x9d\x97[\xae-\xbf]|\xf0\x9d\x98[\x80-\x87]|\xf0\x9d\x98[\xa2-\xbb]|\xf0\x9d\x99[\x96-\xaf]|\xf0\x9d\x9a[\x8a-\xa5]|\xf0\x9d\x9b[\x82-\x9a]|\xf0\x9d\x9b[\x9c-\xa1]|\xf0\x9d\x9b[\xbc-\xbf]|\xf0\x9d\x9c[\x80-\x94]|\xf0\x9d\x9c[\x96-\x9b]|\xf0\x9d\x9c[\xb6-\xbf]|\xf0\x9d\x9d[\x80-\x8e]|\xf0\x9d\x9d[\x90-\x95]|\xf0\x9d\x9d[\xb0-\xbf]|\xf0\x9d\x9e[\x80-\x88]|\xf0\x9d\x9e[\x8a-\x8f]|\xf0\x9d\x9e[\xaa-\xbf]|\xf0\x9d\x9f[\x80-\x82]
UTF-8-Ll-13 \xf0\x9d\x9f[\x84-\x89]|\xf0\x9d\x9f\x8b|\xf0\x9e\xa4[\xa2-\xbf]|\xf0\x9e\xa5[\x80-\x83]
UTF-8-Ll {UTF-8-Ll-0}|{UTF-8-Ll-1}|{UTF-8-Ll-2}|{UTF-8-Ll-3}|{UTF-8-Ll-4}|{UTF-8-Ll-5}|{UTF-8-Ll-6}|{UTF-8-Ll-7}|{UTF-8-Ll-8}|{UTF-8-Ll-9}|{UTF-8-Ll-10}|{UTF-8-Ll-11}|{UTF-8-Ll-12}|{UTF-8-Ll-13}
This diff is collapsed.
UTF-8-Lt \xc7\x85|\xc7\x88|\xc7\x8b|\xc7\xb2|\xe1\xbe[\x88-\x8f]|\xe1\xbe[\x98-\x9f]|\xe1\xbe[\xa8-\xaf]|\xe1\xbe\xbc|\xe1\xbf\x8c|\xe1\xbf\xbc
UTF-8-Lu-0 [\x41-\x5a]|\xc3[\x80-\x96]|\xc3[\x98-\x9e]|\xc4\x80|\xc4\x82|\xc4\x84|\xc4\x86|\xc4\x88|\xc4\x8a|\xc4\x8c|\xc4\x8e|\xc4\x90|\xc4\x92|\xc4\x94|\xc4\x96|\xc4\x98|\xc4\x9a|\xc4\x9c|\xc4\x9e|\xc4\xa0|\xc4\xa2|\xc4\xa4|\xc4\xa6|\xc4\xa8|\xc4\xaa|\xc4\xac|\xc4\xae|\xc4\xb0|\xc4\xb2|\xc4\xb4|\xc4\xb6|\xc4\xb9|\xc4\xbb|\xc4\xbd|\xc4\xbf|\xc5\x81|\xc5\x83|\xc5\x85|\xc5\x87|\xc5\x8a|\xc5\x8c|\xc5\x8e|\xc5\x90|\xc5\x92|\xc5\x94|\xc5\x96|\xc5\x98|\xc5\x9a|\xc5\x9c|\xc5\x9e
UTF-8-Lu-1 \xc5\xa0|\xc5\xa2|\xc5\xa4|\xc5\xa6|\xc5\xa8|\xc5\xaa|\xc5\xac|\xc5\xae|\xc5\xb0|\xc5\xb2|\xc5\xb4|\xc5\xb6|\xc5[\xb8-\xb9]|\xc5\xbb|\xc5\xbd|\xc6[\x81-\x82]|\xc6\x84|\xc6[\x86-\x87]|\xc6[\x89-\x8b]|\xc6[\x8e-\x91]|\xc6[\x93-\x94]|\xc6[\x96-\x98]|\xc6[\x9c-\x9d]|\xc6[\x9f-\xa0]|\xc6\xa2|\xc6\xa4|\xc6[\xa6-\xa7]|\xc6\xa9|\xc6\xac|\xc6[\xae-\xaf]|\xc6[\xb1-\xb3]|\xc6\xb5|\xc6[\xb7-\xb8]|\xc6\xbc|\xc7\x84|\xc7\x87|\xc7\x8a|\xc7\x8d|\xc7\x8f|\xc7\x91|\xc7\x93|\xc7\x95|\xc7\x97|\xc7\x99|\xc7\x9b|\xc7\x9e|\xc7\xa0|\xc7\xa2|\xc7\xa4|\xc7\xa6
UTF-8-Lu-2 \xc7\xa8|\xc7\xaa|\xc7\xac|\xc7\xae|\xc7\xb1|\xc7\xb4|\xc7[\xb6-\xb8]|\xc7\xba|\xc7\xbc|\xc7\xbe|\xc8\x80|\xc8\x82|\xc8\x84|\xc8\x86|\xc8\x88|\xc8\x8a|\xc8\x8c|\xc8\x8e|\xc8\x90|\xc8\x92|\xc8\x94|\xc8\x96|\xc8\x98|\xc8\x9a|\xc8\x9c|\xc8\x9e|\xc8\xa0|\xc8\xa2|\xc8\xa4|\xc8\xa6|\xc8\xa8|\xc8\xaa|\xc8\xac|\xc8\xae|\xc8\xb0|\xc8\xb2|\xc8[\xba-\xbb]|\xc8[\xbd-\xbe]|\xc9\x81|\xc9[\x83-\x86]|\xc9\x88|\xc9\x8a|\xc9\x8c|\xc9\x8e|\xcd\xb0|\xcd\xb2|\xcd\xb6|\xcd\xbf|\xce\x86|\xce[\x88-\x8a]
UTF-8-Lu-3 \xce\x8c|\xce[\x8e-\x8f]|\xce[\x91-\xa1]|\xce[\xa3-\xab]|\xcf\x8f|\xcf[\x92-\x94]|\xcf\x98|\xcf\x9a|\xcf\x9c|\xcf\x9e|\xcf\xa0|\xcf\xa2|\xcf\xa4|\xcf\xa6|\xcf\xa8|\xcf\xaa|\xcf\xac|\xcf\xae|\xcf\xb4|\xcf\xb7|\xcf[\xb9-\xba]|\xcf[\xbd-\xbf]|\xd0[\x80-\xaf]|\xd1\xa0|\xd1\xa2|\xd1\xa4|\xd1\xa6|\xd1\xa8|\xd1\xaa|\xd1\xac|\xd1\xae|\xd1\xb0|\xd1\xb2|\xd1\xb4|\xd1\xb6|\xd1\xb8|\xd1\xba|\xd1\xbc|\xd1\xbe|\xd2\x80|\xd2\x8a|\xd2\x8c|\xd2\x8e|\xd2\x90|\xd2\x92|\xd2\x94|\xd2\x96|\xd2\x98|\xd2\x9a|\xd2\x9c
UTF-8-Lu-4 \xd2\x9e|\xd2\xa0|\xd2\xa2|\xd2\xa4|\xd2\xa6|\xd2\xa8|\xd2\xaa|\xd2\xac|\xd2\xae|\xd2\xb0|\xd2\xb2|\xd2\xb4|\xd2\xb6|\xd2\xb8|\xd2\xba|\xd2\xbc|\xd2\xbe|\xd3[\x80-\x81]|\xd3\x83|\xd3\x85|\xd3\x87|\xd3\x89|\xd3\x8b|\xd3\x8d|\xd3\x90|\xd3\x92|\xd3\x94|\xd3\x96|\xd3\x98|\xd3\x9a|\xd3\x9c|\xd3\x9e|\xd3\xa0|\xd3\xa2|\xd3\xa4|\xd3\xa6|\xd3\xa8|\xd3\xaa|\xd3\xac|\xd3\xae|\xd3\xb0|\xd3\xb2|\xd3\xb4|\xd3\xb6|\xd3\xb8|\xd3\xba|\xd3\xbc|\xd3\xbe|\xd4\x80|\xd4\x82
UTF-8-Lu-5 \xd4\x84|\xd4\x86|\xd4\x88|\xd4\x8a|\xd4\x8c|\xd4\x8e|\xd4\x90|\xd4\x92|\xd4\x94|\xd4\x96|\xd4\x98|\xd4\x9a|\xd4\x9c|\xd4\x9e|\xd4\xa0|\xd4\xa2|\xd4\xa4|\xd4\xa6|\xd4\xa8|\xd4\xaa|\xd4\xac|\xd4\xae|\xd4[\xb1-\xbf]|\xd5[\x80-\x96]|\xe1\x82[\xa0-\xbf]|\xe1\x83[\x80-\x85]|\xe1\x83\x87|\xe1\x83\x8d|\xe1\x8e[\xa0-\xbf]|\xe1\x8f[\x80-\xb5]|\xe1\xb8\x80|\xe1\xb8\x82|\xe1\xb8\x84|\xe1\xb8\x86|\xe1\xb8\x88|\xe1\xb8\x8a|\xe1\xb8\x8c|\xe1\xb8\x8e|\xe1\xb8\x90|\xe1\xb8\x92|\xe1\xb8\x94|\xe1\xb8\x96|\xe1\xb8\x98|\xe1\xb8\x9a|\xe1\xb8\x9c|\xe1\xb8\x9e|\xe1\xb8\xa0|\xe1\xb8\xa2|\xe1\xb8\xa4|\xe1\xb8\xa6
UTF-8-Lu-6 \xe1\xb8\xa8|\xe1\xb8\xaa|\xe1\xb8\xac|\xe1\xb8\xae|\xe1\xb8\xb0|\xe1\xb8\xb2|\xe1\xb8\xb4|\xe1\xb8\xb6|\xe1\xb8\xb8|\xe1\xb8\xba|\xe1\xb8\xbc|\xe1\xb8\xbe|\xe1\xb9\x80|\xe1\xb9\x82|\xe1\xb9\x84|\xe1\xb9\x86|\xe1\xb9\x88|\xe1\xb9\x8a|\xe1\xb9\x8c|\xe1\xb9\x8e|\xe1\xb9\x90|\xe1\xb9\x92|\xe1\xb9\x94|\xe1\xb9\x96|\xe1\xb9\x98|\xe1\xb9\x9a|\xe1\xb9\x9c|\xe1\xb9\x9e|\xe1\xb9\xa0|\xe1\xb9\xa2|\xe1\xb9\xa4|\xe1\xb9\xa6|\xe1\xb9\xa8|\xe1\xb9\xaa|\xe1\xb9\xac|\xe1\xb9\xae|\xe1\xb9\xb0|\xe1\xb9\xb2|\xe1\xb9\xb4|\xe1\xb9\xb6|\xe1\xb9\xb8|\xe1\xb9\xba|\xe1\xb9\xbc|\xe1\xb9\xbe|\xe1\xba\x80|\xe1\xba\x82|\xe1\xba\x84|\xe1\xba\x86|\xe1\xba\x88|\xe1\xba\x8a
UTF-8-Lu-7 \xe1\xba\x8c|\xe1\xba\x8e|\xe1\xba\x90|\xe1\xba\x92|\xe1\xba\x94|\xe1\xba\x9e|\xe1\xba\xa0|\xe1\xba\xa2|\xe1\xba\xa4|\xe1\xba\xa6|\xe1\xba\xa8|\xe1\xba\xaa|\xe1\xba\xac|\xe1\xba\xae|\xe1\xba\xb0|\xe1\xba\xb2|\xe1\xba\xb4|\xe1\xba\xb6|\xe1\xba\xb8|\xe1\xba\xba|\xe1\xba\xbc|\xe1\xba\xbe|\xe1\xbb\x80|\xe1\xbb\x82|\xe1\xbb\x84|\xe1\xbb\x86|\xe1\xbb\x88|\xe1\xbb\x8a|\xe1\xbb\x8c|\xe1\xbb\x8e|\xe1\xbb\x90|\xe1\xbb\x92|\xe1\xbb\x94|\xe1\xbb\x96|\xe1\xbb\x98|\xe1\xbb\x9a|\xe1\xbb\x9c|\xe1\xbb\x9e|\xe1\xbb\xa0|\xe1\xbb\xa2|\xe1\xbb\xa4|\xe1\xbb\xa6|\xe1\xbb\xa8|\xe1\xbb\xaa|\xe1\xbb\xac|\xe1\xbb\xae|\xe1\xbb\xb0|\xe1\xbb\xb2|\xe1\xbb\xb4|\xe1\xbb\xb6
UTF-8-Lu-8 \xe1\xbb\xb8|\xe1\xbb\xba|\xe1\xbb\xbc|\xe1\xbb\xbe|\xe1\xbc[\x88-\x8f]|\xe1\xbc[\x98-\x9d]|\xe1\xbc[\xa8-\xaf]|\xe1\xbc[\xb8-\xbf]|\xe1\xbd[\x88-\x8d]|\xe1\xbd\x99|\xe1\xbd\x9b|\xe1\xbd\x9d|\xe1\xbd\x9f|\xe1\xbd[\xa8-\xaf]|\xe1\xbe[\xb8-\xbb]|\xe1\xbf[\x88-\x8b]|\xe1\xbf[\x98-\x9b]|\xe1\xbf[\xa8-\xac]|\xe1\xbf[\xb8-\xbb]|\xe2\x84\x82|\xe2\x84\x87|\xe2\x84[\x8b-\x8d]|\xe2\x84[\x90-\x92]|\xe2\x84\x95|\xe2\x84[\x99-\x9d]|\xe2\x84\xa4|\xe2\x84\xa6|\xe2\x84\xa8|\xe2\x84[\xaa-\xad]|\xe2\x84[\xb0-\xb3]|\xe2\x84[\xbe-\xbf]|\xe2\x85\x85|\xe2\x86\x83|\xe2\xb0[\x80-\xae]|\xe2\xb1\xa0|\xe2\xb1[\xa2-\xa4]|\xe2\xb1\xa7|\xe2\xb1\xa9|\xe2\xb1\xab|\xe2\xb1[\xad-\xb0]|\xe2\xb1\xb2|\xe2\xb1\xb5|\xe2\xb1[\xbe-\xbf]|\xe2\xb2\x80|\xe2\xb2\x82|\xe2\xb2\x84|\xe2\xb2\x86|\xe2\xb2\x88|\xe2\xb2\x8a|\xe2\xb2\x8c
UTF-8-Lu-9 \xe2\xb2\x8e|\xe2\xb2\x90|\xe2\xb2\x92|\xe2\xb2\x94|\xe2\xb2\x96|\xe2\xb2\x98|\xe2\xb2\x9a|\xe2\xb2\x9c|\xe2\xb2\x9e|\xe2\xb2\xa0|\xe2\xb2\xa2|\xe2\xb2\xa4|\xe2\xb2\xa6|\xe2\xb2\xa8|\xe2\xb2\xaa|\xe2\xb2\xac|\xe2\xb2\xae|\xe2\xb2\xb0|\xe2\xb2\xb2|\xe2\xb2\xb4|\xe2\xb2\xb6|\xe2\xb2\xb8|\xe2\xb2\xba|\xe2\xb2\xbc|\xe2\xb2\xbe|\xe2\xb3\x80|\xe2\xb3\x82|\xe2\xb3\x84|\xe2\xb3\x86|\xe2\xb3\x88|\xe2\xb3\x8a|\xe2\xb3\x8c|\xe2\xb3\x8e|\xe2\xb3\x90|\xe2\xb3\x92|\xe2\xb3\x94|\xe2\xb3\x96|\xe2\xb3\x98|\xe2\xb3\x9a|\xe2\xb3\x9c|\xe2\xb3\x9e|\xe2\xb3\xa0|\xe2\xb3\xa2|\xe2\xb3\xab|\xe2\xb3\xad|\xe2\xb3\xb2|\xea\x99\x80|\xea\x99\x82|\xea\x99\x84|\xea\x99\x86
UTF-8-Lu-10 \xea\x99\x88|\xea\x99\x8a|\xea\x99\x8c|\xea\x99\x8e|\xea\x99\x90|\xea\x99\x92|\xea\x99\x94|\xea\x99\x96|\xea\x99\x98|\xea\x99\x9a|\xea\x99\x9c|\xea\x99\x9e|\xea\x99\xa0|\xea\x99\xa2|\xea\x99\xa4|\xea\x99\xa6|\xea\x99\xa8|\xea\x99\xaa|\xea\x99\xac|\xea\x9a\x80|\xea\x9a\x82|\xea\x9a\x84|\xea\x9a\x86|\xea\x9a\x88|\xea\x9a\x8a|\xea\x9a\x8c|\xea\x9a\x8e|\xea\x9a\x90|\xea\x9a\x92|\xea\x9a\x94|\xea\x9a\x96|\xea\x9a\x98|\xea\x9a\x9a|\xea\x9c\xa2|\xea\x9c\xa4|\xea\x9c\xa6|\xea\x9c\xa8|\xea\x9c\xaa|\xea\x9c\xac|\xea\x9c\xae|\xea\x9c\xb2|\xea\x9c\xb4|\xea\x9c\xb6|\xea\x9c\xb8|\xea\x9c\xba|\xea\x9c\xbc|\xea\x9c\xbe|\xea\x9d\x80|\xea\x9d\x82|\xea\x9d\x84
UTF-8-Lu-11 \xea\x9d\x86|\xea\x9d\x88|\xea\x9d\x8a|\xea\x9d\x8c|\xea\x9d\x8e|\xea\x9d\x90|\xea\x9d\x92|\xea\x9d\x94|\xea\x9d\x96|\xea\x9d\x98|\xea\x9d\x9a|\xea\x9d\x9c|\xea\x9d\x9e|\xea\x9d\xa0|\xea\x9d\xa2|\xea\x9d\xa4|\xea\x9d\xa6|\xea\x9d\xa8|\xea\x9d\xaa|\xea\x9d\xac|\xea\x9d\xae|\xea\x9d\xb9|\xea\x9d\xbb|\xea\x9d[\xbd-\xbe]|\xea\x9e\x80|\xea\x9e\x82|\xea\x9e\x84|\xea\x9e\x86|\xea\x9e\x8b|\xea\x9e\x8d|\xea\x9e\x90|\xea\x9e\x92|\xea\x9e\x96|\xea\x9e\x98|\xea\x9e\x9a|\xea\x9e\x9c|\xea\x9e\x9e|\xea\x9e\xa0|\xea\x9e\xa2|\xea\x9e\xa4|\xea\x9e\xa6|\xea\x9e\xa8|\xea\x9e[\xaa-\xae]|\xea\x9e[\xb0-\xb4]|\xea\x9e\xb6|\xef\xbc[\xa1-\xba]|\xf0\x90\x90[\x80-\xa7]|\xf0\x90\x92[\xb0-\xbf]|\xf0\x90\x93[\x80-\x93]|\xf0\x90\xb2[\x80-\xb2]
UTF-8-Lu-12 \xf0\x91\xa2[\xa0-\xbf]|\xf0\x9d\x90[\x80-\x99]|\xf0\x9d\x90[\xb4-\xbf]|\xf0\x9d\x91[\x80-\x8d]|\xf0\x9d\x91[\xa8-\xbf]|\xf0\x9d\x92[\x80-\x81]|\xf0\x9d\x92\x9c|\xf0\x9d\x92[\x9e-\x9f]|\xf0\x9d\x92\xa2|\xf0\x9d\x92[\xa5-\xa6]|\xf0\x9d\x92[\xa9-\xac]|\xf0\x9d\x92[\xae-\xb5]|\xf0\x9d\x93[\x90-\xa9]|\xf0\x9d\x94[\x84-\x85]|\xf0\x9d\x94[\x87-\x8a]|\xf0\x9d\x94[\x8d-\x94]|\xf0\x9d\x94[\x96-\x9c]|\xf0\x9d\x94[\xb8-\xb9]|\xf0\x9d\x94[\xbb-\xbe]|\xf0\x9d\x95[\x80-\x84]|\xf0\x9d\x95\x86|\xf0\x9d\x95[\x8a-\x90]|\xf0\x9d\x95[\xac-\xbf]|\xf0\x9d\x96[\x80-\x85]|\xf0\x9d\x96[\xa0-\xb9]|\xf0\x9d\x97[\x94-\xad]|\xf0\x9d\x98[\x88-\xa1]|\xf0\x9d\x98[\xbc-\xbf]|\xf0\x9d\x99[\x80-\x95]|\xf0\x9d\x99[\xb0-\xbf]|\xf0\x9d\x9a[\x80-\x89]|\xf0\x9d\x9a[\xa8-\xbf]|\xf0\x9d\x9b\x80|\xf0\x9d\x9b[\xa2-\xba]|\xf0\x9d\x9c[\x9c-\xb4]|\xf0\x9d\x9d[\x96-\xae]|\xf0\x9d\x9e[\x90-\xa8]|\xf0\x9d\x9f\x8a|\xf0\x9e\xa4[\x80-\xa1]
UTF-8-Lu {UTF-8-Lu-0}|{UTF-8-Lu-1}|{UTF-8-Lu-2}|{UTF-8-Lu-3}|{UTF-8-Lu-4}|{UTF-8-Lu-5}|{UTF-8-Lu-6}|{UTF-8-Lu-7}|{UTF-8-Lu-8}|{UTF-8-Lu-9}|{UTF-8-Lu-10}|{UTF-8-Lu-11}|{UTF-8-Lu-12}
UTF-8-Nd-0 [\x30-\x39]|\xd9[\xa0-\xa9]|\xdb[\xb0-\xb9]|\xdf[\x80-\x89]|\xe0\xa5[\xa6-\xaf]|\xe0\xa7[\xa6-\xaf]|\xe0\xa9[\xa6-\xaf]|\xe0\xab[\xa6-\xaf]|\xe0\xad[\xa6-\xaf]|\xe0\xaf[\xa6-\xaf]|\xe0\xb1[\xa6-\xaf]|\xe0\xb3[\xa6-\xaf]|\xe0\xb5[\xa6-\xaf]|\xe0\xb7[\xa6-\xaf]|\xe0\xb9[\x90-\x99]|\xe0\xbb[\x90-\x99]|\xe0\xbc[\xa0-\xa9]|\xe1\x81[\x80-\x89]|\xe1\x82[\x90-\x99]|\xe1\x9f[\xa0-\xa9]|\xe1\xa0[\x90-\x99]|\xe1\xa5[\x86-\x8f]|\xe1\xa7[\x90-\x99]|\xe1\xaa[\x80-\x89]|\xe1\xaa[\x90-\x99]|\xe1\xad[\x90-\x99]|\xe1\xae[\xb0-\xb9]|\xe1\xb1[\x80-\x89]|\xe1\xb1[\x90-\x99]|\xea\x98[\xa0-\xa9]|\xea\xa3[\x90-\x99]|\xea\xa4[\x80-\x89]|\xea\xa7[\x90-\x99]|\xea\xa7[\xb0-\xb9]|\xea\xa9[\x90-\x99]|\xea\xaf[\xb0-\xb9]|\xef\xbc[\x90-\x99]|\xf0\x90\x92[\xa0-\xa9]|\xf0\x91\x81[\xa6-\xaf]|\xf0\x91\x83[\xb0-\xb9]|\xf0\x91\x84[\xb6-\xbf]|\xf0\x91\x87[\x90-\x99]|\xf0\x91\x8b[\xb0-\xb9]|\xf0\x91\x91[\x90-\x99]|\xf0\x91\x93[\x90-\x99]|\xf0\x91\x99[\x90-\x99]|\xf0\x91\x9b[\x80-\x89]|\xf0\x91\x9c[\xb0-\xb9]|\xf0\x91\xa3[\xa0-\xa9]|\xf0\x91\xb1[\x90-\x99]
UTF-8-Nd-1 \xf0\x96\xa9[\xa0-\xa9]|\xf0\x96\xad[\x90-\x99]|\xf0\x9d\x9f[\x8e-\xbf]|\xf0\x9e\xa5[\x90-\x99]
UTF-8-Nd {UTF-8-Nd-0}|{UTF-8-Nd-1}
UTF-8-Nl \xe1\x9b[\xae-\xb0]|\xe2\x85[\xa0-\xbf]|\xe2\x86[\x80-\x82]|\xe2\x86[\x85-\x88]|\xe3\x80\x87|\xe3\x80[\xa1-\xa9]|\xe3\x80[\xb8-\xba]|\xea\x9b[\xa6-\xaf]|\xf0\x90\x85[\x80-\xb4]|\xf0\x90\x8d\x81|\xf0\x90\x8d\x8a|\xf0\x90\x8f[\x91-\x95]|\xf0\x92\x90[\x80-\xbf]|\xf0\x92\x91[\x80-\xae]
UTF-8-No-0 \xc2[\xb2-\xb3]|\xc2\xb9|\xc2[\xbc-\xbe]|\xe0\xa7[\xb4-\xb9]|\xe0\xad[\xb2-\xb7]|\xe0\xaf[\xb0-\xb2]|\xe0\xb1[\xb8-\xbe]|\xe0\xb5[\x98-\x9e]|\xe0\xb5[\xb0-\xb8]|\xe0\xbc[\xaa-\xb3]|\xe1\x8d[\xa9-\xbc]|\xe1\x9f[\xb0-\xb9]|\xe1\xa7\x9a|\xe2\x81\xb0|\xe2\x81[\xb4-\xb9]|\xe2\x82[\x80-\x89]|\xe2\x85[\x90-\x9f]|\xe2\x86\x89|\xe2\x91[\xa0-\xbf]|\xe2\x92[\x80-\x9b]|\xe2\x93[\xaa-\xbf]|\xe2\x9d[\xb6-\xbf]|\xe2\x9e[\x80-\x93]|\xe2\xb3\xbd|\xe3\x86[\x92-\x95]|\xe3\x88[\xa0-\xa9]|\xe3\x89[\x88-\x8f]|\xe3\x89[\x91-\x9f]|\xe3\x8a[\x80-\x89]|\xe3\x8a[\xb1-\xbf]|\xea\xa0[\xb0-\xb5]|\xf0\x90\x84[\x87-\xb3]|\xf0\x90\x85[\xb5-\xb8]|\xf0\x90\x86[\x8a-\x8b]|\xf0\x90\x8b[\xa1-\xbb]|\xf0\x90\x8c[\xa0-\xa3]|\xf0\x90\xa1[\x98-\x9f]|\xf0\x90\xa1[\xb9-\xbf]|\xf0\x90\xa2[\xa7-\xaf]|\xf0\x90\xa3[\xbb-\xbf]|\xf0\x90\xa4[\x96-\x9b]|\xf0\x90\xa6[\xbc-\xbd]|\xf0\x90\xa7[\x80-\x8f]|\xf0\x90\xa7[\x92-\xbf]|\xf0\x90\xa9[\x80-\x87]|\xf0\x90\xa9[\xbd-\xbe]|\xf0\x90\xaa[\x9d-\x9f]|\xf0\x90\xab[\xab-\xaf]|\xf0\x90\xad[\x98-\x9f]|\xf0\x90\xad[\xb8-\xbf]
UTF-8-No-1 \xf0\x90\xae[\xa9-\xaf]|\xf0\x90\xb3[\xba-\xbf]|\xf0\x90\xb9[\xa0-\xbe]|\xf0\x91\x81[\x92-\xa5]|\xf0\x91\x87[\xa1-\xb4]|\xf0\x91\x9c[\xba-\xbb]|\xf0\x91\xa3[\xaa-\xb2]|\xf0\x91\xb1[\x9a-\xac]|\xf0\x96\xad[\x9b-\xa1]|\xf0\x9d\x8d[\xa0-\xb1]|\xf0\x9e\xa3[\x87-\x8f]|\xf0\x9f\x84[\x80-\x8c]
UTF-8-No {UTF-8-No-0}|{UTF-8-No-1}
......@@ -132,7 +132,7 @@ class EntryPrinter:
if key not in self.META_IGNORE:
value_str = None
if isinstance(value, str):
value_str = '"{}"'.format(value)
value_str = '"{}"'.format(misc_utils.escape_string(value))
elif isinstance(value, (Decimal, datetime.date, amount.Amount)):
value_str = str(value)
elif isinstance(value, bool):
......
......@@ -205,6 +205,14 @@ class TestEntryPrinter(cmptest.TestCase):
"""
self.assertRoundTrip(entries, errors)
def test_metadata(self):
meta = data.new_metadata('beancount/core/testing.beancount', 12345)
meta['something'] = r'a"\c'
pr = printer.EntryPrinter()
oss = io.StringIO()
pr.write_metadata(meta, oss)
self.assertEqual(' something: "a\\"\\\\c"\n', oss.getvalue())
def characterize_spaces(text):
"""Classify each line to a particular type.
......
......@@ -101,7 +101,7 @@ def fetch_cached_price(source, symbol, date):
source.get_historical_price(symbol, time))
# Make sure the timezone is UTC and make naive before serialization.
if result.time is not None: