Compare commits
702
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5e53e53bc | ||
|
|
263a082afe | ||
|
|
f2bc982c3d | ||
|
|
dd9ddab849 | ||
|
|
3046b0586c | ||
|
|
cfa278886b | ||
|
|
1c430a6b91 | ||
|
|
b0eb712933 | ||
|
|
51a7ad9483 | ||
|
|
d6e9d62fad | ||
|
|
3bac4a1036 | ||
|
|
1995a7068c | ||
|
|
5dc06d023d | ||
|
|
d98a1857dc | ||
|
|
7da8811327 | ||
|
|
375773d657 | ||
|
|
01060f0b0d | ||
|
|
36779c1229 | ||
|
|
5b7f5164db | ||
|
|
15db2dd603 | ||
|
|
97b15322d4 | ||
|
|
824bf7e40f | ||
|
|
56fa261ef2 | ||
|
|
1e9a3841cd | ||
|
|
e6ddedf6c6 | ||
|
|
325c3f22cc | ||
|
|
54be8d62f3 | ||
|
|
a40eca36d9 | ||
|
|
4b17ca4724 | ||
|
|
69aaec11a5 | ||
|
|
896b77a165 | ||
|
|
1b60193f77 | ||
|
|
1efab19f1e | ||
|
|
e667431dd5 | ||
|
|
cc7e4fda85 | ||
|
|
2490e2d07d | ||
|
|
e5c5a210b4 | ||
|
|
04a40c7a50 | ||
|
|
44c8e3c0f0 | ||
|
|
6f7242a773 | ||
|
|
358c3fc967 | ||
|
|
f1ca280441 | ||
|
|
482cecaa7e | ||
|
|
b6c57ab3c3 | ||
|
|
f3b5f75e37 | ||
|
|
7d9f4dcc80 | ||
|
|
224748eb96 | ||
|
|
2aec83f057 | ||
|
|
fd399323a6 | ||
|
|
bb6b3edee2 | ||
|
|
3f7ea4418c | ||
|
|
efcc115aa7 | ||
|
|
893c715a61 | ||
|
|
6bab78df21 | ||
|
|
29019eed98 | ||
|
|
d8c006e0f7 | ||
|
|
b8438dddeb | ||
|
|
4ba28c637e | ||
|
|
ae84040bc7 | ||
|
|
51e294f748 | ||
|
|
cb65fd93ca | ||
|
|
5b9600d835 | ||
|
|
cf80d17040 | ||
|
|
d4f906f22d | ||
|
|
d189e334d8 | ||
|
|
a48a94d872 | ||
|
|
8e5dc220dc | ||
|
|
dca2f610dc | ||
|
|
3d1833e307 | ||
|
|
aa221cc3c7 | ||
|
|
51b7d1c420 | ||
|
|
674d286f87 | ||
|
|
0161c4b917 | ||
|
|
de31a42fc8 | ||
|
|
9c508de5fd | ||
|
|
1b00d95ce4 | ||
|
|
78870decb8 | ||
|
|
1a5696eb2c | ||
|
|
269d38da2c | ||
|
|
99f77b0a88 | ||
|
|
264fdda4d0 | ||
|
|
8092b88ad4 | ||
|
|
3251e2ae88 | ||
|
|
f718c5f8b4 | ||
|
|
a96a446b47 | ||
|
|
5658411acf | ||
|
|
a4403d719e | ||
|
|
8597a10c40 | ||
|
|
d0c0045dc1 | ||
|
|
868abdc0d9 | ||
|
|
ebf88bf5c5 | ||
|
|
c3814a4e42 | ||
|
|
2a0b3afa4b | ||
|
|
52fe365919 | ||
|
|
414aac4c7e | ||
|
|
037e26a5a3 | ||
|
|
158d3a993b | ||
|
|
2ef35174d1 | ||
|
|
3249938b88 | ||
|
|
9b18083e48 | ||
|
|
04bdeb8321 | ||
|
|
67061d58e2 | ||
|
|
0a66bad41a | ||
|
|
e79535fe23 | ||
|
|
3c5c34d0c5 | ||
|
|
c9abe49d1e | ||
|
|
ca20641cb9 | ||
|
|
c558b8530b | ||
|
|
efb2a63492 | ||
|
|
1642757eb8 | ||
|
|
b0ee4684a1 | ||
|
|
4a561f44c7 | ||
|
|
4211dbf9f5 | ||
|
|
23c62de0d0 | ||
|
|
4179cf4792 | ||
|
|
4c20cbd48a | ||
|
|
5a98236239 | ||
|
|
792caf73b7 | ||
|
|
cfb9a4f664 | ||
|
|
59021550e2 | ||
|
|
acf775ea90 | ||
|
|
f4199b494c | ||
|
|
6fc7f4e0af | ||
|
|
d508ce7fb9 | ||
|
|
a4aa8f90c3 | ||
|
|
b33d7af284 | ||
|
|
e4e1f4ca05 | ||
|
|
72bedf0af7 | ||
|
|
bc39dda9e7 | ||
|
|
257275f169 | ||
|
|
60ba912100 | ||
|
|
2a8240b26d | ||
|
|
c33fc7b240 | ||
|
|
404647be05 | ||
|
|
0af818b0c1 | ||
|
|
8da84aaf23 | ||
|
|
d15a1376d3 | ||
|
|
57bbe542b5 | ||
|
|
cbdb0d5431 | ||
|
|
ff129e2f64 | ||
|
|
663745c7e8 | ||
|
|
5df6ad564b | ||
|
|
1f3e516780 | ||
|
|
25841f9540 | ||
|
|
94bd8470d7 | ||
|
|
21408ab9d2 | ||
|
|
31eecac590 | ||
|
|
58c6da3fb5 | ||
|
|
9c21b98601 | ||
|
|
8735f8a014 | ||
|
|
9acf512663 | ||
|
|
50e8161984 | ||
|
|
69be94843c | ||
|
|
ac5ed9fde0 | ||
|
|
2869e4d8a3 | ||
|
|
f2392f910d | ||
|
|
9e61809b17 | ||
|
|
9e2b935db1 | ||
|
|
aa47410902 | ||
|
|
c72af598b1 | ||
|
|
9a386574d8 | ||
|
|
90bdb0a840 | ||
|
|
4daf7a9c29 | ||
|
|
0452848f57 | ||
|
|
db92ab7d5a | ||
|
|
4dc67910fd | ||
|
|
ebc0f25bc7 | ||
|
|
67dcffee20 | ||
|
|
ae322dbdc8 | ||
|
|
208feceb03 | ||
|
|
b4946dee9c | ||
|
|
8f33163510 | ||
|
|
a3d43fdc32 | ||
|
|
befebe8b0c | ||
|
|
9ee777274c | ||
|
|
d3892c0e82 | ||
|
|
17ffc5460c | ||
|
|
09ca223f1b | ||
|
|
1223cbda1f | ||
|
|
01ce73fc04 | ||
|
|
e53603a1fc | ||
|
|
04d6ca3a49 | ||
|
|
9e668a528d | ||
|
|
96a903c57f | ||
|
|
75921ceaf4 | ||
|
|
310bece2bc | ||
|
|
565e570a71 | ||
|
|
29735eef7d | ||
|
|
cb0bd32aa3 | ||
|
|
469739633c | ||
|
|
495c7f310a | ||
|
|
353fc50770 | ||
|
|
ca9df38b11 | ||
|
|
fd55f0abff | ||
|
|
e1ca8303e5 | ||
|
|
a2879f1717 | ||
|
|
89ad092ac1 | ||
|
|
6c8de19fc5 | ||
|
|
dcf3caf946 | ||
|
|
f1e28c1e28 | ||
|
|
0d1aef889e | ||
|
|
cec9f55769 | ||
|
|
32dd3a2e14 | ||
|
|
23f69f5bc2 | ||
|
|
ec6e9d7ef8 | ||
|
|
6f52d7371e | ||
|
|
e5a5f212bc | ||
|
|
2a297623f2 | ||
|
|
ae11eceef7 | ||
|
|
babe13f811 | ||
|
|
a668f0d04f | ||
|
|
8c1a244b1e | ||
|
|
7aa4258046 | ||
|
|
1c5ae89d86 | ||
|
|
75bf103429 | ||
|
|
cf42e5a4b8 | ||
|
|
433677c905 | ||
|
|
6cbd6ed8d3 | ||
|
|
51df2c188d | ||
|
|
7180806afd | ||
|
|
8fc8668921 | ||
|
|
5dfcf2266f | ||
|
|
0ae51c9522 | ||
|
|
59bd9f040d | ||
|
|
1687616519 | ||
|
|
6bf33ab899 | ||
|
|
41a2a46713 | ||
|
|
fd4344bc07 | ||
|
|
ef395f49fe | ||
|
|
f0719c9eff | ||
|
|
9c5951a9e9 | ||
|
|
05dd44cfe2 | ||
|
|
df00dd1f32 | ||
|
|
7b6f46d595 | ||
|
|
fbcbdfa991 | ||
|
|
8335bbf20f | ||
|
|
2084bb5d0e | ||
|
|
dfe530fdd1 | ||
|
|
910d7199a2 | ||
|
|
b208b7a240 | ||
|
|
ee470deaca | ||
|
|
c149c5f2fa | ||
|
|
fd5433363e | ||
|
|
1ca875a2be | ||
|
|
43646e592b | ||
|
|
ca49b56774 | ||
|
|
c4bc2d6823 | ||
|
|
854ff911a3 | ||
|
|
965f7f7554 | ||
|
|
6c279945e0 | ||
|
|
6ca3821f81 | ||
|
|
caf47940c7 | ||
|
|
6a78d5196d | ||
|
|
fc0fdec25c | ||
|
|
2adcc7d5a3 | ||
|
|
fcaea3e1bb | ||
|
|
fc99f12568 | ||
|
|
1e5a6e1f87 | ||
|
|
db263ff905 | ||
|
|
e202f5cd19 | ||
|
|
2fbb9878c2 | ||
|
|
ba4453213a | ||
|
|
5f133ffaf2 | ||
|
|
cbac98894b | ||
|
|
3f368b2e02 | ||
|
|
1e73ab5be7 | ||
|
|
f428069ac6 | ||
|
|
adf3772b7a | ||
|
|
46cd191e49 | ||
|
|
9afe0cc181 | ||
|
|
19f8c3561c | ||
|
|
d3ed320636 | ||
|
|
6f4a114fdc | ||
|
|
5bec86c1f4 | ||
|
|
5b48691c3a | ||
|
|
be11466b35 | ||
|
|
0445004e7d | ||
|
|
f688d376f5 | ||
|
|
0a38a6352f | ||
|
|
2410435d8c | ||
|
|
6f1d6fa6b4 | ||
|
|
b1db542cb9 | ||
|
|
3d7479969f | ||
|
|
8f4dffa1df | ||
|
|
ffe9f31b0b | ||
|
|
b1af1c5435 | ||
|
|
94b6fcb93f | ||
|
|
4b25dde6e2 | ||
|
|
f83c077a7e | ||
|
|
323d775541 | ||
|
|
4448234281 | ||
|
|
d31ced9ca5 | ||
|
|
9706af03b4 | ||
|
|
b3ca17a90f | ||
|
|
4b13c95467 | ||
|
|
7864af3626 | ||
|
|
028f9582f5 | ||
|
|
cd32559282 | ||
|
|
3980fca903 | ||
|
|
462b0ea20b | ||
|
|
ba4b3eaef6 | ||
|
|
bf826637ab | ||
|
|
316ff4454a | ||
|
|
3266625669 | ||
|
|
90378f19c5 | ||
|
|
78fb08aa12 | ||
|
|
d081b75993 | ||
|
|
10e0e64ff4 | ||
|
|
79ff9bc216 | ||
|
|
3615e75d16 | ||
|
|
3c8cba0301 | ||
|
|
dde9ea8a90 | ||
|
|
b7c39e51c7 | ||
|
|
a216441029 | ||
|
|
89592545f3 | ||
|
|
70fff6253d | ||
|
|
84e76de2b1 | ||
|
|
fe289da983 | ||
|
|
b54672d28d | ||
|
|
371a8a8f89 | ||
|
|
6b42d71158 | ||
|
|
1777cd4b29 | ||
|
|
ac593d814d | ||
|
|
617e2212c8 | ||
|
|
ad15ef7961 | ||
|
|
3971fecb29 | ||
|
|
5d51155441 | ||
|
|
a63c9ad080 | ||
|
|
f44479edfb | ||
|
|
738f2b7dca | ||
|
|
f4dc24cacd | ||
|
|
eeb587e85e | ||
|
|
c93f2dd433 | ||
|
|
d4f37501a0 | ||
|
|
1b0ad55d13 | ||
|
|
aa2a451f23 | ||
|
|
59e367acf9 | ||
|
|
d8057c2b0b | ||
|
|
d624d4a0bb | ||
|
|
ac86c415a7 | ||
|
|
b26b34fba9 | ||
|
|
4ae4ac1d12 | ||
|
|
efabb77567 | ||
|
|
46eb72d002 | ||
|
|
f75a8f9497 | ||
|
|
00715fc530 | ||
|
|
e3300cd55d | ||
|
|
0f7e8e73b9 | ||
|
|
1509ba526d | ||
|
|
76084e6f52 | ||
|
|
871c1a6dea | ||
|
|
33ebd5d0b0 | ||
|
|
b9b06f1668 | ||
|
|
30f3918140 | ||
|
|
e98b065719 | ||
|
|
e7bc887f60 | ||
|
|
85014bd92c | ||
|
|
eee82ae27e | ||
|
|
adadd6c80b | ||
|
|
408caa6c0f | ||
|
|
406faa5603 | ||
|
|
4e0d562208 | ||
|
|
43ef686622 | ||
|
|
d59fe6b2af | ||
|
|
d677a1a785 | ||
|
|
88639fcd7d | ||
|
|
f9da7ec19a | ||
|
|
45e0b9d571 | ||
|
|
2bc4139c65 | ||
|
|
c759ee31eb | ||
|
|
12577cdfac | ||
|
|
288b381453 | ||
|
|
896b9d96e2 | ||
|
|
6b6a297a0e | ||
|
|
07ec5c757e | ||
|
|
5e31bca7d6 | ||
|
|
a91bc09160 | ||
|
|
4b7a0bafa4 | ||
|
|
3b9d38e14a | ||
|
|
df93ce3cb0 | ||
|
|
d5776d4ddb | ||
|
|
9f0376d9aa | ||
|
|
45bda3bacb | ||
|
|
ab20047e88 | ||
|
|
8544f873d4 | ||
|
|
620b2afa09 | ||
|
|
759d68a9e9 | ||
|
|
205b94ad05 | ||
|
|
c495edc220 | ||
|
|
949cd6aae6 | ||
|
|
0826ba8752 | ||
|
|
12d8b62925 | ||
|
|
9b42486f2f | ||
|
|
7e4e66d0e3 | ||
|
|
97db4cf64e | ||
|
|
455d56db1b | ||
|
|
4d614ae5e5 | ||
|
|
ac2e0a26ac | ||
|
|
0f0a9c941b | ||
|
|
89908b54b3 | ||
|
|
875242c8d6 | ||
|
|
8ef49ed303 | ||
|
|
90de264ccf | ||
|
|
700f15be75 | ||
|
|
32caee3aa4 | ||
|
|
bb6d0267ac | ||
|
|
6e24c2e79a | ||
|
|
00095667e8 | ||
|
|
da47949b60 | ||
|
|
90495324e0 | ||
|
|
50091d1f86 | ||
|
|
94a6495a06 | ||
|
|
c048ebcfbb | ||
|
|
1f9f08c3c5 | ||
|
|
05800c530a | ||
|
|
fdccc733a2 | ||
|
|
3d1095d9ca | ||
|
|
be776d6a31 | ||
|
|
0697797504 | ||
|
|
8e34b04d64 | ||
|
|
e21a1c15d5 | ||
|
|
1aec255b38 | ||
|
|
4c268e1236 | ||
|
|
cdec0299a5 | ||
|
|
b3b46c70b2 | ||
|
|
aed7560a46 | ||
|
|
f7c9ef7dbf | ||
|
|
96f430480b | ||
|
|
e38614291d | ||
|
|
4d1bc30d64 | ||
|
|
159601d635 | ||
|
|
d7cba793cf | ||
|
|
fc92bbcdba | ||
|
|
755254cf7c | ||
|
|
5cb9c3e30e | ||
|
|
43c768c2d4 | ||
|
|
e5ce8bc829 | ||
|
|
d5ca13254f | ||
|
|
81a116b6a2 | ||
|
|
cf85f6600d | ||
|
|
84c0d69da2 | ||
|
|
4ae5c6477b | ||
|
|
41b97edb03 | ||
|
|
c9eee3b471 | ||
|
|
95376f9eff | ||
|
|
2b42dd258e | ||
|
|
e1676aca6d | ||
|
|
47ebd361d8 | ||
|
|
62aaa65958 | ||
|
|
457722811d | ||
|
|
0f9a6d57bf | ||
|
|
1482fedb9c | ||
|
|
cd602170fd | ||
|
|
00f8df60ce | ||
|
|
c632d0f6a9 | ||
|
|
829a8bd01d | ||
|
|
61552f6903 | ||
|
|
9643c6d620 | ||
|
|
4be86ba2ad | ||
|
|
f31caf1ea4 | ||
|
|
42f5cd5d11 | ||
|
|
0000b03226 | ||
|
|
84370a75e8 | ||
|
|
9d89aaeac9 | ||
|
|
de02717139 | ||
|
|
19bfb4160a | ||
|
|
8ebb4d35fa | ||
|
|
af975e926f | ||
|
|
fe45742c21 | ||
|
|
193f082f30 | ||
|
|
c5f2717623 | ||
|
|
231b15eca1 | ||
|
|
c6f45af3f1 | ||
|
|
96cc078118 | ||
|
|
4c1a82f757 | ||
|
|
b159ec719d | ||
|
|
e715e9093e | ||
|
|
68310d21d0 | ||
|
|
2eb1f31d92 | ||
|
|
86e2d96228 | ||
|
|
ac4ba4cb0b | ||
|
|
436509edf6 | ||
|
|
526e6503df | ||
|
|
e5d5cfbd3a | ||
|
|
490d206afc | ||
|
|
10956afe84 | ||
|
|
0a19407328 | ||
|
|
65cff91c65 | ||
|
|
4c98f7aa5f | ||
|
|
d756f09c82 | ||
|
|
8b50243270 | ||
|
|
c03247be74 | ||
|
|
2ad5095843 | ||
|
|
61a57b8fdf | ||
|
|
f4dc2a1ff5 | ||
|
|
50b4c62d5e | ||
|
|
b03816a2c0 | ||
|
|
e215393abd | ||
|
|
04bb34b5e3 | ||
|
|
16e68cd605 | ||
|
|
f0dadd9576 | ||
|
|
73f2f05b26 | ||
|
|
08aee19e5e | ||
|
|
1d5788bb2d | ||
|
|
bb8a214c68 | ||
|
|
87a54127ff | ||
|
|
8a648e7e22 | ||
|
|
1d51fa4f61 | ||
|
|
8760bb9f6f | ||
|
|
ceb14a0820 | ||
|
|
30e973162f | ||
|
|
7719e995e0 | ||
|
|
3311224e48 | ||
|
|
d277b169f1 | ||
|
|
4657f91116 | ||
|
|
bd5f6e4711 | ||
|
|
b9b4d2e175 | ||
|
|
f18aac14fd | ||
|
|
da849a1408 | ||
|
|
e15deff4ed | ||
|
|
61d11594e4 | ||
|
|
9d906c29a2 | ||
|
|
ce4c24caa9 | ||
|
|
6577d43e4e | ||
|
|
5662741b03 | ||
|
|
bcec235e3b | ||
|
|
44195cb607 | ||
|
|
097865b0c1 | ||
|
|
aa3a1cc199 | ||
|
|
db357e6af5 | ||
|
|
d09002755b | ||
|
|
3c50a832e7 | ||
|
|
2789ad40a8 | ||
|
|
eccbb93775 | ||
|
|
79a3b4d57d | ||
|
|
2d592fa521 | ||
|
|
c7249b5ca9 | ||
|
|
185d89c917 | ||
|
|
63bb36ea44 | ||
|
|
1513315d05 | ||
|
|
e24ba2f198 | ||
|
|
d0880a07a0 | ||
|
|
2eb81c320b | ||
|
|
bb604521f2 | ||
|
|
1a065485e3 | ||
|
|
009783a59a | ||
|
|
1b4f70c808 | ||
|
|
dd4a727521 | ||
|
|
ebb7111f25 | ||
|
|
e08e1237d9 | ||
|
|
86fd14613e | ||
|
|
aef8668d9f | ||
|
|
b229bd331b | ||
|
|
fb28f71095 | ||
|
|
6d4e4ba6cc | ||
|
|
0fa3d4af76 | ||
|
|
fda7c3becb | ||
|
|
b83283e081 | ||
|
|
95d84573d4 | ||
|
|
5276461239 | ||
|
|
40f47bc22d | ||
|
|
8150403ccb | ||
|
|
b43d94ab16 | ||
|
|
849290a3b7 | ||
|
|
7771fa063a | ||
|
|
d01fbf05ec | ||
|
|
f40526366a | ||
|
|
d6ca3cf527 | ||
|
|
d275b3f7a3 | ||
|
|
48eb507f98 | ||
|
|
a1205009f4 | ||
|
|
8f69201a70 | ||
|
|
0b617e9fd6 | ||
|
|
a2b5c8e34c | ||
|
|
fd2af705e7 | ||
|
|
d611b8b99c | ||
|
|
ad93ef2bb2 | ||
|
|
7f267d8c46 | ||
|
|
6eb435142e | ||
|
|
213243ae3d | ||
|
|
4feaa0b594 | ||
|
|
bb1ae6a240 | ||
|
|
7014bc0d2e | ||
|
|
443809a1c7 | ||
|
|
e81cd22592 | ||
|
|
d1c844e36c | ||
|
|
d10561f27c | ||
|
|
e14ea777d5 | ||
|
|
46d73a16a0 | ||
|
|
9174d0e573 | ||
|
|
b36ca736ea | ||
|
|
6682ebba81 | ||
|
|
4d2b918d39 | ||
|
|
1e28870d25 | ||
|
|
0b263eb5d5 | ||
|
|
4eabee4b92 | ||
|
|
dc8ec0a964 | ||
|
|
d69fc070f7 | ||
|
|
a9dbfca810 | ||
|
|
4acfdcce52 | ||
|
|
0fa5454831 | ||
|
|
8611494069 | ||
|
|
4bbd5d5ee5 | ||
|
|
b3c5e372d6 | ||
|
|
3a663870ac | ||
|
|
8fce3035d3 | ||
|
|
a3070f8149 | ||
|
|
1e8beab9a3 | ||
|
|
afdd7c74c3 | ||
|
|
b0ad63f1c7 | ||
|
|
790cae7685 | ||
|
|
19adb31b0e | ||
|
|
a63e0c2e23 | ||
|
|
cd88b2a0b6 | ||
|
|
28c0638c38 | ||
|
|
dc645c813b | ||
|
|
f3b3eec211 | ||
|
|
e6ec825a97 | ||
|
|
aac102f432 | ||
|
|
353543e47d | ||
|
|
68f1e920ed | ||
|
|
9e796ebb43 | ||
|
|
a52f88fd53 | ||
|
|
0873c9006a | ||
|
|
1db2181dcf | ||
|
|
d2ffe9cc38 | ||
|
|
7ce031bb15 | ||
|
|
bc765ee2b0 | ||
|
|
c77920471d | ||
|
|
702ebaf0a2 | ||
|
|
93349b8fa3 | ||
|
|
040fad0db4 | ||
|
|
1bdccd9270 | ||
|
|
919b79bef4 | ||
|
|
7b898b03a2 | ||
|
|
ef65f7bfa2 | ||
|
|
047bfed661 | ||
|
|
1b32c38373 | ||
|
|
a903e96e92 | ||
|
|
e407e6b456 | ||
|
|
08e58c6652 | ||
|
|
eda61cb80a | ||
|
|
143ae11221 | ||
|
|
4a1e4901c8 | ||
|
|
02e47dbae3 | ||
|
|
20d952d472 | ||
|
|
5487e03212 | ||
|
|
9c1ddbeab7 | ||
|
|
7247bb5ced | ||
|
|
0164c2087f | ||
|
|
aa6e66ef9f | ||
|
|
57eb2bae2b | ||
|
|
f658e5a1af | ||
|
|
a918c66b87 | ||
|
|
4e75ce56ae | ||
|
|
b989b46f21 | ||
|
|
fd12e81724 | ||
|
|
59c97081be | ||
|
|
a840566e02 | ||
|
|
3e5a90b4b1 | ||
|
|
d8ba3f746c | ||
|
|
fd329764ed | ||
|
|
7d9556c933 | ||
|
|
5bb2f8b7fb | ||
|
|
d9136ecfa8 | ||
|
|
f6a2199f68 | ||
|
|
c0e1f5629d | ||
|
|
f954b97f96 | ||
|
|
adb4883291 | ||
|
|
ccb5d5245a | ||
|
|
c7ce70d844 | ||
|
|
d7b6d88274 | ||
|
|
184eaf21cd | ||
|
|
13b5680692 | ||
|
|
2f8bc559e8 | ||
|
|
65b058ff75 | ||
|
|
d486052378 | ||
|
|
f17892c411 | ||
|
|
007c1cb1d6 | ||
|
|
bdbecfa46c | ||
|
|
6ece4ce742 | ||
|
|
c1aeb6b203 | ||
|
|
3150fae2b8 | ||
|
|
620845bc4f | ||
|
|
bec8cea3e3 | ||
|
|
1a4d43dbbf | ||
|
|
676825cf52 | ||
|
|
5f93da1343 | ||
|
|
eedbe0db67 | ||
|
|
dfc9dde32d | ||
|
|
5b0fbf209e | ||
|
|
22fb1ab254 | ||
|
|
d6b26eff26 | ||
|
|
50f93f54ec | ||
|
|
9cb1d96725 | ||
|
|
40013dccc3 | ||
|
|
24af1b8420 | ||
|
|
213d656df4 | ||
|
|
c09b4e96d2 | ||
|
|
a80875e00c | ||
|
|
bbdedb5097 | ||
|
|
dd0671b111 |
@@ -23,5 +23,8 @@ test/data
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
|
||||
# Glade temp files
|
||||
*~
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
Josip Pisoj <josip@pisoj.com>
|
||||
Mirko Leonhaeuser <mirko@leonhaeuser.de>
|
||||
<martin.hawlisch@gmx.de> <loshawlos@users.sourceforge.net>
|
||||
Matti Niemelä <matti.u.niemela@gmail.com>
|
||||
Matti Niemelä <matti.u.niemela@gmail.com> <niememat@gmail.com>
|
||||
<nick-h@gramps-project.org> <nick__hall@hotmail.com>
|
||||
<nick-h@gramps-project.org> <Nick-Hall@users.noreply.github.com>
|
||||
Ondrej Krč-Jediný <hou@centrum.sk>
|
||||
|
||||
+6
-6
@@ -72,7 +72,7 @@ install:
|
||||
# by the automatic git checkout.
|
||||
|
||||
# Download Sean Ross-Ross's Pure Python module containing a framework to
|
||||
# manipulate and analyze python ast�s and bytecode. This is loaded to
|
||||
# manipulate and analyze python ast�s and bytecode. This is loaded to
|
||||
# /home/travis/build/gramps-project/gramps/meta
|
||||
# FIXME: This should be loaded from the release directory at
|
||||
# https://pypi.python.org/pypi/meta
|
||||
@@ -95,11 +95,11 @@ before_script:
|
||||
# set GRAMPS_RESOURCES for locale, data,image and documentation
|
||||
- export GRAMPS_RESOURCES=.
|
||||
# Install addons
|
||||
- mkdir -p ~/.gramps/gramps50/plugins/
|
||||
- wget https://github.com/gramps-project/addons/raw/master/gramps50/download/CliMerge.addon.tgz
|
||||
- tar -C ~/.gramps/gramps50/plugins -xzf CliMerge.addon.tgz
|
||||
- wget https://github.com/gramps-project/addons/raw/master/gramps50/download/ExportRaw.addon.tgz
|
||||
- tar -C ~/.gramps/gramps50/plugins -xzf ExportRaw.addon.tgz
|
||||
- mkdir -p ~/.gramps/gramps51/plugins/
|
||||
- wget https://github.com/gramps-project/addons/raw/master/gramps51/download/CliMerge.addon.tgz
|
||||
- tar -C ~/.gramps/gramps51/plugins -xzf CliMerge.addon.tgz
|
||||
- wget https://github.com/gramps-project/addons/raw/master/gramps51/download/ExportRaw.addon.tgz
|
||||
- tar -C ~/.gramps/gramps51/plugins -xzf ExportRaw.addon.tgz
|
||||
|
||||
script:
|
||||
# Ignore the virtualenv entirely. Use nosetests3, python3 (3.4.0) and coverage
|
||||
|
||||
@@ -355,4 +355,3 @@ Since Gramps generates HTML pages, you can upload the pages to your personal web
|
||||
|
||||
**** End of Gramps Frequently Asked Questions ****
|
||||
|
||||
$Id$
|
||||
|
||||
@@ -33,11 +33,11 @@ all required and optional dependencies. Missing dependencies will
|
||||
result in runtime errors.
|
||||
|
||||
To build and install, whether from a tarball or git repo:
|
||||
python setup.py build
|
||||
sudo python setup.py install
|
||||
python3 setup.py build
|
||||
sudo python3 setup.py install
|
||||
|
||||
You can avoid using sudo for the install step by specifying a prefix to which you have write priviledge. The default is /usr/local, which is usually owned by root. You can learn of more options with
|
||||
python setup.py --help
|
||||
python3 setup.py --help
|
||||
|
||||
One can use gramps from the command line without installing it by
|
||||
setting the following environment variables, but that won't provide
|
||||
@@ -71,7 +71,7 @@ from the source directory.
|
||||
b) You installed Gramps, and want to start it from the PYTHONPATH. In this
|
||||
case use the command:
|
||||
|
||||
python -c 'from gramps.grampsapp import main; main()'
|
||||
python3 -c 'from gramps.grampsapp import main; main()'
|
||||
|
||||
The executable 'gramps' in /usr/local/bin or /usr/bin from a) does
|
||||
this for you.
|
||||
@@ -79,7 +79,7 @@ from the source directory.
|
||||
b) You downloaded the Gramps source code to a directory, and want to run it.
|
||||
You can start Gramps from the source code directory with
|
||||
|
||||
python Gramps.py
|
||||
python3 Gramps.py
|
||||
|
||||
See gramps/gen/const.py how Gramps finds its resource directories in case
|
||||
you encounter problems.
|
||||
@@ -90,17 +90,17 @@ If you would like to install Gramps without being root, or in an
|
||||
alternative location on windows, supply the --root argument to setup.py
|
||||
|
||||
For example:
|
||||
python setup.py install --root ~/test
|
||||
python3 setup.py install --root ~/test
|
||||
|
||||
Packager's issues
|
||||
------------------
|
||||
There is a MANIFEST.in file to indicate the work needed.
|
||||
To create a source distribution run:
|
||||
|
||||
python setup.py sdist
|
||||
python3 setup.py sdist
|
||||
|
||||
If Gramps is built outside of the source tree in a temporary location (e.g. when
|
||||
packaging for a distribution), the --resourcepath option can be used to specify
|
||||
the path to the installed location of the Gramps resources (e.g. /usr/share):
|
||||
|
||||
python setup.py install --resourcepath=/usr/share
|
||||
python3 setup.py install --resourcepath=/usr/share
|
||||
|
||||
+1
-2
@@ -1,6 +1,5 @@
|
||||
include ChangeLog
|
||||
include po/ChangeLog
|
||||
include AUTHORS
|
||||
include ChangeLog
|
||||
include COPYING
|
||||
include FAQ
|
||||
include Gramps.py
|
||||
|
||||
@@ -11,19 +11,20 @@ Requirements
|
||||
The following packages **MUST** be installed in order for Gramps to work:
|
||||
|
||||
* **Python** 3.2 or greater - The programming language used by Gramps. https://www.python.org/
|
||||
* **GTK** 3.10 or greater - A cross-platform widget toolkit for creating graphical user interfaces. http://www.gtk.org/
|
||||
* **GTK** 3.12 or greater - A cross-platform widget toolkit for creating graphical user interfaces. http://www.gtk.org/
|
||||
* **pygobject** 3.12 or greater - Python Bindings for GLib/GObject/GIO/GTK+ https://wiki.gnome.org/Projects/PyGObject
|
||||
|
||||
The following three packages with GObject Introspection bindings (the gi packages)
|
||||
|
||||
* **cairo** - a 2D graphics library with support for multiple output devices. http://cairographics.org/
|
||||
* **cairo** 1.13.1 or greater - a 2D graphics library with support for multiple output devices. http://cairographics.org/
|
||||
* **Pycairo** 1.13.3 or greater - GObject Introspection bindings for cairo. https://github.com/pygobject/pycairo
|
||||
* **pango** - a library for laying out and rendering of text, with an emphasis on internationalization. http://www.pango.org/
|
||||
* **pangocairo** - Allows you to use Pango with Cairo http://www.pango.org/
|
||||
|
||||
* **librsvg2** - (SVG icon view) a library to render SVG files using cairo. http://live.gnome.org/LibRsvg
|
||||
* **xdg-utils** - Desktop integration utilities from freedesktop.org
|
||||
* **bsddb3** - Python bindings for Oracle Berkeley DB https://pypi.python.org/pypi/bsddb3/
|
||||
|
||||
* **sqlite3** - Python bindings for SQLite Database library
|
||||
|
||||
The following package is needed for full translation of the interface
|
||||
to your language:
|
||||
@@ -44,7 +45,7 @@ The following packages are **STRONGLY RECOMMENDED** to be installed:
|
||||
It may be osmgpsmap, osm-gps-map, or python-osmgpsmap,
|
||||
but the Python bindings for this must also be present, so gir1.2-osmgpsmap-1.0.
|
||||
Without this the GeoView will not be active, see
|
||||
https://gramps-project.org/wiki/index.php?title=Gramps_4.2_Wiki_Manual_-_Categories#Geography_Category
|
||||
https://gramps-project.org/wiki/index.php?title=Gramps_5.0_Wiki_Manual_-_Categories#Geography_Category
|
||||
|
||||
* **Graphviz**
|
||||
|
||||
@@ -65,6 +66,10 @@ The following packages are **STRONGLY RECOMMENDED** to be installed:
|
||||
(These are Python bindings for the ICU package.
|
||||
https://pypi.python.org/pypi/PyICU/)
|
||||
|
||||
* **Ghostscript**
|
||||
|
||||
Used by Graphviz reports to help create PDF's
|
||||
|
||||
The following packages are optional:
|
||||
------------------------------------
|
||||
* **gtkspell**
|
||||
@@ -77,12 +82,12 @@ The following packages are optional:
|
||||
|
||||
The GNU Revision Control System (RCS) can be used to manage
|
||||
multiple revisions of your family trees. See info at
|
||||
https://gramps-project.org/wiki/index.php?title=Gramps_4.2_Wiki_Manual_-_Manage_Family_Trees#Archiving_a_Family_Tree
|
||||
https://gramps-project.org/wiki/index.php?title=Gramps_5.0_Wiki_Manual_-_Manage_Family_Trees#Archiving_a_Family_Tree
|
||||
Only rcs is needed, NO python bindings are required
|
||||
|
||||
* **PIL**
|
||||
|
||||
Python Image Library is needed to crop
|
||||
Python Image Library (PILLOW) is needed to crop
|
||||
images and also to convert non-JPG images to
|
||||
JPG so as to include them in LaTeX output.
|
||||
(For Python3 a different source may be needed,
|
||||
@@ -98,6 +103,18 @@ The following packages are optional:
|
||||
|
||||
More font support in the reports
|
||||
|
||||
* **geocodeglib**
|
||||
|
||||
A library use to associate a geographical position (latitude, longitude)
|
||||
to a place name. This is used if you already have osmgpsmap installed.
|
||||
If installed, when you add or link a place from the map, you have a red line
|
||||
at the end of the table for selection.
|
||||
Debian, Ubuntu, ... : gir1.2-geocodeglib-1.0
|
||||
Fedora, Redhat, ... : geocode-glib
|
||||
openSUSE : geocode-glib
|
||||
ArchLinux : geocode-glib
|
||||
...
|
||||
|
||||
Optional packages required by Third-party Addons
|
||||
------------------------------------------------
|
||||
|
||||
@@ -112,6 +129,9 @@ Prerequistes required for the following Addons to work:
|
||||
* **Graph View** - Requires: PyGoocanvas and Goocanvas (python-pygoocanvas, gir1.2-goocanvas-2.0).
|
||||
( https://gramps-project.org/wiki/index.php?title=Graph_View )
|
||||
|
||||
* **Network Chart** - Requires: networkx and pygraphviz
|
||||
( https://gramps-project.org/wiki/index.php?title=NetworkChart )
|
||||
|
||||
* **PedigreeChart** - Can optionally use - numpy if installed
|
||||
( https://gramps-project.org/wiki/index.php?title=PedigreeChart )
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
$Id$
|
||||
|
||||
UNSTABLE Gramps 4.0.0 Beta2 release.
|
||||
|
||||
|
||||
+3
-1
@@ -1,5 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- $Id$ -->
|
||||
<authors xmlns:html="http://www.w3.org/1999/xhtml">
|
||||
<author title="author">
|
||||
Alex Roitman <<html:a href="mailto:shura@gramps-project.org">shura@gramps-project.org</html:a>>
|
||||
@@ -94,6 +93,9 @@
|
||||
<author title="contributor">
|
||||
Nick Hall <<html:a href="mailto:nick__hall@hotmail.com">nick__hall@hotmail.com</html:a>>
|
||||
</author>
|
||||
<author title="contributor">
|
||||
Paul Culley <<html:a href="mailto:paulr2787@gmail.com">paulr2787@gmail.com</html:a>>
|
||||
</author>
|
||||
<author title="contributor">
|
||||
Peter Landgren <<html:a href="mailto:peter.talken@telia.com">peter.talken@telia.com</html:a>>
|
||||
</author>
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright 2009 Serge Noiraud
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
GeoView Style Sheet
|
||||
Style Name: GeoView
|
||||
Style Author: Serge Noiraud (2009)
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
This file was created for GeoView usage.
|
||||
|
||||
# $Id$
|
||||
|
||||
GeoView Styles
|
||||
|
||||
----------------------------------------------------- */
|
||||
|
||||
#geo-map
|
||||
{
|
||||
margin-left:0px;
|
||||
margin-top:0px;
|
||||
margin-right:auto;
|
||||
margin-bottom:auto;
|
||||
}
|
||||
|
||||
/* InfoWindow */
|
||||
#geo-info {
|
||||
font-size:10pt;
|
||||
max-height:200px;
|
||||
max-width: 600px;
|
||||
min-width: 300px;
|
||||
text-align: left;
|
||||
padding-right: 6px;
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,6 @@ Characteristic of this style is that it uses the full width of the browser
|
||||
window and that horizontal highlighting bars extend over the full width of
|
||||
the page.
|
||||
--------------------------------------------------------------------------------------------------
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
------------------------------------------------------------------------------------------------
|
||||
@@ -87,6 +86,12 @@ h1 {
|
||||
font-weight: bold;
|
||||
padding-left: 15px;
|
||||
}
|
||||
h2 {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
text-align: center;
|
||||
}
|
||||
h3 {
|
||||
font-size: large;
|
||||
padding-left: 15px;
|
||||
@@ -325,6 +330,10 @@ table.IndividualList td.ColumnSurname {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
----------------------------------------------------- */
|
||||
#GalleryNav {
|
||||
@@ -416,7 +425,7 @@ div#SourceDetail {
|
||||
}
|
||||
.subsection {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
}
|
||||
.subsection p {
|
||||
margin: 0px;
|
||||
|
||||
@@ -134,7 +134,6 @@ h5, h6 {
|
||||
margin:1.3em 0 .5em 1em;
|
||||
}
|
||||
p#description {
|
||||
max-width: 800px;
|
||||
margin: 0;
|
||||
padding: 1em 20px;
|
||||
text-indent: 30px;
|
||||
@@ -289,10 +288,6 @@ table.infolist thead tr th {
|
||||
table.infolist tr td {
|
||||
border-bottom: dashed 1px #000;
|
||||
vertical-align: middle;
|
||||
padding: 6px 0 6px 10px;
|
||||
}
|
||||
table.infolist tr td a {
|
||||
display: block;
|
||||
}
|
||||
table.infolist tr.BeginLetter td, table.infolist tr.BeginSurname td {
|
||||
border-top: solid 1px #000;
|
||||
@@ -352,15 +347,15 @@ div#Individuals {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
div#Individuals table.individuallist {
|
||||
div#Individuals table.IndividualList {
|
||||
border-bottom: solid 1px #000;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td.ColumnSurname a:hover,
|
||||
div#Individuals table.individuallist tbody tr td.ColumnSurname a:active {
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnSurname a:hover,
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnSurname a:active {
|
||||
cursor: default;
|
||||
background: none;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td.ColumnName a {
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnName a {
|
||||
vertical-align: middle;
|
||||
}
|
||||
div#Individuals div table.infolist tr td p {
|
||||
@@ -494,7 +489,7 @@ table.eventlist tbody tr td.ColumnNotes {
|
||||
width: 20%;
|
||||
}
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 17%;
|
||||
width: 5%;
|
||||
}
|
||||
table.eventlist tbody tr td.ColumnPerson {
|
||||
width: 35%;
|
||||
@@ -1130,9 +1125,10 @@ div.narrative {
|
||||
}
|
||||
.narrative p {
|
||||
font: normal .9em/1.4em sans-serif;
|
||||
margin-top: .5em;
|
||||
margin-bottom: 0;
|
||||
padding: 0 20px 1em 20px;
|
||||
margin: 0.1em 0 0.2em 0;
|
||||
}
|
||||
i + div.grampsstylednote p {
|
||||
margin: 0.1em 0 0.2em 0;
|
||||
}
|
||||
|
||||
/* Subsections : References
|
||||
|
||||
@@ -50,7 +50,6 @@ Characteristic of this style is that it uses the full width of the browser
|
||||
window and that horizontal highlighting bars extend over the full width of
|
||||
the page.
|
||||
--------------------------------------------------------------------------------------------------
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
------------------------------------------------------------------------------------------------
|
||||
@@ -87,6 +86,12 @@ h1 {
|
||||
font-weight: bold;
|
||||
padding-left: 15px;
|
||||
}
|
||||
h2 {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
text-align: center;
|
||||
}
|
||||
h3 {
|
||||
font-size: large;
|
||||
padding-left: 15px;
|
||||
@@ -368,6 +373,10 @@ table.IndividualList td.ColumnSurname {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
----------------------------------------------------- */
|
||||
#GalleryNav {
|
||||
@@ -466,7 +475,7 @@ div#SourceDetail {
|
||||
}
|
||||
.subsection {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
}
|
||||
.subsection p {
|
||||
margin: 0px;
|
||||
|
||||
@@ -50,7 +50,6 @@ Characteristic of this style is that it uses the full width of the browser
|
||||
window and that horizontal highlighting bars extend over the full width of
|
||||
the page.
|
||||
--------------------------------------------------------------------------------------------------
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
------------------------------------------------------------------------------------------------
|
||||
@@ -87,6 +86,12 @@ h1 {
|
||||
font-weight: bold;
|
||||
padding-left: 15px;
|
||||
}
|
||||
h2 {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
text-align: center;
|
||||
}
|
||||
h3 {
|
||||
font-size: large;
|
||||
padding-left: 15px;
|
||||
@@ -361,6 +366,10 @@ table.IndividualList td.ColumnSurname {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
----------------------------------------------------- */
|
||||
#GalleryNav {
|
||||
@@ -459,7 +468,7 @@ div#SourceDetail {
|
||||
}
|
||||
.subsection {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
}
|
||||
.subsection p {
|
||||
margin: 0px;
|
||||
|
||||
@@ -50,7 +50,6 @@ Characteristic of this style is that it uses the full width of the browser
|
||||
window and that horizontal highlighting bars extend over the full width of
|
||||
the page.
|
||||
--------------------------------------------------------------------------------------------------
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
------------------------------------------------------------------------------------------------
|
||||
@@ -87,6 +86,12 @@ h1 {
|
||||
font-weight: bold;
|
||||
padding-left: 15px;
|
||||
}
|
||||
h2 {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
text-align: center;
|
||||
}
|
||||
h3 {
|
||||
font-size: large;
|
||||
padding-left: 15px;
|
||||
@@ -361,6 +366,10 @@ table.IndividualList td.ColumnSurname {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
----------------------------------------------------- */
|
||||
#GalleryNav {
|
||||
@@ -459,7 +468,7 @@ div#SourceDetail {
|
||||
}
|
||||
.subsection {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
}
|
||||
.subsection p {
|
||||
margin: 0px;
|
||||
|
||||
@@ -50,7 +50,6 @@ Characteristic of this style is that it uses the full width of the browser
|
||||
window and that horizontal highlighting bars extend over the full width of
|
||||
the page.
|
||||
--------------------------------------------------------------------------------------------------
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
------------------------------------------------------------------------------------------------
|
||||
@@ -87,6 +86,12 @@ h1 {
|
||||
font-weight: bold;
|
||||
padding-left: 15px;
|
||||
}
|
||||
h2 {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
text-align: center;
|
||||
}
|
||||
h3 {
|
||||
font-size: large;
|
||||
padding-left: 15px;
|
||||
@@ -361,6 +366,10 @@ table.IndividualList td.ColumnSurname {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
----------------------------------------------------- */
|
||||
#GalleryNav {
|
||||
@@ -459,7 +468,7 @@ div#SourceDetail {
|
||||
}
|
||||
.subsection {
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
}
|
||||
.subsection p {
|
||||
margin: 0px;
|
||||
|
||||
@@ -25,7 +25,6 @@ GRAMPS Cascading Style Sheet
|
||||
Style Name: Web_Citations-Outline.css
|
||||
******************************************************
|
||||
|
||||
# $Id$
|
||||
|
||||
Source Citations Outline styles
|
||||
------------------------------------------------------ */
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
*************************************************
|
||||
GRAMPS Cascading Style Sheet
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
*************************************************
|
||||
GRAMPS Cascading Style Sheet
|
||||
|
||||
@@ -25,7 +25,6 @@ GRAMPS Cascading Style Sheet
|
||||
Style Name: Web_Navigation-Horizontal.css
|
||||
******************************************************
|
||||
|
||||
# $Id$
|
||||
|
||||
Body Element
|
||||
------------------------------------------------------ */
|
||||
@@ -33,7 +32,6 @@ body {
|
||||
background-color: #00029D;
|
||||
color: #00029D;
|
||||
width: 100%;
|
||||
padding: 0px 14px;
|
||||
}
|
||||
|
||||
/* Navigation Menus
|
||||
|
||||
+12
-3
@@ -54,7 +54,6 @@ Middle images/Web_Mainz_Mid.png
|
||||
Middle Light images/Web_Mainz_MidLight.png
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
--------------------------------------------------------------------------------------------
|
||||
@@ -68,7 +67,7 @@ body {
|
||||
background: url(../images/Web_Mainz_Bkgd.png) black repeat;
|
||||
}
|
||||
body > div {
|
||||
width: 950px;
|
||||
width: 85%;
|
||||
margin: 0px auto;
|
||||
background: url(../images/Web_Mainz_Mid.png) #FFF2C6 repeat;
|
||||
overflow: hidden;
|
||||
@@ -91,6 +90,12 @@ h1 {
|
||||
font-style: italic;
|
||||
margin-left: 2em;
|
||||
}
|
||||
h2 {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
text-align: center;
|
||||
}
|
||||
h3 {
|
||||
font-size: xx-large;
|
||||
font-weight: normal;
|
||||
@@ -144,7 +149,7 @@ div#nav ul li, #subnavigation ul li {
|
||||
float: left;
|
||||
}
|
||||
div#nav ul li a, #subnavigation ul li a {
|
||||
display: block;
|
||||
display: run-in;
|
||||
padding: 0.4em 0.8em 0.3em 0.8em;
|
||||
font-size: smaller;
|
||||
font-family: sans-serif;
|
||||
@@ -307,6 +312,10 @@ table#SortByCount thead th.ColumnQuantity a:after {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
-----------------------------------------------------------------*/
|
||||
#GalleryNav {
|
||||
|
||||
+17
-15
@@ -45,7 +45,6 @@ gray #696969
|
||||
green #5D835F
|
||||
--------------------------------------------------------------------------------------------
|
||||
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
--------------------------------------------------------------------------------------------
|
||||
@@ -115,7 +114,7 @@ h1 {
|
||||
font:normal 2em/1.2em serif;
|
||||
}
|
||||
h2 {
|
||||
display:none;
|
||||
display:block;
|
||||
}
|
||||
h3 {
|
||||
font:normal 2em/1.2em serif;
|
||||
@@ -139,7 +138,6 @@ h5, h6 {
|
||||
|
||||
p#description {
|
||||
color:#542;
|
||||
max-width:800px;
|
||||
margin:0;
|
||||
padding:1em 20px;
|
||||
background-color:#FFF;
|
||||
@@ -278,7 +276,6 @@ table.infolist tr th a:hover {
|
||||
table.infolist tr td {
|
||||
font:normal 1.1em/1.4em serif;
|
||||
vertical-align:middle;
|
||||
padding:.1em 10px;
|
||||
}
|
||||
table.infolist tr td a {
|
||||
display:block;
|
||||
@@ -398,30 +395,30 @@ table.surname thead tr th.ColumnParents, table.surname tbody tr td.ColumnParents
|
||||
/* Individuals
|
||||
----------------------------------------------------- */
|
||||
#Individuals { }
|
||||
#Individuals table.individuallist {
|
||||
#Individuals table.IndividualList {
|
||||
border-bottom:solid 1px #A97;
|
||||
}
|
||||
#Individuals table.individuallist tbody tr td {
|
||||
#Individuals table.IndividualList tbody tr td {
|
||||
border-bottom:dashed 1px #C1B398;
|
||||
}
|
||||
#Individuals table.individuallist tbody tr td a:hover {
|
||||
#Individuals table.IndividualList tbody tr td a:hover {
|
||||
text-decoration:none;
|
||||
}
|
||||
table.individuallist tbody tr td.ColumnSurname a:hover, table.individuallist tbody tr td.ColumnSurname a:active {
|
||||
table.IndividualList tbody tr td.ColumnSurname a:hover, table.IndividualList tbody tr td.ColumnSurname a:active {
|
||||
cursor:default;
|
||||
color:black;
|
||||
background:none;
|
||||
}
|
||||
table.individuallist tbody tr td.ColumnName {
|
||||
table.IndividualList tbody tr td.ColumnName {
|
||||
padding:0;
|
||||
background-color:#FFF;
|
||||
}
|
||||
table.individuallist tbody tr td.ColumnName a {
|
||||
table.IndividualList tbody tr td.ColumnName a {
|
||||
display:block;
|
||||
padding:.6em 10px;
|
||||
padding:.1em .1em;
|
||||
vertical-align:middle;
|
||||
}
|
||||
table.individuallist tbody tr td.ColumnName a:hover {
|
||||
table.IndividualList tbody tr td.ColumnName a:hover {
|
||||
background-color:#C1B398;
|
||||
}
|
||||
#Individuals div table.infolist tr td p {
|
||||
@@ -579,6 +576,10 @@ table.relationships tbody tr td.ColumnPartner a:hover {
|
||||
content: "";
|
||||
}
|
||||
|
||||
table.eventlist tbody tr td.ColumnSources {
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
/* Gallery
|
||||
----------------------------------------------------- */
|
||||
#Gallery { }
|
||||
@@ -962,11 +963,12 @@ div#Addresses table.infolist tr td a, div#Addresses table.infolist tr td p a {
|
||||
div.narrative {
|
||||
padding-bottom:0;
|
||||
}
|
||||
i + div.grampsstylednote p {
|
||||
margin: 0.1em 0 0.2em 0;
|
||||
}
|
||||
.narrative p {
|
||||
margin: 0.1em 0 0.2em 0;
|
||||
font:normal .9em/1.4em sans-serif;
|
||||
margin-top:.5em;
|
||||
margin-bottom:0;
|
||||
padding:0 20px 1em 20px;
|
||||
}
|
||||
|
||||
/* Subsections : References
|
||||
|
||||
@@ -41,7 +41,6 @@ black #000
|
||||
white #FFF
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
--------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -45,7 +45,6 @@ Unknown #000
|
||||
Males Web_Gender_Male.png
|
||||
Females Web_Gender_Female.png
|
||||
|
||||
# $Id$
|
||||
|
||||
NarrativeWeb Styles
|
||||
-------------------------------------------------------------------------------------------- */
|
||||
@@ -156,7 +155,6 @@ h5, h6 {
|
||||
margin:1.3em 0 .5em 1em;
|
||||
}
|
||||
p#description {
|
||||
max-width:800px;
|
||||
margin:0;
|
||||
padding:1em 20px;
|
||||
}
|
||||
@@ -456,30 +454,30 @@ div#Individuals {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
div#Individuals table.individuallist {
|
||||
div#Individuals table.IndividualList {
|
||||
border-bottom: solid 1px #5D835F;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td {
|
||||
div#Individuals table.IndividualList tbody tr td {
|
||||
border-bottom: dashed 1px #5D835F;
|
||||
background-color: #D8F3D6;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td a {
|
||||
div#Individuals table.IndividualList tbody tr td a {
|
||||
display: block;
|
||||
padding: .6em 10px;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td.ColumnSurname a:hover,
|
||||
div#Individuals table.individuallist tbody tr td.ColumnSurname a:active {
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnSurname a:hover,
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnSurname a:active {
|
||||
cursor:default;
|
||||
color: #000;
|
||||
background:none;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td.ColumnName {
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnName {
|
||||
background-color: #FFF;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td.ColumnName a {
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnName a {
|
||||
vertical-align:middle;
|
||||
}
|
||||
div#Individuals table.individuallist tbody tr td.ColumnPartner {
|
||||
div#Individuals table.IndividualList tbody tr td.ColumnPartner {
|
||||
background-color: #FFF;
|
||||
}
|
||||
div#Individuals div table.infolist tr td p {
|
||||
|
||||
@@ -45,6 +45,9 @@ Females Web_Gender_Female.png
|
||||
}
|
||||
#treeContainer {
|
||||
position:relative;
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
overflow: visible;
|
||||
z-index:1;
|
||||
}
|
||||
#treeContainer div.boxbg {
|
||||
|
||||
@@ -29,7 +29,6 @@ Style Author: Stephane Charette and Jason Simanek
|
||||
Image Gallery
|
||||
-------------
|
||||
|
||||
# $Id$
|
||||
|
||||
ensure RegionBox <ol> is hidden and has no margins/padding that would shift the image */
|
||||
ol.RegionBox {
|
||||
|
||||
@@ -18,13 +18,11 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
###################################################### */
|
||||
body#FamilyMap {
|
||||
background-color: #000;
|
||||
padding: 0 14px;
|
||||
width: 965px;
|
||||
}
|
||||
|
||||
/* Family Maps
|
||||
@@ -33,8 +31,11 @@ body#FamilyMap {
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
border: solid 4px #000;
|
||||
width: 931px;
|
||||
height: 1000px;
|
||||
margin: 0px auto;
|
||||
width: 800px;
|
||||
height: 400px;
|
||||
max-width: 90%;
|
||||
max-height: 90%;
|
||||
}
|
||||
|
||||
/* Place Maps
|
||||
@@ -44,6 +45,8 @@ div#place_canvas {
|
||||
border: solid 4px #000;
|
||||
width: 500px;
|
||||
height: 400px;
|
||||
max-width: 90%;
|
||||
max-height: 90%;
|
||||
}
|
||||
button#drop {
|
||||
background-color: purple;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||
<mime-type type="application/x-gramps">
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
|
||||
$Id$
|
||||
-->
|
||||
<xsl:stylesheet version="1.0"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
# $Id$
|
||||
-->
|
||||
|
||||
<!--
|
||||
|
||||
@@ -201,12 +201,12 @@
|
||||
<date name="Pääsiäispäivä" type="religious" value="> easter(y)" />
|
||||
<date name="2. Pääsiäispäivä" type="religious" value="> easter(y)" offset="1" />
|
||||
<date name="Helatorstai" type="religious" value="> easter(y)" offset="39" if="not(y>=1973)" />
|
||||
<date name="Kristuksen taivaaseenastumisen päivä." type="religious" value="> easter(y)" offset="34" if="(y>=1973) and not(y>=1992)" />
|
||||
<date name="Kristuksen taivaaseenastumisen päivä" type="religious" value="> easter(y)" offset="34" if="(y>=1973) and not(y>=1992)" />
|
||||
<date name="Helatorstai" type="religious" value="> easter(y)" offset="39" if="(y>=1992)" />
|
||||
<date name="Helluntaipäivä" value="easter(y)" offset="49" type="religious" />
|
||||
<date name="Pyhän Kolminaisuuden päivä" value="easter(y)" offset="56" type="religious" />
|
||||
<date name="Apostolienpäivä" value="easter(y)" offset="91" type="religious" />
|
||||
<date name="Kirkastussunnuntai." value="easter(y)" offset="105" type="religious" />
|
||||
<date name="Kirkastussunnuntai" value="easter(y)" offset="105" type="religious" />
|
||||
<date name="Juhannusaatto" value="*/jun/19" offset="fri" type="religious" if="(y>=1955)" />
|
||||
<date name="Juhannusaatto" value="*/jun/23" type="religious" if="not(y>=1955)" />
|
||||
<date name="Juhannuspäivä" value="*/jun/20" offset="sat" type="religious" if="(y>=1955)" />
|
||||
@@ -224,12 +224,12 @@
|
||||
<date name="Joulupäivä" value="*/12/25" type="religious" />
|
||||
<date name="Tapaninpäivä" value="*/12/26" type="religious" />
|
||||
<date name="Johannes Evankelistan päivä" value="*/dec/27" type="religious" if="not(y>=1774)" />
|
||||
<date name="Apostoli Johanneksen päivä." value="*/dec/27" type="religious" if="dow(y, m, d) == 7 and (y>=2000)" />
|
||||
<date name="Apostoli Johanneksen päivä" value="*/dec/27" type="religious" if="dow(y, m, d) == 7 and (y>=2000)" />
|
||||
<date name="Viattomien lasten päivä" value="*/12/28" type="religious" />
|
||||
<date name="Uudenvuodenpäivä" value="*/1/1" type="national" />
|
||||
<date name="Vainojen uhrien muistopäivä" value="*/1/27" type="national" if="(y>=2002)" />
|
||||
<date name="J.L. Runebergin päivä" value="*/2/5" type="national" if="(y>=1854)" />
|
||||
<date name="Saamelaisten kansallis päivä" value="*/2/6" type="religious" if="(y>=2004)" />
|
||||
<date name="Saamelaisten kansallispäivä" value="*/2/6" type="religious" if="(y>=2004)" />
|
||||
<date name="Ystävänpäivä" value="*/2/14" type="national" if="(y>=1987)" />
|
||||
<date name="Kalevalan päivä" value="*/2/28" type="national" if="(y>=1978)" />
|
||||
<date name="Naistenpäivä" value="*/3/8" type="national" if="(y>=1975)" />
|
||||
|
||||
+722
-501
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,12 @@
|
||||
0 HEAD
|
||||
1 SOUR Gramps
|
||||
2 VERS 5.0.0-alpha1
|
||||
2 VERS 5.0.0-alpha2
|
||||
2 NAME Gramps
|
||||
1 DATE 29 OCT 2016
|
||||
2 TIME 15:10:31
|
||||
1 DATE 1 SEP 2017
|
||||
2 TIME 12:10:38
|
||||
1 SUBM @SUBM@
|
||||
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
|
||||
1 COPR Copyright (c) 2016 Alex Roitman,,,.
|
||||
1 COPR Copyright (c) 2017 Alex Roitman,,,.
|
||||
1 GEDC
|
||||
2 VERS 5.5.1
|
||||
2 FORM LINEAGE-LINKED
|
||||
@@ -17,7 +17,7 @@
|
||||
1 ADDR Not Provided
|
||||
2 ADR1 Not Provided
|
||||
1 PHON 666-555-4444
|
||||
1 EMAIL an_email@gmail.com
|
||||
1 EMAIL an_email@@gmail.com
|
||||
0 @I0000@ INDI
|
||||
1 NAME Anna /Hansdotter/
|
||||
2 GIVN Anna
|
||||
@@ -789,7 +789,7 @@
|
||||
1 OBJE
|
||||
2 FORM jpeg
|
||||
2 TITL Michael O'Toole 2015-11
|
||||
2 FILE c:\grampsaio64-4.9.9\share\gramps\tests\O0.jpg
|
||||
2 FILE c:\grampsaio64-5.0.0\share\gramps\tests\O0.jpg
|
||||
2 NOTE @N0019@
|
||||
1 NOTE @N0007@
|
||||
1 CHAN
|
||||
@@ -820,7 +820,7 @@
|
||||
3 CTRY USA
|
||||
2 PHON 440-871-3400
|
||||
2 PHON 800-871-3400
|
||||
2 EMAIL thetester@gmail.com
|
||||
2 EMAIL thetester@@gmail.com
|
||||
2 FAX 440-123-4567
|
||||
2 WWW http://thetester.com
|
||||
1 EVEN A very bad day
|
||||
@@ -862,7 +862,7 @@
|
||||
2 DATE 30 DEC 1954
|
||||
2 PLAC 123 Main St., Winslow, PA, 12345
|
||||
2 PHON 440-871-3401
|
||||
2 EMAIL mrstester@gmail.com
|
||||
2 EMAIL mrstester@@gmail.com
|
||||
2 FAX 440-321-4568
|
||||
2 WWW http://mrstester.com
|
||||
2 NOTE @N0011@
|
||||
@@ -879,7 +879,7 @@
|
||||
3 POST 12345
|
||||
1 PHON 440-871-3401
|
||||
1 PHON 800-871-3401
|
||||
1 EMAIL mrstester@gmail.com
|
||||
1 EMAIL mrstester@@gmail.com
|
||||
1 FAX 440-321-4568
|
||||
1 WWW http://mrstester.com
|
||||
1 NOTE @N0010@
|
||||
@@ -904,7 +904,7 @@
|
||||
3 STAE Colorado
|
||||
3 CTRY USA
|
||||
2 PHON 440-871-3402
|
||||
2 EMAIL tomtester@gmail.com
|
||||
2 EMAIL tomtester@@gmail.com
|
||||
2 FAX 440-321-4569
|
||||
2 WWW http://tomtester.com
|
||||
1 RESI
|
||||
@@ -1316,10 +1316,10 @@
|
||||
2 ADR1 360 W 4800 N, Provo, UT 84604
|
||||
1 PHON (801) 705-7000
|
||||
1 FAX (801) 705-7001
|
||||
1 EMAIL help@ancestry.com
|
||||
1 EMAIL help@@ancestry.com
|
||||
1 WWW http://www.ancestry.com
|
||||
0 @R0001@ REPO
|
||||
1 NAME SUBM (Submitter): (@SUBM@) The Subm /Tester/
|
||||
1 NAME SUBM (Submitter): (@@SUBM@@) The Subm /Tester/
|
||||
1 ADDR 123 Main St.
|
||||
2 CONT Winslow
|
||||
2 CONT PA
|
||||
@@ -1329,7 +1329,7 @@
|
||||
2 STAE PA
|
||||
2 POST 12345
|
||||
1 PHON 440-871-3401
|
||||
1 EMAIL mrstester@gmail.com
|
||||
1 EMAIL mrstester@@gmail.com
|
||||
1 FAX 440-321-4568
|
||||
1 WWW http://mrstester.com
|
||||
1 NOTE @N0009@
|
||||
@@ -1362,7 +1362,7 @@
|
||||
1 ADDR 123 High St., OSF village, CA, USA
|
||||
2 ADR1 123 High St., OSF village, CA, USA
|
||||
1 PHON 988-765-4321
|
||||
1 EMAIL tester_repo@osf.com
|
||||
1 EMAIL tester_repo@@osf.com
|
||||
1 FAX 987-654-3210
|
||||
1 WWW http://www.tester_repo.com
|
||||
1 NOTE @N0012@
|
||||
@@ -1401,8 +1401,8 @@
|
||||
1 CONT
|
||||
1 CONT Only one phone number supported Lin
|
||||
1 CONC e 9: 3 PHON (800) 705-7000
|
||||
0 @N0009@ NOTE Records not imported into SUBM (Submitter): (@SUBM@) The Subm /Test
|
||||
1 CONC er/:
|
||||
0 @N0009@ NOTE Records not imported into SUBM (Submitter): (@@SUBM@@) The Subm /Te
|
||||
1 CONC ster/:
|
||||
1 CONT
|
||||
1 CONT Only one phone number supported Lin
|
||||
1 CONC e 29: 1 PHON 800-871-3401
|
||||
|
||||
@@ -43,6 +43,15 @@
|
||||
2 NOTE @N0018@
|
||||
1 OBJE @M7@
|
||||
1 OBJE @M8@
|
||||
1 OBJE
|
||||
2 FORM URL
|
||||
2 FILE http:\\obje.form.on_person.org
|
||||
1 BIRT
|
||||
2 TYPE Birth of the Tester
|
||||
2 DATE 2 OCT 1864
|
||||
2 OBJE
|
||||
3 FORM URL
|
||||
3 FILE http:\\obje.form.on_event.org
|
||||
0 @M1@ OBJE
|
||||
1 FORM jpeg
|
||||
1 TITL Multimedia link to linked form v5.5 blob
|
||||
|
||||
@@ -3,17 +3,26 @@
|
||||
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
|
||||
<database xmlns="http://gramps-project.org/xml/1.7.1/">
|
||||
<header>
|
||||
<created date="2016-08-29" version="5.0.0-alpha1"/>
|
||||
<created date="2017-05-30" version="5.0.0-alpha1"/>
|
||||
<researcher>
|
||||
</researcher>
|
||||
</header>
|
||||
<events>
|
||||
<event handle="_0000000f0000000f" change="1" id="E0000">
|
||||
<type>Birth</type>
|
||||
<dateval val="1864-10-02"/>
|
||||
<description>Birth of the Tester</description>
|
||||
<noteref hlink="_0000001000000010"/>
|
||||
</event>
|
||||
</events>
|
||||
<people>
|
||||
<person handle="_0000000100000001" change="1472500307" id="I0001">
|
||||
<person handle="_0000000100000001" change="1" id="I0001">
|
||||
<gender>U</gender>
|
||||
<name type="Birth Name">
|
||||
<first>The</first>
|
||||
<surname>Tester</surname>
|
||||
</name>
|
||||
<eventref hlink="_0000000f0000000f" role="Primary"/>
|
||||
<objref hlink="_0000000300000003"/>
|
||||
<objref hlink="_0000000400000004"/>
|
||||
<objref hlink="_0000000500000005"/>
|
||||
@@ -25,106 +34,107 @@
|
||||
<objref hlink="_0000000c0000000c"/>
|
||||
<objref hlink="_0000000d0000000d"/>
|
||||
<objref hlink="_0000000e0000000e"/>
|
||||
<noteref hlink="_0000000f0000000f"/>
|
||||
<url href="http:\\obje.form.on_person.org" type="Web Home"/>
|
||||
<noteref hlink="_0000001100000011"/>
|
||||
</person>
|
||||
</people>
|
||||
<citations>
|
||||
<citation handle="_0000001b0000001b" change="1472500307" id="C0000">
|
||||
<citation handle="_0000001d0000001d" change="1" id="C0000">
|
||||
<confidence>0</confidence>
|
||||
<noteref hlink="_0000001a0000001a"/>
|
||||
<sourceref hlink="_0000001900000019"/>
|
||||
<noteref hlink="_0000001c0000001c"/>
|
||||
<sourceref hlink="_0000001b0000001b"/>
|
||||
</citation>
|
||||
<citation handle="_0000002500000025" change="1472500307" id="C0001">
|
||||
<citation handle="_0000002700000027" change="1" id="C0001">
|
||||
<dateval val="2014-06-07"/>
|
||||
<page>77, 78 discussion of multimedia link with two files</page>
|
||||
<confidence>4</confidence>
|
||||
<noteref hlink="_0000002400000024"/>
|
||||
<sourceref hlink="_0000002300000023"/>
|
||||
<noteref hlink="_0000002600000026"/>
|
||||
<sourceref hlink="_0000002500000025"/>
|
||||
</citation>
|
||||
</citations>
|
||||
<sources>
|
||||
<source handle="_0000001900000019" change="1472500307" id="S0002">
|
||||
<source handle="_0000001b0000001b" change="1" id="S0002">
|
||||
<stitle>A Great Photographer</stitle>
|
||||
</source>
|
||||
<source handle="_0000002300000023" change="1472500307" id="S0001">
|
||||
<source handle="_0000002500000025" change="1" id="S0001">
|
||||
<stitle>The Testers personal files</stitle>
|
||||
<sauthor>The Tester</sauthor>
|
||||
<spubinfo>Name: Tester Publishing Operations, Inc.; Location: OSF world</spubinfo>
|
||||
</source>
|
||||
</sources>
|
||||
<objects>
|
||||
<object handle="_0000000300000003" change="1472500307" id="O0000">
|
||||
<object handle="_0000000300000003" change="1" id="O0000">
|
||||
<file src="test_emb_55.jpg" mime="image/jpeg" description="Multimedia link embedded form v5.5"/>
|
||||
<noteref hlink="_0000000200000002"/>
|
||||
</object>
|
||||
<object handle="_0000000400000004" change="548708291" id="M1">
|
||||
<file src="" mime="" description="Multimedia link to linked form v5.5 blob"/>
|
||||
<attribute type="REFN" value="Ref12345M1">
|
||||
<noteref hlink="_0000001000000010"/>
|
||||
<noteref hlink="_0000001200000012"/>
|
||||
</attribute>
|
||||
<attribute type="RIN" value="ID09876M1"/>
|
||||
<noteref hlink="_0000001100000011"/>
|
||||
<noteref hlink="_0000001200000012"/>
|
||||
<noteref hlink="_0000001300000013"/>
|
||||
<noteref hlink="_0000001400000014"/>
|
||||
</object>
|
||||
<object handle="_0000000500000005" change="548797681" id="M3">
|
||||
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form Gramps style v5.5ish file"/>
|
||||
<noteref hlink="_0000001500000015"/>
|
||||
<noteref hlink="_0000001600000016"/>
|
||||
<noteref hlink="_0000001700000017"/>
|
||||
<noteref hlink="_0000001800000018"/>
|
||||
</object>
|
||||
<object handle="_0000000600000006" change="548883481" id="M4">
|
||||
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form v5.5.1 file"/>
|
||||
<attribute type="Media-Type" value="Photo"/>
|
||||
<attribute type="REFN" value="Ref1234567M4">
|
||||
<noteref hlink="_0000001700000017"/>
|
||||
<noteref hlink="_0000001900000019"/>
|
||||
</attribute>
|
||||
<attribute type="RIN" value="ID098765M4"/>
|
||||
<noteref hlink="_0000001800000018"/>
|
||||
<noteref hlink="_0000001c0000001c"/>
|
||||
<citationref hlink="_0000001b0000001b"/>
|
||||
<noteref hlink="_0000001a0000001a"/>
|
||||
<noteref hlink="_0000001e0000001e"/>
|
||||
<citationref hlink="_0000001d0000001d"/>
|
||||
</object>
|
||||
<object handle="_0000000800000008" change="1472500307" id="O0001">
|
||||
<object handle="_0000000800000008" change="1" id="O0001">
|
||||
<file src="test_emb_551.jpg" mime="image/jpeg" description="Multimedia link embedded form v5.5.1"/>
|
||||
<attribute type="Media-Type" value="Photo"/>
|
||||
<noteref hlink="_0000000700000007"/>
|
||||
</object>
|
||||
<object handle="_0000000900000009" change="1472500307" id="M5">
|
||||
<object handle="_0000000900000009" change="1" id="M5">
|
||||
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form FTM style file"/>
|
||||
<datestr val="6/4/2016 9:33:57 AM"/>
|
||||
<noteref hlink="_0000001d0000001d"/>
|
||||
<noteref hlink="_0000001e0000001e"/>
|
||||
<noteref hlink="_0000001f0000001f"/>
|
||||
<noteref hlink="_0000002000000020"/>
|
||||
<noteref hlink="_0000002100000021"/>
|
||||
<noteref hlink="_0000002200000022"/>
|
||||
<datestr val="6/4/2016 9:33:57 AM"/>
|
||||
</object>
|
||||
<object handle="_0000000a0000000a" change="549056401" id="M6">
|
||||
<file src="test.jpg" mime="image/jpeg" description="Multimedia link to linked form v5.5.1 with two files(1)"/>
|
||||
<attribute type="Media-Type" value="Photo"/>
|
||||
<attribute type="REFN" value="Ref1234567M6">
|
||||
<noteref hlink="_0000002100000021"/>
|
||||
<noteref hlink="_0000002300000023"/>
|
||||
</attribute>
|
||||
<attribute type="RIN" value="ID098765M6"/>
|
||||
<noteref hlink="_0000002200000022"/>
|
||||
<noteref hlink="_0000002600000026"/>
|
||||
<citationref hlink="_0000002500000025"/>
|
||||
<noteref hlink="_0000002400000024"/>
|
||||
<noteref hlink="_0000002800000028"/>
|
||||
<citationref hlink="_0000002700000027"/>
|
||||
</object>
|
||||
<object handle="_0000000c0000000c" change="1472500307" id="O0002">
|
||||
<object handle="_0000000c0000000c" change="1" id="O0002">
|
||||
<file src="http://www.geni.com/photo/view?photo_id=6000000001341319061" mime="unknown" description="Multimedia link embedded form v5.5 URL"/>
|
||||
<noteref hlink="_0000000b0000000b"/>
|
||||
</object>
|
||||
<object handle="_0000000d0000000d" change="1472500307" id="M7">
|
||||
<object handle="_0000000d0000000d" change="1" id="M7">
|
||||
<file src="http://s6.postimg.org/8i2erq27l/Preserve_Record_Numbers_Option.png" mime="image/png" description="Multimedia link to linked form v5.5.1 with URL"/>
|
||||
<attribute type="Media-Type" value="Photo"/>
|
||||
</object>
|
||||
<object handle="_0000000e0000000e" change="1472500307" id="M8">
|
||||
<object handle="_0000000e0000000e" change="1" id="M8">
|
||||
<file src="No_path_No_Title_NoForm.jpg" mime="image/jpeg" description="No_path_No_Title_NoForm.jpg"/>
|
||||
<noteref hlink="_0000002700000027"/>
|
||||
<noteref hlink="_0000002900000029"/>
|
||||
</object>
|
||||
<object handle="_0000001300000013" change="1472500307" id="M2">
|
||||
<object handle="_0000001500000015" change="1" id="M2">
|
||||
<file src="" mime="" description="2nd blob Multimedia link to linked form v5.5 blob"/>
|
||||
<noteref hlink="_0000001400000014"/>
|
||||
<noteref hlink="_0000001600000016"/>
|
||||
</object>
|
||||
</objects>
|
||||
<notes>
|
||||
<note handle="_0000000200000002" change="1472500307" id="N0010" type="Media Note">
|
||||
<note handle="_0000000200000002" change="1" id="N0010" type="Media Note">
|
||||
<text>Media note test: Multimedia link embedded form v5.5
|
||||
n OBJE {1:1} p.55
|
||||
+1 FORM <MULTIMEDIA_FORMAT> {1:1} p.48
|
||||
@@ -132,7 +142,7 @@ n OBJE {1:1} p.55
|
||||
+1 FILE <MULTIMEDIA_FILE_REFERENCE> {1:1} p.47
|
||||
+1 <<NOTE_STRUCTURE>> {0:M} p.33</text>
|
||||
</note>
|
||||
<note handle="_0000000700000007" change="1472500307" id="N0014" type="Media Note">
|
||||
<note handle="_0000000700000007" change="1" id="N0014" type="Media Note">
|
||||
<text>Media note test: Multimedia link embedded form v5.5.1
|
||||
This note is not in the 5.5.1 spec, but is an obvious extrapolation from 5.5.
|
||||
n OBJE
|
||||
@@ -141,23 +151,27 @@ n OBJE
|
||||
+3 MEDI <SOURCE_MEDIA_TYPE> {0:1} p.62
|
||||
+1 TITL <DESCRIPTIVE_TITLE> {0:1} p.48</text>
|
||||
</note>
|
||||
<note handle="_0000000b0000000b" change="1472500307" id="N0018" type="Media Note">
|
||||
<note handle="_0000000b0000000b" change="1" id="N0018" type="Media Note">
|
||||
<text>Multimedia embedded 2nd copy v5.5</text>
|
||||
</note>
|
||||
<note handle="_0000000f0000000f" change="1472500307" id="N0000" type="GEDCOM import">
|
||||
<note handle="_0000001000000010" change="1" id="N0000" type="Event Note">
|
||||
<text>http:\\obje.form.on_event.org</text>
|
||||
</note>
|
||||
<note handle="_0000001100000011" change="1" id="N0001" type="GEDCOM import">
|
||||
<text>Records not imported into INDI (individual) Gramps ID I0001:
|
||||
|
||||
Could not import test_emb_55.jpg Line 18: 1 OBJE
|
||||
Could not import test_emb_551.jpg Line 26: 1 OBJE
|
||||
Could not import test_emb_55.jpg Line 34: 1 OBJE</text>
|
||||
Could not import test_emb_55.jpg Line 34: 1 OBJE
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="326"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000001000000010" change="1472500307" id="N0001" type="REFN-TYPE">
|
||||
<note handle="_0000001200000012" change="1" id="N0002" type="REFN-TYPE">
|
||||
<text>SOMETEXT</text>
|
||||
</note>
|
||||
<note handle="_0000001100000011" change="1472500307" id="N0011" type="Media Note">
|
||||
<note handle="_0000001300000013" change="1" id="N0011" type="Media Note">
|
||||
<text>Media note test: Multimedia link to linked form v5.5 blob
|
||||
n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 FORM <MULTIMEDIA_FORMAT> {1:1} p.48
|
||||
@@ -171,10 +185,10 @@ n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 RIN <AUTOMATED_RECORD_ID> {0:1} p.38
|
||||
+1 <<CHANGE_DATE>> {0:1} p.29</text>
|
||||
</note>
|
||||
<note handle="_0000001200000012" change="1472500307" id="N0002" type="GEDCOM import">
|
||||
<note handle="_0000001400000014" change="1" id="N0003" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M1:
|
||||
|
||||
Tag recognized but not supported Line 49: 1 BLOB
|
||||
Tag recognized but not supported Line 58: 1 BLOB
|
||||
.HM.......k.1..F.jwA.Dzzzzw............A....1.........0U.66..E.8
|
||||
.......A..k.a6.A.......A..k.........../6....G.......0../..U.....
|
||||
.w1/m........HC0..../...zzzzzzzz..5zzk..AnA..U..W6U....2rRrRrRrR
|
||||
@@ -182,23 +196,25 @@ Tag recognized but not supported Line 49:
|
||||
/Dw/.Tvz.E5zzUE9/kHz.Tw2/DzzzEEA.kE2zk5yzk2/zzs21.U2/Dw/.Tw/.Tzy
|
||||
/.fy/.HzzkHzzzo21Ds00.E2.UE2.U62/.k./Ds0.UE0/Do0..E8/UE2.U62.U9w
|
||||
/.Tx/.20.jg2/jo2..9u/.0U.6A.zk
|
||||
Line ignored as not understood Line 57: 1 OBJE @M2@
|
||||
Filename omitted Line 46: 0 M1 OBJE</text>
|
||||
Line ignored as not understood Line 66: 1 OBJE @M2@
|
||||
Filename omitted Line 55: 0 M1 OBJE
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="1367"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000001400000014" change="1472500307" id="N0003" type="GEDCOM import">
|
||||
<note handle="_0000001600000016" change="1" id="N0004" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M2:
|
||||
|
||||
Tag recognized but not supported Line 68: 1 BLOB
|
||||
Tag recognized but not supported Line 77: 1 BLOB
|
||||
67890gramps doesn't do this anyway, so don't bother doing it right.
|
||||
Filename omitted Line 65: 0 M2 OBJE</text>
|
||||
Filename omitted Line 74: 0 M2 OBJE
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="400"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000001500000015" change="1472500307" id="N0012" type="Media Note">
|
||||
<note handle="_0000001700000017" change="1" id="N0012" type="Media Note">
|
||||
<text>Media note test: Multimedia link to linked form Gramps style v5.5ish file
|
||||
n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 FORM <MULTIMEDIA_FORMAT> {1:1} p.48
|
||||
@@ -206,18 +222,19 @@ n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 FILE <MULTIMEDIA_FILE_REFERENCE> {1:1} p.47
|
||||
+1 <<NOTE_STRUCTURE>> {0:M} p.33</text>
|
||||
</note>
|
||||
<note handle="_0000001600000016" change="1472500307" id="N0004" type="GEDCOM import">
|
||||
<note handle="_0000001800000018" change="1" id="N0005" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M3:
|
||||
|
||||
Could not import test.jpg Line 73: 1 FILE test.jpg</text>
|
||||
Could not import test.jpg Line 82: 1 FILE test.jpg
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="163"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000001700000017" change="1472500307" id="N0005" type="REFN-TYPE">
|
||||
<note handle="_0000001900000019" change="1" id="N0006" type="REFN-TYPE">
|
||||
<text>SOMETEXT</text>
|
||||
</note>
|
||||
<note handle="_0000001800000018" change="1472500307" id="N0013" type="Media Note">
|
||||
<note handle="_0000001a0000001a" change="1" id="N0013" type="Media Note">
|
||||
<text>Media note test: Multimedia link to linked form v5.5.1 file
|
||||
n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 FILE <MULTIMEDIA_FILE_REFN> {1:M} p.54
|
||||
@@ -231,25 +248,26 @@ n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 <<SOURCE_CITATION>> {0:M} p.39
|
||||
+1 <<CHANGE_DATE>> {0:1} p.31</text>
|
||||
</note>
|
||||
<note handle="_0000001a0000001a" change="1472500307" id="N0006" type="Source text">
|
||||
<note handle="_0000001c0000001c" change="1" id="N0007" type="Source text">
|
||||
<text>who shall remain un-named</text>
|
||||
</note>
|
||||
<note handle="_0000001c0000001c" change="1472500307" id="N0007" type="GEDCOM import">
|
||||
<note handle="_0000001e0000001e" change="1" id="N0008" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M4:
|
||||
|
||||
Could not import test.jpg Line 79: 1 FILE test.jpg</text>
|
||||
Could not import test.jpg Line 88: 1 FILE test.jpg
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="163"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000001d0000001d" change="1472500307" id="N0008" type="Media Note">
|
||||
<note handle="_0000001f0000001f" change="1" id="N0009" type="Media Note">
|
||||
<text>A fine gentelman was he, upstanding in his community and a great believer in the testing of open source software.</text>
|
||||
</note>
|
||||
<note handle="_0000001e0000001e" change="1472500307" id="N0015" type="Media Note">
|
||||
<note handle="_0000002000000020" change="1" id="N0015" type="Media Note">
|
||||
<text>A note on the FTM media, to see how this integrates... The DATE line is bad; it doesnt follow Gedcom standard at all, and includes the time.
|
||||
The TEXT line comes from the FTM media description. This is the media Note.</text>
|
||||
</note>
|
||||
<note handle="_0000001f0000001f" change="1472500307" id="N0016" type="Media Note">
|
||||
<note handle="_0000002100000021" change="1" id="N0016" type="Media Note">
|
||||
<text>Multimedia link to linked form FTM style
|
||||
n @XREF:OBJE@ OBJE {1:1}
|
||||
+1 FILE <MULTIMEDIA_FILE_REFN> {1:M} p.54
|
||||
@@ -258,39 +276,42 @@ n @XREF:OBJE@ OBJE {1:1}
|
||||
+2 TEXT text string from FTM media description sometimes populated from exif comments
|
||||
+1 <<NOTE_STRUCTURE>> {0:M} p.33</text>
|
||||
</note>
|
||||
<note handle="_0000002000000020" change="1472500307" id="N0009" type="GEDCOM import">
|
||||
<note handle="_0000002200000022" change="1" id="N0017" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M5:
|
||||
|
||||
Could not import test.jpg Line 94: 1 FILE test.jpg</text>
|
||||
Could not import test.jpg Line 103: 1 FILE test.jpg
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="163"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000002100000021" change="1472500307" id="N0017" type="REFN-TYPE">
|
||||
<note handle="_0000002300000023" change="1" id="N0019" type="REFN-TYPE">
|
||||
<text>SOMETEXT</text>
|
||||
</note>
|
||||
<note handle="_0000002200000022" change="1472500307" id="N0019" type="Media Note">
|
||||
<note handle="_0000002400000024" change="1" id="N0020" type="Media Note">
|
||||
<text>Multimedia link to linked form v5.5.1 with two files</text>
|
||||
</note>
|
||||
<note handle="_0000002400000024" change="1472500307" id="N0020" type="Source text">
|
||||
<note handle="_0000002600000026" change="1" id="N0021" type="Source text">
|
||||
<text>A source who shall remain un-named</text>
|
||||
</note>
|
||||
<note handle="_0000002600000026" change="1472500307" id="N0021" type="GEDCOM import">
|
||||
<note handle="_0000002800000028" change="1" id="N0022" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M6:
|
||||
|
||||
Could not import test.jpg Line 102: 1 FILE test.jpg
|
||||
Multiple FILE in a single OBJE ignored Line 106: 1 FILE test1.jpg
|
||||
Skipped subordinate line Line 107: 2 FORM jpeg
|
||||
Skipped subordinate line Line 108: 3 TYPE photo
|
||||
Skipped subordinate line Line 109: 2 TITL Multimedia link to linked form v5.5.1 with two files(2)</text>
|
||||
Could not import test.jpg Line 111: 1 FILE test.jpg
|
||||
Multiple FILE in a single OBJE ignored Line 115: 1 FILE test1.jpg
|
||||
Skipped subordinate line Line 116: 2 FORM jpeg
|
||||
Skipped subordinate line Line 117: 3 TYPE photo
|
||||
Skipped subordinate line Line 118: 2 TITL Multimedia link to linked form v5.5.1 with two files(2)
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="588"/>
|
||||
</style>
|
||||
</note>
|
||||
<note handle="_0000002700000027" change="1472500307" id="N0022" type="GEDCOM import">
|
||||
<note handle="_0000002900000029" change="1" id="N0023" type="GEDCOM import">
|
||||
<text>Records not imported into OBJE (multi-media object) Gramps ID M8:
|
||||
|
||||
Could not import No_path_No_Title_NoForm.jpg Line 129: 1 FILE No_path_No_Title_NoForm.jpg</text>
|
||||
Could not import No_path_No_Title_NoForm.jpg Line 138: 1 FILE No_path_No_Title_NoForm.jpg
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="182"/>
|
||||
</style>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
0 HEAD
|
||||
1 SOUR FTM
|
||||
2 VERS Family Tree Maker (22.0.0.1410)
|
||||
2 NAME Family Tree Maker for Windows
|
||||
1 SOUR Tester
|
||||
2 VERS 1.0
|
||||
2 NAME The Tester
|
||||
2 CORP Ancestry.com
|
||||
3 ADDR 360 W 4800 N
|
||||
4 CONT Provo, UT 84604
|
||||
@@ -44,7 +44,7 @@
|
||||
3 FORM Street, City, County, State, Country, Zip code
|
||||
2 PHON 440-871-3400
|
||||
2 PHON 800-871-3400
|
||||
2 EMAIL thetester@gmail.com
|
||||
2 EMAIL thetester@@gmail.com
|
||||
2 FAX 440-123-4567
|
||||
2 WWW http://thetester.com
|
||||
0 @I1@ INDI
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
|
||||
<database xmlns="http://gramps-project.org/xml/1.7.1/">
|
||||
<header>
|
||||
<created date="2016-10-23" version="5.0.0-alpha1"/>
|
||||
<created date="2017-12-19" version="5.0.0-alpha3"/>
|
||||
<researcher>
|
||||
<resname>The Subm /Tester/</resname>
|
||||
<resaddr>123 Main St.</resaddr>
|
||||
@@ -109,12 +109,12 @@
|
||||
<source handle="_0000000300000003" change="1" id="S0000">
|
||||
<stitle>Import from imp_FTM_LINK.ged</stitle>
|
||||
<sauthor>The Tester</sauthor>
|
||||
<srcattribute type="Approved system identification" value="FTM"/>
|
||||
<srcattribute type="Version number of software product" value="Family Tree Maker (22.0.0.1410)"/>
|
||||
<srcattribute type="Name of software product" value="Family Tree Maker for Windows"/>
|
||||
<srcattribute type="Approved system identification" value="Tester"/>
|
||||
<srcattribute type="Version number of software product" value="1.0"/>
|
||||
<srcattribute type="Name of software product" value="The Tester"/>
|
||||
<srcattribute type="Name of source data" value="FTM Source data"/>
|
||||
<srcattribute type="Copyright of source data" value="Copyright 2999"/>
|
||||
<srcattribute type="Generated By" value="Family Tree Maker for Windows Family Tree Maker (22.0.0.1410)"/>
|
||||
<srcattribute type="Generated By" value="The Tester 1.0"/>
|
||||
<srcattribute type="Creation date of GEDCOM" value="2016-03-01"/>
|
||||
<srcattribute type="Character set and version" value="UTF-8 1.1"/>
|
||||
<srcattribute type="GEDCOM version" value="5.5"/>
|
||||
@@ -206,7 +206,8 @@
|
||||
|
||||
Only one phone number supported Line 9: 3 PHON (800) 705-7000
|
||||
Line ignored as not understood Line 15: 2 DATE 1111-01-01
|
||||
GEDCOM FORM should be in uppercase Line 26: 2 FORM Lineage-Linked</text>
|
||||
GEDCOM FORM should be in uppercase Line 26: 2 FORM Lineage-Linked
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="344"/>
|
||||
</style>
|
||||
@@ -214,7 +215,8 @@ GEDCOM FORM should be in uppercase Line 26:
|
||||
<note handle="_0000000600000006" change="1" id="N0001" type="GEDCOM import">
|
||||
<text>Records not imported into SUBM (Submitter): (@SUBM@) The Subm /Tester/:
|
||||
|
||||
Only one phone number supported Line 35: 1 PHON 800-871-3401</text>
|
||||
Only one phone number supported Line 35: 1 PHON 800-871-3401
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="173"/>
|
||||
</style>
|
||||
@@ -234,7 +236,8 @@ Only one phone number supported Line 35:
|
||||
<note handle="_0000001700000017" change="1" id="N0005" type="GEDCOM import">
|
||||
<text>Records not imported into REPO (repository) Gramps ID R0002:
|
||||
|
||||
Only one phone number supported Line 93: 1 PHON 800-765-4321</text>
|
||||
Only one phone number supported Line 93: 1 PHON 800-765-4321
|
||||
</text>
|
||||
<style name="fontface" value="Monospace">
|
||||
<range start="0" end="162"/>
|
||||
</style>
|
||||
|
||||
Vendored
+12
-12
@@ -1,18 +1,18 @@
|
||||
Gramps for Debian
|
||||
----------------------
|
||||
-----------------
|
||||
|
||||
This is the Debian package of the 4.0 series of GRAMPS.
|
||||
Version 5.0 of gramps adds the option of using a new database backend called
|
||||
DB_API, as an alternative to the default BSDDB (Berkeley).
|
||||
|
||||
It is a major update of Gramps to upgrade to GTK 3. A switch was also made to distutils from autotools.
|
||||
Two DB-API SQL engines have been developed, sqlite3 and postgresql. Compared
|
||||
to BSDDB, the alternative backends have beend designed allow some flexibility
|
||||
with respect to using the database with multiple users, or in multiple
|
||||
locations (different computers).
|
||||
|
||||
The 4.0 series of Gramps is being packaged for the experimental distribution until all dependencies are available
|
||||
and it proves stable.
|
||||
For more details, please read the Gramps wiki:
|
||||
https://gramps-project.org/wiki/index.php?title=DB-API_Database_Backend
|
||||
|
||||
Webkit - gir1.2-webkit-3.0 crashes. Gramps has been patched disable the hidden
|
||||
HTML view instead until a solution is found.
|
||||
Please note, this particular version is a pre-release version for testing.
|
||||
Please do not use it on your only copy of important genealogical data.
|
||||
|
||||
Goocanvas2 - The latest Goocanvas is not available in Debian yet. If you miss
|
||||
the Graphview plugin, you could try installing the gir1.2-goocanvas-2.0-9 which
|
||||
is available in Ubuntu.
|
||||
|
||||
-- Ross Gammon <rossgammon@mail.dk> Sat, 25 Jan 2014 18:00:00 +0100
|
||||
-- Ross Gammon <rossgammon@debian.org> Mon, 19 Feb 2018 00:04:00 +0100
|
||||
|
||||
Vendored
+157
@@ -0,0 +1,157 @@
|
||||
Run gramps -v from the commandline and check dependencies:
|
||||
- From the commandline type $ gramps -v
|
||||
- The gramps version and versions of library dependencies are output
|
||||
- Check that all dependencies have been installed, show their versions, and that there are no error messages
|
||||
- If required, install the dependencies that have not been found (typically icu, osmgpsmap & gexiv)
|
||||
- Type $ gramps -v again
|
||||
- Check that all dependencies have been installed, show their versions, and that there are no error messages
|
||||
|
||||
Open Gramps, create an empty Family Tree, and check the Gramps version, credits & license:
|
||||
- Run gramps
|
||||
- Family Trees window opens
|
||||
- Click "New" to create an empty Family Tree
|
||||
- Type a name for your family tree (e.g. Sample), and press "Enter"
|
||||
- Click "Load Family Tree"
|
||||
- Gramps displays the "Welcome to Gramps!" start screen
|
||||
- Choose Help > About from the menu
|
||||
- The "About gramps" window is displayed with Version information
|
||||
- Click on "Credits"
|
||||
- A list of Authors and Contributors to Gramps is displayed
|
||||
- Click on "License"
|
||||
- The GNU General Public License is displayed
|
||||
- Click on the "X" to close the "About gramps" window
|
||||
- Gramps closes the "About gramps" window and returns to the "Welcome to Gramps!" start screen
|
||||
|
||||
Import a GEDCOM file into Gramps
|
||||
If you do not have one to hand, the provided example can be extracted to your home directory and imported from there.
|
||||
/usr/share/doc/gramps/example/gedcom/sample.ged.gz
|
||||
- From your open and empty Family Tree, choose Family Trees > Import from the menu
|
||||
- The Gramps: Import Family Tree window opens
|
||||
- Locate your GEDCOM file, select it and click on "Import"
|
||||
- The Import Statistics window displays "Results: done"
|
||||
- Click on "Close"
|
||||
- The GEDCOM import report window displays "No errors detected"
|
||||
- CLick on "Close"
|
||||
- The Top Surnames gramplet displays the surnames of the people imported into the Tree
|
||||
|
||||
Test aspects of the People View
|
||||
- Click on the People View
|
||||
- A list of people in "Group View" mode are shown
|
||||
- Click on the arrow for a surname (e.g. Hansdotter)
|
||||
- The people with this surname are revealed
|
||||
- Select a person and click in the "Edit selcted person" icon (or just double click on the person)
|
||||
- The "Person" window opens showing the details of this person
|
||||
- Click on Cancel
|
||||
- The "Person" window closes
|
||||
- Choose the person list view (not grouped) by clicking on the "People" icon
|
||||
- The people are now listed without any grouping by surname
|
||||
- Click on the "+" icon to create a new person
|
||||
- An empty "Person" window opens
|
||||
- Enter some details about the person (e.g. given name, surname, and gender)
|
||||
- Click on the "+" button to create a new event for this person
|
||||
- The "Event Reference Editor" window opens
|
||||
- Create an event (e.g. birth) by entering a date
|
||||
- Click on the "+" button to add a new place
|
||||
- The "New Place" window opens
|
||||
- Type in some details about the place (Name, Type, Latitude & Longitude)
|
||||
- Click on OK
|
||||
- The "New Place" window closes
|
||||
- In the "Event Reference Editor" click OK
|
||||
- In the "Person" window click OK
|
||||
- The "Person" window closes and you can find the person just created in the list of people
|
||||
|
||||
Test aspects of the Relationships View
|
||||
- Click on Anna Hansdotter to select her
|
||||
- Click on the Relationships View
|
||||
- Details of Anna and her family are displayed
|
||||
- Click on one of her children, Hjalmar Smith
|
||||
- Details of Hjalmar and his family are displayed
|
||||
- Click on the "Add existing Child to family" icon just above Halmar's children
|
||||
- The "Select Child" window opens
|
||||
- Find the person you entered previously and select it
|
||||
- Click OK
|
||||
- The "Select Child" window closes and you can see the new person listed as a child in Hjalmar's family
|
||||
|
||||
Test aspects of the Charts View
|
||||
- Click on the Charts View
|
||||
- The Pedigree View is shown
|
||||
- Click somewhere in the Pedigree View and drag the chart around
|
||||
- The mouse pointer changes to a hand and the chart can be move around
|
||||
- Click on the left and right arrows (when going left you need to choose the child to move to)
|
||||
- The chart will move to reveal the next generation in the family
|
||||
- Make sure there are several families in view, then Click on the "Fan Chart" icon
|
||||
- A fan chart showing the ancesters of the main person is shown
|
||||
- Click on the Descendant Fan icon
|
||||
- A fan chart showing the descendants of the same person is shown
|
||||
|
||||
Test aspects of the Geography View
|
||||
- Click on the Geography View
|
||||
- The map may take some time to load, then a pin for the person you entered early should be shown on the map at the coordinates you entered
|
||||
- Click on the pin
|
||||
- A choice of the place, or the person will be offered
|
||||
- Hover over the place name, and choose "Edit Place"
|
||||
- The "Place Selection in a region" opens
|
||||
- Double click on the place
|
||||
- The "Place:" editor opens
|
||||
- Click on Cancel
|
||||
- Click on the pin
|
||||
- A choice of the place, or the person will be offered
|
||||
- Hover over the persons name, and choose "Edit Event"
|
||||
- The "Event:" window opens
|
||||
- Click on Cancel
|
||||
|
||||
Import a Gramps Xml file (*.gramps) into Gramps
|
||||
An existing Gramps *.gramps file with links to media will be needed for this and the next test. If you do not have one to hand, the provided example can be extracted to your home directory and imported from there.
|
||||
/usr/share/doc/gramps/example/gramps/example.gramps.gz
|
||||
- From the "Family Trees" menu, choose "Manage Family Trees"
|
||||
- The Family Trees window opens
|
||||
- Click "New" to create an empty Family Tree
|
||||
- Type a name for your family tree (e.g. Example), and press "Enter"
|
||||
- Click "Load Family Tree"
|
||||
- Gramps opens an empty database
|
||||
- From your open and empty Family Tree, choose Family Trees > Import from the menu
|
||||
- The Gramps: Import Family Tree window opens
|
||||
- Locate your *.gramps file, select it and click on "Import"
|
||||
- The import may take some minutes, then the Import Statistics window displays the number of objects imported.
|
||||
- Click on "Close"
|
||||
- The Import Statistics window closes.
|
||||
|
||||
View Media for a person, and add new media
|
||||
The media for the example file you may have used in the previous test can be found in /usr/share/doc/gramps/example/gramps/. Create a folder in your home directory to store Gramps media, and then copy the media there.
|
||||
You will also need a photo to add to Gramps. Any photo will do (e.g. *.jpg file - but you can use the ones provided with Gramps).
|
||||
You also need to set the base media patch for Gramps.
|
||||
- In the "Edit" menu, choose "Preferences".
|
||||
- The Preferences window opens on the "General" tab.
|
||||
- Click the "Folder" icon to set the "Base path for relative media paths".
|
||||
- The "Select media directory" window opens
|
||||
- Choose the directory where your media is stored and then click "Apply"
|
||||
- The "Select media directory" window closes
|
||||
- Click Close
|
||||
- The "Preferences" window closes
|
||||
- In the "People" View, find a person with media associated (e.g. Eugene Stanley Garner, Jr. in the example database) and select him/her.
|
||||
- Below the Detials tab, a thumbnail image of the person should appear (in the case of Eugene Stanley Garner, Jr. you should see him yawning). It may be necessary to restart Gramps to see the Thumbnail.
|
||||
- Double click on the person's name in the People View.
|
||||
- The "Person:" window opens, and the image is dispayed for the person in the Image square in the top left corner of the "Person:" window.
|
||||
- Double click on the image.
|
||||
- The Media Reference Editor opens showing details about the image.
|
||||
- Double click in the bottom image Preview.
|
||||
- An external viewer opens giving details of the image metadata and allowing some basic manipulation of the image.
|
||||
- Click on the "X" to close the external viewer
|
||||
- Click "Cancel" on the Media Reference Editor
|
||||
- Click "Cancel" on the "Person:" window.
|
||||
- All three windows close.
|
||||
- Click on the "Media View".
|
||||
- A list of available media is shown.
|
||||
- Click on the "+" icon.
|
||||
- The "Select a media object" window opens.
|
||||
- Move to the folder where the media is and select the new photo (if you are using the examples provided with Gramps, I can recommend choosing O3.jpg).
|
||||
- Click on "OK".
|
||||
- The "New Media" window opens.
|
||||
- Click on "OK".
|
||||
- The media is added to the list of media.
|
||||
- Select the new media.
|
||||
- A preview (thumbnail) image is shown.
|
||||
- Close Gramps by choosing "Quit" from the "Family Trees" menu.
|
||||
- Gramps closes.
|
||||
|
||||
TODO: Tagging & Filtering
|
||||
Vendored
+118
-7
@@ -1,16 +1,127 @@
|
||||
Old Changelog:
|
||||
gramps (5.0.0-1) unstable; urgency=medium
|
||||
|
||||
* New Gramps release
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Wed, 25 Jul 2018 21:19:00 +0200
|
||||
|
||||
gramps (5.0.0~rc1-1) unstable; urgency=medium
|
||||
|
||||
* First release candidate for Gramps 5.0
|
||||
* Drop patch applied upstream
|
||||
* Update copyrights
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sun, 01 Jul 2018 21:57:10 +0200
|
||||
|
||||
gramps (5.0.0~beta1-1) unstable; urgency=medium
|
||||
|
||||
* First beta release of gramps 5.0
|
||||
* Sync debian directory with Debian experimental branch on salsa
|
||||
* Point Vcs URLs at the Gramps Project on Github
|
||||
* Correct spelling in debian/rules, node > nose
|
||||
* Delete gbp.conf, not required as gbp not used to build package
|
||||
* Delete NEWS file, only really applicable in Debian
|
||||
* Fix syntax errors in d/changelog and remove trailing whitespace
|
||||
* Patch person_rules_test.py to remove hard coded build path from
|
||||
import. Fixes FTBFS due to test failure.
|
||||
* Enable extra tests that were failing for alpha3
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Mon, 19 Feb 2018 19:25:25 +0100
|
||||
|
||||
gramps (4.2.8) unstable; urgency=medium
|
||||
|
||||
* Quick bug fix release
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Sat, 10 Feb 2018 08:30:33 +0100
|
||||
|
||||
gramps (5.0.0-alpha3) experimental; urgency=medium
|
||||
|
||||
* New alpha release for Gramps 5.0.0
|
||||
|
||||
-- Ross Gammon <rossgammon@debian.org> Mon, 04 Sep 2017 16:55:41 +0200
|
||||
|
||||
gramps (4.2.6) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.6
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Tue, 01 Aug 2017 14:10:19 +0200
|
||||
|
||||
gramps (5.0.0-alpha2) experimental; urgency=medium
|
||||
|
||||
* 2nd Alpha release for testing
|
||||
|
||||
-- Ross Gammon <rosco2@ubuntu.com> Mon, 12 Jun 2017 19:42:39 +0200
|
||||
|
||||
gramps (4.2.5) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.5
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Thu, 15 Dec 2016 18:52:08 +0100
|
||||
|
||||
gramps (4.2.4) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.4
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Sun, 04 Sep 2016 18:34:49 +0200
|
||||
|
||||
gramps (5.0.0-alpha1) UNRELEASED; urgency=medium
|
||||
|
||||
* Alpha stream for Gramps 5.0.0
|
||||
|
||||
-- système <romjerome@yahoo.fr> Sat, 04 Jun 2016 20:07:14 +0200
|
||||
|
||||
gramps (4.2.3) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.3
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Sun, 10 Apr 2016 21:09:19 +0200
|
||||
|
||||
gramps (4.2.2) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.2
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Wed, 06 Jan 2016 19:38:25 +0100
|
||||
|
||||
gramps (4.2.1) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.1
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Tue, 13 Oct 2015 05:08:30 +0200
|
||||
|
||||
gramps (4.2.0) UNRELEASED; urgency=medium
|
||||
|
||||
* New upstream for Gramps 4.2.0
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Sun, 02 Aug 2015 17:03:37 +0200
|
||||
|
||||
gramps (4.1.3) precise; urgency=low
|
||||
|
||||
* New upstream for Gramps 4.1 branch (4.1.3)
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Thu, 30 Apr 2015 18:42:34 +0200
|
||||
|
||||
gramps (3.4.9-1) precise; urgency=low
|
||||
|
||||
* New upstream release for 3.4.x branch
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Thu, 30 Apr 2015 16:02:44 +0200
|
||||
|
||||
gramps (4.0.4) precise; urgency=low
|
||||
|
||||
* New upsteam for Gramps 4.0.4
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Fri, 23 May 2014 17:07:41 +0200
|
||||
|
||||
gramps (4.0.3) precise; urgency=low
|
||||
|
||||
* - 4.0.4-git.f08e40 Experimental stream gramps.git
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Tue, 04 Feb 2014 19:49:32 +0100
|
||||
|
||||
|
||||
gramps (4.0.2) precise; urgency=low
|
||||
|
||||
* experimental .deb for gramps 4.0.2
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Wed, 04 Dec 2013 10:23:36 +0100
|
||||
|
||||
-- Jérôme Rapinat <romjerome@yahoo.fr> Wed, 04 Dec 2013 10:23:36 +0100
|
||||
|
||||
gramps (4.0.1-2) precise; urgency=low
|
||||
|
||||
@@ -705,7 +816,7 @@ gramps (0.7.3-1) unstable; urgency=low
|
||||
* Added new entry to the upstream NEWS file - it was missing.
|
||||
* Added '#! usr/bin/python -O' line to src/AddMedia.py to make lintian happy.
|
||||
Also removed this line from src/DbPrompter.py for the same reason.
|
||||
* Edited debian/rules to call '$(MAKE) clean' instead of
|
||||
* Edited debian/rules to call '$(MAKE) clean' instead of
|
||||
'$(MAKE) distclean' which did not exist.
|
||||
* Edited src/Makefile.in - 'clean' target should also remove *.so files.
|
||||
* Pre-built static HTMLs since the on-the-fly generation from SGML is buggy.
|
||||
@@ -840,7 +951,7 @@ gramps (0.3.1-2) unstable; urgency=low
|
||||
* The author has finally addressed the issue of a missing help file. Though
|
||||
as of now none have been created the error produced before is gone and the
|
||||
author is working on better documentation.
|
||||
Closes: #99617
|
||||
Closes: #99617
|
||||
|
||||
-- Brandon L. Griffith <brandon@debian.org> Thu, 28 Jun 2001 20:27:30 -0500
|
||||
|
||||
@@ -917,7 +1028,7 @@ gramps (0.1.4-3) unstable; urgency=low
|
||||
This should take care of the startup problem some people have had.
|
||||
Bug Fixed. Closes: #98646
|
||||
|
||||
* Silly me named the menu file wrong so it never got included into the
|
||||
* Silly me named the menu file wrong so it never got included into the
|
||||
Debian Menu system. Gramps should now show up under Apps->Tools. Have
|
||||
no idea how I overlooked this.
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
9
|
||||
11
|
||||
|
||||
Vendored
+33
-18
@@ -1,29 +1,38 @@
|
||||
Source: gramps
|
||||
Section: python
|
||||
Section: gnome
|
||||
Priority: optional
|
||||
Maintainer: Ross Gammon <rossgammon@mail.dk>
|
||||
Maintainer: Ross Gammon <rossgammon@debian.org>
|
||||
Build-Depends-Indep:
|
||||
dh-linktree,
|
||||
dh-python,
|
||||
gettext,
|
||||
intltool,
|
||||
libxml-parser-perl,
|
||||
python3-all,
|
||||
python3-setuptools
|
||||
python3-setuptools,
|
||||
python3-nose,
|
||||
gir1.2-gtk-3.0 (>= 3.10.0),
|
||||
python3-gi (>= 3.12.0),
|
||||
python3-gi-cairo,
|
||||
python3-bsddb3,
|
||||
python3-lxml,
|
||||
python3-jsonschema,
|
||||
python3-mock,
|
||||
python3-icu,
|
||||
python3-nose-exclude
|
||||
Build-Depends:
|
||||
dh-python,
|
||||
debhelper (>= 9.0.0)
|
||||
Standards-Version: 3.9.5
|
||||
Vcs-Git: git://anonscm.debian.org/collab-maint/gramps.git
|
||||
Vcs-browser: http://anonscm.debian.org/gitweb/?p=collab-maint/gramps.git
|
||||
Homepage: http://www.gramps-project.org/
|
||||
X-Python-Version: >= 3.2
|
||||
debhelper (>= 11)
|
||||
Standards-Version: 4.1.3
|
||||
Vcs-Git: https://github.com/gramps-project/gramps.git
|
||||
Vcs-browser: https://github.com/gramps-project/gramps/tree/maintenance/gramps50
|
||||
Homepage: https://www.gramps-project.org/
|
||||
X-Python3-Version: >= 3.2
|
||||
|
||||
Package: python3-gramps
|
||||
Package: gramps
|
||||
Architecture: all
|
||||
Depends:
|
||||
gir1.2-gtk-3.0 (>= 3.10.0),
|
||||
librsvg2-2,
|
||||
python3-gi,
|
||||
python3-gi (>= 3.12.0),
|
||||
python3-gi-cairo,
|
||||
python3-bsddb3,
|
||||
xdg-utils,
|
||||
@@ -31,16 +40,22 @@ Depends:
|
||||
${python3:Depends}
|
||||
Recommends:
|
||||
graphviz,
|
||||
gir1.2-goocanvas-2.0,
|
||||
libosmgpsmap-1.0-0,
|
||||
gir1.2-gexiv2-0.10,
|
||||
gir1.2-osmgpsmap-1.0,
|
||||
python3-pyicu
|
||||
python3-icu
|
||||
Suggests:
|
||||
fonts-freefont-ttf,
|
||||
gir1.2-gexiv2-0.10,
|
||||
gir1.2-goocanvas-2.0,
|
||||
gir1.2-gtkspell3-3.0,
|
||||
python3-pil,
|
||||
rcs
|
||||
rcs,
|
||||
python3-numpy
|
||||
Conflicts:
|
||||
python-gramps,
|
||||
python3-gramps
|
||||
Replaces:
|
||||
python-gramps,
|
||||
python3-gramps
|
||||
Description: Genealogical research program
|
||||
Gramps is an Open Source genealogy program written in Python, using
|
||||
the GTK/GNOME interface. It is an extremely flexible program fitting
|
||||
|
||||
Vendored
+38
-238
@@ -1,37 +1,37 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: Gramps
|
||||
Source: http://gramps-project.org
|
||||
Source: https://gramps-project.org
|
||||
|
||||
Files: *
|
||||
Copyright: 2000-2007, Alex Roitman
|
||||
2000-2002, Bruce J. DeGrasse
|
||||
2000-2008, Donald N. Allingham
|
||||
2000-2007, Martin Hawlisch
|
||||
2001, Andrés Sepúlveda
|
||||
2001, Andrés Sepúlveda
|
||||
2001, David R. Hampton
|
||||
2001-2013, Free Software Foundation, Inc.
|
||||
2001-2017, Free Software Foundation, Inc.
|
||||
2001, Graham J. Williams
|
||||
2001, Jesper Zedlitz
|
||||
2001-2013, The Gramps Project
|
||||
2001-2018, The Gramps Project
|
||||
2002, Gary Shao
|
||||
2003-2006, Josiah Carlson
|
||||
2004-2006, Eero Tamminen
|
||||
2004-2013, Julio Sánchez
|
||||
2004, Toshio Kuratomi
|
||||
2005-2011, Serge Noiraud
|
||||
2006-2011, Brian G. Matherly
|
||||
2004-2013, Julio Sánchez
|
||||
2005-2017, Serge Noiraud
|
||||
2006-2012, Brian G. Matherly
|
||||
2006, 2008-2011, Kees Bakker
|
||||
2006-2008, Steve Hall
|
||||
2007-2012, Benny Malengier
|
||||
2007-2012, Douglas S. Blank
|
||||
2007-2013, Benny Malengier
|
||||
2007-2013, 2015-2016, Douglas S. Blank
|
||||
2007-2012, Gary Burton
|
||||
2007-2011, Jerome Rapinat
|
||||
2007, Johan Gronqvist
|
||||
2007, Robert Cawley
|
||||
2007-2009, Stephane Charette
|
||||
2007-2016, The Gramps Developers
|
||||
2007, Thom Sturgill
|
||||
2007-2008, Zsolt Foldvari
|
||||
2008-2010, 2012, Craig J. Anderson
|
||||
2008-2010, 2012-2015, Craig J. Anderson
|
||||
2008-2009, James Friedmann
|
||||
2008-2009, Jason Simanek
|
||||
2008, Lukasz Rymarczyk
|
||||
@@ -43,133 +43,58 @@ Copyright: 2000-2007, Alex Roitman
|
||||
2008, Stefan Siegel
|
||||
2008-2010, Stephen George
|
||||
2009-2010, Andrew I Baznikin
|
||||
2009, 2011, The Dojo Foundation
|
||||
2009, Florian Heinle
|
||||
2009, Gerald W. Britton
|
||||
2009, Igal Shapira
|
||||
2009, 2011, John Resig
|
||||
2009-2013, Nick Hall
|
||||
2009-2018, Nick Hall
|
||||
2009, Pander Musubi
|
||||
2009, Robert Ham
|
||||
2009, Swoon on bug tracker
|
||||
2009, Yevgeny Zegzda
|
||||
2010, Gramps
|
||||
2010, 2015 Gramps
|
||||
2010, Jakim Friant
|
||||
2010, Josip
|
||||
2010, lcc & Robert Jerome
|
||||
2010-2012, Michiel D. Nauta
|
||||
2010-2013, Tim G L Lyons
|
||||
2010-2011, Vlada Perić
|
||||
2010-2016, Tim G L Lyons
|
||||
2010-2011, 2014, Vlada Perić
|
||||
2011, Adam Stein
|
||||
2011-2012, Harald Rosemann
|
||||
2011, 2013, Heinz Brinker
|
||||
2011, Helge Herz
|
||||
2011, 2013 John Ralls
|
||||
2011, Matt Keenan
|
||||
2011-2013, Paul Franklin
|
||||
2012, Mathieu MD
|
||||
2011, 2016 Matt Keenan
|
||||
2011-2017, Paul Franklin
|
||||
2012, lcc
|
||||
2012, 2014, Mathieu MD
|
||||
2012, Nicolas Adenis-Lamarre
|
||||
2013, Fedir Zinchuk
|
||||
2013, Oleh Petrivk
|
||||
2013, Vassilii Khachaturov
|
||||
2013, Artem Glebov
|
||||
2011-2016, Fedir Zinchuk
|
||||
2013-2017, Alois Poettker
|
||||
2013-2014, Vassilii Khachaturov
|
||||
2013, Zissis Papadopoulos
|
||||
2015, Icelandic translators of Gramps
|
||||
2014, Bastien Jacquet
|
||||
2014, Gerald Kunzmann
|
||||
2015, Fabrice
|
||||
2015, Lajos Nemeséri
|
||||
2015, Detlef Wolz
|
||||
2016, Allen Crider
|
||||
2016, DaAwesomeP
|
||||
2016-2017, Paul Culley
|
||||
2016, QuLogic
|
||||
2016, Tom Samstag
|
||||
2017, Mindaugas Baranauskas
|
||||
2017, Robert Carnell
|
||||
License: GPL-2+
|
||||
|
||||
Files: data/javascript/jquery-1.3.2.min.js
|
||||
Copyright: 2009, John Resig
|
||||
License: MIT and GPL
|
||||
|
||||
Files: data/javascript/jquery-1.7.1.js
|
||||
Copyright: 2011, John Resig
|
||||
2011, The Dojo Foundation
|
||||
License: BSD and MIT and GPL-2
|
||||
|
||||
Files: data/javascript/jquery-ui-1.7.2.custom.min.js
|
||||
Copyright: 2009, jQuery UI Team (http://jqueryui.com/about/)
|
||||
License: MIT and GPL-2
|
||||
|
||||
Files: data/javascript/jquery.flexbox*
|
||||
Copyright: 2008-2010, Noah Heldman and Fairway Technologies
|
||||
License: Ms-PL
|
||||
|
||||
Files: data/jhtmlarea/Readme.txt
|
||||
Copyright: 2009, Chris Pietschmann
|
||||
License: Ms-RL
|
||||
|
||||
Files: data/jhtmlarea/scripts/jHtmlArea*
|
||||
Copyright: 2009, Chris Pietschmann
|
||||
License: Ms-RL
|
||||
|
||||
Files: data/jhtmlarea/scripts/jquery-1.3.2*
|
||||
Copyright: 2009, John Resig
|
||||
2009, The Dojo Foundation
|
||||
License: MIT
|
||||
|
||||
Files: data/jhtmlarea/scripts/jquery-ui-*
|
||||
Copyright: 2009, jQuery UI Team (http://jqueryui.com/about)
|
||||
License: MIT and GPL
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2001-2002, Brandon L. Griffith
|
||||
2002, Alex Roitman
|
||||
2002-2012, James A. Treacy
|
||||
2013, Ross Gammon
|
||||
2013-2018, Ross Gammon
|
||||
License: GPL-2+
|
||||
|
||||
Files: gramps/webapp/grampsdb/view/png.py
|
||||
Copyright: 2006, Johann C. Rocholl
|
||||
2009, David Jones
|
||||
2006, Nicko van Someren
|
||||
License: MIT
|
||||
|
||||
License: BSD
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the <organization> nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY John Resig ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
License: GPL
|
||||
This package is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 1 only of the License.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License can be found in `/usr/share/common-licenses/GPL'.
|
||||
|
||||
License: GPL-2
|
||||
This package is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 only of the License.
|
||||
.
|
||||
This package is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this package; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License can be found in `/usr/share/common-licenses/GPL-2'.
|
||||
|
||||
License: GPL-2+
|
||||
This package is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -187,128 +112,3 @@ License: GPL-2+
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License can be found in `/usr/share/common-licenses/GPL-2'.
|
||||
|
||||
License: MIT
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
.
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
License: Ms-PL
|
||||
This license governs use of the accompanying software. If you use the
|
||||
software, you accept this license. If you do not accept the license, do not
|
||||
use the software.
|
||||
.
|
||||
1. Definitions
|
||||
.
|
||||
The terms "reproduce," "reproduction," "derivative works," and "distribution"
|
||||
have the same meaning here as under U.S. copyright law.
|
||||
.
|
||||
A "contribution" is the original software, or any additions or changes to the
|
||||
software.
|
||||
.
|
||||
A "contributor" is any person that distributes its contribution under this
|
||||
license.
|
||||
.
|
||||
"Licensed patents" are a contributor's patent claims that read directly on its
|
||||
contribution.
|
||||
.
|
||||
2. Grant of Rights
|
||||
.
|
||||
(A) Copyright Grant- Subject to the terms of this license, including the
|
||||
license conditions and limitations in section 3, each contributor grants you a
|
||||
non-exclusive, worldwide, royalty-free copyright license to reproduce its
|
||||
contribution, prepare derivative works of its contribution, and distribute its
|
||||
contribution or any derivative works that you create.
|
||||
.
|
||||
(B) Patent Grant- Subject to the terms of this license, including the license
|
||||
conditions and limitations in section 3, each contributor grants you a
|
||||
non-exclusive, worldwide, royalty-free license under its licensed patents to
|
||||
make, have made, use, sell, offer for sale, import, and/or otherwise dispose of
|
||||
its contribution in the software or derivative works of the contribution in the
|
||||
software.
|
||||
.
|
||||
3. Conditions and Limitations
|
||||
.
|
||||
(A) No Trademark License- This license does not grant you rights to use any
|
||||
contributors' name, logo, or trademarks.
|
||||
.
|
||||
(B) If you bring a patent claim against any contributor over patents that you
|
||||
claim are infringed by the software, your patent license from such contributor
|
||||
to the software ends automatically.
|
||||
.
|
||||
(C) If you distribute any portion of the software, you must retain all copyright,
|
||||
patent, trademark, and attribution notices that are present in the software.
|
||||
.
|
||||
(D) If you distribute any portion of the software in source code form, you may do
|
||||
so only under this license by including a complete copy of this license with your
|
||||
distribution. If you distribute any portion of the software in compiled or object
|
||||
code form, you may only do so under a license that complies with this license.
|
||||
.
|
||||
(E) The software is licensed "as-is." You bear the risk of using it. The
|
||||
contributors give no express warranties, guarantees or conditions. You may have
|
||||
additional consumer rights under your local laws which this license cannot change.
|
||||
To the extent permitted under your local laws, the contributors exclude the
|
||||
implied warranties of merchantability, fitness for a particular purpose and
|
||||
non-infringement.
|
||||
|
||||
License: Ms-RL
|
||||
This license governs use of the accompanying software. If you use the software,
|
||||
you accept this license. If you do not accept the license, do not use the software.
|
||||
.
|
||||
1. Definitions
|
||||
The terms "reproduce," "reproduction," "derivative works," and "distribution" have
|
||||
the same meaning here as under U.S. copyright law.
|
||||
A "contribution" is the original software, or any additions or changes to the
|
||||
software.
|
||||
A "contributor" is any person that distributes its contribution under this license.
|
||||
"Licensed patents" are a contributor's patent claims that read directly on its
|
||||
contribution.
|
||||
.
|
||||
2. Grant of Rights
|
||||
(A) Copyright Grant- Subject to the terms of this license, including the license
|
||||
conditions and limitations in section 3, each contributor grants you a
|
||||
non-exclusive, worldwide, royalty-free copyright license to reproduce its
|
||||
contribution, prepare derivative works of its contribution, and distribute its
|
||||
contribution or any derivative works that you create.
|
||||
(B) Patent Grant- Subject to the terms of this license, including the license
|
||||
conditions and limitations in section 3, each contributor grants you a
|
||||
non-exclusive, worldwide, royalty-free license under its licensed patents to make,
|
||||
have made, use, sell, offer for sale, import, and/or otherwise dispose of its
|
||||
contribution in the software or derivative works of the contribution in the software.
|
||||
.
|
||||
3. Conditions and Limitations
|
||||
(A) Reciprocal Grants- For any file you distribute that contains code from the
|
||||
software (in source code or binary format), you must provide recipients the source
|
||||
code to that file along with a copy of this license, which license will govern that
|
||||
file. You may license other files that are entirely your own work and do not contain
|
||||
code from the software under any terms you choose.
|
||||
(B) No Trademark License- This license does not grant you rights to use any
|
||||
contributors' name, logo, or trademarks.
|
||||
(C) If you bring a patent claim against any contributor over patents that you claim
|
||||
are infringed by the software, your patent license from such contributor to the
|
||||
software ends automatically.
|
||||
(D) If you distribute any portion of the software, you must retain all copyright,
|
||||
patent, trademark, and attribution notices that are present in the software.
|
||||
(E) If you distribute any portion of the software in source code form, you may do so
|
||||
only under this license by including a complete copy of this license with your
|
||||
distribution. If you distribute any portion of the software in compiled or object code
|
||||
form, you may only do so under a license that complies with this license.
|
||||
(F) The software is licensed "as-is." You bear the risk of using it. The contributors
|
||||
give no express warranties, guarantees or conditions. You may have additional consumer
|
||||
rights under your local laws which this license cannot change. To the extent permitted
|
||||
under your local laws, the contributors exclude the implied warranties of
|
||||
merchantability, fitness for a particular purpose and non-infringement.
|
||||
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
RELEASE_NOTES
|
||||
Vendored
+25
-22
@@ -1,35 +1,38 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
export DH_VERBOSE=1
|
||||
export DH_OPTIONS=-v
|
||||
#export DH_VERBOSE=1
|
||||
#export DH_OPTIONS=-v
|
||||
export PYBUILD_NAME=gramps
|
||||
export PYBUILD_INSTALL_ARGS_python3=--resourcepath=/usr/share --force
|
||||
|
||||
%:
|
||||
dh $@ --with python3 --buildsystem=pybuild
|
||||
|
||||
# Override auto test because upstream do not use the standard unittest discover
|
||||
# Override auto test to enable nose tests
|
||||
override_dh_auto_test:
|
||||
|
||||
# Override of auto_build
|
||||
override_dh_auto_build:
|
||||
python3 setup.py build
|
||||
HOME=$(CURDIR)/build \
|
||||
nosetests3 -vv \
|
||||
--exclude=TestcaseGenerator \
|
||||
--exclude=test4_arbitrary_uncode_path \
|
||||
--exclude-dir=gramps/plugins/test/ \
|
||||
gramps
|
||||
|
||||
# Override of auto_install to remove information from package
|
||||
override_dh_auto_install:
|
||||
#dh_auto_install
|
||||
python3 setup.py install --resourcepath=/usr/share --root=debian/python3-gramps --install-layout=deb
|
||||
# Remove duplicate license/copyright information
|
||||
rm $(CURDIR)/debian/python3-gramps/usr/share/doc/gramps/COPYING
|
||||
dh_installchangelogs NEWS
|
||||
dh_auto_install
|
||||
# Remove install file as it is not needed by package users
|
||||
rm $(CURDIR)/debian/python3-gramps/usr/share/doc/gramps/INSTALL
|
||||
# Link license/copyright information to debians
|
||||
ln -s /usr/share/common-licenses/GPL-2 $(CURDIR)/debian/python3-gramps/usr/share/doc/gramps/COPYING
|
||||
rm $(CURDIR)/debian/gramps/usr/share/doc/gramps/INSTALL
|
||||
# Remove NEWS file as it is now installed as the changelog
|
||||
rm $(CURDIR)/debian/gramps/usr/share/doc/gramps/NEWS
|
||||
#Remove license information in COPYING file & link to system license
|
||||
rm $(CURDIR)/debian/gramps/usr/share/doc/gramps/COPYING
|
||||
ln -s /usr/share/common-licenses/GPL-2 $(CURDIR)/debian/gramps/usr/share/doc/gramps/COPYING
|
||||
|
||||
# Make css style sheets and png icons non-executable
|
||||
override_dh_fixperms:
|
||||
dh_fixperms
|
||||
chmod a-x $(CURDIR)/debian/python3-gramps/usr/share/gramps/css/Web_*.css
|
||||
|
||||
# Avoid compressing COPYING file so that it can appear in the "About" dialog
|
||||
override_dh_compress:
|
||||
dh_compress -X COPYING
|
||||
# Fix clean target
|
||||
override_dh_clean:
|
||||
rm -rf data/tips.xml
|
||||
rm -rf gramps/plugins/lib/holidays.xml
|
||||
rm -rf po/.intltool-merge-cache
|
||||
dh_clean
|
||||
|
||||
Vendored
+1
-1
@@ -1 +1 @@
|
||||
1.8
|
||||
3.0 (quilt)
|
||||
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
unapply-patches
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
Tests: gramps-import-export
|
||||
Depends: gramps, gzip
|
||||
Restrictions: allow-stderr
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Author: Ross Gammon <rossgammon@mail.dk>
|
||||
#
|
||||
# autopkgtest check: Tests that gramps can import the sample gedcom file and
|
||||
# export it in the .gpkg format, and then import the example gramps database
|
||||
# and export it in gedcom format.
|
||||
|
||||
set -e
|
||||
|
||||
echo "--------------------------------"
|
||||
echo "GEDCOM to Gramps conversion test"
|
||||
echo "--------------------------------"
|
||||
echo "Retrieving sample gedcom"
|
||||
cp /usr/share/doc/gramps/example/gedcom/sample.ged.gz .
|
||||
echo "Unzipping sample gedcom"
|
||||
gunzip sample.ged.gz
|
||||
echo "Importing gedcom into gramps and exporting a gramps .gpkg file"
|
||||
gramps -i sample.ged -e sample.gpkg
|
||||
echo "-----------------------------------"
|
||||
echo "GEDCOM to Gramps conversion SUCCESS"
|
||||
echo "-----------------------------------"
|
||||
echo
|
||||
|
||||
echo "--------------------------------"
|
||||
echo "Gramps to GEDCOM conversion test"
|
||||
echo "--------------------------------"
|
||||
echo "Retrieving example gramps file"
|
||||
cp /usr/share/doc/gramps/example/gramps/example.gramps.gz .
|
||||
echo "Unzipping example gramps file"
|
||||
gunzip example.gramps.gz
|
||||
echo "Importing gramps file into gramps and exporting a gedcom"
|
||||
gramps -i example.gramps -e example.ged
|
||||
echo "-----------------------------------"
|
||||
echo "Gramps to GEDCOM conversion SUCCESS"
|
||||
echo "-----------------------------------"
|
||||
echo
|
||||
echo "gramps-import-export: TEST PASSED"
|
||||
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
Bug-Database: https://gramps-project.org/bugs/my_view_page.php
|
||||
Contact: https://lists.sourceforge.net/lists/listinfo/gramps-users
|
||||
Donation: https://sourceforge.net/project/project_donations.php?group_id=25770
|
||||
Name: Gramps
|
||||
Homepage: https://gramps-project.org/
|
||||
Repository: https://github.com/gramps-project/gramps.git
|
||||
Repository-Browse: https://github.com/gramps-project/gramps
|
||||
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
version=3
|
||||
|
||||
opts=\
|
||||
dversionmangle=s/(\~|\+)(debian|dfsg|ds|deb)(\.\d+)?$//,\
|
||||
filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/$1\.tar\.gz/,\
|
||||
repacksuffix=~dfsg \
|
||||
https://github.com/gramps-project/gramps/tags \
|
||||
.*/archive/v?([\d\.]+).tar.gz
|
||||
+1
-1
@@ -57,7 +57,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = 'Gramps'
|
||||
copyright = '2017, The Gramps Project'
|
||||
copyright = '2001-2018, The Gramps Project'
|
||||
author = 'Donald N. Allingham'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ Generic
|
||||
|
||||
DummyDb
|
||||
====================================
|
||||
.. automodule:: gramps.plugins.db.dummydb
|
||||
.. automodule:: gramps.gen.db.dummydb
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"http://gramps-project.org/xml/1.7.1/grampsxml.dtd">
|
||||
<database xmlns="http://gramps-project.org/xml/1.7.1/">
|
||||
<header>
|
||||
<created date="2016-08-31" version="5.0.0"/>
|
||||
<created date="2017-08-08" version="5.1.0"/>
|
||||
<researcher>
|
||||
<resname>Alex Roitman,,,</resname>
|
||||
</researcher>
|
||||
@@ -951,7 +951,7 @@
|
||||
<place hlink="_L3WJQCD3US67V2CNZT"/>
|
||||
<description>Birth of Garner, Anderson</description>
|
||||
</event>
|
||||
<event handle="_a5af0eb7dfb557da07e" change="1284030599" id="E0179">
|
||||
<event handle="_a5af0eb7dfb557da07e" change="1502187535" id="E0179">
|
||||
<type>Death</type>
|
||||
<dateval val="1887-04-07"/>
|
||||
<place hlink="_AKFKQC2N4SM243HCTN"/>
|
||||
@@ -6262,7 +6262,7 @@
|
||||
<dateval val="1842-06-28"/>
|
||||
<description>Death of Moreno, Joseph McDowell</description>
|
||||
</event>
|
||||
<event handle="_a5af0ec45b25c630e03" change="1284030608" id="E1179">
|
||||
<event handle="_a5af0ec45b25c630e03" change="1502187451" id="E1179">
|
||||
<type>Birth</type>
|
||||
<dateval val="1911-07-12"/>
|
||||
<description>Birth of Thornton, James Arthur</description>
|
||||
@@ -13946,10 +13946,10 @@
|
||||
<place hlink="_VDCKQCZX3MEHKVDR8S"/>
|
||||
<description>Death of Schultz, Rev.Isaac</description>
|
||||
</event>
|
||||
<event handle="_a5af0ed3f64432fb742" change="1284030595" id="E2618">
|
||||
<event handle="_a5af0ed3f64432fb742" change="1520536150" id="E2618">
|
||||
<type>Burial</type>
|
||||
<dateval val="1818" type="about"/>
|
||||
<place hlink="_4ECKQCWCLO5YIHXEXZ"/>
|
||||
<place hlink="_c965872633b600e8b5ca4d5e6db"/>
|
||||
<description>Burial of Schultz, Rev.Isaac</description>
|
||||
</event>
|
||||
<event handle="_a5af0ed3f9b07f938fb" change="1284030602" id="E2619">
|
||||
@@ -15003,7 +15003,7 @@
|
||||
<type>Marriage</type>
|
||||
<description>Marriage of Johnson, Henry and Sparks, Catherine</description>
|
||||
</event>
|
||||
<event handle="_a5af0ed5df832ee65c1" change="1328026859" id="E2815">
|
||||
<event handle="_a5af0ed5df832ee65c1" change="1502187371" id="E2815">
|
||||
<type>Marriage</type>
|
||||
<dateval val="1875-04-01"/>
|
||||
<place hlink="_RF5KQCNJRQY8OGTX2H"/>
|
||||
@@ -18649,7 +18649,7 @@
|
||||
<parentin hlink="_F4CKQCJZ24JRE9Z889"/>
|
||||
<citationref hlink="_c140d2472c91aad494f"/>
|
||||
</person>
|
||||
<person handle="_14LKQCYZJEAXTS3XX" change="1185438865" id="I1376">
|
||||
<person handle="_14LKQCYZJEAXTS3XX" change="1502187492" id="I1376">
|
||||
<gender>F</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Elizabeth</first>
|
||||
@@ -18657,6 +18657,7 @@
|
||||
</name>
|
||||
<eventref hlink="_a5af0ebb003796f79a0" role="Primary"/>
|
||||
<eventref hlink="_a5af0ebb0143dab99ff" role="Primary"/>
|
||||
<eventref hlink="_a5af0eb7dfb557da07e" role="Witness"/>
|
||||
<childof hlink="_5IUJQCRJY47YQ8PU7N"/>
|
||||
<parentin hlink="_I4LKQCOAGPFH4R90A7"/>
|
||||
<citationref hlink="_c140d24731407d57b3c"/>
|
||||
@@ -19904,7 +19905,7 @@
|
||||
<childof hlink="_IO5KQC6H0Q6Y517LR9"/>
|
||||
<citationref hlink="_c140d24a1fd2319b703"/>
|
||||
</person>
|
||||
<person handle="_35WJQC1B7T7NPV8OLV" change="1284030051" id="I0106">
|
||||
<person handle="_35WJQC1B7T7NPV8OLV" change="1502187260" id="I0106">
|
||||
<gender>M</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Robert W.</first>
|
||||
@@ -19913,6 +19914,11 @@
|
||||
<eventref hlink="_a5af0eb74ac73f86aa7" role="Primary"/>
|
||||
<eventref hlink="_a5af0eb74ba358391ae" role="Primary"/>
|
||||
<eventref hlink="_a5af0eb74c852f7c633" role="Primary"/>
|
||||
<eventref hlink="_a5af0ed5df832ee65c1" role="Witness">
|
||||
<attribute type="Age" value="23">
|
||||
<citationref hlink="_c140dafeb317af2fd79"/>
|
||||
</attribute>
|
||||
</eventref>
|
||||
<childof hlink="_X3WJQCSF48F6809142"/>
|
||||
<parentin hlink="_8OUJQCUVZ0XML7BQLF"/>
|
||||
<citationref hlink="_c140d24a27e19bb381a"/>
|
||||
@@ -21991,13 +21997,14 @@
|
||||
<childof hlink="_GCDKQCHI74ZPMI5GDJ"/>
|
||||
<citationref hlink="_c140d24f3f8704aa41b"/>
|
||||
</person>
|
||||
<person handle="_6G0KQC2UXYC66XDDC2" change="1185438865" id="I0363">
|
||||
<person handle="_6G0KQC2UXYC66XDDC2" change="1502187537" id="I0363">
|
||||
<gender>F</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Miranda Keziah</first>
|
||||
<surname>Farmer</surname>
|
||||
</name>
|
||||
<eventref hlink="_a5af0ec7a76244d962d" role="Primary"/>
|
||||
<eventref hlink="_a5af0eb7dfb557da07e" role="Witness"/>
|
||||
<childof hlink="_8NVJQCGMJTCL7E6ZDV"/>
|
||||
<citationref hlink="_c140d24f439709d3118"/>
|
||||
</person>
|
||||
@@ -22989,7 +22996,7 @@
|
||||
<parentin hlink="_FBVJQCFBI50TW78O49"/>
|
||||
<citationref hlink="_c140d2522702664ec52"/>
|
||||
</person>
|
||||
<person handle="_8CLKQCT97PJOGREJ7W" change="1185438865" id="I1387">
|
||||
<person handle="_8CLKQCT97PJOGREJ7W" change="1502187387" id="I1387">
|
||||
<gender>M</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Robert</first>
|
||||
@@ -22997,6 +23004,11 @@
|
||||
</name>
|
||||
<eventref hlink="_a5af0ebb3737a6ad088" role="Primary"/>
|
||||
<eventref hlink="_a5af0ebb39b441e9607" role="Primary"/>
|
||||
<eventref hlink="_a5af0ed5df832ee65c1" role="Clergy">
|
||||
<attribute type="Age" value="23">
|
||||
<citationref hlink="_c140dafeb317af2fd79"/>
|
||||
</attribute>
|
||||
</eventref>
|
||||
<childof hlink="_5IUJQCRJY47YQ8PU7N"/>
|
||||
<parentin hlink="_H6LKQCWVIFNRNGHFVH"/>
|
||||
<citationref hlink="_c140d2522d804491375"/>
|
||||
@@ -23803,7 +23815,7 @@
|
||||
<childof hlink="_5DBKQCVAB0XMBEW8R9"/>
|
||||
<citationref hlink="_c140d25425874b0b827"/>
|
||||
</person>
|
||||
<person handle="_9HUJQC6ONNW8SMSKGQ" change="1185438865" id="I0038">
|
||||
<person handle="_9HUJQC6ONNW8SMSKGQ" change="1502187526" id="I0038">
|
||||
<gender>M</gender>
|
||||
<name type="Birth Name">
|
||||
<first>David</first>
|
||||
@@ -23812,6 +23824,7 @@
|
||||
<eventref hlink="_a5af0ec7eb514c52fbf" role="Primary"/>
|
||||
<eventref hlink="_a5af0ec7ec844213b55" role="Primary"/>
|
||||
<eventref hlink="_a5af0ec7ed61c743fc8" role="Primary"/>
|
||||
<eventref hlink="_a5af0eb7dfb557da07e" role="Informant"/>
|
||||
<childof hlink="_5IUJQCRJY47YQ8PU7N"/>
|
||||
<parentin hlink="_3HUJQCK4DH582YUTZG"/>
|
||||
<citationref hlink="_c140d2542c764516f13"/>
|
||||
@@ -24506,7 +24519,7 @@
|
||||
<parentin hlink="_8NVJQCGMJTCL7E6ZDV"/>
|
||||
<citationref hlink="_c140d2560004fad8df6"/>
|
||||
</person>
|
||||
<person handle="_ANLKQCQSQNE5LDZMRC" change="1185438865" id="I1402">
|
||||
<person handle="_ANLKQCQSQNE5LDZMRC" change="1502187434" id="I1402">
|
||||
<gender>F</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Margaret Jane "Maggie"</first>
|
||||
@@ -24514,6 +24527,7 @@
|
||||
</name>
|
||||
<eventref hlink="_a5af0ebb7d47a006ee2" role="Primary"/>
|
||||
<eventref hlink="_a5af0ebb7e54e14970f" role="Primary"/>
|
||||
<eventref hlink="_a5af0ec45b25c630e03" role="Witness"/>
|
||||
<childof hlink="_VDLKQCQQ1ADTJG1D1F"/>
|
||||
<parentin hlink="_SNLKQCD0VNJ627062Y"/>
|
||||
<citationref hlink="_c140d25607213be35da"/>
|
||||
@@ -24882,13 +24896,18 @@
|
||||
<parentin hlink="_JFYJQCG2KLRQN835JD"/>
|
||||
<citationref hlink="_c140d256e3403ba129d"/>
|
||||
</person>
|
||||
<person handle="_B3BKQCSV0G3NKSKWDX" change="1185438865" id="I0880">
|
||||
<person handle="_B3BKQCSV0G3NKSKWDX" change="1502187344" id="I0880">
|
||||
<gender>F</gender>
|
||||
<name type="Birth Name">
|
||||
<first>L. J.</first>
|
||||
<surname>Blanco</surname>
|
||||
</name>
|
||||
<eventref hlink="_a5af0ed2cf617169903" role="Primary"/>
|
||||
<eventref hlink="_a5af0ed5df832ee65c1" role="Clergy">
|
||||
<attribute type="Age" value="23">
|
||||
<citationref hlink="_c140dafeb317af2fd79"/>
|
||||
</attribute>
|
||||
</eventref>
|
||||
<childof hlink="_1BVJQCNTFAGS8273LJ"/>
|
||||
<citationref hlink="_c140d256ec4306a51ca"/>
|
||||
</person>
|
||||
@@ -31930,7 +31949,7 @@
|
||||
<childof hlink="_UDMKQC5D3A2PXPUGNC"/>
|
||||
<citationref hlink="_c140d266ec93334f40f"/>
|
||||
</person>
|
||||
<person handle="_MG5KQC6ZKSVO4A63G2" change="1328026883" id="I0624">
|
||||
<person handle="_MG5KQC6ZKSVO4A63G2" change="1502187451" id="I0624">
|
||||
<gender>M</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Raymond E.</first>
|
||||
@@ -31938,6 +31957,7 @@
|
||||
</name>
|
||||
<eventref hlink="_a5af0ece8bd1125a1a9" role="Primary"/>
|
||||
<eventref hlink="_a5af0ece8d15511ddf9" role="Primary"/>
|
||||
<eventref hlink="_a5af0ec45b25c630e03" role="Informant"/>
|
||||
<childof hlink="_9OUJQCBOHW9UEK9CNV"/>
|
||||
<citationref hlink="_c140d266f0d5d178784"/>
|
||||
</person>
|
||||
@@ -32336,7 +32356,7 @@
|
||||
<parentin hlink="_F4CKQCJZ24JRE9Z889"/>
|
||||
<citationref hlink="_c140d267ccb7aef0cd0"/>
|
||||
</person>
|
||||
<person handle="_N4DKQCPEMZ7OO62O7J" change="1185438865" id="I0975">
|
||||
<person handle="_N4DKQCPEMZ7OO62O7J" change="1502187308" id="I0975">
|
||||
<gender>M</gender>
|
||||
<name type="Birth Name">
|
||||
<first>Henry</first>
|
||||
@@ -32345,6 +32365,11 @@
|
||||
<eventref hlink="_a5af0ed483738d4ed1e" role="Primary"/>
|
||||
<eventref hlink="_a5af0ed484a144d229b" role="Primary"/>
|
||||
<eventref hlink="_a5af0ed48605fb6b9eb" role="Primary"/>
|
||||
<eventref hlink="_a5af0ed5df832ee65c1" role="Witness">
|
||||
<attribute type="Age" value="23">
|
||||
<citationref hlink="_c140dafeb317af2fd79"/>
|
||||
</attribute>
|
||||
</eventref>
|
||||
<parentin hlink="_7PUJQC4PPS4EDIVMYE"/>
|
||||
<citationref hlink="_c140d267d2128356d8e"/>
|
||||
</person>
|
||||
@@ -59379,10 +59404,6 @@
|
||||
<ptitle>USA</ptitle>
|
||||
<pname value="USA"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_4ECKQCWCLO5YIHXEXZ" change="1234373374" id="P1704" type="Country">
|
||||
<ptitle>Puerto Rico</ptitle>
|
||||
<pname value="Puerto Rico"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_4FUJQCDFTJJJNKKJMH" change="1234390522" id="P0958" type="City">
|
||||
<ptitle>Boone, IA</ptitle>
|
||||
<pname value="Boone"/>
|
||||
@@ -65622,29 +65643,44 @@
|
||||
<pname value="St. Lawrence"/>
|
||||
<placeref hlink="_c96587263cc11e217c35cc9003f"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_d583a5b7ab21971300a" change="1467134436" id="P0435" type="Unknown">
|
||||
<placeobj handle="_d583a5b7ab21971300a" change="1520535854" id="P0435" type="City">
|
||||
<ptitle>Δράμα</ptitle>
|
||||
<pname value="Δράμα"/>
|
||||
<pname value="Δράμα" lang="el"/>
|
||||
<pname value="Drama" lang="en"/>
|
||||
<placeref hlink="_dd445e5bfcc17bd1838"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_d583a5b8614206a939d" change="1467134581" id="P0436" type="Unknown">
|
||||
<placeobj handle="_d583a5b8614206a939d" change="1520535887" id="P0436" type="City">
|
||||
<ptitle>Θεσσαλονίκη</ptitle>
|
||||
<pname value="Θεσσαλονίκη"/>
|
||||
<pname value="Θεσσαλονίκη" lang="el"/>
|
||||
<pname value="Thessaloniki" lang="en"/>
|
||||
<placeref hlink="_dd445e5bfcc17bd1838"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_d583a5b8a8c1474357d" change="1467135440" id="P0437" type="Unknown">
|
||||
<placeobj handle="_d583a5b8a8c1474357d" change="1520535915" id="P0437" type="City">
|
||||
<ptitle>Ιωάννινα</ptitle>
|
||||
<pname value="Ιωάννινα"/>
|
||||
<pname value="Ιωάννινα" lang="el"/>
|
||||
<pname value="Ioannina" lang="en"/>
|
||||
<placeref hlink="_dd445e5bfcc17bd1838"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_d583a5b8b586fb992c8" change="1467135553" id="P0438" type="Unknown">
|
||||
<placeobj handle="_d583a5b8b586fb992c8" change="1520535978" id="P0438" type="City">
|
||||
<ptitle>Σιάτιστα</ptitle>
|
||||
<pname value="Σιάτιστα"/>
|
||||
<pname value="Σιάτιστα" lang="el"/>
|
||||
<pname value="Siatista" lang="en"/>
|
||||
<placeref hlink="_dd445e5bfcc17bd1838"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_d583a5b8c380fb024c9" change="1467136002" id="P0439" type="Unknown">
|
||||
<placeobj handle="_d583a5b8c380fb024c9" change="1520535800" id="P0439" type="City">
|
||||
<ptitle>Άργος</ptitle>
|
||||
<pname value="Άργος"/>
|
||||
<pname value="Άργος" lang="el"/>
|
||||
<pname value="Argos" lang="en"/>
|
||||
<placeref hlink="_dd445e5bfcc17bd1838"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_d583a5b8d1106cda712" change="1467136077" id="P0440" type="Unknown">
|
||||
<placeobj handle="_d583a5b8d1106cda712" change="1520535947" id="P0440" type="City">
|
||||
<ptitle>Μεσολόγγι</ptitle>
|
||||
<pname value="Μεσολόγγι"/>
|
||||
<pname value="Μεσολόγγι" lang="el"/>
|
||||
<pname value="Missolonghi" lang="en"/>
|
||||
<placeref hlink="_dd445e5bfcc17bd1838"/>
|
||||
</placeobj>
|
||||
<placeobj handle="_dd445e5bfcc17bd1838" change="1520535973" id="P0441" type="Country">
|
||||
<pname value="Greece" lang="en"/>
|
||||
</placeobj>
|
||||
</places>
|
||||
<objects>
|
||||
|
||||
@@ -180,6 +180,8 @@ class ArgHandler:
|
||||
self.imports = []
|
||||
self.exports = []
|
||||
self.removes = parser.removes
|
||||
self.username = parser.username
|
||||
self.password = parser.password
|
||||
|
||||
self.open = self.__handle_open_option(parser.open, parser.create)
|
||||
self.sanitize_args(parser.imports, parser.exports)
|
||||
@@ -502,10 +504,9 @@ class ArgHandler:
|
||||
self.imp_db_path = get_empty_tempdir("import_dbdir")
|
||||
dbid = config.get('database.backend')
|
||||
newdb = make_database(dbid)
|
||||
newdb.write_version(self.imp_db_path)
|
||||
|
||||
try:
|
||||
self.smgr.open_activate(self.imp_db_path)
|
||||
self.smgr.open_activate(self.imp_db_path, self.username, self.password)
|
||||
msg = _("Created empty Family Tree successfully")
|
||||
print(msg, file=sys.stderr)
|
||||
except:
|
||||
@@ -532,7 +533,7 @@ class ArgHandler:
|
||||
|
||||
# we load this file for use
|
||||
try:
|
||||
self.smgr.open_activate(self.open)
|
||||
self.smgr.open_activate(self.open, self.username, self.password)
|
||||
print(_("Opened successfully!"), file=sys.stderr)
|
||||
except:
|
||||
print(_("Error opening the file."), file=sys.stderr)
|
||||
@@ -553,6 +554,9 @@ class ArgHandler:
|
||||
if self.dbman.needs_recovery(dbpath):
|
||||
self.__error(_("Database needs recovery, cannot open it!"))
|
||||
return False
|
||||
if self.dbman.backend_unavailable(dbpath):
|
||||
self.__error(_("Database backend unavailable, cannot open it!"))
|
||||
return False
|
||||
return True
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
# Copyright (C) 2008 Brian G. Matherly
|
||||
# Copyright (C) 2012 Doug Blank
|
||||
# Copyright (C) 2012-2013 Paul Franklin
|
||||
# Copyright (C) 2017 Serge Noiraud
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -35,6 +36,7 @@ Module responsible for handling the command line arguments for Gramps.
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import sys
|
||||
import os
|
||||
import getopt
|
||||
import logging
|
||||
|
||||
@@ -60,6 +62,8 @@ Help options
|
||||
|
||||
Application options
|
||||
-O, --open=FAMILY_TREE Open Family Tree
|
||||
-U, --username=USERNAME Database username
|
||||
-P, --password=PASSWORD Database password
|
||||
-C, --create=FAMILY_TREE Create on open if new Family Tree
|
||||
-i, --import=FILENAME Import file
|
||||
-e, --export=FILENAME Export file
|
||||
@@ -136,6 +140,8 @@ class ArgParser:
|
||||
The valid options are:
|
||||
|
||||
-O, --open=FAMILY_TREE Open Family Tree
|
||||
-U, --username=USERNAME Database username
|
||||
-P, --password=PASSWORD Database password
|
||||
-C, --create=FAMILY_TREE Create on open if new Family Tree
|
||||
-i, --import=FILENAME Import file
|
||||
-e, --export=FILENAME Export file
|
||||
@@ -194,6 +200,8 @@ class ArgParser:
|
||||
|
||||
self.open_gui = None
|
||||
self.open = None
|
||||
self.username = None
|
||||
self.password = None
|
||||
self.exports = []
|
||||
self.actions = []
|
||||
self.imports = []
|
||||
@@ -277,6 +285,10 @@ class ArgParser:
|
||||
self.open = value
|
||||
elif option in ['-C', '--create']:
|
||||
self.create = value
|
||||
elif option in ['-U', '--username']:
|
||||
self.username = value
|
||||
elif option in ['-P', '--password']:
|
||||
self.password = value
|
||||
elif option in ['-i', '--import']:
|
||||
family_tree_format = None
|
||||
if (opt_ix < len(options) - 1
|
||||
@@ -290,6 +302,21 @@ class ArgParser:
|
||||
if (opt_ix < len(options) - 1
|
||||
and options[opt_ix + 1][0] in ('-f', '--format')):
|
||||
family_tree_format = options[opt_ix + 1][1]
|
||||
abs_name = os.path.abspath(os.path.expanduser(value))
|
||||
if not os.path.exists(abs_name):
|
||||
# The file doesn't exists, try to create it.
|
||||
try:
|
||||
open(abs_name, 'w').close()
|
||||
os.unlink(abs_name)
|
||||
except OSError as e:
|
||||
message = _("WARNING: %(strerr)s "
|
||||
"(errno=%(errno)s):\n"
|
||||
"WARNING: %(name)s\n") % {
|
||||
'strerr' : e.strerror,
|
||||
'errno' : e.errno,
|
||||
'name' : e.filename}
|
||||
print(message)
|
||||
sys.exit(1)
|
||||
self.exports.append((value, family_tree_format))
|
||||
elif option in ['-a', '--action']:
|
||||
action = value
|
||||
|
||||
+31
-40
@@ -48,8 +48,8 @@ import logging
|
||||
from gramps.gen.plug import BasePluginManager
|
||||
from gramps.gen.config import config
|
||||
from gramps.gen.constfunc import win
|
||||
from gramps.gen.db.dbconst import DBLOGNAME
|
||||
from gramps.gen.db.utils import make_database
|
||||
from gramps.gen.db.dbconst import DBLOGNAME, DBBACKEND
|
||||
from gramps.gen.db.utils import make_database, get_dbid_from_path
|
||||
from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
|
||||
@@ -69,6 +69,7 @@ _LOG = logging.getLogger(DBLOGNAME)
|
||||
DEFAULT_TITLE = _("Family Tree")
|
||||
NAME_FILE = "name.txt"
|
||||
META_NAME = "meta_data.db"
|
||||
UNAVAILABLE = _('Unavailable')
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -154,11 +155,7 @@ class CLIDbManager:
|
||||
_("Version")
|
||||
_("Schema version")
|
||||
"""
|
||||
dbid = "bsddb"
|
||||
dbid_path = os.path.join(dirpath, "database.txt")
|
||||
if os.path.isfile(dbid_path):
|
||||
with open(dbid_path) as file:
|
||||
dbid = file.read().strip()
|
||||
dbid = get_dbid_from_path(dirpath)
|
||||
if not self.is_locked(dirpath):
|
||||
try:
|
||||
database = make_database(dbid)
|
||||
@@ -171,12 +168,19 @@ class CLIDbManager:
|
||||
retval = {_("Unavailable"): "locked"}
|
||||
retval.update({_("Family Tree"): name,
|
||||
_("Path"): dirpath,
|
||||
_("Database"): dbid,
|
||||
_("Database"): self.get_backend_name_from_dbid(dbid),
|
||||
_("Last accessed"): time_val(dirpath)[1],
|
||||
_("Locked?"): self.is_locked(dirpath),
|
||||
})
|
||||
return retval
|
||||
|
||||
def get_backend_name_from_dbid(self, dbid):
|
||||
pmgr = BasePluginManager.get_instance()
|
||||
for plugin in pmgr.get_reg_databases():
|
||||
if plugin.id == dbid:
|
||||
return plugin._name
|
||||
return UNAVAILABLE
|
||||
|
||||
def print_family_tree_summaries(self, database_names=None):
|
||||
"""
|
||||
Prints a detailed list of the known family trees.
|
||||
@@ -184,7 +188,7 @@ class CLIDbManager:
|
||||
print(_('Gramps Family Trees:'))
|
||||
for item in self.current_names:
|
||||
(name, dirpath, path_name, last,
|
||||
tval, enable, stock_id, backend_type, version) = item
|
||||
tval, enable, stock_id, backend_type) = item
|
||||
if (database_names is None or
|
||||
any([(re.match("^" + dbname + "$", name) or
|
||||
dbname == name)
|
||||
@@ -206,7 +210,7 @@ class CLIDbManager:
|
||||
summary_list = []
|
||||
for item in self.current_names:
|
||||
(name, dirpath, path_name, last,
|
||||
tval, enable, stock_id, backend_type, version) = item
|
||||
tval, enable, stock_id, backend_type) = item
|
||||
if (database_names is None or
|
||||
any([(re.match("^" + dbname + "$", name) or
|
||||
dbname == name)
|
||||
@@ -228,20 +232,7 @@ class CLIDbManager:
|
||||
for dpath in os.listdir(dbdir):
|
||||
dirpath = os.path.join(dbdir, dpath)
|
||||
path_name = os.path.join(dirpath, NAME_FILE)
|
||||
try:
|
||||
with open(os.path.join(dirpath, "database.txt")) as file:
|
||||
backend_type = file.read()
|
||||
except:
|
||||
backend_type = "bsddb"
|
||||
try:
|
||||
with open(os.path.join(dirpath, "bdbversion.txt")) as file:
|
||||
version = file.read()
|
||||
except:
|
||||
version = "(0, 0, 0)"
|
||||
try:
|
||||
version = ast.literal_eval(version)
|
||||
except:
|
||||
version = (0, 0, 0)
|
||||
backend_type = get_dbid_from_path(dirpath)
|
||||
if os.path.isfile(path_name):
|
||||
with open(path_name, 'r', encoding='utf8') as file:
|
||||
name = file.readline().strip()
|
||||
@@ -255,7 +246,7 @@ class CLIDbManager:
|
||||
|
||||
self.current_names.append(
|
||||
(name, os.path.join(dbdir, dpath), path_name,
|
||||
last, tval, enable, stock_id, backend_type, version))
|
||||
last, tval, enable, stock_id, backend_type))
|
||||
|
||||
self.current_names.sort()
|
||||
|
||||
@@ -305,11 +296,13 @@ class CLIDbManager:
|
||||
name_file.write(title)
|
||||
|
||||
if create_db:
|
||||
# write the version number into metadata
|
||||
if dbid is None:
|
||||
dbid = "bsddb"
|
||||
dbid = config.get('database.backend')
|
||||
newdb = make_database(dbid)
|
||||
newdb.write_version(new_path)
|
||||
|
||||
backend_path = os.path.join(new_path, DBBACKEND)
|
||||
with open(backend_path, "w", encoding='utf8') as backend_file:
|
||||
backend_file.write(dbid)
|
||||
|
||||
(tval, last) = time_val(new_path)
|
||||
|
||||
@@ -357,15 +350,6 @@ class CLIDbManager:
|
||||
# write locally:
|
||||
temp_fp.write(data)
|
||||
url_fp.close()
|
||||
from gramps.gen.db.dbconst import BDBVERSFN
|
||||
# name not set
|
||||
(name, ext) = os.path.splitext(os.path.basename(filename))
|
||||
versionpath = os.path.join(name, BDBVERSFN)
|
||||
# dbase not set
|
||||
dbase = make_database("bsddb")
|
||||
_LOG.debug("Write bsddb version %s", str(dbase.version()))
|
||||
with open(versionpath, "w") as version_file:
|
||||
version_file.write(str(dbase.version()))
|
||||
temp_fp.close()
|
||||
|
||||
(name, ext) = os.path.splitext(os.path.basename(filename))
|
||||
@@ -374,13 +358,13 @@ class CLIDbManager:
|
||||
for plugin in pmgr.get_import_plugins():
|
||||
if format == plugin.get_extension():
|
||||
|
||||
new_path, name = self._create_new_db(name, edit_entry=False)
|
||||
dbid = config.get('database.backend')
|
||||
new_path, name = self._create_new_db(name, dbid=dbid,
|
||||
edit_entry=False)
|
||||
|
||||
# Create a new database
|
||||
self.__start_cursor(_("Importing data..."))
|
||||
|
||||
## Use bsddb, for now, because we assumed that above.
|
||||
dbid = "bsddb" ## config.get('database.backend')
|
||||
dbase = make_database(dbid)
|
||||
dbase.load(new_path, user.callback)
|
||||
|
||||
@@ -410,6 +394,13 @@ class CLIDbManager:
|
||||
return True
|
||||
return False
|
||||
|
||||
def backend_unavailable(self, dbpath):
|
||||
"""
|
||||
Returns True if the database in dirpath has an unavailable backend
|
||||
"""
|
||||
dbid = get_dbid_from_path(dbpath)
|
||||
return self.get_backend_name_from_dbid(dbid) == UNAVAILABLE
|
||||
|
||||
def remove_database(self, dbname, user=None):
|
||||
"""
|
||||
Deletes a database folder given a pattenr that matches
|
||||
|
||||
+13
-13
@@ -59,7 +59,8 @@ from gramps.gen.db.exceptions import (DbUpgradeRequiredError,
|
||||
BsddbUpgradeRequiredError,
|
||||
BsddbDowngradeRequiredError,
|
||||
PythonUpgradeRequiredError,
|
||||
PythonDowngradeError)
|
||||
PythonDowngradeError,
|
||||
DbConnectionError)
|
||||
from gramps.gen.plug import BasePluginManager
|
||||
from gramps.gen.utils.config import get_researcher
|
||||
from gramps.gen.recentfiles import recent_files
|
||||
@@ -131,7 +132,7 @@ class CLIDbLoader:
|
||||
"""
|
||||
pass
|
||||
|
||||
def read_file(self, filename):
|
||||
def read_file(self, filename, username, password):
|
||||
"""
|
||||
This method takes care of changing database, and loading the data.
|
||||
In 3.0 we only allow reading of real databases of filetype
|
||||
@@ -172,8 +173,8 @@ class CLIDbLoader:
|
||||
self._begin_progress()
|
||||
|
||||
try:
|
||||
self.dbstate.db.load(filename, self._pulse_progress, mode)
|
||||
self.dbstate.db.set_save_path(filename)
|
||||
self.dbstate.db.load(filename, self._pulse_progress, mode,
|
||||
username=username, password=password)
|
||||
except DbEnvironmentError as msg:
|
||||
self.dbstate.no_database()
|
||||
self._errordialog(_("Cannot open database"), str(msg))
|
||||
@@ -201,6 +202,9 @@ class CLIDbLoader:
|
||||
except DbPythonError as msg:
|
||||
self.dbstate.no_database()
|
||||
self._errordialog(_("Cannot open database"), str(msg))
|
||||
except DbConnectionError as msg:
|
||||
self.dbstate.no_database()
|
||||
self._errordialog(_("Cannot open database"), str(msg))
|
||||
except OSError as msg:
|
||||
self.dbstate.no_database()
|
||||
self._errordialog(
|
||||
@@ -237,11 +241,11 @@ class CLIManager:
|
||||
self._pmgr = BasePluginManager.get_instance()
|
||||
self.user = user
|
||||
|
||||
def open_activate(self, path):
|
||||
def open_activate(self, path, username=None, password=None):
|
||||
"""
|
||||
Open and make a family tree active
|
||||
"""
|
||||
self._read_recent_file(path)
|
||||
self._read_recent_file(path, username, password)
|
||||
|
||||
def _errordialog(self, title, errormessage):
|
||||
"""
|
||||
@@ -250,7 +254,7 @@ class CLIManager:
|
||||
print(_('ERROR: %s') % errormessage, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def _read_recent_file(self, filename):
|
||||
def _read_recent_file(self, filename, username=None, password=None):
|
||||
"""
|
||||
Called when a file needs to be loaded
|
||||
"""
|
||||
@@ -271,7 +275,7 @@ class CLIManager:
|
||||
"that the database is not in use."))
|
||||
return
|
||||
|
||||
if self.db_loader.read_file(filename):
|
||||
if self.db_loader.read_file(filename, username, password):
|
||||
# Attempt to figure out the database title
|
||||
path = os.path.join(filename, "name.txt")
|
||||
try:
|
||||
@@ -303,11 +307,6 @@ class CLIManager:
|
||||
if title:
|
||||
name = title
|
||||
|
||||
# This method is for UI stuff when the database has changed.
|
||||
# Window title, recent files, etc related to new file.
|
||||
|
||||
self.dbstate.db.set_save_path(filename)
|
||||
|
||||
# apply preferred researcher if loaded file has none
|
||||
res = self.dbstate.db.get_researcher()
|
||||
owner = get_researcher()
|
||||
@@ -319,6 +318,7 @@ class CLIManager:
|
||||
and self.dbstate.db.get_total() == 0):
|
||||
self.dbstate.db.set_researcher(owner)
|
||||
|
||||
name_displayer.clear_custom_formats()
|
||||
name_displayer.set_name_format(self.dbstate.db.name_formats)
|
||||
fmt_default = config.get('preferences.name-format')
|
||||
name_displayer.set_default_format(fmt_default)
|
||||
|
||||
@@ -47,7 +47,8 @@ LOG = logging.getLogger(".")
|
||||
#-------------------------------------------------------------------------
|
||||
from gramps.gen.plug import BasePluginManager
|
||||
from gramps.gen.plug.docgen import (StyleSheet, StyleSheetList, PaperStyle,
|
||||
PAPER_PORTRAIT, PAPER_LANDSCAPE, graphdoc)
|
||||
PAPER_PORTRAIT, PAPER_LANDSCAPE, graphdoc,
|
||||
treedoc)
|
||||
from gramps.gen.plug.menu import (FamilyOption, PersonOption, NoteOption,
|
||||
MediaOption, PersonListOption, NumberOption,
|
||||
BooleanOption, DestinationOption, Option,
|
||||
@@ -56,8 +57,8 @@ from gramps.gen.plug.menu import (FamilyOption, PersonOption, NoteOption,
|
||||
from gramps.gen.display.name import displayer as name_displayer
|
||||
from gramps.gen.errors import ReportError, FilterError
|
||||
from gramps.gen.plug.report import (CATEGORY_TEXT, CATEGORY_DRAW, CATEGORY_BOOK,
|
||||
CATEGORY_GRAPHVIZ, CATEGORY_CODE,
|
||||
ReportOptions, append_styles)
|
||||
CATEGORY_GRAPHVIZ, CATEGORY_TREE,
|
||||
CATEGORY_CODE, ReportOptions, append_styles)
|
||||
from gramps.gen.plug.report._paper import paper_sizes
|
||||
from gramps.gen.const import USER_HOME, DOCGEN_OPTIONS
|
||||
from gramps.gen.dbstate import DbState
|
||||
@@ -250,6 +251,15 @@ class CommandLineReport:
|
||||
if name not in self.option_class.options_dict:
|
||||
self.option_class.options_dict[
|
||||
name] = menu.get_option_by_name(name).get_value()
|
||||
if category == CATEGORY_TREE:
|
||||
# Need to include Genealogy Tree options
|
||||
self.__toptions = treedoc.TreeOptions()
|
||||
menu = self.option_class.menu
|
||||
self.__toptions.add_menu_options(menu)
|
||||
for name in menu.get_all_option_names():
|
||||
if name not in self.option_class.options_dict:
|
||||
self.option_class.options_dict[
|
||||
name] = menu.get_option_by_name(name).get_value()
|
||||
self.option_class.load_previous_values()
|
||||
_validate_options(self.option_class, database)
|
||||
self.show = options_str_dict.pop('show', None)
|
||||
@@ -320,6 +330,10 @@ class CommandLineReport:
|
||||
for graph_format in graphdoc.FORMATS:
|
||||
self.options_help['off'][2].append(
|
||||
graph_format["type"] + "\t" + graph_format["descr"])
|
||||
elif self.category == CATEGORY_TREE:
|
||||
for tree_format in treedoc.FORMATS:
|
||||
self.options_help['off'][2].append(
|
||||
tree_format["type"] + "\t" + tree_format["descr"])
|
||||
else:
|
||||
self.options_help['off'][2] = "NA"
|
||||
|
||||
@@ -446,7 +460,7 @@ class CommandLineReport:
|
||||
else:
|
||||
print(_("Unknown option: %s") % option, file=sys.stderr)
|
||||
print(_(" Valid options are:") +
|
||||
", ".join(list(self.options_dict.keys())),
|
||||
_(", ").join(list(self.options_dict.keys())), # Arabic OK
|
||||
file=sys.stderr)
|
||||
print(_(" Use '%(donottranslate)s' to see description "
|
||||
"and acceptable values"
|
||||
@@ -498,6 +512,15 @@ class CommandLineReport:
|
||||
# Pick the first one as the default.
|
||||
self.format = graphdoc.FORMATS[0]["class"]
|
||||
_chosen_format = graphdoc.FORMATS[0]["type"]
|
||||
elif self.category == CATEGORY_TREE:
|
||||
for tree_format in treedoc.FORMATS:
|
||||
if tree_format['type'] == self.options_dict['off']:
|
||||
if not self.format: # choose the first one, not the last
|
||||
self.format = tree_format["class"]
|
||||
if self.format is None:
|
||||
# Pick the first one as the default.
|
||||
self.format = tree_format.FORMATS[0]["class"]
|
||||
_chosen_format = tree_format.FORMATS[0]["type"]
|
||||
else:
|
||||
self.format = None
|
||||
if _chosen_format and _format_str:
|
||||
@@ -527,7 +550,7 @@ class CommandLineReport:
|
||||
else:
|
||||
print(_("Ignoring unknown option: %s") % opt, file=sys.stderr)
|
||||
print(_(" Valid options are:"),
|
||||
", ".join(list(self.options_dict.keys())),
|
||||
_(", ").join(list(self.options_dict.keys())), # Arabic OK
|
||||
file=sys.stderr)
|
||||
print(_(" Use '%(donottranslate)s' to see description "
|
||||
"and acceptable values"
|
||||
@@ -665,7 +688,7 @@ def cl_report(database, name, category, report_class, options_class,
|
||||
clr.selected_style,
|
||||
PaperStyle(clr.paper, clr.orien, clr.marginl,
|
||||
clr.marginr, clr.margint, clr.marginb))
|
||||
elif category == CATEGORY_GRAPHVIZ:
|
||||
elif category in [CATEGORY_GRAPHVIZ, CATEGORY_TREE]:
|
||||
clr.option_class.handler.doc = clr.format(
|
||||
clr.option_class,
|
||||
PaperStyle(clr.paper, clr.orien, clr.marginl,
|
||||
|
||||
+28
-22
@@ -155,7 +155,7 @@ register('behavior.translator-needed', True)
|
||||
register('behavior.use-tips', False)
|
||||
register('behavior.welcome', 100)
|
||||
register('behavior.web-search-url', 'http://google.com/#&q=%(text)s')
|
||||
register('behavior.addons-url', "https://raw.githubusercontent.com/gramps-project/addons/master/gramps50")
|
||||
register('behavior.addons-url', "https://raw.githubusercontent.com/gramps-project/addons/master/gramps51")
|
||||
|
||||
register('database.backend', 'bsddb')
|
||||
register('database.compress-backup', True)
|
||||
@@ -163,6 +163,8 @@ register('database.backup-path', USER_HOME)
|
||||
register('database.backup-on-exit', True)
|
||||
register('database.autobackup', 0)
|
||||
register('database.path', os.path.join(HOME_DIR, 'grampsdb'))
|
||||
register('database.host', '')
|
||||
register('database.port', '')
|
||||
|
||||
register('export.proxy-order',
|
||||
[["privacy", 0],
|
||||
@@ -194,6 +196,7 @@ register('interface.view-categories',
|
||||
register('interface.filter', False)
|
||||
register('interface.fullscreen', False)
|
||||
register('interface.grampletbar-close', False)
|
||||
register('interface.grampletbar-freeze', False)
|
||||
register('interface.ignore-gexiv2', False)
|
||||
register('interface.ignore-pil', False)
|
||||
register('interface.ignore-osmgpsmap', False)
|
||||
@@ -215,6 +218,7 @@ register('interface.sidebar-text', True)
|
||||
register('interface.size-checked', False)
|
||||
register('interface.statusbar', 1)
|
||||
register('interface.toolbar-on', True)
|
||||
register('interface.toolbar-text', False)
|
||||
register('interface.view', True)
|
||||
register('interface.surname-box-height', 150)
|
||||
register('interface.treemodel-cache-size', 1000)
|
||||
@@ -226,6 +230,8 @@ register('paths.report-directory', USER_HOME)
|
||||
register('paths.website-directory', USER_HOME)
|
||||
register('paths.website-cms-uri', '')
|
||||
register('paths.website-cal-uri', '')
|
||||
register('paths.website-extra-page-uri', '')
|
||||
register('paths.website-extra-page-name', '')
|
||||
register('paths.quick-backup-directory', USER_HOME)
|
||||
register('paths.quick-backup-filename',
|
||||
"%(filename)s_%(year)d-%(month)02d-%(day)02d.%(extension)s")
|
||||
@@ -245,11 +251,8 @@ register('preferences.hide-ep-msg', False)
|
||||
register('preferences.invalid-date-format', "<b>%s</b>")
|
||||
register('preferences.iprefix', 'I%04d')
|
||||
register('preferences.name-format', 1)
|
||||
register('preferences.place-format', 0)
|
||||
register('preferences.place-auto', True)
|
||||
register('preferences.place-number', False)
|
||||
register('preferences.place-reverse', False)
|
||||
register('preferences.place-restrict', 0)
|
||||
register('preferences.place-lang', '')
|
||||
register('preferences.patronimic-surname', False)
|
||||
register('preferences.no-given-text', "[%s]" % _("Missing Given Name"))
|
||||
register('preferences.no-record-text', "[%s]" % _("Missing Record"))
|
||||
@@ -270,22 +273,25 @@ register('preferences.last-view', '')
|
||||
register('preferences.last-views', [])
|
||||
register('preferences.family-relation-type', 3) # UNKNOWN
|
||||
register('preferences.age-display-precision', 1)
|
||||
register('preferences.color-gender-male-alive', '#b8cee6')
|
||||
register('preferences.color-gender-male-death', '#b8cee6')
|
||||
register('preferences.color-gender-female-alive', '#feccf0')
|
||||
register('preferences.color-gender-female-death', '#feccf0')
|
||||
register('preferences.color-gender-unknown-alive', '#f3dbb6')
|
||||
register('preferences.color-gender-unknown-death', '#f3dbb6')
|
||||
#register('preferences.color-gender-other-alive', '#fcaf3e')
|
||||
#register('preferences.color-gender-other-death', '#fcaf3e')
|
||||
register('preferences.bordercolor-gender-male-alive', '#1f4986')
|
||||
register('preferences.bordercolor-gender-male-death', '#000000')
|
||||
register('preferences.bordercolor-gender-female-alive', '#861f69')
|
||||
register('preferences.bordercolor-gender-female-death', '#000000')
|
||||
register('preferences.bordercolor-gender-unknown-alive', '#8e5801')
|
||||
register('preferences.bordercolor-gender-unknown-death', '#000000')
|
||||
#register('preferences.bordercolor-gender-other-alive', '#f57900')
|
||||
#register('preferences.bordercolor-gender-other-death', '#000000')
|
||||
|
||||
register('colors.scheme', 0)
|
||||
register('colors.male-alive', ['#b8cee6', '#1f344a'])
|
||||
register('colors.male-dead', ['#b8cee6', '#2d3039'])
|
||||
register('colors.female-alive', ['#feccf0', '#62242D'])
|
||||
register('colors.female-dead', ['#feccf0', '#3a292b'])
|
||||
register('colors.unknown-alive', ['#f3dbb6', '#75507B'])
|
||||
register('colors.unknown-dead', ['#f3dbb6', '#35103b'])
|
||||
register('colors.family', ['#eeeeee', '#454545'])
|
||||
register('colors.family-divorced', ['#ffdede', '#5c3636'])
|
||||
register('colors.home-person', ['#bbe68a', '#304918'])
|
||||
register('colors.border-male-alive', ['#1f4986', '#171d26'])
|
||||
register('colors.border-male-dead', ['#000000', '#000000'])
|
||||
register('colors.border-female-alive', ['#861f69', '#261111'])
|
||||
register('colors.border-female-dead', ['#000000', '#000000'])
|
||||
register('colors.border-unknown-alive', ['#8e5801', '#8e5801'])
|
||||
register('colors.border-unknown-dead', ['#000000', '#000000'])
|
||||
register('colors.border-family', ['#cccccc', '#252525'])
|
||||
register('colors.border-family-divorced', ['#ff7373', '#720b0b'])
|
||||
|
||||
register('researcher.researcher-addr', '')
|
||||
register('researcher.researcher-locality', '')
|
||||
@@ -323,7 +329,7 @@ if not os.path.exists(CONFIGMAN.filename):
|
||||
# check previous version of gramps:
|
||||
fullpath, filename = os.path.split(CONFIGMAN.filename)
|
||||
fullpath, previous = os.path.split(fullpath)
|
||||
match = re.match('gramps(\d*)', previous)
|
||||
match = re.match(r'gramps(\d*)', previous)
|
||||
if match:
|
||||
# cycle back looking for previous versions of gramps
|
||||
for i in range(1, 20): # check back 2 gramps versions
|
||||
|
||||
+9
-5
@@ -59,8 +59,8 @@ PROGRAM_NAME = "Gramps"
|
||||
#-------------------------------------------------------------------------
|
||||
URL_HOMEPAGE = "http://gramps-project.org/"
|
||||
URL_MAILINGLIST = "http://sourceforge.net/mail/?group_id=25770"
|
||||
URL_BUGHOME = "http://bugs.gramps-project.org"
|
||||
URL_BUGTRACKER = "http://bugs.gramps-project.org/bug_report_page.php"
|
||||
URL_BUGHOME = "http://gramps-project.org/bugs"
|
||||
URL_BUGTRACKER = "http://gramps-project.org/bugs/bug_report_page.php"
|
||||
URL_WIKISTRING = "http://gramps-project.org/wiki/index.php?title="
|
||||
URL_MANUAL_PAGE = "Gramps_%s_Wiki_Manual" % major_version
|
||||
URL_MANUAL_DATA = '%s_-_Entering_and_editing_data:_detailed' % URL_MANUAL_PAGE
|
||||
@@ -112,6 +112,7 @@ VERSION_DIR = os.path.join(
|
||||
CUSTOM_FILTERS = os.path.join(VERSION_DIR, "custom_filters.xml")
|
||||
REPORT_OPTIONS = os.path.join(HOME_DIR, "report_options.xml")
|
||||
TOOL_OPTIONS = os.path.join(HOME_DIR, "tool_options.xml")
|
||||
PLACE_FORMATS = os.path.join(HOME_DIR, "place_formats.xml")
|
||||
|
||||
ENV_DIR = os.path.join(HOME_DIR, "env")
|
||||
TEMP_DIR = os.path.join(HOME_DIR, "temp")
|
||||
@@ -137,7 +138,8 @@ sys.path.insert(0, ROOT_DIR)
|
||||
git_revision = get_git_revision(ROOT_DIR).replace('\n', '')
|
||||
if sys.platform == 'win32' and git_revision == "":
|
||||
git_revision = get_git_revision(os.path.split(ROOT_DIR)[1])
|
||||
#VERSION += git_revision
|
||||
VERSION += git_revision
|
||||
#VERSION += "-1"
|
||||
|
||||
#
|
||||
# Glade files
|
||||
@@ -216,7 +218,7 @@ GTK_GETTEXT_DOMAIN = 'gtk30'
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
COPYRIGHT_MSG = "© 2001-2006 Donald N. Allingham\n" \
|
||||
"© 2007-2017 The Gramps Developers"
|
||||
"© 2007-2018 The Gramps Developers"
|
||||
COMMENTS = _("Gramps\n (Genealogical Research and Analysis "
|
||||
"Management Programming System)\n"
|
||||
"is a personal genealogy program.")
|
||||
@@ -288,6 +290,8 @@ LONGOPTS = [
|
||||
"oaf-ior-fd=",
|
||||
"oaf-private",
|
||||
"open=",
|
||||
"username=",
|
||||
"password=",
|
||||
"create=",
|
||||
"options=",
|
||||
"screen=",
|
||||
@@ -303,7 +307,7 @@ LONGOPTS = [
|
||||
"quiet",
|
||||
]
|
||||
|
||||
SHORTOPTS = "O:C:i:e:f:a:p:d:c:r:lLthuv?syq"
|
||||
SHORTOPTS = "O:U:P:C:i:e:f:a:p:d:c:r:lLthuv?syq"
|
||||
|
||||
GRAMPS_UUID = uuid.UUID('516cd010-5a41-470f-99f8-eb22f1098ad6')
|
||||
|
||||
|
||||
@@ -124,12 +124,12 @@ class DateParserAR(DateParser):
|
||||
_span_2 = ['إلى']
|
||||
_range_1 = ['بين']
|
||||
_range_2 = ['و']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)), re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -166,12 +166,12 @@ class DateParserBG(DateParser):
|
||||
_span_2 = ['до']
|
||||
_range_1 = ['между']
|
||||
_range_2 = ['и']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)), re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -98,14 +98,14 @@ class DateParserCA(DateParser):
|
||||
DateParser.init_strings(self)
|
||||
_span_1 = ['des de']
|
||||
_span_2 = ['fins a']
|
||||
_range_1 = ['entre', 'ent\.', 'ent']
|
||||
_range_1 = ['entre', r'ent\.', 'ent']
|
||||
_range_2 = ['i']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)), re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -49,145 +49,15 @@ class DateParserCZ(DateParser):
|
||||
"""
|
||||
Converts a text string into a Date object
|
||||
"""
|
||||
month_to_int = DateParser.month_to_int
|
||||
|
||||
month_to_int["leden"] = 1
|
||||
month_to_int["ledna"] = 1
|
||||
month_to_int["lednu"] = 1
|
||||
month_to_int["led"] = 1
|
||||
month_to_int["I"] = 1
|
||||
month_to_int["i"] = 1
|
||||
|
||||
month_to_int["únor"] = 2
|
||||
month_to_int["února"] = 2
|
||||
month_to_int["únoru"] = 2
|
||||
month_to_int["ún"] = 2
|
||||
month_to_int["II"] = 2
|
||||
month_to_int["ii"] = 2
|
||||
|
||||
month_to_int["březen"] = 3
|
||||
month_to_int["března"] = 3
|
||||
month_to_int["březnu"] = 3
|
||||
month_to_int["bře"] = 3
|
||||
month_to_int["III"] = 3
|
||||
month_to_int["iii"] = 3
|
||||
|
||||
month_to_int["duben"] = 4
|
||||
month_to_int["dubna"] = 4
|
||||
month_to_int["dubnu"] = 4
|
||||
month_to_int["dub"] = 4
|
||||
month_to_int["IV"] = 4
|
||||
month_to_int["iv"] = 4
|
||||
|
||||
month_to_int["květen"] = 5
|
||||
month_to_int["května"] = 5
|
||||
month_to_int["květnu"] = 5
|
||||
month_to_int["V"] = 5
|
||||
month_to_int["v"] = 5
|
||||
|
||||
month_to_int["červen"] = 6
|
||||
month_to_int["června"] = 6
|
||||
month_to_int["červnu"] = 6
|
||||
month_to_int["čer"] = 6
|
||||
month_to_int["vi"] = 6
|
||||
|
||||
month_to_int["červenec"] = 7
|
||||
month_to_int["července"] = 7
|
||||
month_to_int["červenci"] = 7
|
||||
month_to_int["čvc"] = 7
|
||||
month_to_int["VII"] = 7
|
||||
month_to_int["vii"] = 7
|
||||
|
||||
month_to_int["srpen"] = 8
|
||||
month_to_int["srpna"] = 8
|
||||
month_to_int["srpnu"] = 8
|
||||
month_to_int["srp"] = 8
|
||||
month_to_int["VIII"] = 8
|
||||
month_to_int["viii"] = 8
|
||||
|
||||
month_to_int["září"] = 9
|
||||
month_to_int["zář"] = 9
|
||||
month_to_int["IX"] = 9
|
||||
month_to_int["ix"] = 9
|
||||
|
||||
month_to_int["říjen"] = 10
|
||||
month_to_int["října"] = 10
|
||||
month_to_int["říjnu"] = 10
|
||||
month_to_int["říj"] = 10
|
||||
month_to_int["X"] = 10
|
||||
month_to_int["x"] = 10
|
||||
|
||||
month_to_int["listopad"] = 11
|
||||
month_to_int["listopadu"] = 11
|
||||
month_to_int["lis"] = 11
|
||||
month_to_int["XI"] = 11
|
||||
month_to_int["xi"] = 11
|
||||
|
||||
month_to_int["prosinec"] = 12
|
||||
month_to_int["prosince"] = 12
|
||||
month_to_int["prosinci"] = 12
|
||||
month_to_int["pro"] = 12
|
||||
month_to_int["XII"] = 12
|
||||
month_to_int["xii"] = 12
|
||||
|
||||
modifier_to_int = {
|
||||
'před' : Date.MOD_BEFORE,
|
||||
'do' : Date.MOD_BEFORE,
|
||||
'po' : Date.MOD_AFTER,
|
||||
'asi' : Date.MOD_ABOUT,
|
||||
'kolem' : Date.MOD_ABOUT,
|
||||
'přibl.' : Date.MOD_ABOUT,
|
||||
}
|
||||
|
||||
calendar_to_int = {
|
||||
'gregoriánský' : Date.CAL_GREGORIAN,
|
||||
'greg.' : Date.CAL_GREGORIAN,
|
||||
'g' : Date.CAL_GREGORIAN,
|
||||
'juliánský' : Date.CAL_JULIAN,
|
||||
'jul.' : Date.CAL_JULIAN,
|
||||
'j' : Date.CAL_JULIAN,
|
||||
'hebrejský' : Date.CAL_HEBREW,
|
||||
'hebr.' : Date.CAL_HEBREW,
|
||||
'h' : Date.CAL_HEBREW,
|
||||
'islámský' : Date.CAL_ISLAMIC,
|
||||
'isl.' : Date.CAL_ISLAMIC,
|
||||
'i' : Date.CAL_ISLAMIC,
|
||||
'francouzský republikánský' : Date.CAL_FRENCH,
|
||||
'fr.' : Date.CAL_FRENCH,
|
||||
'perský' : Date.CAL_PERSIAN,
|
||||
'per.' : Date.CAL_PERSIAN,
|
||||
'p' : Date.CAL_PERSIAN,
|
||||
'švédský' : Date.CAL_SWEDISH,
|
||||
'sve.' : Date.CAL_SWEDISH,
|
||||
's' : Date.CAL_SWEDISH,
|
||||
}
|
||||
|
||||
quality_to_int = {
|
||||
'přibližně' : Date.QUAL_ESTIMATED,
|
||||
'odhadem' : Date.QUAL_ESTIMATED,
|
||||
'odh.' : Date.QUAL_ESTIMATED,
|
||||
'vypočteno' : Date.QUAL_CALCULATED,
|
||||
'vypočtené' : Date.QUAL_CALCULATED,
|
||||
'vyp.' : Date.QUAL_CALCULATED,
|
||||
}
|
||||
bce = ["před naším letopočtem", "před Kristem",
|
||||
"př. n. l.", "př. Kr."] + DateParser.bce
|
||||
|
||||
def dhformat_changed(self):
|
||||
""" Allow overriding so a subclass can modify it """
|
||||
# bug 9739 grampslocale.py gets '%-d.%-m.%Y' -- makes it be '%/d.%/m.%Y'
|
||||
self.dhformat = self.dhformat.replace('/', '') # so counteract that
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._text2 = re.compile('(\d+)?\.?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
"(od)\s+(?P<start>.+)\s+(do)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
"(mezi)\s+(?P<start>.+)\s+(a)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Czech display
|
||||
@@ -197,25 +67,6 @@ class DateDisplayCZ(DateDisplay):
|
||||
"""
|
||||
Czech language date display class.
|
||||
"""
|
||||
long_months = ( "", "leden", "únor", "březen", "duben", "květen",
|
||||
"červen", "červenec", "srpen", "září", "říjen",
|
||||
"listopad", "prosinec" )
|
||||
|
||||
short_months = ( "", "led", "úno", "bře", "dub", "kvě", "čer",
|
||||
"čvc", "srp", "zář", "říj", "lis", "pro" )
|
||||
|
||||
calendar = (
|
||||
"", "juliánský", "hebrejský",
|
||||
"francouzský republikánský", "perský", "islámský",
|
||||
"švédský"
|
||||
)
|
||||
|
||||
_mod_str = ("", "před ", "po ", "kolem ", "", "", "")
|
||||
|
||||
_qual_str = ("", "přibližně ", "vypočteno ")
|
||||
|
||||
bce = ["před naším letopočtem", "před Kristem",
|
||||
"př. n. l.", "př. Kr."] + DateParser.bce
|
||||
|
||||
display = DateDisplay.display_formatted
|
||||
|
||||
@@ -225,58 +76,6 @@ class DateDisplayCZ(DateDisplay):
|
||||
# bug 9537 grampslocale.py gets '%-d.%-m.%Y' -- makes it be '%/d.%/m.%Y'
|
||||
self.dhformat = self.dhformat.replace('/', '') # so counteract that
|
||||
|
||||
self.formats = (
|
||||
"ISO (rrrr-mm-dd)",
|
||||
"numerický",
|
||||
"měsíc den, Rok",
|
||||
"měs den, Rok",
|
||||
"den. měsíc rok",
|
||||
"den. měs rok"
|
||||
)
|
||||
# this must agree with DateDisplayEn's "formats" definition
|
||||
# (since no locale-specific _display_gregorian exists, here)
|
||||
|
||||
def orig_display(self, date): # unused: only here for historical reference
|
||||
"""
|
||||
Return a text string representing the date.
|
||||
"""
|
||||
mod = date.get_modifier()
|
||||
cal = date.get_calendar()
|
||||
qual = date.get_quality()
|
||||
start = date.get_start_date()
|
||||
newyear = date.get_new_year()
|
||||
|
||||
qual_str = self._qual_str[qual]
|
||||
|
||||
if mod == Date.MOD_TEXTONLY:
|
||||
return date.get_text()
|
||||
elif start == Date.EMPTY:
|
||||
return ""
|
||||
# elif mod == Date.MOD_NONE:
|
||||
# date_decl_string = self.display_cal[cal](start)
|
||||
# date_decl_string = date_decl_string.replace("den ", "dna ")
|
||||
# date_decl_string = date_decl_string.replace("or ", "ora ")
|
||||
# date_decl_string = date_decl_string.replace("en ", "na ")
|
||||
# date_decl_string = date_decl_string.replace("ad ", "adu ")
|
||||
# date_decl_string = date_decl_string.replace("ec ", "ce ")
|
||||
# return date_decl_string
|
||||
elif mod == Date.MOD_SPAN:
|
||||
dat1 = self.display_cal[cal](start)
|
||||
dat2 = self.display_cal[cal](date.get_stop_date())
|
||||
scal = self.format_extras(cal, newyear)
|
||||
return "%s%s %s %s %s%s" % (qual_str, 'od', dat1,
|
||||
'do', dat2, scal)
|
||||
elif mod == Date.MOD_RANGE:
|
||||
dat1 = self.display_cal[cal](start)
|
||||
dat2 = self.display_cal[cal](date.get_stop_date())
|
||||
scal = self.format_extras(cal, newyear)
|
||||
return "%s%s %s %s %s%s" % (qual_str, 'mezi',
|
||||
dat1, 'a', dat2, scal)
|
||||
else:
|
||||
text = self.display_cal[date.get_calendar()](start)
|
||||
scal = self.format_extras(cal, newyear)
|
||||
return "%s%s%s%s" % (qual_str, self._mod_str[mod],
|
||||
text, scal)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -89,10 +89,11 @@ class DateParserDa(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._span = re.compile("(fra)?\s*(?P<start>.+)\s*(til|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(mellem)\s+(?P<start>.+)\s+og\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(fra)?\s*(?P<start>.+)\s*(til|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(mellem)\s+(?P<start>.+)\s+og\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -58,30 +58,60 @@ class DateParserDE(DateParser):
|
||||
# Add other common latin,
|
||||
|
||||
month_to_int["januaris"] = 1
|
||||
month_to_int["ianarius"] = 1
|
||||
month_to_int["januarii"] = 1
|
||||
month_to_int["januarius"] = 1
|
||||
month_to_int["january"] = 1
|
||||
month_to_int["ianuary"] = 1
|
||||
month_to_int["mensis"] = 1
|
||||
month_to_int["februaris"] = 2
|
||||
month_to_int["februarii"] = 2
|
||||
month_to_int["februarius"] = 2
|
||||
month_to_int["february"] = 2
|
||||
month_to_int["martii"] = 3
|
||||
month_to_int["martius"] = 3
|
||||
month_to_int["martij"] = 3
|
||||
month_to_int["marty"] = 3
|
||||
month_to_int["aprilis"] = 4
|
||||
month_to_int["maius"] = 5
|
||||
month_to_int["majus"] = 5
|
||||
month_to_int["maii"] = 5
|
||||
month_to_int["maij"] = 5
|
||||
month_to_int["may"] = 5
|
||||
month_to_int["junius"] = 6
|
||||
month_to_int["iunius"] = 6
|
||||
month_to_int["junii"] = 6
|
||||
month_to_int["iunius"] = 6
|
||||
month_to_int["junij"] = 6
|
||||
month_to_int["iunij"] = 6
|
||||
month_to_int["juny"] = 6
|
||||
month_to_int["iuny"] = 6
|
||||
month_to_int["julius"] = 7
|
||||
month_to_int["iulius"] = 7
|
||||
month_to_int["julii"] = 7
|
||||
month_to_int["iulii"] = 7
|
||||
month_to_int["july"] = 7
|
||||
month_to_int["iuly"] = 7
|
||||
month_to_int["quintilis"] = 7
|
||||
month_to_int["augustus"] = 8
|
||||
month_to_int["augusti"] = 8
|
||||
month_to_int["sextilis"] = 8
|
||||
month_to_int["septembris"] = 9
|
||||
month_to_int["7ber"] = 9
|
||||
month_to_int["7bris"] = 9
|
||||
month_to_int["viiber"] = 9
|
||||
month_to_int["viibris"] = 9
|
||||
month_to_int["september"] = 9
|
||||
month_to_int["october"] = 10
|
||||
month_to_int["octobris"] = 10
|
||||
month_to_int["8bris"] = 10
|
||||
month_to_int["viiiber"] = 10
|
||||
month_to_int["viiibris"] = 10
|
||||
month_to_int["novembris"] = 11
|
||||
month_to_int["9ber"] = 11
|
||||
month_to_int["9bris"] = 11
|
||||
month_to_int["ixber"] = 11
|
||||
month_to_int["ixbris"] = 11
|
||||
month_to_int["november"] = 11
|
||||
month_to_int["decembris"] = 12
|
||||
month_to_int["10bris"] = 12
|
||||
@@ -103,38 +133,79 @@ class DateParserDE(DateParser):
|
||||
# old german names
|
||||
|
||||
month_to_int["hartung"] = 1
|
||||
month_to_int["hartmonat"] = 1
|
||||
month_to_int["hartmond"] = 1
|
||||
month_to_int["eismond"] = 1
|
||||
month_to_int["eismonat"] = 1
|
||||
month_to_int["lassmonat"] = 1
|
||||
month_to_int["wolfsmonat"] = 1
|
||||
month_to_int["wintermonat"] = 1
|
||||
month_to_int["hornung"] = 2
|
||||
month_to_int["hintester"] = 2
|
||||
month_to_int["sporkel"] = 2
|
||||
month_to_int["spörkel"] = 2
|
||||
month_to_int["rebmonat"] = 2
|
||||
month_to_int["schmelzmond"] = 2
|
||||
month_to_int["taumond"] = 2
|
||||
month_to_int["narrenmond"] = 2
|
||||
month_to_int["rebmond"] = 2
|
||||
month_to_int["hintester"] = 2
|
||||
month_to_int["letzter Wintermonat"] = 2
|
||||
month_to_int["lenzing"] = 3
|
||||
month_to_int["lenzmond"] = 3
|
||||
month_to_int["lenzmonat"] = 3
|
||||
month_to_int["frühlingsmonat"] = 3
|
||||
month_to_int["launing"] = 4
|
||||
month_to_int["grasmond"] = 4
|
||||
month_to_int["ostermond"] = 4
|
||||
month_to_int["ostermonat"] = 4
|
||||
month_to_int["beuet"] = 5
|
||||
month_to_int["blühmond"] = 5
|
||||
month_to_int["winnemond"] = 5
|
||||
month_to_int["wonnemond"] = 5
|
||||
month_to_int["wonnemonat"] = 5
|
||||
month_to_int["weidenmonat"] = 5
|
||||
month_to_int["blumenmond"] = 5
|
||||
month_to_int["brachet"] = 6
|
||||
month_to_int["brachmond"] = 6
|
||||
month_to_int["brachmonat"] = 6
|
||||
month_to_int["johannismond"] = 6
|
||||
month_to_int["weidemaent"] = 6
|
||||
month_to_int["heuet"] = 7
|
||||
month_to_int["heuert"] = 7
|
||||
month_to_int["heumond"] = 7
|
||||
month_to_int["heumonat"] = 7
|
||||
month_to_int["bärenmonat"] = 7
|
||||
month_to_int["honigmond"] = 7
|
||||
month_to_int["honigmonat"] = 7
|
||||
month_to_int["ernting"] = 8
|
||||
month_to_int["erntemond"] = 8
|
||||
month_to_int["bisemond"] = 8
|
||||
month_to_int["holzing"] = 9
|
||||
month_to_int["holzmond"] = 9
|
||||
month_to_int["scheiding"] = 9
|
||||
month_to_int["herbstmond"] = 9
|
||||
month_to_int["scheidung"] = 9
|
||||
month_to_int["erster herbstmond"] = 9
|
||||
month_to_int["herbstmonat"] = 9
|
||||
month_to_int["engelmonat"] = 9
|
||||
month_to_int["gilbhard"] = 10
|
||||
month_to_int["gilbhart"] = 10
|
||||
month_to_int["weinmond"] = 10
|
||||
month_to_int["weinmonat"] = 10
|
||||
month_to_int["zweiter herbstmond"] = 10
|
||||
month_to_int["windmond"] = 11
|
||||
month_to_int["windmonat"] = 11
|
||||
month_to_int["nebelung"] = 11
|
||||
month_to_int["nebelmond"] = 11
|
||||
month_to_int["schlachtmond"] = 11
|
||||
month_to_int["wintermond"] = 11
|
||||
month_to_int["dritter herbstmond"] = 11
|
||||
month_to_int["julmond"] = 12
|
||||
month_to_int["heilmond"] = 12
|
||||
month_to_int["christmond"] = 12
|
||||
month_to_int["christmonat"] = 12
|
||||
month_to_int["dustermond"] = 12
|
||||
month_to_int["heiligenmonat"] = 12
|
||||
month_to_int["wendeling"] = 11
|
||||
|
||||
modifier_to_int = {
|
||||
'vor' : Date.MOD_BEFORE,
|
||||
@@ -177,14 +248,16 @@ class DateParserDE(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._span = re.compile("(von|vom)\s+(?P<start>.+)\s+(bis)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("zwischen\s+(?P<start>.+)\s+und\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._text2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._mon_str,
|
||||
re.IGNORECASE)
|
||||
self._jtext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._jmon_str,
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(von|vom)\s+(?P<start>.+)\s+(bis)\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"zwischen\s+(?P<start>.+)\s+und\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
self._text2 = re.compile(
|
||||
r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._mon_str,
|
||||
re.IGNORECASE)
|
||||
self._jtext2 = re.compile(
|
||||
r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._jmon_str,
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -221,7 +294,7 @@ class DateDisplayDE(DateDisplay):
|
||||
)
|
||||
# this definition must agree with its "_display_gregorian" method
|
||||
|
||||
def _display_gregorian(self, date_val):
|
||||
def _display_gregorian(self, date_val, **kwargs):
|
||||
"""
|
||||
display gregorian calendar date in different format
|
||||
"""
|
||||
|
||||
@@ -116,14 +116,14 @@ class DateParserEL(DateParser):
|
||||
DateParser.init_strings(self)
|
||||
_span_1 = ['από']
|
||||
_span_2 = ['έως']
|
||||
_range_1 = ['μετ', 'μετ\.', 'μεταξύ']
|
||||
_range_1 = ['μετ', r'μετ\.', 'μεταξύ']
|
||||
_range_2 = ['και']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)), re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -155,7 +155,7 @@ class DateDisplayEL(DateDisplay):
|
||||
)
|
||||
# this definition must agree with its "_display_gregorian" method
|
||||
|
||||
def _display_gregorian(self, date_val):
|
||||
def _display_gregorian(self, date_val, **kwargs):
|
||||
"""
|
||||
display gregorian calendar date in different format
|
||||
"""
|
||||
|
||||
@@ -97,14 +97,14 @@ class DateParserES(DateParser):
|
||||
DateParser.init_strings(self)
|
||||
_span_1 = ['de']
|
||||
_span_2 = ['a']
|
||||
_range_1 = ['entre', 'ent\.', 'ent']
|
||||
_range_1 = ['entre', r'ent\.', 'ent']
|
||||
_range_2 = ['y']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)), re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -98,12 +98,12 @@ class DateParserFI(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._text2 = re.compile('(\d+)?\.?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._span = re.compile("(?P<start>.+)\s+(-)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._span = re.compile(r"(?P<start>.+)\s+(-)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
"(vuosien\s*)?(?P<start>.+)\s+ja\s+(?P<stop>.+)\s+välillä",
|
||||
r"(vuosien\s*)?(?P<start>.+)\s+ja\s+(?P<stop>.+)\s+välillä",
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -79,15 +79,27 @@ class DateParserHR(DateParser):
|
||||
#~ 'персидский' : Date.CAL_PERSIAN,
|
||||
#~ 'п' : Date.CAL_PERSIAN,
|
||||
#~ })
|
||||
|
||||
# match 'Day. MONTH year.' format with or without dots
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*\.?$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
|
||||
# match Day.Month.Year.
|
||||
self._numeric = re.compile(
|
||||
r"((\d+)[/\. ])?\s*((\d+)[/\.])?\s*(\d+)\.?$")
|
||||
|
||||
self._jtext2 = re.compile(r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
|
||||
_span_1 = ['od']
|
||||
_span_2 = ['do']
|
||||
_range_1 = ['između']
|
||||
_range_2 = ['i']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@@ -105,11 +117,35 @@ class DateDisplayHR(DateDisplay):
|
||||
|
||||
display = DateDisplay.display_formatted
|
||||
|
||||
def format_short_month_year(self, month, year, inflect, short_months):
|
||||
""" Allow a subclass to modify the year, e.g. add a period """
|
||||
if not hasattr(short_months[1], 'f'): # not a Lexeme: no inflection
|
||||
return "{short_month} {year}.".format(
|
||||
short_month = short_months[month], year = year)
|
||||
return self.FORMATS_short_month_year[inflect].format(
|
||||
short_month = short_months[month], year = year)
|
||||
|
||||
def _get_localized_year(self, year):
|
||||
""" Allow a subclass to modify the year, e.g. add a period """
|
||||
return year + '.'
|
||||
|
||||
# FIXME probably there should be a Croatian-specific "formats" (and this
|
||||
# ("American comma") format (and dd_dformat03 too) should be eliminated)
|
||||
def dd_dformat02(self, date_val, inflect, long_months):
|
||||
""" month_name day, year """
|
||||
return DateDisplay.dd_dformat02(
|
||||
self, date_val, inflect, long_months).replace(' .', '')
|
||||
|
||||
def dd_dformat04(self, date_val, inflect, long_months):
|
||||
""" day month_name year """
|
||||
return DateDisplay.dd_dformat04(
|
||||
self, date_val, inflect, long_months).replace(' .', '')
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Register classes
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
register_datehandler(
|
||||
('hr_HR', 'hr', 'HR', 'croatian', 'Croatian', 'hrvatski', ('%d.%m.%Y',)),
|
||||
('hr_HR', 'hr', 'HR', 'croatian', 'Croatian', 'hrvatski', ('%d.%m.%Y.',)),
|
||||
DateParserHR, DateDisplayHR)
|
||||
|
||||
@@ -228,18 +228,19 @@ class DateParserHU(DateParser):
|
||||
DateParser.init_strings(self)
|
||||
|
||||
self._numeric = re.compile(
|
||||
"((\d+)[/\.])?\s*((\d+)[/\.])?\s*(\d+)[/\. ]?$")
|
||||
self._text2 = re.compile('((\d+)(/\d+)?\.)?\s+?%s\.?\s*(\d+\.)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
_span_1 = ['-tó\(ő\)l', '-tól', '-től']
|
||||
r"((\d+)[/\.])?\s*((\d+)[/\.])?\s*(\d+)[/\. ]?$")
|
||||
# this next RE has the (possibly-slashed) year at the string's start
|
||||
self._text2 = re.compile(r'((\d+)(/\d+)?\.)?\s+?%s\.?\s*(\d+\.)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
_span_1 = [r'-tó\(ő\)l', '-tól', '-től']
|
||||
_span_2 = ['-ig']
|
||||
_range_1 = ['és']
|
||||
_range_2 = ['között']
|
||||
self._span = re.compile("(?P<start>.+)(%s)\s+(?P<stop>.+)(%s)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(?P<start>.+)\s+(%s)\s+(?P<stop>.+)\s+(%s)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(?P<start>.+)(%s)\s+(?P<stop>.+)(%s)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(?P<start>.+)\s+(%s)\s+(?P<stop>.+)\s+(%s)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
|
||||
@@ -90,22 +90,23 @@ class DateParserIs(DateParser):
|
||||
}
|
||||
|
||||
def dhformat_changed(self):
|
||||
self._dhformat_parse = re.compile(".*%(\S).*%(\S).*%(\S).*%(\S).*")
|
||||
self._dhformat_parse = re.compile(r".*%(\S).*%(\S).*%(\S).*%(\S).*")
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
|
||||
# match 'day. month year' format
|
||||
self._text2 = re.compile('(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
# match 'short-day day.month year' format
|
||||
short_day_str = '(' + '|'.join(self._ds.short_days[1:]) + ')'
|
||||
self._numeric = re.compile("%s\s*((\d+)[\.]\s*)?((\d+)\s*)?(\d+)\s*$"
|
||||
self._numeric = re.compile(r"%s\s*((\d+)[\.]\s*)?((\d+)\s*)?(\d+)\s*$"
|
||||
% short_day_str, re.IGNORECASE)
|
||||
self._span = re.compile("(frá)?\s*(?P<start>.+)\s*(til|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(milli)\s+(?P<start>.+)\s+og\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(frá)?\s*(?P<start>.+)\s*(til|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(milli)\s+(?P<start>.+)\s+og\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -185,7 +186,8 @@ class DateDisplayIs(DateDisplay):
|
||||
text, scal)
|
||||
|
||||
def _get_weekday(self, date_val):
|
||||
if date_val[0] == 0 or date_val[1] == 0: # no day or no month or both
|
||||
if (date_val[0] == 0 or date_val[1] == 0 # no day or no month or both
|
||||
or date_val[2] > datetime.MAXYEAR): # bug 10815
|
||||
return ''
|
||||
w_day = datetime.date(date_val[2], date_val[1], date_val[0]) # y, m, d
|
||||
return self.short_days[((w_day.weekday() + 1) % 7) + 1]
|
||||
|
||||
@@ -96,12 +96,12 @@ class DateParserIT(DateParser):
|
||||
_span_2 = ['al', 'a']
|
||||
_range_1 = ['tra', 'fra']
|
||||
_range_2 = ['e']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -166,13 +166,13 @@ class DateParserJA(DateParser):
|
||||
_span_2 = ['まで', '']
|
||||
_range_1 = ['から', 'と', '~', '〜']
|
||||
_range_2 = ['までの間', 'の間']
|
||||
self._span = re.compile("(?P<start>.+)(%s)(?P<stop>\d+)(%s)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(?P<start>.+)(%s)(?P<stop>.+)(%s)" %
|
||||
self._span = re.compile(r"(?P<start>.+)(%s)(?P<stop>\d+)(%s)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(?P<start>.+)(%s)(?P<stop>.+)(%s)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._numeric = re.compile("((\d+)年\s*)?((\d+)月\s*)?(\d+)?日?\s*$")
|
||||
self._numeric = re.compile(r"((\d+)年\s*)?((\d+)月\s*)?(\d+)?日?\s*$")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -130,18 +130,20 @@ class DateParserLT(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._text2 = re.compile('((\d+)(/\d+)?)?\s+?m\.\s+%s\s*(\d+)?\s*d?\.?$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
# this next RE has the (possibly-slashed) year at the string's start
|
||||
self._text2 = re.compile(
|
||||
r'((\d+)(/\d+)?)?\s+?m\.\s+%s\s*(\d+)?\s*d?\.?$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
_span_1 = ['nuo']
|
||||
_span_2 = ['iki']
|
||||
_range_1 = ['tarp']
|
||||
_range_2 = ['ir']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)), re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -186,7 +188,7 @@ class DateDisplayLT(DateDisplay):
|
||||
"mmmm m. mėnesio diena d.", "Mėn diena, metai")
|
||||
# this definition must agree with its "_display_gregorian" method
|
||||
|
||||
def _display_gregorian(self, date_val):
|
||||
def _display_gregorian(self, date_val, **kwargs):
|
||||
"""
|
||||
display gregorian calendar date in different format
|
||||
"""
|
||||
|
||||
@@ -58,6 +58,7 @@ class DateParserNb(DateParser):
|
||||
'innen' : Date.MOD_BEFORE,
|
||||
'etter' : Date.MOD_AFTER,
|
||||
'omkring' : Date.MOD_ABOUT,
|
||||
'omtrent' : Date.MOD_ABOUT,
|
||||
'ca' : Date.MOD_ABOUT
|
||||
}
|
||||
|
||||
@@ -89,12 +90,13 @@ class DateParserNb(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
# match day. month year
|
||||
self._numeric = re.compile("((\d+)[\.])?\s*((\d+))?\s*(\d+)$")
|
||||
self._span = re.compile("(fra)?\s*(?P<start>.+)\s*(til|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(mellom)\s+(?P<start>.+)\s+og\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._numeric = re.compile(
|
||||
r"((\d+)[/\.\s]\s*)?((\d+)[/\.\-\s]\s*)?(\d+)\s*$")
|
||||
self._span = re.compile(
|
||||
r"(fra)?\s*(?P<start>.+)\s*(til|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(mellom)\s+(?P<start>.+)\s+og\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -173,6 +175,10 @@ class DateDisplayNb(DateDisplay):
|
||||
return "%s%s%s%s" % (qual_str, self._mod_str[mod],
|
||||
text, scal)
|
||||
|
||||
def dd_dformat01(self, date_val):
|
||||
""" numerical -- for Norwegian dates """
|
||||
return DateDisplay.dd_dformat01(self, date_val).lstrip()
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Register classes
|
||||
|
||||
@@ -119,16 +119,14 @@ class DateParserNL(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._span = re.compile("(van)\s+(?P<start>.+)\s+(tot)\s+(?P<stop>.+)",
|
||||
self._span = re.compile(
|
||||
r"(van)\s+(?P<start>.+)\s+(tot)\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
self._range = re.compile(r"tussen\s+(?P<start>.+)\s+en\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("tussen\s+(?P<start>.+)\s+en\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._text2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._mon_str,
|
||||
re.IGNORECASE)
|
||||
self._jtext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._jmon_str,
|
||||
re.IGNORECASE)
|
||||
self._text2 = re.compile(r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._jtext2 = re.compile(r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -164,7 +162,7 @@ class DateDisplayNL(DateDisplay):
|
||||
)
|
||||
# this definition must agree with its "_display_gregorian" method
|
||||
|
||||
def _display_gregorian(self, date_val):
|
||||
def _display_gregorian(self, date_val, **kwargs):
|
||||
"""
|
||||
display gregorian calendar date in different format
|
||||
"""
|
||||
|
||||
@@ -156,13 +156,16 @@ class DateParserPL(DateParser):
|
||||
|
||||
def init_strings(self):
|
||||
DateParser.init_strings(self)
|
||||
self._span = re.compile("(od)\s+(?P<start>.+)\s+(do)\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(od)\s+(?P<start>.+)\s+(do)\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
# Also handle a common mistakes
|
||||
self._range = re.compile("((?:po)?mi(?:ę|e)dzy)\s+(?P<start>.+)\s+(a)\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
self._text2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._mon_str,
|
||||
re.IGNORECASE)
|
||||
self._jtext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?' % self._jmon_str,
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"((?:po)?mi(?:ę|e)dzy)\s+(?P<start>.+)\s+(a)\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._text2 = re.compile(r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._jtext2 = re.compile(r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -215,7 +218,7 @@ class DateDisplayPL(DateDisplay):
|
||||
"XII"
|
||||
)
|
||||
|
||||
def _display_gregorian(self, date_val):
|
||||
def _display_gregorian(self, date_val, **kwargs):
|
||||
"""
|
||||
display gregorian calendar date in different format
|
||||
"""
|
||||
|
||||
@@ -102,13 +102,13 @@ class DateParserPT(DateParser):
|
||||
DateParser.init_strings(self)
|
||||
_span_1 = ['de']
|
||||
_span_2 = ['a']
|
||||
_range_1 = ['entre','ent\.','ent']
|
||||
_range_1 = ['entre', r'ent\.', 'ent']
|
||||
_range_2 = ['e']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -94,13 +94,13 @@ class DateParserRU(DateParser):
|
||||
_span_1 = ['с', 'от']
|
||||
#_span_2 = ['по', 'до'] # <-- clashes with bce parsing :-(
|
||||
_span_2 = ['по']
|
||||
_range_1 = ['между', 'меж\.', 'меж']
|
||||
_range_1 = ['между', r'меж\.', 'меж']
|
||||
_range_2 = ['и']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -86,11 +86,11 @@ class DateParserSK(DateParser):
|
||||
_span_2 = ['do']
|
||||
_range_1 = ['medzi']
|
||||
_range_2 = ['a']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -88,18 +88,18 @@ class DateParserSL(DateParser):
|
||||
|
||||
DateParser.init_strings(self)
|
||||
# match 'Day. MONTH year.' format with or without dots
|
||||
self._text2 = re.compile('(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*\.?$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s*?%s\.?\s*((\d+)(/\d+)?)?\s*\.?$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
# match Day.Month.Year.
|
||||
self._numeric = re.compile("((\d+)[/\.-])?\s*((\d+)[/\.-])?\s*(\d+)\.?$")
|
||||
self._numeric = re.compile(
|
||||
r"((\d+)[/\.-])?\s*((\d+)[/\.-])?\s*(\d+)\.?$")
|
||||
|
||||
self._span = re.compile("od\s+(?P<start>.+)\s+do\s+(?P<stop>.+)",
|
||||
self._span = re.compile(r"od\s+(?P<start>.+)\s+do\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
"med\s+(?P<start>.+)\s+in\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._jtext2 = re.compile('(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'\
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
r"med\s+(?P<start>.+)\s+in\s+(?P<stop>.+)", re.IGNORECASE)
|
||||
self._jtext2 = re.compile(r'(\d+)?.?\s+?%s\s*((\d+)(/\d+)?)?'
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -208,21 +208,22 @@ class DateParserSR(DateParser):
|
||||
"""
|
||||
DateParser.init_strings(self)
|
||||
# match 'Day. MONTH year.' format with or without dots
|
||||
self._text2 = re.compile('(\d+)?\.?\s*?%s\s*((\d+)(/\d+)?)?\.?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._text2 = re.compile(r'(\d+)?\.?\s*?%s\s*((\d+)(/\d+)?)?\.?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
|
||||
# match Day.Month.Year.
|
||||
self._numeric = re.compile("((\d+)[/\. ])?\s*((\d+)[/\.])?\s*(\d+)\.?$")
|
||||
self._numeric = re.compile(
|
||||
r"((\d+)[/\. ])?\s*((\d+)[/\.])?\s*(\d+)\.?$")
|
||||
|
||||
_span_1 = ['od', 'од']
|
||||
_span_2 = ['do', 'до']
|
||||
_range_1 = ['između', 'између']
|
||||
_range_2 = ['i', 'и']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
@@ -240,7 +241,7 @@ class DateDisplaySR_Base(DateDisplay):
|
||||
"VII", "VIII", "IX", "X", "XI", "XII"
|
||||
)
|
||||
|
||||
def _display_gregorian(self, date_val):
|
||||
def _display_gregorian(self, date_val, **kwargs):
|
||||
"""
|
||||
display gregorian calendar date in different format
|
||||
"""
|
||||
|
||||
@@ -95,10 +95,16 @@ class DateParserSv(DateParser):
|
||||
def init_strings(self):
|
||||
""" Define, in Swedish, span and range regular expressions"""
|
||||
DateParser.init_strings(self)
|
||||
self._span = re.compile("(från)?\s*(?P<start>.+)\s*(till|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(mellan)\s+(?P<start>.+)\s+och\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._numeric = re.compile(r"((\d+)/)?\s*((\d+)/)?\s*(\d+)[/ ]?$")
|
||||
# this next RE has the (possibly-slashed) year at the string's start
|
||||
self._text2 = re.compile(r'((\d+)(/\d+)?)?\s+?%s\s*(\d+)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._span = re.compile(
|
||||
r"(från)?\s*(?P<start>.+)\s*(till|--|–)\s*(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(mellan)\s+(?P<start>.+)\s+och\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -109,72 +115,70 @@ class DateDisplaySv(DateDisplay):
|
||||
"""
|
||||
Swedish language date display class.
|
||||
"""
|
||||
long_months = ( "", "januari", "februari", "mars", "april", "maj",
|
||||
"juni", "juli", "augusti", "september", "oktober",
|
||||
"november", "december" )
|
||||
|
||||
short_months = ( "", "jan", "feb", "mar", "apr", "maj", "jun",
|
||||
"jul", "aug", "sep", "okt", "nov", "dec" )
|
||||
_bce_str = "%s f Kr"
|
||||
|
||||
formats = (
|
||||
"ÅÅÅÅ-MM-DD (ISO)",
|
||||
"År/mån/dag",
|
||||
"Månad dag, år",
|
||||
"MÅN DAG ÅR",
|
||||
"Dag månad år",
|
||||
"DAG MÅN ÅR",
|
||||
"År månad dag",
|
||||
"År mån dag",
|
||||
)
|
||||
# this must agree with DateDisplayEn's "formats" definition
|
||||
# (since no locale-specific _display_gregorian exists, here)
|
||||
# this definition must agree with its "_display_calendar" method
|
||||
|
||||
calendar = (
|
||||
"",
|
||||
"juliansk",
|
||||
"hebreisk",
|
||||
"fransk republikansk",
|
||||
"persisk",
|
||||
"islamisk",
|
||||
"svensk"
|
||||
)
|
||||
def _display_calendar(self, date_val, long_months, short_months = None,
|
||||
inflect=""):
|
||||
# this must agree with its locale-specific "formats" definition
|
||||
|
||||
_mod_str = ("", "före ", "efter ", "c:a ", "", "", "")
|
||||
if short_months is None:
|
||||
# Let the short formats work the same as long formats
|
||||
short_months = long_months
|
||||
|
||||
_qual_str = ("", "uppskattat ", "beräknat ")
|
||||
|
||||
_bce_str = "%s f Kr"
|
||||
|
||||
def display(self, date):
|
||||
"""
|
||||
Return a text string representing the date.
|
||||
"""
|
||||
mod = date.get_modifier()
|
||||
cal = date.get_calendar()
|
||||
qual = date.get_quality()
|
||||
start = date.get_start_date()
|
||||
newyear = date.get_new_year()
|
||||
|
||||
qual_str = self._qual_str[qual]
|
||||
|
||||
if mod == Date.MOD_TEXTONLY:
|
||||
return date.get_text()
|
||||
elif start == Date.EMPTY:
|
||||
return ""
|
||||
elif mod == Date.MOD_SPAN:
|
||||
d1 = self.display_cal[cal](start)
|
||||
d2 = self.display_cal[cal](date.get_stop_date())
|
||||
scal = self.format_extras(cal, newyear)
|
||||
return "%sfrån %s till %s%s" % (qual_str, d1, d2, scal)
|
||||
elif mod == Date.MOD_RANGE:
|
||||
d1 = self.display_cal[cal](start)
|
||||
d2 = self.display_cal[cal](date.get_stop_date())
|
||||
scal = self.format_extras(cal, newyear)
|
||||
return "%smellan %s och %s%s" % (qual_str, d1, d2,
|
||||
scal)
|
||||
if self.format == 0:
|
||||
return self.display_iso(date_val)
|
||||
elif self.format == 1:
|
||||
# numerical: year/month/day (with slashes)
|
||||
value = self.dd_dformat01(date_val)
|
||||
elif self.format == 2:
|
||||
# year month_name day
|
||||
value = self.dd_dformat02_sv(date_val, long_months)
|
||||
# elif self.format == 3:
|
||||
else:
|
||||
text = self.display_cal[date.get_calendar()](start)
|
||||
scal = self.format_extras(cal, newyear)
|
||||
return "%s%s%s%s" % (qual_str, self._mod_str[mod],
|
||||
text, scal)
|
||||
# year month_abbreviation day
|
||||
value = self.dd_dformat03_sv(date_val, short_months)
|
||||
if date_val[2] < 0:
|
||||
# TODO fix BUG 7064: non-Gregorian calendars wrongly use BCE notation for negative dates
|
||||
return self._bce_str % value
|
||||
else:
|
||||
return value
|
||||
|
||||
def dd_dformat02_sv(self, date_val, long_months):
|
||||
# year month_name day
|
||||
year = self._slash_year(date_val[2], date_val[3])
|
||||
if date_val[0] == 0:
|
||||
if date_val[1] == 0:
|
||||
return year
|
||||
else:
|
||||
return "%s %s" % (year, long_months[date_val[1]])
|
||||
elif date_val[1] == 0: # month is zero but day is not (see 8477)
|
||||
return self.display_iso(date_val)
|
||||
else:
|
||||
return "%s %s %s" % (year, long_months[date_val[1]], date_val[0])
|
||||
|
||||
def dd_dformat03_sv(self, date_val, short_months):
|
||||
# year month_abbreviation day
|
||||
year = self._slash_year(date_val[2], date_val[3])
|
||||
if date_val[0] == 0:
|
||||
if date_val[1] == 0:
|
||||
return year
|
||||
else:
|
||||
return "%s %s" % (year, short_months[date_val[1]])
|
||||
elif date_val[1] == 0: # month is zero but day is not (see 8477)
|
||||
return self.display_iso(date_val)
|
||||
else:
|
||||
return "%s %s %s" % (year, short_months[date_val[1]], date_val[0])
|
||||
|
||||
display = DateDisplay.display_formatted
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -108,14 +108,14 @@ class DateParserUK(DateParser):
|
||||
|
||||
_span_1 = ['з', 'від']
|
||||
# b.c.e. pattern also have "до" so skip "до н."
|
||||
_span_2 = ['по', 'до(?!\s+н)']
|
||||
_span_2 = ['по', r'до(?!\s+н)']
|
||||
_range_1 = ['між']
|
||||
_range_2 = ['і', 'та']
|
||||
self._span = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
self._span = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)\s+(?P<start>.+)\s+(%s)\s+(?P<stop>.+)"
|
||||
% ('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@@ -124,13 +124,13 @@ class DateParserZH_CN(DateParser):
|
||||
_span_2 = ['至']
|
||||
_range_1 = ['介于']
|
||||
_range_2 = ['与']
|
||||
self._span = re.compile("(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
self._span = re.compile(r"(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._numeric = re.compile("((\d+)年\s*)?((\d+)月\s*)?(\d+)?日?\s*$")
|
||||
self._numeric = re.compile(r"((\d+)年\s*)?((\d+)月\s*)?(\d+)?日?\s*$")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -124,13 +124,13 @@ class DateParserZH_TW(DateParser):
|
||||
_span_2 = ['至']
|
||||
_range_1 = ['介於']
|
||||
_range_2 = ['與']
|
||||
self._span = re.compile("(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
self._span = re.compile(r"(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
('|'.join(_span_1), '|'.join(_span_2)),
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(r"(%s)(?P<start>.+)(%s)(?P<stop>\d+)" %
|
||||
('|'.join(_range_1), '|'.join(_range_2)),
|
||||
re.IGNORECASE)
|
||||
self._numeric = re.compile("((\d+)年\s*)?((\d+)月\s*)?(\d+)?日?\s*$")
|
||||
self._numeric = re.compile(r"((\d+)年\s*)?((\d+)月\s*)?(\d+)?日?\s*$")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
# Copyright (C) 2004-2006 Donald N. Allingham
|
||||
# Copyright (C) 2013 Vassilii Khachaturov
|
||||
# Copyright (C) 2014-2017 Paul Franklin
|
||||
# Copyright (C) 2014-2018 Paul Franklin
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -342,6 +342,7 @@ class DateDisplay:
|
||||
for item in [scal, snewyear]:
|
||||
if item:
|
||||
if retval:
|
||||
# TODO for Arabic, should the next comma be translated?
|
||||
retval += ", "
|
||||
retval += item
|
||||
if retval:
|
||||
@@ -569,6 +570,7 @@ class DateDisplay:
|
||||
def _get_short_weekday(self, date_val):
|
||||
if (date_val[0] == 0 or date_val[1] == 0 # no day or no month or both
|
||||
or date_val[1] == 13 # Hebrew has 13 months
|
||||
or date_val[2] > datetime.MAXYEAR # bug 10815
|
||||
or date_val[2] < 0): # B.C.E. date
|
||||
return ''
|
||||
w_day = datetime.date(date_val[2], date_val[1], date_val[0]) # y, m, d
|
||||
@@ -577,11 +579,16 @@ class DateDisplay:
|
||||
def _get_long_weekday(self, date_val):
|
||||
if (date_val[0] == 0 or date_val[1] == 0 # no day or no month or both
|
||||
or date_val[1] == 13 # Hebrew has 13 months
|
||||
or date_val[2] > datetime.MAXYEAR # bug 10815
|
||||
or date_val[2] < 0): # B.C.E. date
|
||||
return ''
|
||||
w_day = datetime.date(date_val[2], date_val[1], date_val[0]) # y, m, d
|
||||
return self.long_days[((w_day.weekday() + 1) % 7) + 1]
|
||||
|
||||
def _get_localized_year(self, year):
|
||||
""" Allow a subclass to modify the year, e.g. add a period """
|
||||
return year
|
||||
|
||||
def dd_dformat01(self, date_val):
|
||||
"""
|
||||
numerical
|
||||
@@ -593,22 +600,29 @@ class DateDisplay:
|
||||
return self.display_iso(date_val)
|
||||
else:
|
||||
if date_val[0] == date_val[1] == 0:
|
||||
return str(date_val[2])
|
||||
return self._get_localized_year(str(date_val[2]))
|
||||
else:
|
||||
value = self.dhformat.replace('%m', str(date_val[1]))
|
||||
# some locales have %b for the month, e.g. ar_EG, is_IS, nb_NO
|
||||
# so it would be "Jan" but as it's "numeric" I'll make it "1"
|
||||
value = value.replace('%b', str(date_val[1]))
|
||||
# some locales have %B for the month, e.g. ta_IN
|
||||
# so it would be "January" but as it's "numeric" I'll make it 1
|
||||
value = value.replace('%B', str(date_val[1]))
|
||||
# some locales have %a for the abbreviated day, e.g. is_IS
|
||||
value = value.replace('%a', self._get_short_weekday(date_val))
|
||||
# some locales have %A for the long/full day, e.g. ta_IN
|
||||
value = value.replace('%A', self._get_long_weekday(date_val))
|
||||
if '%b' in value or '%B' in value:
|
||||
# some locales have %b for the month (ar_EG, is_IS, nb_NO)
|
||||
# so it would be "Jan" but as it's "numeric" make it "1"
|
||||
value = value.replace('%b', str(date_val[1]))
|
||||
# some locales have %B for the month, e.g. ta_IN
|
||||
# so it would be "January" but as it's "numeric" make it 1
|
||||
value = value.replace('%B', str(date_val[1]))
|
||||
if '%a' in value or '%A' in value:
|
||||
# some locales have %a for the abbreviated day, e.g. is_IS
|
||||
value = value.replace('%a',
|
||||
self._get_short_weekday(date_val))
|
||||
# some locales have %A for the long/full day, e.g. ta_IN
|
||||
value = value.replace('%A',
|
||||
self._get_long_weekday(date_val))
|
||||
if date_val[0] == 0: # ignore the zero day and its delimiter
|
||||
i_day = value.find('%d')
|
||||
value = value.replace(value[i_day:i_day+3], '')
|
||||
if len(value) == i_day + 2: # delimiter is left of the day
|
||||
value = value.replace(value[i_day-1:i_day+2], '')
|
||||
else: # delimiter is to the right of the day
|
||||
value = value.replace(value[i_day:i_day+3], '')
|
||||
value = value.replace('%d', str(date_val[0]))
|
||||
value = value.replace('%Y', str(abs(date_val[2])))
|
||||
return value.replace('-', '/')
|
||||
@@ -624,7 +638,7 @@ class DateDisplay:
|
||||
year = self._slash_year(date_val[2], date_val[3])
|
||||
if date_val[0] == 0:
|
||||
if date_val[1] == 0:
|
||||
return year
|
||||
return self._get_localized_year(year)
|
||||
else:
|
||||
return self.format_long_month_year(date_val[1], year,
|
||||
inflect, long_months)
|
||||
@@ -650,7 +664,7 @@ class DateDisplay:
|
||||
year = self._slash_year(date_val[2], date_val[3])
|
||||
if date_val[0] == 0:
|
||||
if date_val[1] == 0:
|
||||
return year
|
||||
return self._get_localized_year(year)
|
||||
else:
|
||||
return self.format_short_month_year(date_val[1], year,
|
||||
inflect, short_months)
|
||||
@@ -676,7 +690,7 @@ class DateDisplay:
|
||||
year = self._slash_year(date_val[2], date_val[3])
|
||||
if date_val[0] == 0:
|
||||
if date_val[1] == 0:
|
||||
return year
|
||||
return self._get_localized_year(year)
|
||||
else:
|
||||
return self.format_long_month_year(date_val[1], year,
|
||||
inflect, long_months)
|
||||
@@ -702,7 +716,7 @@ class DateDisplay:
|
||||
year = self._slash_year(date_val[2], date_val[3])
|
||||
if date_val[0] == 0:
|
||||
if date_val[1] == 0:
|
||||
return year
|
||||
return self._get_localized_year(year)
|
||||
else:
|
||||
return self.format_short_month_year(date_val[1], year,
|
||||
inflect, short_months)
|
||||
|
||||
@@ -193,7 +193,7 @@ class DateParser:
|
||||
converted, the text string is assigned.
|
||||
"""
|
||||
|
||||
_dhformat_parse = re.compile(".*%(\S).*%(\S).*%(\S).*")
|
||||
_dhformat_parse = re.compile(r".*%(\S).*%(\S).*%(\S).*")
|
||||
|
||||
# RFC-2822 only uses capitalized English abbreviated names, no locales.
|
||||
_rfc_days = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')
|
||||
@@ -423,62 +423,69 @@ class DateParser:
|
||||
# bce, calendar type and quality may be either at the end or at
|
||||
# the beginning of the given date string, therefore they will
|
||||
# be parsed from the middle and will be in match.group(2).
|
||||
self._bce_re = re.compile("(.*)\s+%s( ?.*)" % self._bce_str)
|
||||
self._bce_re = re.compile(r"(.*)\s+%s( ?.*)" % self._bce_str)
|
||||
|
||||
self._cal = re.compile("(.*)\s+\(%s\)( ?.*)" % self._cal_str,
|
||||
re.IGNORECASE)
|
||||
self._calny = re.compile("(.*)\s+\(%s,\s*%s\)( ?.*)" % (self._cal_str,
|
||||
self._ny_str),
|
||||
re.IGNORECASE)
|
||||
self._calny_iso = re.compile("(.*)\s+\(%s,\s*(\d{1,2}-\d{1,2})\)( ?.*)" % self._cal_str,
|
||||
re.IGNORECASE)
|
||||
self._cal = re.compile(r"(.*)\s+\(%s\)( ?.*)" % self._cal_str,
|
||||
re.IGNORECASE)
|
||||
self._calny = re.compile(r"(.*)\s+\(%s,\s*%s\)( ?.*)" %
|
||||
(self._cal_str, self._ny_str), re.IGNORECASE)
|
||||
self._calny_iso = re.compile(
|
||||
r"(.*)\s+\(%s,\s*(\d{1,2}-\d{1,2})\)( ?.*)" % self._cal_str,
|
||||
re.IGNORECASE)
|
||||
|
||||
self._ny = re.compile("(.*)\s+\(%s\)( ?.*)" % self._ny_str,
|
||||
re.IGNORECASE)
|
||||
self._ny_iso = re.compile("(.*)\s+\((\d{1,2}-\d{1,2})\)( ?.*)")
|
||||
self._ny = re.compile(r"(.*)\s+\(%s\)( ?.*)" % self._ny_str,
|
||||
re.IGNORECASE)
|
||||
self._ny_iso = re.compile(r"(.*)\s+\((\d{1,2}-\d{1,2})\)( ?.*)")
|
||||
|
||||
self._qual = re.compile("(.* ?)%s\s+(.+)" % self._qual_str,
|
||||
re.IGNORECASE)
|
||||
self._qual = re.compile(r"(.* ?)%s\s+(.+)" % self._qual_str,
|
||||
re.IGNORECASE)
|
||||
|
||||
self._span = re.compile("(from)\s+(?P<start>.+)\s+to\s+(?P<stop>.+)",
|
||||
self._span = re.compile(r"(from)\s+(?P<start>.+)\s+to\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile(
|
||||
r"(bet|bet.|between)\s+(?P<start>.+)\s+and\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._modifier = re.compile(r'%s\s+(.*)' % self._mod_str,
|
||||
re.IGNORECASE)
|
||||
self._range = re.compile("(bet|bet.|between)\s+(?P<start>.+)\s+and\s+(?P<stop>.+)",
|
||||
re.IGNORECASE)
|
||||
self._modifier = re.compile('%s\s+(.*)' % self._mod_str,
|
||||
re.IGNORECASE)
|
||||
self._modifier_after = re.compile('(.*)\s+%s' % self._mod_after_str,
|
||||
self._modifier_after = re.compile(r'(.*)\s+%s' % self._mod_after_str,
|
||||
re.IGNORECASE)
|
||||
self._abt2 = re.compile('<(.*)>', re.IGNORECASE)
|
||||
self._text = re.compile('%s\.?\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._mon_str,
|
||||
re.IGNORECASE)
|
||||
self._text2 = re.compile('(\d+)?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$' % self._mon_str,
|
||||
re.IGNORECASE)
|
||||
self._jtext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._jmon_str,
|
||||
re.IGNORECASE)
|
||||
self._jtext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._jmon_str,
|
||||
re.IGNORECASE)
|
||||
self._ftext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._fmon_str,
|
||||
re.IGNORECASE)
|
||||
self._ftext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._fmon_str,
|
||||
re.IGNORECASE)
|
||||
self._ptext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._pmon_str,
|
||||
re.IGNORECASE)
|
||||
self._ptext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._pmon_str,
|
||||
re.IGNORECASE)
|
||||
self._itext = re.compile('%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._imon_str,
|
||||
re.IGNORECASE)
|
||||
self._itext2 = re.compile('(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$' % self._imon_str,
|
||||
re.IGNORECASE)
|
||||
self._stext = re.compile('%s\.?\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$' % self._smon_str,
|
||||
re.IGNORECASE)
|
||||
self._stext2 = re.compile('(\d+)?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$' % self._smon_str,
|
||||
re.IGNORECASE)
|
||||
self._numeric = re.compile("((\d+)[/\.]\s*)?((\d+)[/\.]\s*)?(\d+)\s*$")
|
||||
self._iso = re.compile("(\d+)(/(\d+))?-(\d+)-(\d+)\s*$")
|
||||
self._isotimestamp = re.compile("^\s*?(\d{4})([01]\d)([0123]\d)(?:(?:[012]\d[0-5]\d[0-5]\d)|(?:\s+[012]\d:[0-5]\d(?::[0-5]\d)?))?\s*?$")
|
||||
self._rfc = re.compile("(%s,)?\s+(\d|\d\d)\s+%s\s+(\d+)\s+\d\d:\d\d(:\d\d)?\s+(\+|-)\d\d\d\d"
|
||||
% (self._rfc_day_str, self._rfc_mon_str))
|
||||
self._today = re.compile("^\s*%s\s*$" % self._today_str, re.IGNORECASE)
|
||||
self._abt2 = re.compile('<(.*)>', re.IGNORECASE)
|
||||
self._text = re.compile(r'%s\.?(\s+\d+)?\s*,?\s+((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
# this next RE has the (possibly-slashed) year at the string's end
|
||||
self._text2 = re.compile(r'(\d+)?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._mon_str, re.IGNORECASE)
|
||||
self._jtext = re.compile(r'%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
self._jtext2 = re.compile(r'(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._jmon_str, re.IGNORECASE)
|
||||
self._ftext = re.compile(r'%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._fmon_str, re.IGNORECASE)
|
||||
self._ftext2 = re.compile(r'(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._fmon_str, re.IGNORECASE)
|
||||
self._ptext = re.compile(r'%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._pmon_str, re.IGNORECASE)
|
||||
self._ptext2 = re.compile(r'(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._pmon_str, re.IGNORECASE)
|
||||
self._itext = re.compile(r'%s\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._imon_str, re.IGNORECASE)
|
||||
self._itext2 = re.compile(r'(\d+)?\s+?%s\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._imon_str, re.IGNORECASE)
|
||||
self._stext = re.compile(r'%s\.?\s+(\d+)?\s*,?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._smon_str, re.IGNORECASE)
|
||||
self._stext2 = re.compile(r'(\d+)?\s+?%s\.?\s*((\d+)(/\d+)?)?\s*$'
|
||||
% self._smon_str, re.IGNORECASE)
|
||||
self._numeric = re.compile(
|
||||
r"((\d+)[/\.]\s*)?((\d+)[/\.]\s*)?(\d+)\s*$")
|
||||
self._iso = re.compile(r"(\d+)(/(\d+))?-(\d+)-(\d+)\s*$")
|
||||
self._isotimestamp = re.compile(
|
||||
r"^\s*?(\d{4})([01]\d)([0123]\d)(?:(?:[012]\d[0-5]\d[0-5]\d)|"
|
||||
r"(?:\s+[012]\d:[0-5]\d(?::[0-5]\d)?))?\s*?$")
|
||||
self._rfc = re.compile(
|
||||
r"(%s,)?\s+(\d|\d\d)\s+%s\s+(\d+)\s+\d\d:\d\d(:\d\d)?\s+"
|
||||
r"(\+|-)\d\d\d\d" % (self._rfc_day_str, self._rfc_mon_str))
|
||||
self._today = re.compile(r"^\s*%s\s*$" % self._today_str,
|
||||
re.IGNORECASE)
|
||||
|
||||
def _get_int(self, val):
|
||||
"""
|
||||
@@ -521,7 +528,7 @@ class DateParser:
|
||||
|
||||
def _parse_calendar(self, text, regex1, regex2, mmap, check=None):
|
||||
match = regex1.match(text.lower())
|
||||
if match:
|
||||
if match: # user typed in 'month-name day year' or 'month-name year'
|
||||
groups = match.groups()
|
||||
if groups[0] is None:
|
||||
m = 0
|
||||
@@ -534,19 +541,21 @@ class DateParser:
|
||||
s = False
|
||||
else:
|
||||
d = self._get_int(groups[1])
|
||||
if groups[4] is not None: # slash year "/80"
|
||||
if groups[4] is not None:
|
||||
y = int(groups[3]) + 1 # fullyear + 1
|
||||
s = True
|
||||
else: # regular, non-slash date
|
||||
s = True # slash year
|
||||
else: # regular year
|
||||
y = int(groups[3])
|
||||
s = False
|
||||
value = (d, m, y, s)
|
||||
if check and not check((d, m, y)):
|
||||
if s and julian_valid(value): # slash year
|
||||
pass
|
||||
elif check and not check((d, m, y)):
|
||||
value = Date.EMPTY
|
||||
return value
|
||||
|
||||
match = regex2.match(text.lower())
|
||||
if match:
|
||||
if match: # user typed in day month-name year or year month-name day
|
||||
groups = match.groups()
|
||||
if self.ymd:
|
||||
if groups[3] is None:
|
||||
@@ -558,10 +567,10 @@ class DateParser:
|
||||
y = None
|
||||
s = False
|
||||
else:
|
||||
if groups[2] is not None: # slash year digit
|
||||
if groups[2] is not None:
|
||||
y = int(groups[1]) + 1 # fullyear + 1
|
||||
s = True
|
||||
else: # regular, non-slash year
|
||||
s = True # slash year
|
||||
else: # regular year
|
||||
y = int(groups[1])
|
||||
s = False
|
||||
else:
|
||||
@@ -574,10 +583,10 @@ class DateParser:
|
||||
y = None
|
||||
s = False
|
||||
else:
|
||||
if groups[4] is not None: # slash year digit
|
||||
if groups[4] is not None:
|
||||
y = int(groups[3]) + 1 # fullyear + 1
|
||||
s = True
|
||||
else: # regular, non-slash year
|
||||
s = True # slash year
|
||||
else: # regular year
|
||||
y = int(groups[3])
|
||||
s = False
|
||||
value = (d, m, y, s)
|
||||
@@ -618,8 +627,8 @@ class DateParser:
|
||||
y = self._get_int(groups[0])
|
||||
m = self._get_int(groups[3])
|
||||
d = self._get_int(groups[4])
|
||||
if groups[2] and julian_valid((d, m, y + 1)): # slash year digit
|
||||
return (d, m, y + 1, True)
|
||||
if groups[2] and julian_valid((d, m, y + 1)):
|
||||
return (d, m, y + 1, True) # slash year
|
||||
if check is None or check((d, m, y)):
|
||||
return (d, m, y, False)
|
||||
return Date.EMPTY
|
||||
@@ -669,6 +678,15 @@ class DateParser:
|
||||
y = self._get_int(groups[1])
|
||||
m = self._get_int(groups[3])
|
||||
d = self._get_int(groups[4])
|
||||
if m > 12: # maybe a slash year, not a month (1722/3 is March)
|
||||
if y % 100 == 99:
|
||||
modyear = (y + 1) % 1000
|
||||
elif y % 10 == 9:
|
||||
modyear = (y + 1) % 100
|
||||
else:
|
||||
modyear = (y + 1) % 10
|
||||
if m == modyear:
|
||||
return (0, 0, y + 1, True) # slash year
|
||||
else:
|
||||
y = self._get_int(groups[4])
|
||||
if self.dmy:
|
||||
@@ -681,6 +699,15 @@ class DateParser:
|
||||
else:
|
||||
m = self._get_int(groups[1])
|
||||
d = self._get_int(groups[3])
|
||||
if m > 12: # maybe a slash year, not a month
|
||||
if m % 100 == 99:
|
||||
modyear = (m + 1) % 1000
|
||||
elif m % 10 == 9:
|
||||
modyear = (m + 1) % 100
|
||||
else:
|
||||
modyear = (m + 1) % 10
|
||||
if y == modyear:
|
||||
return (0, 0, m + 1, True) # slash year
|
||||
value = (d, m, y, False)
|
||||
if check and not check((d, m, y)):
|
||||
value = Date.EMPTY
|
||||
@@ -906,8 +933,6 @@ class DateParser:
|
||||
if subdate == Date.EMPTY and text != "":
|
||||
date.set_as_text(text)
|
||||
return
|
||||
#else:
|
||||
# print 'valid subdate', text, subdate
|
||||
except:
|
||||
date.set_as_text(text)
|
||||
return
|
||||
|
||||
+79
-38
@@ -605,12 +605,15 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_citation_handles(self, sort_handles=False):
|
||||
def get_citation_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Citation in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Citation title.
|
||||
:param sort_handles: If True, the list is sorted by Citation title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
@@ -624,24 +627,30 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_family_handles(self, sort_handles=False):
|
||||
def get_family_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Family in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by surnames.
|
||||
:param sort_handles: If True, the list is sorted by surnames.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
|
||||
.. warning:: For speed the keys are directly returned, so handles are
|
||||
bytes type
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_media_handles(self, sort_handles=False):
|
||||
def get_media_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Media in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by title.
|
||||
:param sort_handles: If True, the list is sorted by title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
|
||||
.. warning:: For speed the keys are directly returned, so handles are
|
||||
bytes type
|
||||
@@ -658,24 +667,30 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_person_handles(self, sort_handles=False):
|
||||
def get_person_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Person in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by surnames.
|
||||
:param sort_handles: If True, the list is sorted by surnames.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
|
||||
.. warning:: For speed the keys are directly returned, so handles are
|
||||
bytes type
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_place_handles(self, sort_handles=False):
|
||||
def get_place_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Place in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Place title.
|
||||
:param sort_handles: If True, the list is sorted by Place title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
|
||||
.. warning:: For speed the keys are directly returned, so handles are
|
||||
bytes type
|
||||
@@ -692,24 +707,30 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_source_handles(self, sort_handles=False):
|
||||
def get_source_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Source in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Source title.
|
||||
:param sort_handles: If True, the list is sorted by Source title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
|
||||
.. warning:: For speed the keys are directly returned, so handles are
|
||||
bytes type
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_tag_handles(self, sort_handles=False):
|
||||
def get_tag_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Tag in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Tag name.
|
||||
:param sort_handles: If True, the list is sorted by Tag name.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
|
||||
.. warning:: For speed the keys are directly returned, so handles are
|
||||
bytes type
|
||||
@@ -826,12 +847,6 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_gramps_ids(self, obj_key):
|
||||
"""
|
||||
Returns all the keys from a table given a table name
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_mediapath(self):
|
||||
"""
|
||||
Return the default media path of the database.
|
||||
@@ -1003,12 +1018,6 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def has_gramps_id(self, obj_key, gramps_id):
|
||||
"""
|
||||
Returns True if the key exists in table given a table name
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def has_citation_gramps_id(self, gramps_id):
|
||||
"""
|
||||
Return True if the Gramps ID exists in the Citation table.
|
||||
@@ -1395,12 +1404,6 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def set_save_path(self, path):
|
||||
"""
|
||||
Set the save path for the database.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_dbid(self):
|
||||
"""
|
||||
A unique ID for this database on this computer.
|
||||
@@ -1413,6 +1416,50 @@ class DbReadBase:
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_summary(self):
|
||||
"""
|
||||
Returns dictionary of summary item.
|
||||
Should include, if possible:
|
||||
|
||||
_("Number of people")
|
||||
_("Version")
|
||||
_("Data version")
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def requires_login(self):
|
||||
"""
|
||||
Returns True for backends that require a login dialog, else False.
|
||||
"""
|
||||
return False
|
||||
|
||||
def method(self, fmt, *args):
|
||||
"""
|
||||
Convenience function to return database methods.
|
||||
|
||||
:param fmt: Method format string.
|
||||
:type fmt: str
|
||||
:param args: Substitutions arguments.
|
||||
:type args: str
|
||||
:returns: Returns a database method or None.
|
||||
:rtype: method
|
||||
|
||||
Examples::
|
||||
|
||||
db.method('get_%s_from_handle, 'Person')
|
||||
Returns the get_person_from_handle method.
|
||||
|
||||
db.method('get_%s_from_%s, 'Event', 'gramps_id')
|
||||
Returns the get_event_from_gramps_id method.
|
||||
|
||||
db.method('get_%s_handles, 'Attribute')
|
||||
Returns None. Attribute is not a primary object.
|
||||
|
||||
.. warning:: Formats 'iter_%s' and 'get_number_of_%s' are not yet
|
||||
implemented.
|
||||
"""
|
||||
return getattr(self, fmt % tuple([arg.lower() for arg in args]), None)
|
||||
|
||||
|
||||
class DbWriteBase(DbReadBase):
|
||||
"""
|
||||
@@ -1750,12 +1797,6 @@ class DbWriteBase(DbReadBase):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def write_version(self, name):
|
||||
"""
|
||||
Write version number for a newly created DB.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def add_child_to_family(self, family, child,
|
||||
mrel=ChildRefType(),
|
||||
frel=ChildRefType(),
|
||||
|
||||
+38
-40
@@ -68,6 +68,7 @@ from .dbconst import DBLOGNAME
|
||||
from ..errors import HandleError
|
||||
from ..utils.callback import Callback
|
||||
from ..lib import Researcher
|
||||
from ..const import GRAMPS_LOCALE as glocale
|
||||
|
||||
LOG = logging.getLogger(DBLOGNAME)
|
||||
|
||||
@@ -215,8 +216,9 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
"""
|
||||
Create a new DummyDb instance.
|
||||
"""
|
||||
DbReadBase.__init__(self)
|
||||
Callback.__init__(self)
|
||||
self.basedb = None
|
||||
self.__feature = {} # {"feature": VALUE, ...}
|
||||
self.db_is_open = False
|
||||
self.readonly = True
|
||||
self.name_formats = []
|
||||
@@ -531,12 +533,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("handle %s does not exist in the dummy database", handle)
|
||||
raise HandleError('Handle %s not found' % handle)
|
||||
|
||||
def get_family_handles(self, sort_handles=False):
|
||||
def get_family_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Family in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by surnames.
|
||||
:param sort_handles: If True, the list is sorted by surnames.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -551,14 +556,6 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("database is closed")
|
||||
return []
|
||||
|
||||
def get_gramps_ids(self, obj_key):
|
||||
"""
|
||||
Returns all the keys from a table given a table name
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
return []
|
||||
|
||||
def get_media_attribute_types(self):
|
||||
"""
|
||||
Return a list of all Attribute types associated with Media and MediaRef
|
||||
@@ -584,12 +581,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("database is closed")
|
||||
return []
|
||||
|
||||
def get_media_handles(self, sort_handles=False):
|
||||
def get_media_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Media in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by title.
|
||||
:param sort_handles: If True, the list is sorted by title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -834,12 +834,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("handle %s does not exist in the dummy database", handle)
|
||||
raise HandleError('Handle %s not found' % handle)
|
||||
|
||||
def get_person_handles(self, sort_handles=False):
|
||||
def get_person_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Person in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by surnames.
|
||||
:param sort_handles: If True, the list is sorted by surnames.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -892,12 +895,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("handle %s does not exist in the dummy database", handle)
|
||||
raise HandleError('Handle %s not found' % handle)
|
||||
|
||||
def get_place_handles(self, sort_handles=False):
|
||||
def get_place_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Place in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Place title.
|
||||
:param sort_handles: If True, the list is sorted by Place title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -1102,12 +1108,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("handle %s does not exist in the dummy database", handle)
|
||||
raise HandleError('Handle %s not found' % handle)
|
||||
|
||||
def get_source_handles(self, sort_handles=False):
|
||||
def get_source_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Source in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Source title.
|
||||
:param sort_handles: If True, the list is sorted by Source title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -1160,12 +1169,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("handle %s does not exist in the dummy database", handle)
|
||||
raise HandleError('Handle %s not found' % handle)
|
||||
|
||||
def get_citation_handles(self, sort_handles=False):
|
||||
def get_citation_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Citation in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Citation title.
|
||||
:param sort_handles: If True, the list is sorted by Citation title.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -1209,12 +1221,15 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("tag name %s does not exist in the dummy database", val)
|
||||
return None
|
||||
|
||||
def get_tag_handles(self, sort_handles=False):
|
||||
def get_tag_handles(self, sort_handles=False, locale=glocale):
|
||||
"""
|
||||
Return a list of database handles, one handle for each Tag in
|
||||
the database.
|
||||
|
||||
If sort_handles is True, the list is sorted by Tag name.
|
||||
:param sort_handles: If True, the list is sorted by Tag name.
|
||||
:type sort_handles: bool
|
||||
:param locale: The locale to use for collation.
|
||||
:type locale: A GrampsLocale object.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
@@ -1254,16 +1269,6 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
LOG.warning("database is closed")
|
||||
return False
|
||||
|
||||
def has_gramps_id(self, obj_key, gramps_id):
|
||||
"""
|
||||
Returns True if the key exists in table given a table name
|
||||
|
||||
Not used in current codebase
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
return False
|
||||
|
||||
def has_name_group_key(self, name):
|
||||
"""
|
||||
Return if a key exists in the name_group table.
|
||||
@@ -1626,13 +1631,6 @@ class DummyDb(M_A_M_B("NewBaseClass", (DbReadBase, Callback, object,), {})):
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
|
||||
def set_save_path(self, path):
|
||||
"""
|
||||
Set the save path for the database.
|
||||
"""
|
||||
if not self.db_is_open:
|
||||
LOG.warning("database is closed")
|
||||
|
||||
def get_dbid(self):
|
||||
"""
|
||||
A unique ID for this database on this computer.
|
||||
|
||||
@@ -343,6 +343,23 @@ class PythonUpgradeRequiredError(Exception):
|
||||
'db_python_version': self.db_python_version,
|
||||
'current_python_version': self.current_python_version }
|
||||
|
||||
class DbConnectionError(Exception):
|
||||
"""
|
||||
Error used to report that a database connection failed.
|
||||
"""
|
||||
def __init__(self, msg, settings_file):
|
||||
Exception.__init__(self)
|
||||
self.msg = msg
|
||||
self.settings_file = settings_file
|
||||
|
||||
def __str__(self):
|
||||
return _('Database connection failed.\n\n'
|
||||
'%(message)s\n'
|
||||
'Please check your connection settings file:\n'
|
||||
'%(settings_file)s') % {
|
||||
'message': self.msg,
|
||||
'settings_file': self.settings_file}
|
||||
|
||||
if __name__ == "__main__":
|
||||
"""
|
||||
Call this from the CLI (in order to find the imported modules):
|
||||
|
||||
+148
-181
@@ -42,14 +42,15 @@ import glob
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from . import (DbReadBase, DbWriteBase, DbUndo, DBLOGNAME, DBUNDOFN,
|
||||
KEY_TO_CLASS_MAP, REFERENCE_KEY, PERSON_KEY, FAMILY_KEY,
|
||||
REFERENCE_KEY, PERSON_KEY, FAMILY_KEY,
|
||||
CITATION_KEY, SOURCE_KEY, EVENT_KEY, MEDIA_KEY, PLACE_KEY,
|
||||
REPOSITORY_KEY, NOTE_KEY, TAG_KEY)
|
||||
REPOSITORY_KEY, NOTE_KEY, TAG_KEY, TXNADD, TXNUPD, TXNDEL,
|
||||
KEY_TO_NAME_MAP, DBMODE_R, DBMODE_W)
|
||||
from .utils import write_lock_file, clear_lock_file
|
||||
from ..errors import HandleError
|
||||
from ..utils.callback import Callback
|
||||
from ..updatecallback import UpdateCallback
|
||||
from .bookmarks import DbBookmarks
|
||||
from . import exceptions
|
||||
|
||||
from ..utils.id import create_id
|
||||
from ..lib.researcher import Researcher
|
||||
@@ -132,6 +133,8 @@ class DbGenericUndo(DbUndo):
|
||||
transaction = txn
|
||||
db = self.db
|
||||
subitems = transaction.get_recnos()
|
||||
# sigs[obj_type][trans_type]
|
||||
sigs = [[[] for trans_type in range(3)] for key in range(11)]
|
||||
|
||||
# Process all records in the transaction
|
||||
try:
|
||||
@@ -141,17 +144,13 @@ class DbGenericUndo(DbUndo):
|
||||
pickle.loads(self.undodb[record_id])
|
||||
|
||||
if key == REFERENCE_KEY:
|
||||
self.undo_reference(new_data, handle)
|
||||
self.db.undo_reference(new_data, handle)
|
||||
else:
|
||||
self.undo_data(new_data, handle, key)
|
||||
self.db.undo_data(new_data, handle, key)
|
||||
sigs[key][trans_type].append(handle)
|
||||
# now emit the signals
|
||||
for record_id in subitems:
|
||||
(key, trans_type, handle, old_data, new_data) = \
|
||||
pickle.loads(self.undodb[record_id])
|
||||
self.undo_sigs(sigs, False)
|
||||
|
||||
if key != REFERENCE_KEY:
|
||||
self.undo_signals(new_data, handle, key,
|
||||
db.emit, SIGBASE[key])
|
||||
self.db._txn_commit()
|
||||
except:
|
||||
self.db._txn_abort()
|
||||
@@ -183,6 +182,8 @@ class DbGenericUndo(DbUndo):
|
||||
transaction = txn
|
||||
db = self.db
|
||||
subitems = transaction.get_recnos(reverse=True)
|
||||
# sigs[obj_type][trans_type]
|
||||
sigs = [[[] for trans_type in range(3)] for key in range(11)]
|
||||
|
||||
# Process all records in the transaction
|
||||
try:
|
||||
@@ -192,17 +193,13 @@ class DbGenericUndo(DbUndo):
|
||||
pickle.loads(self.undodb[record_id])
|
||||
|
||||
if key == REFERENCE_KEY:
|
||||
self.undo_reference(old_data, handle)
|
||||
self.db.undo_reference(old_data, handle)
|
||||
else:
|
||||
self.undo_data(old_data, handle, key)
|
||||
self.db.undo_data(old_data, handle, key)
|
||||
sigs[key][trans_type].append(handle)
|
||||
# now emit the signals
|
||||
for record_id in subitems:
|
||||
(key, trans_type, handle, old_data, new_data) = \
|
||||
pickle.loads(self.undodb[record_id])
|
||||
self.undo_sigs(sigs, True)
|
||||
|
||||
if key != REFERENCE_KEY:
|
||||
self.undo_signals(old_data, handle, key,
|
||||
db.emit, SIGBASE[key])
|
||||
self.db._txn_commit()
|
||||
except:
|
||||
self.db._txn_abort()
|
||||
@@ -224,53 +221,34 @@ class DbGenericUndo(DbUndo):
|
||||
db.undo_history_callback()
|
||||
return True
|
||||
|
||||
def undo_reference(self, data, handle):
|
||||
def undo_sigs(self, sigs, undo):
|
||||
"""
|
||||
Helper method to undo a reference map entry
|
||||
Helper method to undo/redo the signals for changes made
|
||||
We want to do deletes and adds first
|
||||
Note that if 'undo' we swap emits
|
||||
"""
|
||||
if data is None:
|
||||
sql = ("DELETE FROM reference " +
|
||||
"WHERE obj_handle = ? AND ref_handle = ?")
|
||||
self.db.dbapi.execute(sql, [handle[0], handle[1]])
|
||||
else:
|
||||
sql = ("INSERT INTO reference " +
|
||||
"(obj_handle, obj_class, ref_handle, ref_class) " +
|
||||
"VALUES(?, ?, ?, ?)")
|
||||
self.db.dbapi.execute(sql, data)
|
||||
|
||||
def undo_data(self, data, handle, obj_key):
|
||||
"""
|
||||
Helper method to undo/redo the changes made
|
||||
"""
|
||||
cls = KEY_TO_CLASS_MAP[obj_key]
|
||||
table = cls.lower()
|
||||
if data is None:
|
||||
sql = "DELETE FROM %s WHERE handle = ?" % table
|
||||
self.db.dbapi.execute(sql, [handle])
|
||||
else:
|
||||
if self.db.has_handle(obj_key, handle):
|
||||
sql = "UPDATE %s SET blob_data = ? WHERE handle = ?" % table
|
||||
self.db.dbapi.execute(sql, [pickle.dumps(data), handle])
|
||||
else:
|
||||
sql = "INSERT INTO %s (handle, blob_data) VALUES (?, ?)" % table
|
||||
self.db.dbapi.execute(sql, [handle, pickle.dumps(data)])
|
||||
obj = self.db._get_table_func(cls)["class_func"].create(data)
|
||||
self.db._update_secondary_values(obj)
|
||||
|
||||
def undo_signals(self, data, handle, obj_key, emit, signal_root):
|
||||
"""
|
||||
Helper method to undo/redo the changes made
|
||||
"""
|
||||
cls = KEY_TO_CLASS_MAP[obj_key]
|
||||
table = cls.lower()
|
||||
if data is None:
|
||||
emit(signal_root + '-delete', ([handle],))
|
||||
else:
|
||||
if self.db.has_handle(obj_key, handle):
|
||||
signal = signal_root + '-update'
|
||||
else:
|
||||
signal = signal_root + '-add'
|
||||
emit(signal, ([handle],))
|
||||
for trans_type in [TXNDEL, TXNADD, TXNUPD]:
|
||||
for obj_type in range(11):
|
||||
handles = sigs[obj_type][trans_type]
|
||||
if handles:
|
||||
if not undo and trans_type == TXNDEL \
|
||||
or undo and trans_type == TXNADD:
|
||||
typ = '-delete'
|
||||
else:
|
||||
# don't update a handle if its been deleted, and note
|
||||
# that 'deleted' handles are in the 'add' list if we
|
||||
# are undoing
|
||||
handles = [handle for handle in handles
|
||||
if handle not in
|
||||
sigs[obj_type][TXNADD if undo else TXNDEL]]
|
||||
if ((not undo) and trans_type == TXNADD) \
|
||||
or (undo and trans_type == TXNDEL):
|
||||
typ = '-add'
|
||||
else: # TXNUPD
|
||||
typ = '-update'
|
||||
if handles:
|
||||
self.db.emit(KEY_TO_NAME_MAP[obj_type] + typ,
|
||||
(handles,))
|
||||
|
||||
class Cursor:
|
||||
def __init__(self, iterator):
|
||||
@@ -518,7 +496,6 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
"del_func": self.remove_tag,
|
||||
}
|
||||
}
|
||||
self.set_save_path(directory)
|
||||
self.readonly = False
|
||||
self.db_is_open = False
|
||||
self.name_formats = []
|
||||
@@ -566,29 +543,58 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
if directory:
|
||||
self.load(directory)
|
||||
|
||||
def _initialize(self, directory):
|
||||
def _initialize(self, directory, username, password):
|
||||
"""
|
||||
Initialize database backend.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def load(self, directory, callback=None, mode=None,
|
||||
def __check_readonly(self, name):
|
||||
"""
|
||||
Return True if we don't have read/write access to the database,
|
||||
otherwise return False (that is, we DO have read/write access)
|
||||
"""
|
||||
# In-memory databases always allow write access.
|
||||
if name == ':memory:':
|
||||
return False
|
||||
|
||||
# See if we write to the target directory at all?
|
||||
if not os.access(name, os.W_OK):
|
||||
return True
|
||||
|
||||
# See if we lack write access to the database file
|
||||
path = os.path.join(name, 'sqlite.db')
|
||||
if os.path.isfile(path) and not os.access(path, os.W_OK):
|
||||
return True
|
||||
|
||||
# All tests passed. Inform caller that we are NOT read only
|
||||
return False
|
||||
|
||||
def load(self, directory, callback=None, mode=DBMODE_W,
|
||||
force_schema_upgrade=False,
|
||||
force_bsddb_upgrade=False,
|
||||
force_bsddb_downgrade=False,
|
||||
force_python_upgrade=False,
|
||||
update=True):
|
||||
update=True,
|
||||
username=None,
|
||||
password=None):
|
||||
"""
|
||||
If update is False: then don't update any files
|
||||
"""
|
||||
db_schema_version = self.get_schema_version(directory)
|
||||
current_schema_version = self.VERSION[0]
|
||||
if db_schema_version != current_schema_version:
|
||||
raise exceptions.DbVersionError(str(db_schema_version),
|
||||
str(current_schema_version),
|
||||
str(current_schema_version))
|
||||
if self.__check_readonly(directory):
|
||||
mode = DBMODE_R
|
||||
|
||||
self.readonly = mode == DBMODE_R
|
||||
|
||||
if not self.readonly and directory != ':memory:':
|
||||
write_lock_file(directory)
|
||||
|
||||
# run backend-specific code:
|
||||
self._initialize(directory)
|
||||
self._initialize(directory, username, password)
|
||||
|
||||
if not self._schema_exists():
|
||||
self._create_schema()
|
||||
self._set_metadata('version', str(self.VERSION[0]))
|
||||
|
||||
# Load metadata
|
||||
self.name_formats = self._get_metadata('name_formats')
|
||||
@@ -627,7 +633,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
# surname list
|
||||
self.surname_list = self.get_surname_list()
|
||||
|
||||
self.set_save_path(directory)
|
||||
self._set_save_path(directory)
|
||||
|
||||
if self._directory:
|
||||
self.undolog = os.path.join(self._directory, DBUNDOFN)
|
||||
else:
|
||||
@@ -663,8 +670,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
Close the database.
|
||||
if update is False, don't change access times, etc.
|
||||
"""
|
||||
if self._directory:
|
||||
if update:
|
||||
if self._directory != ":memory:":
|
||||
if update and not self.readonly:
|
||||
# This is just a dummy file to indicate last modified time of
|
||||
# the database for gramps.cli.clidbman:
|
||||
filename = os.path.join(self._directory, "meta_data.db")
|
||||
@@ -723,6 +730,12 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
self._set_metadata('nmap_index', self.nmap_index)
|
||||
|
||||
self._close()
|
||||
|
||||
try:
|
||||
clear_lock_file(self.get_save_path())
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
self.db_is_open = False
|
||||
self._directory = None
|
||||
|
||||
@@ -754,13 +767,6 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
"""Return True when the file has a supported version."""
|
||||
return True
|
||||
|
||||
def get_schema_version(self, directory=None):
|
||||
"""
|
||||
Get the version of the schema that the database was created
|
||||
under. Assumes 18, if not found.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def _get_table_func(self, table=None, func=None):
|
||||
"""
|
||||
Private implementation of get_table_func.
|
||||
@@ -774,45 +780,6 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_table_names(self):
|
||||
"""Return a list of valid table names."""
|
||||
return list(self._get_table_func())
|
||||
|
||||
def get_table_metadata(self, table_name):
|
||||
"""Return the metadata for a valid table name."""
|
||||
if table_name in self._get_table_func():
|
||||
return self._get_table_func(table_name)
|
||||
return None
|
||||
|
||||
def get_from_name_and_handle(self, table_name, handle):
|
||||
"""
|
||||
Returns a gen.lib object (or None) given table_name and
|
||||
handle.
|
||||
|
||||
Examples:
|
||||
|
||||
>>> self.get_from_name_and_handle("Person", "a7ad62365bc652387008")
|
||||
>>> self.get_from_name_and_handle("Media", "c3434653675bcd736f23")
|
||||
"""
|
||||
if table_name in self._get_table_func() and handle:
|
||||
return self._get_table_func(table_name, "handle_func")(handle)
|
||||
return None
|
||||
|
||||
def get_from_name_and_gramps_id(self, table_name, gramps_id):
|
||||
"""
|
||||
Returns a gen.lib object (or None) given table_name and
|
||||
Gramps ID.
|
||||
|
||||
Examples:
|
||||
|
||||
>>> self.get_from_name_and_gramps_id("Person", "I00002")
|
||||
>>> self.get_from_name_and_gramps_id("Family", "F056")
|
||||
>>> self.get_from_name_and_gramps_id("Media", "M00012")
|
||||
"""
|
||||
if table_name in self._get_table_func():
|
||||
return self._get_table_func(table_name, "gramps_id_func")(gramps_id)
|
||||
return None
|
||||
|
||||
def _txn_begin(self):
|
||||
"""
|
||||
Lowlevel interface to the backend transaction.
|
||||
@@ -1034,7 +1001,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
Helper function for find_next_<object>_gramps_id methods
|
||||
"""
|
||||
index = prefix % map_index
|
||||
while self.has_gramps_id(obj_key, index):
|
||||
while self._has_gramps_id(obj_key, index):
|
||||
map_index += 1
|
||||
index = prefix % map_index
|
||||
map_index += 1
|
||||
@@ -1136,7 +1103,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
#
|
||||
################################################################
|
||||
|
||||
def get_number_of(self, obj_key):
|
||||
def _get_number_of(self, obj_key):
|
||||
"""
|
||||
Return the number of objects currently in the database.
|
||||
"""
|
||||
@@ -1146,61 +1113,61 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
"""
|
||||
Return the number of people currently in the database.
|
||||
"""
|
||||
return self.get_number_of(PERSON_KEY)
|
||||
return self._get_number_of(PERSON_KEY)
|
||||
|
||||
def get_number_of_events(self):
|
||||
"""
|
||||
Return the number of events currently in the database.
|
||||
"""
|
||||
return self.get_number_of(EVENT_KEY)
|
||||
return self._get_number_of(EVENT_KEY)
|
||||
|
||||
def get_number_of_places(self):
|
||||
"""
|
||||
Return the number of places currently in the database.
|
||||
"""
|
||||
return self.get_number_of(PLACE_KEY)
|
||||
return self._get_number_of(PLACE_KEY)
|
||||
|
||||
def get_number_of_tags(self):
|
||||
"""
|
||||
Return the number of tags currently in the database.
|
||||
"""
|
||||
return self.get_number_of(TAG_KEY)
|
||||
return self._get_number_of(TAG_KEY)
|
||||
|
||||
def get_number_of_families(self):
|
||||
"""
|
||||
Return the number of families currently in the database.
|
||||
"""
|
||||
return self.get_number_of(FAMILY_KEY)
|
||||
return self._get_number_of(FAMILY_KEY)
|
||||
|
||||
def get_number_of_notes(self):
|
||||
"""
|
||||
Return the number of notes currently in the database.
|
||||
"""
|
||||
return self.get_number_of(NOTE_KEY)
|
||||
return self._get_number_of(NOTE_KEY)
|
||||
|
||||
def get_number_of_citations(self):
|
||||
"""
|
||||
Return the number of citations currently in the database.
|
||||
"""
|
||||
return self.get_number_of(CITATION_KEY)
|
||||
return self._get_number_of(CITATION_KEY)
|
||||
|
||||
def get_number_of_sources(self):
|
||||
"""
|
||||
Return the number of sources currently in the database.
|
||||
"""
|
||||
return self.get_number_of(SOURCE_KEY)
|
||||
return self._get_number_of(SOURCE_KEY)
|
||||
|
||||
def get_number_of_media(self):
|
||||
"""
|
||||
Return the number of media objects currently in the database.
|
||||
"""
|
||||
return self.get_number_of(MEDIA_KEY)
|
||||
return self._get_number_of(MEDIA_KEY)
|
||||
|
||||
def get_number_of_repositories(self):
|
||||
"""
|
||||
Return the number of source repositories currently in the database.
|
||||
"""
|
||||
return self.get_number_of(REPOSITORY_KEY)
|
||||
return self._get_number_of(REPOSITORY_KEY)
|
||||
|
||||
################################################################
|
||||
#
|
||||
@@ -1208,7 +1175,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
#
|
||||
################################################################
|
||||
|
||||
def get_gramps_ids(self, obj_key):
|
||||
def _get_gramps_ids(self, obj_key):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each object in the
|
||||
database.
|
||||
@@ -1220,63 +1187,63 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
Return a list of Gramps IDs, one ID for each Person in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(PERSON_KEY)
|
||||
return self._get_gramps_ids(PERSON_KEY)
|
||||
|
||||
def get_family_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Family in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(FAMILY_KEY)
|
||||
return self._get_gramps_ids(FAMILY_KEY)
|
||||
|
||||
def get_source_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Source in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(SOURCE_KEY)
|
||||
return self._get_gramps_ids(SOURCE_KEY)
|
||||
|
||||
def get_citation_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Citation in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(CITATION_KEY)
|
||||
return self._get_gramps_ids(CITATION_KEY)
|
||||
|
||||
def get_event_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Event in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(EVENT_KEY)
|
||||
return self._get_gramps_ids(EVENT_KEY)
|
||||
|
||||
def get_media_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Media in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(MEDIA_KEY)
|
||||
return self._get_gramps_ids(MEDIA_KEY)
|
||||
|
||||
def get_place_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Place in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(PLACE_KEY)
|
||||
return self._get_gramps_ids(PLACE_KEY)
|
||||
|
||||
def get_repository_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Repository in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(REPOSITORY_KEY)
|
||||
return self._get_gramps_ids(REPOSITORY_KEY)
|
||||
|
||||
def get_note_gramps_ids(self):
|
||||
"""
|
||||
Return a list of Gramps IDs, one ID for each Note in the
|
||||
database.
|
||||
"""
|
||||
return self.get_gramps_ids(NOTE_KEY)
|
||||
return self._get_gramps_ids(NOTE_KEY)
|
||||
|
||||
################################################################
|
||||
#
|
||||
@@ -1289,7 +1256,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
raise HandleError('Handle is None')
|
||||
if not handle:
|
||||
raise HandleError('Handle is empty')
|
||||
data = self.get_raw_data(obj_key, handle)
|
||||
data = self._get_raw_data(obj_key, handle)
|
||||
if data:
|
||||
return obj_class.create(data)
|
||||
else:
|
||||
@@ -1373,41 +1340,41 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
#
|
||||
################################################################
|
||||
|
||||
def has_handle(self, obj_key, handle):
|
||||
def _has_handle(self, obj_key, handle):
|
||||
"""
|
||||
Return True if the handle exists in the database.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def has_person_handle(self, handle):
|
||||
return self.has_handle(PERSON_KEY, handle)
|
||||
return self._has_handle(PERSON_KEY, handle)
|
||||
|
||||
def has_family_handle(self, handle):
|
||||
return self.has_handle(FAMILY_KEY, handle)
|
||||
return self._has_handle(FAMILY_KEY, handle)
|
||||
|
||||
def has_source_handle(self, handle):
|
||||
return self.has_handle(SOURCE_KEY, handle)
|
||||
return self._has_handle(SOURCE_KEY, handle)
|
||||
|
||||
def has_citation_handle(self, handle):
|
||||
return self.has_handle(CITATION_KEY, handle)
|
||||
return self._has_handle(CITATION_KEY, handle)
|
||||
|
||||
def has_event_handle(self, handle):
|
||||
return self.has_handle(EVENT_KEY, handle)
|
||||
return self._has_handle(EVENT_KEY, handle)
|
||||
|
||||
def has_media_handle(self, handle):
|
||||
return self.has_handle(MEDIA_KEY, handle)
|
||||
return self._has_handle(MEDIA_KEY, handle)
|
||||
|
||||
def has_place_handle(self, handle):
|
||||
return self.has_handle(PLACE_KEY, handle)
|
||||
return self._has_handle(PLACE_KEY, handle)
|
||||
|
||||
def has_repository_handle(self, handle):
|
||||
return self.has_handle(REPOSITORY_KEY, handle)
|
||||
return self._has_handle(REPOSITORY_KEY, handle)
|
||||
|
||||
def has_note_handle(self, handle):
|
||||
return self.has_handle(NOTE_KEY, handle)
|
||||
return self._has_handle(NOTE_KEY, handle)
|
||||
|
||||
def has_tag_handle(self, handle):
|
||||
return self.has_handle(TAG_KEY, handle)
|
||||
return self._has_handle(TAG_KEY, handle)
|
||||
|
||||
################################################################
|
||||
#
|
||||
@@ -1415,35 +1382,35 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
#
|
||||
################################################################
|
||||
|
||||
def has_gramps_id(self, obj_key, gramps_id):
|
||||
def _has_gramps_id(self, obj_key, gramps_id):
|
||||
raise NotImplementedError
|
||||
|
||||
def has_person_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(PERSON_KEY, gramps_id)
|
||||
return self._has_gramps_id(PERSON_KEY, gramps_id)
|
||||
|
||||
def has_family_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(FAMILY_KEY, gramps_id)
|
||||
return self._has_gramps_id(FAMILY_KEY, gramps_id)
|
||||
|
||||
def has_source_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(SOURCE_KEY, gramps_id)
|
||||
return self._has_gramps_id(SOURCE_KEY, gramps_id)
|
||||
|
||||
def has_citation_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(CITATION_KEY, gramps_id)
|
||||
return self._has_gramps_id(CITATION_KEY, gramps_id)
|
||||
|
||||
def has_event_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(EVENT_KEY, gramps_id)
|
||||
return self._has_gramps_id(EVENT_KEY, gramps_id)
|
||||
|
||||
def has_media_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(MEDIA_KEY, gramps_id)
|
||||
return self._has_gramps_id(MEDIA_KEY, gramps_id)
|
||||
|
||||
def has_place_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(PLACE_KEY, gramps_id)
|
||||
return self._has_gramps_id(PLACE_KEY, gramps_id)
|
||||
|
||||
def has_repository_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(REPOSITORY_KEY, gramps_id)
|
||||
return self._has_gramps_id(REPOSITORY_KEY, gramps_id)
|
||||
|
||||
def has_note_gramps_id(self, gramps_id):
|
||||
return self.has_gramps_id(NOTE_KEY, gramps_id)
|
||||
return self._has_gramps_id(NOTE_KEY, gramps_id)
|
||||
|
||||
################################################################
|
||||
#
|
||||
@@ -1679,41 +1646,41 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
#
|
||||
################################################################
|
||||
|
||||
def get_raw_data(self, obj_key, handle):
|
||||
def _get_raw_data(self, obj_key, handle):
|
||||
"""
|
||||
Return raw (serialized and pickled) object from handle.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_raw_person_data(self, handle):
|
||||
return self.get_raw_data(PERSON_KEY, handle)
|
||||
return self._get_raw_data(PERSON_KEY, handle)
|
||||
|
||||
def get_raw_family_data(self, handle):
|
||||
return self.get_raw_data(FAMILY_KEY, handle)
|
||||
return self._get_raw_data(FAMILY_KEY, handle)
|
||||
|
||||
def get_raw_source_data(self, handle):
|
||||
return self.get_raw_data(SOURCE_KEY, handle)
|
||||
return self._get_raw_data(SOURCE_KEY, handle)
|
||||
|
||||
def get_raw_citation_data(self, handle):
|
||||
return self.get_raw_data(CITATION_KEY, handle)
|
||||
return self._get_raw_data(CITATION_KEY, handle)
|
||||
|
||||
def get_raw_event_data(self, handle):
|
||||
return self.get_raw_data(EVENT_KEY, handle)
|
||||
return self._get_raw_data(EVENT_KEY, handle)
|
||||
|
||||
def get_raw_media_data(self, handle):
|
||||
return self.get_raw_data(MEDIA_KEY, handle)
|
||||
return self._get_raw_data(MEDIA_KEY, handle)
|
||||
|
||||
def get_raw_place_data(self, handle):
|
||||
return self.get_raw_data(PLACE_KEY, handle)
|
||||
return self._get_raw_data(PLACE_KEY, handle)
|
||||
|
||||
def get_raw_repository_data(self, handle):
|
||||
return self.get_raw_data(REPOSITORY_KEY, handle)
|
||||
return self._get_raw_data(REPOSITORY_KEY, handle)
|
||||
|
||||
def get_raw_note_data(self, handle):
|
||||
return self.get_raw_data(NOTE_KEY, handle)
|
||||
return self._get_raw_data(NOTE_KEY, handle)
|
||||
|
||||
def get_raw_tag_data(self, handle):
|
||||
return self.get_raw_data(TAG_KEY, handle)
|
||||
return self._get_raw_data(TAG_KEY, handle)
|
||||
|
||||
################################################################
|
||||
#
|
||||
@@ -2398,7 +2365,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
def get_save_path(self):
|
||||
return self._directory
|
||||
|
||||
def set_save_path(self, directory):
|
||||
def _set_save_path(self, directory):
|
||||
self._directory = directory
|
||||
if directory:
|
||||
self.full_name = os.path.abspath(self._directory)
|
||||
@@ -2450,7 +2417,7 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
_("Number of repositories"): self.get_number_of_repositories(),
|
||||
_("Number of notes"): self.get_number_of_notes(),
|
||||
_("Number of tags"): self.get_number_of_tags(),
|
||||
_("Data version"): ".".join([str(v) for v in self.VERSION]),
|
||||
_("Schema version"): ".".join([str(v) for v in self.VERSION]),
|
||||
}
|
||||
|
||||
def _order_by_person_key(self, person):
|
||||
|
||||
+58
-10
@@ -39,8 +39,9 @@ import logging
|
||||
#------------------------------------------------------------------------
|
||||
from ..plug import BasePluginManager
|
||||
from ..const import PLUGINS_DIR, USER_PLUGINS
|
||||
from ..constfunc import win, get_env_var
|
||||
from ..config import config
|
||||
from .dbconst import DBLOGNAME
|
||||
from .dbconst import DBLOGNAME, DBLOCKFN, DBBACKEND
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@@ -108,13 +109,7 @@ def lookup_family_tree(dbname):
|
||||
if dbname == name:
|
||||
locked = False
|
||||
locked_by = None
|
||||
backend = None
|
||||
fname = os.path.join(dirpath, "database.txt")
|
||||
if os.path.isfile(fname):
|
||||
with open(fname, 'r', encoding='utf8') as ifile:
|
||||
backend = ifile.read().strip()
|
||||
else:
|
||||
backend = "bsddb"
|
||||
backend = get_dbid_from_path(dirpath)
|
||||
try:
|
||||
fname = os.path.join(dirpath, "lock")
|
||||
with open(fname, 'r', encoding='utf8') as ifile:
|
||||
@@ -125,13 +120,34 @@ def lookup_family_tree(dbname):
|
||||
return (dirpath, locked, locked_by, backend)
|
||||
return None
|
||||
|
||||
def get_dbid_from_path(dirpath):
|
||||
"""
|
||||
Return a database backend from a directory path.
|
||||
"""
|
||||
dbid = "bsddb"
|
||||
dbid_path = os.path.join(dirpath, DBBACKEND)
|
||||
if os.path.isfile(dbid_path):
|
||||
with open(dbid_path) as file:
|
||||
dbid = file.read().strip()
|
||||
return dbid
|
||||
|
||||
def import_as_dict(filename, user, skp_imp_adds=True):
|
||||
"""
|
||||
Import the filename into a InMemoryDB and return it.
|
||||
"""
|
||||
db = make_database("inmemorydb")
|
||||
db.load(None)
|
||||
db = make_database("sqlite")
|
||||
db.load(":memory:")
|
||||
db.set_feature("skip-import-additions", skp_imp_adds)
|
||||
db.set_prefixes(
|
||||
config.get('preferences.iprefix'),
|
||||
config.get('preferences.oprefix'),
|
||||
config.get('preferences.fprefix'),
|
||||
config.get('preferences.sprefix'),
|
||||
config.get('preferences.cprefix'),
|
||||
config.get('preferences.pprefix'),
|
||||
config.get('preferences.eprefix'),
|
||||
config.get('preferences.rprefix'),
|
||||
config.get('preferences.nprefix'))
|
||||
status = import_from_filename(db, filename, user)
|
||||
return db if status else None
|
||||
|
||||
@@ -179,3 +195,35 @@ def __index_surname(surn_list):
|
||||
else:
|
||||
surn = ""
|
||||
return surn
|
||||
|
||||
def clear_lock_file(name):
|
||||
try:
|
||||
os.unlink(os.path.join(name, DBLOCKFN))
|
||||
except OSError:
|
||||
return
|
||||
|
||||
def write_lock_file(name):
|
||||
if not os.path.isdir(name):
|
||||
os.mkdir(name)
|
||||
with open(os.path.join(name, DBLOCKFN), "w", encoding='utf8') as f:
|
||||
if win():
|
||||
user = get_env_var('USERNAME')
|
||||
host = get_env_var('USERDOMAIN')
|
||||
if host is None:
|
||||
host = ""
|
||||
else:
|
||||
host = os.uname()[1]
|
||||
# An ugly workaround for os.getlogin() issue with Konsole
|
||||
try:
|
||||
user = os.getlogin()
|
||||
except:
|
||||
# not win, so don't need get_env_var.
|
||||
# under cron getlogin() throws and there is no USER.
|
||||
user = os.environ.get('USER', 'noUSER')
|
||||
if host:
|
||||
text = "%s@%s" % (user, host)
|
||||
else:
|
||||
text = user
|
||||
# Save only the username and host, so the massage can be
|
||||
# printed with correct locale in DbManager.py when a lock is found
|
||||
f.write(text)
|
||||
|
||||
@@ -418,6 +418,11 @@ class NameDisplay:
|
||||
result = raw_data[_FIRSTNAME]
|
||||
return ' '.join(result.split())
|
||||
|
||||
def clear_custom_formats(self):
|
||||
self.name_formats = {num: value
|
||||
for num, value in self.name_formats.items()
|
||||
if num >= 0}
|
||||
|
||||
def set_name_format(self, formats):
|
||||
|
||||
raw_func_dict = {
|
||||
@@ -1054,13 +1059,13 @@ class NameDisplay:
|
||||
format_str = format_str[1:]
|
||||
else:
|
||||
patterns = [
|
||||
",\W*\"%(" + ("|".join(codes)) + ")\"", # ,\W*"%s"
|
||||
",\W*\(%(" + ("|".join(codes)) + ")\)", # ,\W*(%s)
|
||||
",\W*%(" + ("|".join(codes)) + ")", # ,\W*%s
|
||||
"\"%(" + ("|".join(codes)) + ")\"", # "%s"
|
||||
"_%(" + ("|".join(codes)) + ")_", # _%s_
|
||||
"\(%(" + ("|".join(codes)) + ")\)", # (%s)
|
||||
"%(" + ("|".join(codes)) + ")", # %s
|
||||
",\\W*\"%(" + ("|".join(codes)) + ")\"", # ,\W*"%s"
|
||||
",\\W*\\(%(" + ("|".join(codes)) + ")\\)", # ,\W*(%s)
|
||||
",\\W*%(" + ("|".join(codes)) + ")", # ,\W*%s
|
||||
"\"%(" + ("|".join(codes)) + ")\"", # "%s"
|
||||
"_%(" + ("|".join(codes)) + ")_", # _%s_
|
||||
"\\(%(" + ("|".join(codes)) + ")\\)", # (%s)
|
||||
"%(" + ("|".join(codes)) + ")", # %s
|
||||
]
|
||||
new_fmt = format_str
|
||||
|
||||
|
||||
+119
-16
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2014-2015 Nick Hall
|
||||
# Copyright (C) 2014-2017 Nick Hall
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -22,15 +22,44 @@
|
||||
Class handling displaying of places.
|
||||
"""
|
||||
|
||||
#---------------------------------------------------------------
|
||||
#
|
||||
# Python imports
|
||||
#
|
||||
#---------------------------------------------------------------
|
||||
import os
|
||||
import xml.dom.minidom
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from ..const import PLACE_FORMATS, GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
from ..config import config
|
||||
from ..utils.location import get_location_list
|
||||
from ..lib import PlaceType
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# PlaceFormat class
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class PlaceFormat:
|
||||
def __init__(self, name, levels, language, street, reverse):
|
||||
self.name = name
|
||||
self.levels = levels
|
||||
self.language = language
|
||||
self.street = street
|
||||
self.reverse = reverse
|
||||
|
||||
def to_xml(self):
|
||||
return (' <format name="%s" levels="%s" language="%s" '
|
||||
'street="%s" reverse="%s"/>\n' %
|
||||
(self.name, self.levels, self.language,
|
||||
self.street, self.reverse))
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# PlaceDisplay class
|
||||
@@ -38,50 +67,124 @@ from ..lib import PlaceType
|
||||
#-------------------------------------------------------------------------
|
||||
class PlaceDisplay:
|
||||
|
||||
def display_event(self, db, event):
|
||||
def __init__(self):
|
||||
self.place_formats = []
|
||||
self.default_format = config.get('preferences.place-format')
|
||||
if os.path.exists(PLACE_FORMATS):
|
||||
self.load_formats()
|
||||
else:
|
||||
pf = PlaceFormat(_('Full'), ':', '', 0, False)
|
||||
self.place_formats.append(pf)
|
||||
|
||||
def display_event(self, db, event, fmt=-1):
|
||||
if not event:
|
||||
return ""
|
||||
place_handle = event.get_place_handle()
|
||||
if place_handle:
|
||||
place = db.get_place_from_handle(place_handle)
|
||||
return self.display(db, place, event.get_date_object())
|
||||
return self.display(db, place, event.get_date_object(), fmt)
|
||||
else:
|
||||
return ""
|
||||
|
||||
def display(self, db, place, date=None):
|
||||
def display(self, db, place, date=None, fmt=-1):
|
||||
if not place:
|
||||
return ""
|
||||
if not config.get('preferences.place-auto'):
|
||||
return place.title
|
||||
else:
|
||||
lang = config.get('preferences.place-lang')
|
||||
places = get_location_list(db, place, date, lang)
|
||||
if fmt == -1:
|
||||
fmt = config.get('preferences.place-format')
|
||||
pf = self.place_formats[fmt]
|
||||
lang = pf.language
|
||||
all_places = get_location_list(db, place, date, lang)
|
||||
|
||||
if config.get('preferences.place-restrict') > 0:
|
||||
index = _find_populated_place(places)
|
||||
if index is not None:
|
||||
if config.get('preferences.place-restrict') == 1:
|
||||
places = places[:index+1]
|
||||
# Apply format string to place list
|
||||
index = _find_populated_place(all_places)
|
||||
places = []
|
||||
for slice in pf.levels.split(','):
|
||||
parts = slice.split(':')
|
||||
if len(parts) == 1:
|
||||
offset = _get_offset(parts[0], index)
|
||||
if offset is not None:
|
||||
try:
|
||||
places.append(all_places[offset])
|
||||
except IndexError:
|
||||
pass
|
||||
elif len(parts) == 2:
|
||||
start = _get_offset(parts[0], index)
|
||||
end = _get_offset(parts[1], index)
|
||||
if start is None:
|
||||
places.extend(all_places[:end])
|
||||
elif end is None:
|
||||
places.extend(all_places[start:])
|
||||
else:
|
||||
places = places[index:]
|
||||
places.extend(all_places[start:end])
|
||||
|
||||
if config.get('preferences.place-number'):
|
||||
if pf.street:
|
||||
types = [item[1] for item in places]
|
||||
try:
|
||||
idx = types.index(PlaceType.NUMBER)
|
||||
except ValueError:
|
||||
idx = None
|
||||
if idx is not None and len(places) > idx+1:
|
||||
combined = (places[idx][0] + ' ' + places[idx+1][0],
|
||||
places[idx+1][1])
|
||||
if pf.street == 1:
|
||||
combined = (places[idx][0] + ' ' + places[idx+1][0],
|
||||
places[idx+1][1])
|
||||
else:
|
||||
combined = (places[idx+1][0] + ' ' + places[idx][0],
|
||||
places[idx+1][1])
|
||||
places = places[:idx] + [combined] + places[idx+2:]
|
||||
|
||||
names = [item[0] for item in places]
|
||||
if config.get('preferences.place-reverse'):
|
||||
if pf.reverse:
|
||||
names.reverse()
|
||||
|
||||
# TODO for Arabic, should the next line's comma be translated?
|
||||
return ", ".join(names)
|
||||
|
||||
def get_formats(self):
|
||||
return self.place_formats
|
||||
|
||||
def set_formats(self, formats):
|
||||
self.place_formats = formats
|
||||
|
||||
def load_formats(self):
|
||||
dom = xml.dom.minidom.parse(PLACE_FORMATS)
|
||||
top = dom.getElementsByTagName('place_formats')
|
||||
|
||||
for fmt in top[0].getElementsByTagName('format'):
|
||||
name = fmt.attributes['name'].value
|
||||
levels = fmt.attributes['levels'].value
|
||||
language = fmt.attributes['language'].value
|
||||
street = int(fmt.attributes['street'].value)
|
||||
reverse = fmt.attributes['reverse'].value == 'True'
|
||||
pf = PlaceFormat(name, levels, language, street, reverse)
|
||||
self.place_formats.append(pf)
|
||||
|
||||
dom.unlink()
|
||||
|
||||
def save_formats(self):
|
||||
with open(PLACE_FORMATS, 'w') as fd:
|
||||
fd.write('<?xml version="1.0" encoding="utf-8"?>\n')
|
||||
fd.write('<place_formats>\n')
|
||||
for fmt in self.place_formats:
|
||||
fd.write(fmt.to_xml())
|
||||
fd.write('</place_formats>\n')
|
||||
|
||||
def _get_offset(value, index):
|
||||
if index is not None and value.startswith('p'):
|
||||
try:
|
||||
offset = int(value[1:])
|
||||
except ValueError:
|
||||
offset = 0
|
||||
offset += index
|
||||
else:
|
||||
try:
|
||||
offset = int(value)
|
||||
except ValueError:
|
||||
offset = None
|
||||
return offset
|
||||
|
||||
def _find_populated_place(places):
|
||||
populated_place = None
|
||||
for index, item in enumerate(places):
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user