Compare commits
1417 Commits
2.2.6
...
namespaces
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16053e26d7 | ||
|
|
f0d0942bfb | ||
|
|
cd9246ebed | ||
|
|
f7b23d854f | ||
|
|
104a1395e7 | ||
|
|
ceb4c3a9cc | ||
|
|
536757e8e2 | ||
|
|
00af1aa638 | ||
|
|
c2cf3e7b43 | ||
|
|
05c14d37b2 | ||
|
|
fc3614f291 | ||
|
|
e201c77696 | ||
|
|
f280cb5df4 | ||
|
|
29863d7109 | ||
|
|
b514ea7846 | ||
|
|
eeaf615d3b | ||
|
|
f003481c5e | ||
|
|
4d10ef389a | ||
|
|
726ffdced1 | ||
|
|
18c4071da8 | ||
|
|
fd7fa0c3ab | ||
|
|
2ba5b72242 | ||
|
|
fa5a2f7a1a | ||
|
|
ad042630b6 | ||
|
|
9cf35b9b52 | ||
|
|
4f69103b8c | ||
|
|
37c882780a | ||
|
|
6d5f97e1ba | ||
|
|
4b1063c699 | ||
|
|
b891674a6f | ||
|
|
1a65df6e36 | ||
|
|
6043be852c | ||
|
|
bb11bdf789 | ||
|
|
540fd588c9 | ||
|
|
278fad1f43 | ||
|
|
eadeb460f5 | ||
|
|
5da9ce64c0 | ||
|
|
40498b53f7 | ||
|
|
eaf97602ff | ||
|
|
987c262425 | ||
|
|
c33ee0a9e6 | ||
|
|
eb7665661f | ||
|
|
72ae1bf56f | ||
|
|
8f30ed8109 | ||
|
|
19e71f1180 | ||
|
|
9397a38394 | ||
|
|
17bd2d08cd | ||
|
|
47a5e81000 | ||
|
|
7bfe740fb2 | ||
|
|
6a324b59b9 | ||
|
|
23545006a5 | ||
|
|
65012eacbb | ||
|
|
91107143f3 | ||
|
|
cafda90555 | ||
|
|
32dfec102d | ||
|
|
c1cdca5f95 | ||
|
|
61dc928e33 | ||
|
|
d43fe3fab9 | ||
|
|
3acb572c0d | ||
|
|
0f6787d349 | ||
|
|
af287a1279 | ||
|
|
6bbd43f8a3 | ||
|
|
364d7c695b | ||
|
|
871af41881 | ||
|
|
4648bfbd83 | ||
|
|
129d02850b | ||
|
|
ee23ef509c | ||
|
|
7e865696b0 | ||
|
|
244d06ca3b | ||
|
|
1a59075b51 | ||
|
|
e0b3c18499 | ||
|
|
5434136a4d | ||
|
|
aeeb182dad | ||
|
|
4d6882ffc7 | ||
|
|
828482f439 | ||
|
|
2b6f2dfa0c | ||
|
|
413b43174c | ||
|
|
9709c87185 | ||
|
|
0cca358de2 | ||
|
|
acff0cb69f | ||
|
|
8d5956cb7f | ||
|
|
e9773ea694 | ||
|
|
7094ec098b | ||
|
|
04fe4d6991 | ||
|
|
570a6b1f07 | ||
|
|
4211d6aa03 | ||
|
|
5941fcd7e6 | ||
|
|
f3df2eb289 | ||
|
|
8b975cd5e5 | ||
|
|
850f292260 | ||
|
|
ced1252b9d | ||
|
|
c0a6bfebf2 | ||
|
|
36815767f3 | ||
|
|
2cba2d30b7 | ||
|
|
fded17520c | ||
|
|
46580a3958 | ||
|
|
d584899447 | ||
|
|
79c0a9fd02 | ||
|
|
c3f21d60c2 | ||
|
|
43221ea8a9 | ||
|
|
25350e93cb | ||
|
|
415a8aa9a8 | ||
|
|
a3d740aa67 | ||
|
|
1956335640 | ||
|
|
b89c8b99e8 | ||
|
|
4e4d8ee784 | ||
|
|
7ecd7b784e | ||
|
|
0d9764b0de | ||
|
|
5d7964977c | ||
|
|
d50cda9cea | ||
|
|
7257bfb6d5 | ||
|
|
f2470256ae | ||
|
|
3c7a56ba5a | ||
|
|
07d68b4400 | ||
|
|
51d2d3e0ca | ||
|
|
0a361873de | ||
|
|
6af02a8a1e | ||
|
|
dc283ea828 | ||
|
|
8e3917b933 | ||
|
|
5a2209a0c2 | ||
|
|
73b6949b95 | ||
|
|
771b07e661 | ||
|
|
629693e353 | ||
|
|
a45e13f74c | ||
|
|
a919f4b8fd | ||
|
|
6d37baabd9 | ||
|
|
41f18d0b3e | ||
|
|
8a5cce103e | ||
|
|
65cfd93de9 | ||
|
|
a67cac80f5 | ||
|
|
c73f224f2d | ||
|
|
f241d7cd77 | ||
|
|
a5f5607667 | ||
|
|
2d7451402f | ||
|
|
7e13816d40 | ||
|
|
c2231b9e39 | ||
|
|
58ecb96975 | ||
|
|
d24b7d8bd3 | ||
|
|
91e054cea4 | ||
|
|
be2abffde2 | ||
|
|
93b706dd28 | ||
|
|
8f43c818df | ||
|
|
8194d6bb81 | ||
|
|
dc203917b9 | ||
|
|
e7818ef43e | ||
|
|
37c4a19f1f | ||
|
|
864f294761 | ||
|
|
1534d6dd8f | ||
|
|
9ae728bf13 | ||
|
|
768244860f | ||
|
|
95e566ae97 | ||
|
|
040545269a | ||
|
|
c6b7d952bd | ||
|
|
06067dd1c1 | ||
|
|
6ee6b384cf | ||
|
|
7cdf2abe2d | ||
|
|
942d77f599 | ||
|
|
71baa51a54 | ||
|
|
8819183be3 | ||
|
|
0941a09c19 | ||
|
|
eae48212be | ||
|
|
4f9641c43f | ||
|
|
32fa6057c7 | ||
|
|
025907f65a | ||
|
|
a259edc0bb | ||
|
|
94fd9c0c2a | ||
|
|
0affd5a1b7 | ||
|
|
f27ab9a8a0 | ||
|
|
086a992b5a | ||
|
|
54cae9bc1d | ||
|
|
9d9c196441 | ||
|
|
9238e42cfd | ||
|
|
836f3abecb | ||
|
|
d669f783bb | ||
|
|
c18279ca4c | ||
|
|
bbd280abf9 | ||
|
|
c15e6041ef | ||
|
|
e4c84d9b3a | ||
|
|
a49afca3f7 | ||
|
|
883f07f926 | ||
|
|
b5d182582f | ||
|
|
fe26471abb | ||
|
|
96a3cbbb22 | ||
|
|
d303e5e955 | ||
|
|
dd6198ffca | ||
|
|
ae646290ed | ||
|
|
1a74dc9605 | ||
|
|
0c19bd13cd | ||
|
|
42bb4888a2 | ||
|
|
9a5e44aba3 | ||
|
|
78b5dd3737 | ||
|
|
b8717c4084 | ||
|
|
42f4816ae5 | ||
|
|
ff8d671787 | ||
|
|
e16cda46c1 | ||
|
|
431e792e52 | ||
|
|
c9f3060e42 | ||
|
|
ec4987e817 | ||
|
|
655d3b47c6 | ||
|
|
8b85c6e9dd | ||
|
|
ef35e4eda6 | ||
|
|
7bb1ca239b | ||
|
|
a7625b35f4 | ||
|
|
1d239aa9a6 | ||
|
|
3f1e5caaad | ||
|
|
bdbd6c8ba7 | ||
|
|
1a898ee589 | ||
|
|
9609adb575 | ||
|
|
34c10202b0 | ||
|
|
1457fad242 | ||
|
|
ce355499c7 | ||
|
|
2bb3d2f967 | ||
|
|
a301ab5e1c | ||
|
|
d74d29fa13 | ||
|
|
96c54d9d66 | ||
|
|
9a0700cac1 | ||
|
|
864890c168 | ||
|
|
a93873d1d4 | ||
|
|
b0a8fa2141 | ||
|
|
88799b3ebc | ||
|
|
4032aa563c | ||
|
|
2b9fd67dbd | ||
|
|
62056409de | ||
|
|
f45f4eb49f | ||
|
|
acd4d42561 | ||
|
|
8375c3a842 | ||
|
|
54138b7998 | ||
|
|
3816567543 | ||
|
|
c6954437ea | ||
|
|
f3725a4938 | ||
|
|
fc8f6b4a42 | ||
|
|
b6109e37ad | ||
|
|
b3b98e2b82 | ||
|
|
74f6a4b314 | ||
|
|
19a9ad3da0 | ||
|
|
2d99025024 | ||
|
|
63370f31d7 | ||
|
|
752daa81b5 | ||
|
|
429ead8c69 | ||
|
|
52f4aad356 | ||
|
|
4abd0a26cf | ||
|
|
c8173cac04 | ||
|
|
be4b141c43 | ||
|
|
f9d6258744 | ||
|
|
66234d7785 | ||
|
|
c67b4a7f12 | ||
|
|
4a94023be2 | ||
|
|
9535f45647 | ||
|
|
8f585bcd29 | ||
|
|
d95d7b0674 | ||
|
|
50fcd7eb0b | ||
|
|
e5b46fe1a4 | ||
|
|
28872646d0 | ||
|
|
d059e09104 | ||
|
|
545cd78805 | ||
|
|
1e7a7d2fa7 | ||
|
|
1b540fc294 | ||
|
|
493ddc233c | ||
|
|
07b3169c5b | ||
|
|
e73707a16f | ||
|
|
5323399bc8 | ||
|
|
13ac083542 | ||
|
|
3dee191328 | ||
|
|
e13524c1d3 | ||
|
|
dc82b7d64f | ||
|
|
d68163ee90 | ||
|
|
349ed2722c | ||
|
|
e01b39edf6 | ||
|
|
783325509a | ||
|
|
2db3736a70 | ||
|
|
22cf00c28f | ||
|
|
3fe2736ad4 | ||
|
|
03b38673f7 | ||
|
|
3590bb96dd | ||
|
|
5051b9602a | ||
|
|
af9da2be34 | ||
|
|
0c17454a0c | ||
|
|
d789bc40f0 | ||
|
|
3a97171320 | ||
|
|
110970f310 | ||
|
|
9986552ffb | ||
|
|
64277e26ed | ||
|
|
b35e867b55 | ||
|
|
67c6db4b03 | ||
|
|
eec5307bc3 | ||
|
|
6a3b9a9916 | ||
|
|
e6880ae469 | ||
|
|
40de3ea9a1 | ||
|
|
93d40b022f | ||
|
|
dec6acf354 | ||
|
|
062cd9b5b9 | ||
|
|
31574e3606 | ||
|
|
ca01d9d3d6 | ||
|
|
9c69322289 | ||
|
|
c13841e30a | ||
|
|
9ae1ff22c7 | ||
|
|
8db5a45dcd | ||
|
|
b3e2485cd0 | ||
|
|
6c135be248 | ||
|
|
b5a4af9656 | ||
|
|
b23f1d777b | ||
|
|
2f49adf605 | ||
|
|
76f9eb7945 | ||
|
|
0c2718ca8c | ||
|
|
7109c5be9c | ||
|
|
e9fad88a10 | ||
|
|
d94d571881 | ||
|
|
d663c2b61d | ||
|
|
a3cbd8db8b | ||
|
|
90e92c27b8 | ||
|
|
76b433c1da | ||
|
|
b116a0103e | ||
|
|
6a7a0dd24d | ||
|
|
c2366aa36f | ||
|
|
4da50ef125 | ||
|
|
2e0f293dcd | ||
|
|
d0095a36b5 | ||
|
|
1eae7852c4 | ||
|
|
da06278df8 | ||
|
|
bd8f914804 | ||
|
|
51b24309a7 | ||
|
|
60a4572087 | ||
|
|
248af821a7 | ||
|
|
c85e8b84b9 | ||
|
|
e4d159307b | ||
|
|
80a30a9102 | ||
|
|
299b94243d | ||
|
|
b7ab45a3a7 | ||
|
|
9d3deaff0f | ||
|
|
42a1e389a5 | ||
|
|
9883a064f3 | ||
|
|
52617b472d | ||
|
|
764c15e6c0 | ||
|
|
88b384c2b4 | ||
|
|
92e231b10c | ||
|
|
e9ce006444 | ||
|
|
bc5ee74ffd | ||
|
|
688cf9eea5 | ||
|
|
ad9a19d551 | ||
|
|
7595e6db36 | ||
|
|
74fd5c569c | ||
|
|
e4376c178b | ||
|
|
9e46438534 | ||
|
|
4dd29bd4a7 | ||
|
|
90af54b7ba | ||
|
|
cadcdde5f8 | ||
|
|
4c77bc11de | ||
|
|
05988eb899 | ||
|
|
040bd05333 | ||
|
|
5f03238f60 | ||
|
|
4c6d91a101 | ||
|
|
71b93887dc | ||
|
|
391049ef77 | ||
|
|
3d5aec5651 | ||
|
|
d976184e24 | ||
|
|
5a45c1191a | ||
|
|
07f315ca12 | ||
|
|
be1cf0e876 | ||
|
|
d4d0ed728f | ||
|
|
0f0f20b21c | ||
|
|
abdb9c973b | ||
|
|
4e0b287890 | ||
|
|
00308f9ed6 | ||
|
|
2488ccdb8c | ||
|
|
cec2f3cc1b | ||
|
|
5a19773dfa | ||
|
|
7c3bb0a0af | ||
|
|
90d44bf863 | ||
|
|
9d0ff86a44 | ||
|
|
d03bc9f40b | ||
|
|
863bda76dc | ||
|
|
fcbe01bbfd | ||
|
|
6178c46aec | ||
|
|
87110eef08 | ||
|
|
1bfeac5035 | ||
|
|
ef257b566f | ||
|
|
0fce2edcf8 | ||
|
|
152188503e | ||
|
|
d804c16a1c | ||
|
|
cb7f2e4634 | ||
|
|
b90695c7c8 | ||
|
|
e67c8bfda6 | ||
|
|
90eb428787 | ||
|
|
e3cacaa89f | ||
|
|
6167428ecf | ||
|
|
367f76b6f4 | ||
|
|
733b6dabb1 | ||
|
|
72cd669bf0 | ||
|
|
84f630af4a | ||
|
|
05df700140 | ||
|
|
f230a64e7d | ||
|
|
1855c84cec | ||
|
|
3c982a6cd4 | ||
|
|
7053561f89 | ||
|
|
02fcabfdbc | ||
|
|
0c0efdd2c8 | ||
|
|
9a93601a03 | ||
|
|
b68f2b6cd6 | ||
|
|
80d95e9225 | ||
|
|
04288eda8c | ||
|
|
3a7f75cf30 | ||
|
|
0ca64b2db0 | ||
|
|
81aaf49463 | ||
|
|
5c93616690 | ||
|
|
c1823bc59c | ||
|
|
1634859659 | ||
|
|
684781423d | ||
|
|
1f2507fc00 | ||
|
|
0644b63b67 | ||
|
|
64f6b267d9 | ||
|
|
528e9d8868 | ||
|
|
f618822f34 | ||
|
|
e9a5fcdc7c | ||
|
|
2a33e91167 | ||
|
|
77327ec06f | ||
|
|
f530b25d74 | ||
|
|
8db81914b1 | ||
|
|
5fce7f4b63 | ||
|
|
1ee235c949 | ||
|
|
be7d8d4460 | ||
|
|
f134283bae | ||
|
|
38d5d01ea1 | ||
|
|
8e3e186fab | ||
|
|
4b33b3afeb | ||
|
|
9beca5895a | ||
|
|
1afc03eee1 | ||
|
|
331b03f894 | ||
|
|
1c9b180b3a | ||
|
|
57a16e85f8 | ||
|
|
c7cd5bcc36 | ||
|
|
f571007516 | ||
|
|
fac3f03f7b | ||
|
|
7d85dd6570 | ||
|
|
a91ef8602f | ||
|
|
1bc670617e | ||
|
|
74288ba3f3 | ||
|
|
bf2856011d | ||
|
|
ca974a902d | ||
|
|
f992897e7a | ||
|
|
c121607f61 | ||
|
|
032c7aea73 | ||
|
|
f6c419746c | ||
|
|
83f13a9a1a | ||
|
|
2111af2ec8 | ||
|
|
648e6eb9bc | ||
|
|
994b4e8051 | ||
|
|
f2f464b1ca | ||
|
|
119d11b405 | ||
|
|
d7031198cd | ||
|
|
187d4020f5 | ||
|
|
0a77bd0b47 | ||
|
|
cb00e7e969 | ||
|
|
1b2fe0d713 | ||
|
|
8e73f6f0dd | ||
|
|
d3c7b45ad9 | ||
|
|
fee15fd880 | ||
|
|
196b960b47 | ||
|
|
241a88ef48 | ||
|
|
fdf0c2711b | ||
|
|
239a95e683 | ||
|
|
d3205d2425 | ||
|
|
681ba8068c | ||
|
|
d5429d276f | ||
|
|
746b10be81 | ||
|
|
b9aa27e406 | ||
|
|
00cf277156 | ||
|
|
75ce7d745e | ||
|
|
ee1bbca5c9 | ||
|
|
0effc86620 | ||
|
|
8a36970b24 | ||
|
|
8be87ede99 | ||
|
|
d61dd71627 | ||
|
|
755f742088 | ||
|
|
0107e41123 | ||
|
|
e58c8c2192 | ||
|
|
ee4518da9e | ||
|
|
64e7183896 | ||
|
|
bd2715a35e | ||
|
|
986e4fc65f | ||
|
|
908cecffb9 | ||
|
|
07226ae7a1 | ||
|
|
c90258ef4b | ||
|
|
f500092a6a | ||
|
|
d1f1f65c9b | ||
|
|
aae0cb6379 | ||
|
|
2b0a0d9a14 | ||
|
|
69fcb9646b | ||
|
|
a0bf615960 | ||
|
|
c024f553fd | ||
|
|
c97d6a576f | ||
|
|
c64095fd95 | ||
|
|
542f552002 | ||
|
|
22017a24f2 | ||
|
|
6ac7093e9f | ||
|
|
89a23a6ac5 | ||
|
|
ed17476aeb | ||
|
|
1b951c66f1 | ||
|
|
878d99a84c | ||
|
|
c5ec3d782c | ||
|
|
a28276b868 | ||
|
|
a8920bfec1 | ||
|
|
0e5f338b40 | ||
|
|
4a7e50e83e | ||
|
|
608440553b | ||
|
|
e493652e96 | ||
|
|
d286267d52 | ||
|
|
27c5c5fa79 | ||
|
|
9f7cd0bfc7 | ||
|
|
6a45d51189 | ||
|
|
5d99cb5874 | ||
|
|
7f0f8164bd | ||
|
|
236e6a4c85 | ||
|
|
669043e7a9 | ||
|
|
e57372692e | ||
|
|
512afd75a0 | ||
|
|
b5c51d19ba | ||
|
|
0955dcbc97 | ||
|
|
5ee3adf13f | ||
|
|
5a237d05f7 | ||
|
|
bd5d419472 | ||
|
|
cdb66e1ed4 | ||
|
|
d5cd6cbd65 | ||
|
|
e85ddcc9b9 | ||
|
|
ac4948ca5d | ||
|
|
6bffdc8149 | ||
|
|
db814c627a | ||
|
|
b156e08d85 | ||
|
|
cad08ee17c | ||
|
|
7c04ee83e5 | ||
|
|
844d984526 | ||
|
|
e91797fcba | ||
|
|
8ad1c60817 | ||
|
|
e24f853bef | ||
|
|
cfceb84cc6 | ||
|
|
e81234d81f | ||
|
|
5a647e6042 | ||
|
|
a53f3e390f | ||
|
|
d9d213b6b3 | ||
|
|
09c5351a11 | ||
|
|
f0fc2f2f29 | ||
|
|
7d6138107f | ||
|
|
446f587a49 | ||
|
|
0872ee501e | ||
|
|
e4f7500340 | ||
|
|
a429bb6a4b | ||
|
|
ce2a39d8f1 | ||
|
|
81a4dbcdcd | ||
|
|
33a3f515a3 | ||
|
|
6372907c4b | ||
|
|
a8b7b67efe | ||
|
|
b0f9722857 | ||
|
|
d5fda299b0 | ||
|
|
725e121731 | ||
|
|
ad299b6b1d | ||
|
|
8439566b01 | ||
|
|
ef4263cf03 | ||
|
|
464a6e9af1 | ||
|
|
7152fa0a54 | ||
|
|
da5c5a8275 | ||
|
|
ee52a25ebf | ||
|
|
e831c10cd3 | ||
|
|
9a6da39aaf | ||
|
|
99b819dd68 | ||
|
|
0b42ed0508 | ||
|
|
3b6d891dc7 | ||
|
|
e77abbc09f | ||
|
|
61a2238d9a | ||
|
|
0322deaf82 | ||
|
|
044a6ad835 | ||
|
|
86fe0193b7 | ||
|
|
2517928c1e | ||
|
|
971f4b1579 | ||
|
|
c0f0b970a6 | ||
|
|
fa493d7360 | ||
|
|
831de74800 | ||
|
|
755010f619 | ||
|
|
44c7102dd5 | ||
|
|
e731c16214 | ||
|
|
b3b6eeb2bd | ||
|
|
fc8c0e66a7 | ||
|
|
6207434f19 | ||
|
|
9ecfe306cb | ||
|
|
a4dd2b8b0a | ||
|
|
0868f3a98e | ||
|
|
316471b145 | ||
|
|
586972c71d | ||
|
|
f6954c4a2e | ||
|
|
3b0d8c9bd6 | ||
|
|
3e60aa8e1b | ||
|
|
b3f865a4ab | ||
|
|
64568025c9 | ||
|
|
9472a279ea | ||
|
|
e0fdeffc94 | ||
|
|
d1d70be583 | ||
|
|
6260033669 | ||
|
|
57a4132512 | ||
|
|
3e16b45dbb | ||
|
|
21392f2f1b | ||
|
|
0fd86ee60d | ||
|
|
fd42ebf9c3 | ||
|
|
3180e5b02a | ||
|
|
26d3852f30 | ||
|
|
ad54fda317 | ||
|
|
dca0c75e34 | ||
|
|
ca0f12697b | ||
|
|
b8ae7e0817 | ||
|
|
3e91bdc75e | ||
|
|
e25a621e6e | ||
|
|
de6a3f1d0c | ||
|
|
bf00a9ea04 | ||
|
|
f8ac7a2818 | ||
|
|
1cd33b691c | ||
|
|
9d7e5b43c0 | ||
|
|
ceca41d85c | ||
|
|
1c4e082755 | ||
|
|
aec340b401 | ||
|
|
3ea87c007d | ||
|
|
4d8b028e2d | ||
|
|
31c02d6e95 | ||
|
|
26bf8a3043 | ||
|
|
ac21a8e6a4 | ||
|
|
a000937768 | ||
|
|
4eef4d2d76 | ||
|
|
92410a1f5c | ||
|
|
aa89d08e08 | ||
|
|
244ddb5157 | ||
|
|
9c3456c963 | ||
|
|
ad9afbf5ba | ||
|
|
bc079133f7 | ||
|
|
69a0f3ed23 | ||
|
|
1fc3600329 | ||
|
|
c1141cd610 | ||
|
|
300d86b2cd | ||
|
|
d609a857c0 | ||
|
|
8e98298777 | ||
|
|
0642fad8f8 | ||
|
|
d10d76c475 | ||
|
|
8aa2f04995 | ||
|
|
b3a1f199c1 | ||
|
|
9fbf8a6f39 | ||
|
|
c96b9bb71c | ||
|
|
71ff0f7de3 | ||
|
|
89fa22d1c9 | ||
|
|
7582aaaba1 | ||
|
|
58e9a1e240 | ||
|
|
bd39fe5d38 | ||
|
|
1c776e1080 | ||
|
|
d088887337 | ||
|
|
0ba76bafb2 | ||
|
|
c7756a8861 | ||
|
|
5462b215be | ||
|
|
f98374df9b | ||
|
|
4614990e04 | ||
|
|
6658886b72 | ||
|
|
5130a92f9c | ||
|
|
a602bc0678 | ||
|
|
09efd911e6 | ||
|
|
958c118649 | ||
|
|
c031898184 | ||
|
|
d32ebaddc8 | ||
|
|
9c90bba602 | ||
|
|
93cc1578d0 | ||
|
|
79610f7490 | ||
|
|
be2b87635c | ||
|
|
8e38179b66 | ||
|
|
1300cfad52 | ||
|
|
bc6ae67a9a | ||
|
|
c989bdab1d | ||
|
|
3d339a2bf5 | ||
|
|
ac7d68d134 | ||
|
|
a50c2da042 | ||
|
|
6ccf5b7c14 | ||
|
|
7a54eff9b1 | ||
|
|
3c2ff5577b | ||
|
|
d721704a1f | ||
|
|
2ba67e1d8b | ||
|
|
eb0a4b6416 | ||
|
|
7f9b23a704 | ||
|
|
1576c80c9f | ||
|
|
894748b6b8 | ||
|
|
a70618c3be | ||
|
|
7e92227414 | ||
|
|
57788b375a | ||
|
|
b363cb535f | ||
|
|
e31662cda6 | ||
|
|
ec84200a0b | ||
|
|
6f5a4f974c | ||
|
|
7d7383de7f | ||
|
|
892d462e53 | ||
|
|
4e26f0ea37 | ||
|
|
ca0a429027 | ||
|
|
d72ee44c3d | ||
|
|
5b8caecee9 | ||
|
|
9e58992459 | ||
|
|
408df36c0b | ||
|
|
46183d0246 | ||
|
|
3e6de210f8 | ||
|
|
f50b617b76 | ||
|
|
2c4df27922 | ||
|
|
823f518615 | ||
|
|
2a2987ac79 | ||
|
|
dfd97d4958 | ||
|
|
826d1cd6ef | ||
|
|
642cec5e7d | ||
|
|
dfa71cb2e3 | ||
|
|
5ed32a6d3f | ||
|
|
06c7fedec0 | ||
|
|
b29ce6c44d | ||
|
|
ef6d9172f5 | ||
|
|
eaf4433505 | ||
|
|
259dc5c27d | ||
|
|
e606016ece | ||
|
|
c7692fad5b | ||
|
|
3206947b6b | ||
|
|
1eb5bb06a5 | ||
|
|
0b4007ff5a | ||
|
|
92c64bbba9 | ||
|
|
f7d5430451 | ||
|
|
22bf1e8df3 | ||
|
|
9ec075c1c0 | ||
|
|
a767bb5c94 | ||
|
|
6d62283927 | ||
|
|
445e80cefc | ||
|
|
6589e84d10 | ||
|
|
59e79d2b17 | ||
|
|
ea426db112 | ||
|
|
b3759296e2 | ||
|
|
00388009f7 | ||
|
|
c50fb63c36 | ||
|
|
9f49cf49ea | ||
|
|
1c240033d8 | ||
|
|
c04743d6e1 | ||
|
|
f740251bbb | ||
|
|
4e90046b66 | ||
|
|
d1f9c401cd | ||
|
|
4027e142bc | ||
|
|
76b26df765 | ||
|
|
b054fa463d | ||
|
|
538dac4d3f | ||
|
|
1a2d690487 | ||
|
|
b7ff38b8a8 | ||
|
|
c0c79cfbf2 | ||
|
|
80ef71f3e4 | ||
|
|
846ddce24e | ||
|
|
4ec48bb963 | ||
|
|
70c7d154a3 | ||
|
|
eb0738dedc | ||
|
|
f993903c8c | ||
|
|
a5ecd94393 | ||
|
|
2c823013e7 | ||
|
|
e8b7ad4b67 | ||
|
|
3c84add52a | ||
|
|
e0c38a6fe6 | ||
|
|
f0588fa299 | ||
|
|
2942b9427d | ||
|
|
7acb6cf516 | ||
|
|
2a433a7513 | ||
|
|
62d6dc4bd4 | ||
|
|
9b35704a57 | ||
|
|
77fd49544c | ||
|
|
b3fa76bfb6 | ||
|
|
1ab2aa9427 | ||
|
|
57c2413b51 | ||
|
|
aa8dcd54fa | ||
|
|
81721e29de | ||
|
|
9d3b5e25ee | ||
|
|
2ca2d43068 | ||
|
|
697c320d52 | ||
|
|
de1b4c3a3b | ||
|
|
c6f00323fc | ||
|
|
300d8e9ad3 | ||
|
|
f78f0ad7e8 | ||
|
|
afb21a02d4 | ||
|
|
98af7703d7 | ||
|
|
b4b82e8050 | ||
|
|
9636fe2e0a | ||
|
|
cda31ad0aa | ||
|
|
5e35d0aa79 | ||
|
|
66ea19a686 | ||
|
|
b302e1f8d4 | ||
|
|
874586f27d | ||
|
|
5566297f91 | ||
|
|
295d64e34f | ||
|
|
8e3d36610e | ||
|
|
e1781c0651 | ||
|
|
c53f9c7954 | ||
|
|
a8ca3b6b95 | ||
|
|
02d90f1fc2 | ||
|
|
2ddd13eea5 | ||
|
|
ff069557f5 | ||
|
|
51f85d9581 | ||
|
|
9e6f63c0e8 | ||
|
|
4689452d8e | ||
|
|
90829ca433 | ||
|
|
eb3071d0db | ||
|
|
c4671a8909 | ||
|
|
aa759e5c04 | ||
|
|
7e27af5998 | ||
|
|
3c25fcb9ba | ||
|
|
7aa86d29fe | ||
|
|
7a8ffb8e64 | ||
|
|
f1f2ed71a5 | ||
|
|
4f4ad14850 | ||
|
|
7ad2d0ed38 | ||
|
|
9589c42a6a | ||
|
|
8d4c15e948 | ||
|
|
c7274a267b | ||
|
|
6cbcb4cd46 | ||
|
|
8a9a0b6d50 | ||
|
|
25eb21b91e | ||
|
|
4686c37252 | ||
|
|
73b8caebb5 | ||
|
|
9f636bd021 | ||
|
|
e066762122 | ||
|
|
2e91d5a722 | ||
|
|
89eca3212f | ||
|
|
8720b1e954 | ||
|
|
6d51cd321a | ||
|
|
f900c71aa7 | ||
|
|
90f768c3a4 | ||
|
|
dab37b2038 | ||
|
|
218dd6ae7a | ||
|
|
b3678f4c96 | ||
|
|
6bc9531986 | ||
|
|
c5cf5774aa | ||
|
|
8974a8c433 | ||
|
|
d8b2e8f351 | ||
|
|
5736d04431 | ||
|
|
c9dcd305ed | ||
|
|
5c09684f58 | ||
|
|
205c103efa | ||
|
|
d8ecc5c4e5 | ||
|
|
9546156b59 | ||
|
|
4abe61ca5f | ||
|
|
655c7eb7d6 | ||
|
|
66e32c54dd | ||
|
|
588b91e3f7 | ||
|
|
22b43753d9 | ||
|
|
556b33bdd5 | ||
|
|
e93625680e | ||
|
|
60d67a87af | ||
|
|
6ba0176f44 | ||
|
|
00e96d8e65 | ||
|
|
66be305e41 | ||
|
|
8808f16f8e | ||
|
|
f782691e7e | ||
|
|
1c0801bd6c | ||
|
|
32ab01dae4 | ||
|
|
615a78f0b7 | ||
|
|
5df789cf51 | ||
|
|
2902e9a872 | ||
|
|
4388746064 | ||
|
|
dc50e5c814 | ||
|
|
179e64f7c8 | ||
|
|
ad0ef6139c | ||
|
|
1c950b705c | ||
|
|
1fbd097422 | ||
|
|
dd6f2205ec | ||
|
|
8a74f92ebb | ||
|
|
37aa9e52d4 | ||
|
|
44a31c1e34 | ||
|
|
535dead4b4 | ||
|
|
b823d373b0 | ||
|
|
2894a4b381 | ||
|
|
3a57912585 | ||
|
|
4b49c1d326 | ||
|
|
37da9c4f2c | ||
|
|
d83106faa4 | ||
|
|
f3fcf0a176 | ||
|
|
26b0853e13 | ||
|
|
0c0de3b838 | ||
|
|
a57e296531 | ||
|
|
a9d764aa94 | ||
|
|
7b681bc1cd | ||
|
|
5ef2e2f5a9 | ||
|
|
cd124f9c3a | ||
|
|
fa95f57fd0 | ||
|
|
0949b1556d | ||
|
|
eb94e8a0d6 | ||
|
|
636800a42c | ||
|
|
82e46bc541 | ||
|
|
4d73a37288 | ||
|
|
a8c0ae3e3e | ||
|
|
047288bb53 | ||
|
|
65dbdc576f | ||
|
|
302141de71 | ||
|
|
a615bedccf | ||
|
|
10ca910c81 | ||
|
|
df87ff82c3 | ||
|
|
cdc499fd7a | ||
|
|
4a63d7e4df | ||
|
|
dc97c4c195 | ||
|
|
8274d9054f | ||
|
|
aff58708b3 | ||
|
|
17234071cf | ||
|
|
af2637cb3e | ||
|
|
85617ba255 | ||
|
|
9cfa86beec | ||
|
|
0f1486e4d7 | ||
|
|
8b36bd14cb | ||
|
|
e85f3e054b | ||
|
|
64aa833e95 | ||
|
|
bc4c26f26c | ||
|
|
5c47b84714 | ||
|
|
10fbf17254 | ||
|
|
2089fa60ea | ||
|
|
dbcc6d1459 | ||
|
|
b08a017a80 | ||
|
|
195ed322d3 | ||
|
|
864ba25b5b | ||
|
|
5b731a61df | ||
|
|
7112f1c170 | ||
|
|
c7bd5617ff | ||
|
|
892d352b9e | ||
|
|
fafb051632 | ||
|
|
39b8439371 | ||
|
|
e703a3ca89 | ||
|
|
17b2562054 | ||
|
|
79da6c19aa | ||
|
|
40ec24349a | ||
|
|
f09bffb417 | ||
|
|
d8129c16dd | ||
|
|
9529850a08 | ||
|
|
44f66dbed6 | ||
|
|
472e8c5e73 | ||
|
|
6f8d281d79 | ||
|
|
5acb280d27 | ||
|
|
391eb1a222 | ||
|
|
994de81c41 | ||
|
|
555bec1bdf | ||
|
|
e7c77a7b0e | ||
|
|
21d8ab6089 | ||
|
|
238aa0778b | ||
|
|
55c17249bd | ||
|
|
5d86d9aace | ||
|
|
a305782062 | ||
|
|
655f6bc6e3 | ||
|
|
0db6f8e731 | ||
|
|
3d85c07270 | ||
|
|
074450ce2f | ||
|
|
d69e24f473 | ||
|
|
a97f6baadf | ||
|
|
50f4901cac | ||
|
|
4156e34c1f | ||
|
|
0c5ca9d432 | ||
|
|
d8fba591d5 | ||
|
|
2045d2471a | ||
|
|
b25135eeef | ||
|
|
115145017a | ||
|
|
cdb00faf65 | ||
|
|
5e2d20ecdb | ||
|
|
1b9183311c | ||
|
|
199dd9cd63 | ||
|
|
0b5ccf0bb3 | ||
|
|
a256edb54f | ||
|
|
00de66780a | ||
|
|
fb1507b6da | ||
|
|
fd026eda27 | ||
|
|
32568bc3d0 | ||
|
|
8edf8e0c4e | ||
|
|
be44cc74c7 | ||
|
|
e67e519efa | ||
|
|
88f472b4a3 | ||
|
|
1d1ab00fb8 | ||
|
|
88aac79df3 | ||
|
|
ab91ceece4 | ||
|
|
7f3e1592fc | ||
|
|
6ae8b3c9b1 | ||
|
|
4df99dc798 | ||
|
|
95c8c6b39d | ||
|
|
e664529904 | ||
|
|
a8ea996232 | ||
|
|
8f7fe86e63 | ||
|
|
fbeea18137 | ||
|
|
f23a2451a0 | ||
|
|
0f3c0c2717 | ||
|
|
432ad81993 | ||
|
|
074d28aabf | ||
|
|
037f1aa009 | ||
|
|
c3cb47e040 | ||
|
|
19d0a2a2df | ||
|
|
1921487999 | ||
|
|
87a576271d | ||
|
|
3a555f1cff | ||
|
|
cfc811c2e0 | ||
|
|
e27222374e | ||
|
|
27233886bc | ||
|
|
24f0590f7c | ||
|
|
123257d58d | ||
|
|
47b7d205fa | ||
|
|
d99f945656 | ||
|
|
5d03331bb3 | ||
|
|
06468e4310 | ||
|
|
c48a45d0b4 | ||
|
|
0f736b2a1c | ||
|
|
f9c7746956 | ||
|
|
60561397aa | ||
|
|
671f71d9f8 | ||
|
|
1c32e0d45c | ||
|
|
ea15f107d7 | ||
|
|
d45bd85ed1 | ||
|
|
5ad5ad265a | ||
|
|
da4de5acfc | ||
|
|
46a1e974f7 | ||
|
|
aebacdfb4a | ||
|
|
0e9288b41d | ||
|
|
52809c6164 | ||
|
|
f26164a432 | ||
|
|
6965f604e8 | ||
|
|
1e5fe85253 | ||
|
|
890e0fd7ec | ||
|
|
7367b759b3 | ||
|
|
e38e5d4d97 | ||
|
|
c990dff747 | ||
|
|
1580e3ad25 | ||
|
|
90d4253811 | ||
|
|
ada41ef14f | ||
|
|
e9c9b9c65d | ||
|
|
46a5a32348 | ||
|
|
a3d69ae8c6 | ||
|
|
a3334f41ab | ||
|
|
026478b1f0 | ||
|
|
572e9c899c | ||
|
|
d595409c41 | ||
|
|
e61eaf26cb | ||
|
|
09697fba23 | ||
|
|
812742a856 | ||
|
|
d84d0c6b9b | ||
|
|
5e4426b9c8 | ||
|
|
4492ede096 | ||
|
|
cb8c7a1234 | ||
|
|
4991910ee8 | ||
|
|
e9bde11993 | ||
|
|
66972c4dc4 | ||
|
|
ae6a6c1f05 | ||
|
|
089630a1e1 | ||
|
|
d4ff3072e2 | ||
|
|
fd4ceb681c | ||
|
|
820ab7f53f | ||
|
|
6d7892db73 | ||
|
|
01086ab8e0 | ||
|
|
b55a5bc5fb | ||
|
|
7e72eaa6bd | ||
|
|
022fd7bffc | ||
|
|
a09eea3984 | ||
|
|
dd8c59d634 | ||
|
|
d8d37eb65c | ||
|
|
fa7cf6226c | ||
|
|
62c7553d82 | ||
|
|
b5c30a5fdc | ||
|
|
8139036d82 | ||
|
|
b1d39e3195 | ||
|
|
48a00a6ff6 | ||
|
|
a3ee3c60ce | ||
|
|
d69063599e | ||
|
|
0146225c4f | ||
|
|
50fca72f82 | ||
|
|
1a4e6aa527 | ||
|
|
cdf8b561a6 | ||
|
|
905d8c930e | ||
|
|
f64c6d470b | ||
|
|
0657d84769 | ||
|
|
0181d8b944 | ||
|
|
fae5f1e345 | ||
|
|
81b179acac | ||
|
|
bc810ee0ce | ||
|
|
3a4236bc45 | ||
|
|
8642ae63a2 | ||
|
|
3c5373f76b | ||
|
|
58e297b092 | ||
|
|
cd4f6dc64c | ||
|
|
5a112b64b3 | ||
|
|
a7b0c661c8 | ||
|
|
b2f9a0044b | ||
|
|
d0cdd451e4 | ||
|
|
86334d6532 | ||
|
|
733752727d | ||
|
|
6635803807 | ||
|
|
7f3488baaa | ||
|
|
dcc318f34e | ||
|
|
17edc1c523 | ||
|
|
85912f211b | ||
|
|
52d7239400 | ||
|
|
9c691e5b9b | ||
|
|
0e45ea2e99 | ||
|
|
8773242dba | ||
|
|
267cd53adb | ||
|
|
ce82a328b6 | ||
|
|
b925805800 | ||
|
|
c8c50b4e81 | ||
|
|
4a976278d5 | ||
|
|
1255fe8168 | ||
|
|
081e8243d7 | ||
|
|
a20fc60617 | ||
|
|
770de2986a | ||
|
|
0551018de1 | ||
|
|
aa77f2ce2f | ||
|
|
471994f7b1 | ||
|
|
9d2c0216f6 | ||
|
|
82d888f0ea | ||
|
|
ccaf283204 | ||
|
|
3fb5319562 | ||
|
|
76c92f027c | ||
|
|
d828454511 | ||
|
|
34c6e93780 | ||
|
|
0a6f473098 | ||
|
|
4d67f9bfd2 | ||
|
|
6e80adc293 | ||
|
|
dc3fb65317 | ||
|
|
6a652de193 | ||
|
|
4747235fe7 | ||
|
|
0ecbeeb2c4 | ||
|
|
65378d91cb | ||
|
|
cb6a6bf4a6 | ||
|
|
db67c34203 | ||
|
|
ccf8fe2314 | ||
|
|
e336086cf0 | ||
|
|
5315b3f6ad | ||
|
|
e31abd57bc | ||
|
|
5bf60bb5d8 | ||
|
|
ad672aff28 | ||
|
|
e49af47d30 | ||
|
|
ecbe6a859a | ||
|
|
413228c56c | ||
|
|
a905de7ab5 | ||
|
|
a09409f375 | ||
|
|
764c0ffcf1 | ||
|
|
5962745937 | ||
|
|
d380062ec6 | ||
|
|
cd8066233c | ||
|
|
6f04d2044f | ||
|
|
f41ded592b | ||
|
|
8a2c9eca9c | ||
|
|
d712a17f82 | ||
|
|
504190b752 | ||
|
|
56e515a791 | ||
|
|
36feb62052 | ||
|
|
239f15cdbc | ||
|
|
f39cfd3235 | ||
|
|
329699a6aa | ||
|
|
28965bdaa6 | ||
|
|
ed42d2dad5 | ||
|
|
45b21cbdb8 | ||
|
|
b540093c2c | ||
|
|
d164d47e24 | ||
|
|
a56b92ecb3 | ||
|
|
114d914754 | ||
|
|
875051ea84 | ||
|
|
003357acad | ||
|
|
e1c77c4ba6 | ||
|
|
88475c3e41 | ||
|
|
e80f05301d | ||
|
|
a624e78975 | ||
|
|
8cd869f0f9 | ||
|
|
b09b3f8f8e | ||
|
|
b9043ffd98 | ||
|
|
54d3dc400a | ||
|
|
3962068385 | ||
|
|
a0b74ac3c6 | ||
|
|
870d75ac64 | ||
|
|
42d8260ce4 | ||
|
|
bfda4abe54 | ||
|
|
4b0d411564 | ||
|
|
6790de2d6a | ||
|
|
2784628544 | ||
|
|
dd8c687b2b | ||
|
|
9f4ceb2d72 | ||
|
|
0f8a4fa1df | ||
|
|
3b16b58880 | ||
|
|
192a902932 | ||
|
|
aedf77cff8 | ||
|
|
728547f309 | ||
|
|
33f5484441 | ||
|
|
a225486709 | ||
|
|
3f7f9ec1eb | ||
|
|
174aac5570 | ||
|
|
954232f7c8 | ||
|
|
067658fd10 | ||
|
|
b2b2b0f6cc | ||
|
|
408d169729 | ||
|
|
0eddbd5806 | ||
|
|
210a28afd4 | ||
|
|
94a16bd463 | ||
|
|
4005e246f7 | ||
|
|
6b3cd0437f | ||
|
|
c961748b49 | ||
|
|
7327eb8e0c | ||
|
|
1b0d595945 | ||
|
|
b7e2a04bb4 | ||
|
|
848eb65ad0 | ||
|
|
7ae98f4ed9 | ||
|
|
dc792691d4 | ||
|
|
0a57a8e89b | ||
|
|
f75d415322 | ||
|
|
1654562236 | ||
|
|
ba0535f39d | ||
|
|
e5b069f70b | ||
|
|
d34b9f669b | ||
|
|
ae2061fcaf | ||
|
|
65475cf2e8 | ||
|
|
ce2e63be6b | ||
|
|
007ce8db86 | ||
|
|
5997c3ea02 | ||
|
|
6895428844 | ||
|
|
2bc2d1f927 | ||
|
|
873ce10ced | ||
|
|
3855c83a7e | ||
|
|
281736a082 | ||
|
|
63d8e24c2f | ||
|
|
c66f1a6f8e | ||
|
|
6418cab98c | ||
|
|
040d51bc93 | ||
|
|
41c3245a51 | ||
|
|
ffc2a0b12f | ||
|
|
90c632f4ab | ||
|
|
9e8def306a | ||
|
|
f4e551111a | ||
|
|
1ead545561 | ||
|
|
f5fc46821f | ||
|
|
ce9f8d9b74 | ||
|
|
1104ecf72f | ||
|
|
13fc4cc0a4 | ||
|
|
31f7b330c5 | ||
|
|
ad3909888b | ||
|
|
f7b99d44fd | ||
|
|
2cf943d178 | ||
|
|
b2b1c16247 | ||
|
|
f91041b677 | ||
|
|
30b0faa70e | ||
|
|
174c4f6642 | ||
|
|
9ba5b119f8 | ||
|
|
b8ce7f07df | ||
|
|
c9a9db28a6 | ||
|
|
b21dc2db01 | ||
|
|
0f61a795ee | ||
|
|
ed30eeffb0 | ||
|
|
9473e08a14 | ||
|
|
16796b7fe5 | ||
|
|
1e704ece07 | ||
|
|
1f824d5838 | ||
|
|
d8bc7bd82f | ||
|
|
a2e1a73d10 | ||
|
|
68e71cc535 | ||
|
|
548bdf7d1c | ||
|
|
a6314a2c44 | ||
|
|
85e8800435 | ||
|
|
41b5c65e22 | ||
|
|
3ad0438a78 | ||
|
|
3ab80d0e3f | ||
|
|
2312787ec1 | ||
|
|
b8b2035151 | ||
|
|
4aefc9a648 | ||
|
|
c1cb7516a8 | ||
|
|
5aba2ae56f | ||
|
|
f958de8165 | ||
|
|
f79b188e82 | ||
|
|
dc182fde16 | ||
|
|
5fbc444a53 | ||
|
|
a7f83b2ba7 | ||
|
|
5bfe0073d9 | ||
|
|
3b3e707d3b | ||
|
|
ee932dee37 | ||
|
|
772bf2745a | ||
|
|
8cbd7dabec | ||
|
|
860d2f0bce | ||
|
|
ef4aac31b4 | ||
|
|
be1789f996 | ||
|
|
b7c1045783 | ||
|
|
54913a0131 | ||
|
|
a6036d2455 | ||
|
|
12d362106e | ||
|
|
b292ab5983 | ||
|
|
090c708ce9 | ||
|
|
67dc63c433 | ||
|
|
2606b846f0 | ||
|
|
ff66da7c65 | ||
|
|
76a6b4bfad | ||
|
|
ddadb21517 | ||
|
|
e62423ec84 | ||
|
|
083fdb3371 | ||
|
|
6cfe1ab29a | ||
|
|
4e43357daa | ||
|
|
7a82dd40ff | ||
|
|
584f23b08a | ||
|
|
b21f33951f | ||
|
|
acacd5ff01 | ||
|
|
a333fbf3b1 | ||
|
|
eb7de3c722 | ||
|
|
ac7ca05707 | ||
|
|
32ce6cde2d | ||
|
|
d922b7413c | ||
|
|
54b0fbcfaf | ||
|
|
d919dd5d94 | ||
|
|
48ec41b566 | ||
|
|
0d592e12f2 | ||
|
|
ee8b8db17f | ||
|
|
252033bff8 | ||
|
|
e21333faca | ||
|
|
ff3d7a9ea2 | ||
|
|
dd34aff9ef | ||
|
|
9eee99514b | ||
|
|
5ead2bdcf2 | ||
|
|
8b5267a013 | ||
|
|
423dad59b1 | ||
|
|
f79aa04c68 | ||
|
|
7535c859b9 | ||
|
|
ac34706853 | ||
|
|
b705fcb3f1 | ||
|
|
ae13fe5235 | ||
|
|
5830fbcd71 | ||
|
|
a2123aeb76 | ||
|
|
f07bdddb5d | ||
|
|
5da39c28a8 | ||
|
|
28f08d9583 | ||
|
|
0ba55b13d6 | ||
|
|
270e1aad9e | ||
|
|
ec1b7d1a46 | ||
|
|
718e17f07f | ||
|
|
48ff67a27c | ||
|
|
39eabb6cbb | ||
|
|
28d7d0a897 | ||
|
|
3f295e7a88 | ||
|
|
d6ef6bb56c | ||
|
|
f276ae6469 | ||
|
|
f6d4d5f517 | ||
|
|
0ee7a23018 | ||
|
|
61dec7317b | ||
|
|
7a1b4c38b1 | ||
|
|
0e97e7bee5 | ||
|
|
769bc55821 | ||
|
|
bd9cdf56bf | ||
|
|
be97b89b87 | ||
|
|
a9f5fe4374 | ||
|
|
a88878dc08 | ||
|
|
dcaabca09f | ||
|
|
d680d0173b | ||
|
|
3e8cb56f37 | ||
|
|
33ec1b1743 | ||
|
|
6f4b5451fc | ||
|
|
2770defdc4 | ||
|
|
1d6f435ca8 | ||
|
|
00856c0436 | ||
|
|
e0ee3bb24d | ||
|
|
8bbbed026d | ||
|
|
c9767ce84b | ||
|
|
b984f3ecad | ||
|
|
f58f784009 | ||
|
|
b6ee8da7c6 | ||
|
|
ae59ab3746 | ||
|
|
28ab5885a0 | ||
|
|
881dbc7094 | ||
|
|
2537a97900 | ||
|
|
20de100781 | ||
|
|
e1c3445136 | ||
|
|
e8be707079 | ||
|
|
680c3b96ce | ||
|
|
ba4ce729e6 | ||
|
|
d74da11382 | ||
|
|
9d0e6cb3cb | ||
|
|
027557999d | ||
|
|
41fb4d0c4b | ||
|
|
7cf0904b2b | ||
|
|
7330f1961b | ||
|
|
6e9d50204f | ||
|
|
629157d367 | ||
|
|
23af89d21e | ||
|
|
a3cf3dbb99 | ||
|
|
a28f380125 | ||
|
|
eb8fd17e01 | ||
|
|
4784e3bc88 | ||
|
|
cff287ee24 | ||
|
|
07eeffa3e3 | ||
|
|
fe7a5e564a | ||
|
|
00aa0761d7 | ||
|
|
f09a81b3b9 | ||
|
|
c43b0695c2 | ||
|
|
e9e436c0b8 | ||
|
|
c0194c1178 | ||
|
|
c6a0cb33ac | ||
|
|
e9375974cb | ||
|
|
a226902617 | ||
|
|
213774d6ff | ||
|
|
98d96fd1d8 | ||
|
|
ddb8fb06e6 | ||
|
|
25989f78a5 | ||
|
|
afdb7a9dcb | ||
|
|
2e79a843c8 | ||
|
|
54370da235 | ||
|
|
8ec456ed41 | ||
|
|
020df9098d | ||
|
|
43839ac1aa | ||
|
|
3c2f96250b | ||
|
|
9def2d2eb2 | ||
|
|
3ad40b84fb | ||
|
|
ecda4c3d98 | ||
|
|
74a0576c5d | ||
|
|
a6e07a9886 | ||
|
|
b76b61dc86 | ||
|
|
c3cb434973 | ||
|
|
62f82c2af2 | ||
|
|
d454973294 | ||
|
|
cba29c8981 | ||
|
|
4a812931c8 | ||
|
|
093a6da63d | ||
|
|
0ab5261bc6 | ||
|
|
1d4f3e4a28 | ||
|
|
6babcffd00 | ||
|
|
977cbba251 | ||
|
|
2fc4f4b054 | ||
|
|
53566c8434 | ||
|
|
563e5cd9c6 | ||
|
|
365d33b602 | ||
|
|
eef56e435d | ||
|
|
2044564981 | ||
|
|
26a5db86b0 | ||
|
|
7f74d3c211 | ||
|
|
ab3a7752ba |
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.pl linguist-language=Perl
|
||||||
6
.gitignore
vendored
@@ -1,7 +1,11 @@
|
|||||||
*~
|
*~
|
||||||
/build/
|
/build/
|
||||||
\#*\#
|
\#*\#
|
||||||
/test-data
|
/test-data*
|
||||||
/Mac/pkg/
|
/Mac/pkg/
|
||||||
*.dmg
|
*.dmg
|
||||||
*.pkg
|
*.pkg
|
||||||
|
.DS_Store
|
||||||
|
wiki.log
|
||||||
|
.prove
|
||||||
|
TAGS
|
||||||
|
|||||||
16
BUGS
@@ -1,16 +0,0 @@
|
|||||||
I've seen a bug that shows as follows: <strong class="changes">think
|
|
||||||
it belongs anymore.</stron><strong class="changes">g>.
|
|
||||||
|
|
||||||
Is DiffHtmlMarkWords called twice for a chunk?
|
|
||||||
|
|
||||||
It seems that following the diff link from RC to a page that has
|
|
||||||
a minor edit at the end will show a minor diff instead of a major
|
|
||||||
diff, eventhough it *says* that it will show a major diff!
|
|
||||||
|
|
||||||
mod_perl:
|
|
||||||
|
|
||||||
After a while, the script forgets some pages, so that links to these
|
|
||||||
pages turn into questionmarks.
|
|
||||||
|
|
||||||
From time to time, the script will show for a page X the page content
|
|
||||||
of the previous page.
|
|
||||||
675
LICENSE
Normal file
@@ -0,0 +1,675 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
{one line to give the program's name and a brief idea of what it does.}
|
||||||
|
Copyright (C) {year} {name of author}
|
||||||
|
|
||||||
|
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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
{project} Copyright (C) {year} {fullname}
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IFPkgDescriptionDeleteWarning</key>
|
|
||||||
<string></string>
|
|
||||||
<key>IFPkgDescriptionDescription</key>
|
|
||||||
<string>A wiki engine.</string>
|
|
||||||
<key>IFPkgDescriptionTitle</key>
|
|
||||||
<string>Oddmuse</string>
|
|
||||||
<key>IFPkgDescriptionVersion</key>
|
|
||||||
<string></string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleGetInfoString</key>
|
|
||||||
<string>Oddmuse</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>Oddmuse</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string></string>
|
|
||||||
<key>IFMajorVersion</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>IFMinorVersion</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>IFPkgFlagAllowBackRev</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagAuthorizationAction</key>
|
|
||||||
<string>RootAuthorization</string>
|
|
||||||
<key>IFPkgFlagDefaultLocation</key>
|
|
||||||
<string>/Library/WebServer</string>
|
|
||||||
<key>IFPkgFlagFollowLinks</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagInstallFat</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagIsRequired</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagOverwritePermissions</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagRelocatable</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagRestartAction</key>
|
|
||||||
<string>NoRestart</string>
|
|
||||||
<key>IFPkgFlagRootVolumeOnly</key>
|
|
||||||
<true/>
|
|
||||||
<key>IFPkgFlagUpdateInstalledLanguages</key>
|
|
||||||
<false/>
|
|
||||||
<key>IFPkgFlagUseUserMask</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>IFPkgFormatVersion</key>
|
|
||||||
<real>0.10000000149011612</real>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
package OddMuse;
|
|
||||||
$DataDir = '/Library/WebServer/Oddmuse';
|
|
||||||
do 'current';
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
$AdminPass = '';
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
$AdminPass = '';
|
|
||||||
4
Mac/wiki
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
package OddMuse;
|
|
||||||
$DataDir = '/Library/WebServer/Oddmuse';
|
|
||||||
do 'current';
|
|
||||||
183
Makefile
@@ -1,9 +1,10 @@
|
|||||||
# The Makefile is only for developpers wanting to prepare the tarball.
|
# In order to build a copy of Oddmuse with all the version numbers, use:
|
||||||
# Make sure the CVS keywords for the sed command on the next line are not expanded.
|
# make build. This creates modified copies of the files in the build
|
||||||
|
# subdirectory.
|
||||||
|
|
||||||
VERSION_NO=$(shell git describe --tags)
|
VERSION_NO=$(shell git describe --tags)
|
||||||
TRANSLATIONS=$(wildcard modules/translations/[a-z]*-utf8.pl$)
|
TRANSLATIONS=$(wildcard modules/translations/*-utf8.pl)
|
||||||
MODULES=$(wildcard modules/*.pl)
|
MODULES=$(sort $(wildcard modules/*.pl))
|
||||||
BUILD=build/wiki.pl $(foreach file, $(notdir $(MODULES)) $(notdir $(TRANSLATIONS)), build/$(file))
|
BUILD=build/wiki.pl $(foreach file, $(notdir $(MODULES)) $(notdir $(TRANSLATIONS)), build/$(file))
|
||||||
|
|
||||||
# PREPARE/BUILD: this creates copies of wiki.pl and all the modules
|
# PREPARE/BUILD: this creates copies of wiki.pl and all the modules
|
||||||
@@ -16,152 +17,64 @@ prepare: build $(BUILD)
|
|||||||
build:
|
build:
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf build
|
||||||
|
prove t/setup.pl
|
||||||
|
|
||||||
|
release:
|
||||||
|
perl stuff/release ~/oddmuse.org/releases 2.3.3
|
||||||
|
|
||||||
build/wiki.pl: wiki.pl
|
build/wiki.pl: wiki.pl
|
||||||
sed "s/\\\$$q->a({-href=>'http:\/\/www.oddmuse.org\/'}, 'Oddmuse')/\\\$$q->a({-href=>'http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tag\/?id=$(VERSION_NO)'}, 'wiki.pl') . ' ($(VERSION_NO)), see ' . &/" < $< > $@
|
perl -lne "s/(\\\$$q->a\(\{-href=>'https:\/\/www.oddmuse.org\/'\}, 'Oddmuse'\))/\\\$$q->a({-href=>'https:\/\/alexschroeder.ch\/cgit\/oddmuse\/tag\/?id=$(VERSION_NO)'}, 'wiki.pl') . ' ($(VERSION_NO)), see ' . \$$1/; print" < $< > $@
|
||||||
|
|
||||||
build/%-utf8.pl: modules/translations/%-utf8.pl
|
build/%-utf8.pl: modules/translations/%-utf8.pl
|
||||||
sed "s/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/translations\/\\(.*\\).pl\">\\(.*\\).pl<\/a>/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/translations\/\\1.pl?id=$(VERSION_NO)\">\\1.pl<\/a> (for $(VERSION_NO))/" < $< > $@
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
||||||
|
|
||||||
# Currently oddtrans introduces encoding errors!
|
build/national-%.pl: modules/translations/national-%.pl
|
||||||
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
||||||
|
|
||||||
# %-utf8.pl: wiki.pl $(MODULES)
|
build/month-names-%.pl: modules/translations/month-names-%.pl
|
||||||
# perl oddtrans -l $@ $^ > $@-new && mv $@-new $@
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, 'translations\/', '$(VERSION_NO)')/; print" < $< > $@
|
||||||
|
|
||||||
# from: http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl
|
# from: https://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl
|
||||||
# to: http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl?id=2.1-11-gd4f1e27
|
# to: https://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/namespaces.pl?id=2.1-11-gd4f1e27
|
||||||
|
|
||||||
build/%.pl: modules/%.pl
|
build/%.pl: modules/%.pl
|
||||||
sed "s/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/\\(.*\\).pl\">\\(.*\\).pl<\/a>/<a href=\"http:\/\/git.savannah.gnu.org\/cgit\/oddmuse.git\/tree\/modules\/\\1.pl?id=$(VERSION_NO)\">\\1.pl<\/a> (for $(VERSION_NO))/" < $< > $@
|
perl -lne "s/(AddModuleDescription\('[^']+', '[^']+')\)/\$$1, undef, '$(VERSION_NO)')/; print" < $< > $@
|
||||||
|
|
||||||
|
modules/translations/new-utf8.pl: wiki.pl $(MODULES)
|
||||||
|
cp $@ $@-old
|
||||||
|
perl stuff/oddtrans -l $@-old wiki.pl $(MODULES) > $@
|
||||||
|
rm -f $@-old
|
||||||
|
|
||||||
|
translations: $(TRANSLATIONS)
|
||||||
|
|
||||||
# UNTESTED/OBSOLETE: these targets have not been tested in a long time
|
|
||||||
# and are potentially obsolete.
|
|
||||||
VERSION=oddmuse-$(VERSION_NO)
|
|
||||||
UPLOADVERSION=oddmuse-inkscape-$(VERSION_NO)
|
|
||||||
INKSCAPE=GPL $(wildcard inkscape/*.py inkscape/*.inx inkscape/*.sh)
|
|
||||||
PACKAGEMAKER=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
|
|
||||||
DIST=$(VERSION).tar.gz $(VERSION).tar.gz.sig \
|
|
||||||
contrib/simple-install/$(VERSION)-simple.tar.gz \
|
|
||||||
contrib/simple-install/$(VERSION)-simple.tar.gz.sig
|
|
||||||
OLDDIST=$(VERSION).dmg $(VERSION).dmg.sig \
|
|
||||||
$(VERSION).tgz $(VERSION).tgz.sig
|
|
||||||
PWD=$(shell pwd)
|
|
||||||
|
|
||||||
dist: $(DIST)
|
|
||||||
|
|
||||||
upload: $(DIST)
|
|
||||||
for f in $^; do \
|
for f in $^; do \
|
||||||
scp $$f as@dl.sv.nongnu.org:/releases/oddmuse/; \
|
echo updating $$f...; \
|
||||||
|
perl stuff/oddtrans -l $$f wiki.pl $(MODULES) > $$f-new && mv $$f-new $$f; \
|
||||||
done
|
done
|
||||||
|
|
||||||
upload-text: new-utf8.pl
|
# Running four jobs in parallel, but clean up data directories without
|
||||||
wikiupload new-utf8.pl http://www.oddmuse.org/cgi-bin/oddmuse-en/New_Translation_File
|
# race conditions!
|
||||||
|
|
||||||
contrib/simple-install/$(VERSION)-simple.tar.gz:
|
|
||||||
cd contrib/simple-install && make $(VERSION)-simple.tar.gz
|
|
||||||
|
|
||||||
$(VERSION).tar.gz: README FDL GPL ChangeLog wiki.pl $(TRANSLATIONS) $(MODULES) current.pl
|
|
||||||
rm -rf $(VERSION)
|
|
||||||
mkdir $(VERSION)
|
|
||||||
cp $^ $(VERSION)
|
|
||||||
tar czf $@ $(VERSION)
|
|
||||||
|
|
||||||
$(UPLOADVERSION).tar.gz: $(INKSCAPE)
|
|
||||||
rm -rf $(UPLOADVERSION)
|
|
||||||
mkdir $(UPLOADVERSION)
|
|
||||||
cp $^ $(UPLOADVERSION)
|
|
||||||
cp wikiupload $(UPLOADVERSION)/oddmuse-upload.py
|
|
||||||
tar czf $@ $(UPLOADVERSION)
|
|
||||||
|
|
||||||
%.sig: %
|
|
||||||
gpg --sign -b $<
|
|
||||||
|
|
||||||
# OSX: .pkg is the package, and .dmg is the disk image.
|
|
||||||
|
|
||||||
# Make sure to copy the files into a new directory so that the CVS
|
|
||||||
#subdirectory are not inlcuded in the .pkg. And fix permissions. Skip
|
|
||||||
#if we can't run PackageMaker. All cp commands need sudo because on a
|
|
||||||
#second run the directories will already exist.
|
|
||||||
$(VERSION).pkg: wiki.pl modules/creole.pl Mac/config Mac/wiki
|
|
||||||
if test -x $(PACKAGEMAKER); then \
|
|
||||||
mkdir -p Mac/pkg/CGI-Executables; \
|
|
||||||
sudo cp wiki.pl Mac/pkg/CGI-Executables/current; \
|
|
||||||
sudo cp Mac/wiki Mac/pkg/CGI-Executables/wiki; \
|
|
||||||
sudo chown -R root:admin Mac/pkg/CGI-Executables; \
|
|
||||||
sudo chmod 644 Mac/pkg/CGI-Executables/current; \
|
|
||||||
sudo chmod 755 Mac/pkg/CGI-Executables/wiki; \
|
|
||||||
mkdir -p Mac/pkg/Oddmuse; \
|
|
||||||
sudo cp Mac/config Mac/pkg/Oddmuse; \
|
|
||||||
sudo chown www:admin Mac/pkg/Oddmuse; \
|
|
||||||
sudo chmod 775 Mac/pkg/Oddmuse; \
|
|
||||||
sudo chown root:admin Mac/pkg/Oddmuse/config; \
|
|
||||||
sudo chmod 664 Mac/pkg/Oddmuse/config; \
|
|
||||||
mkdir -p Mac/pkg/Oddmuse/modules; \
|
|
||||||
sudo cp modules/mac.pl Mac/pkg/Oddmuse/modules; \
|
|
||||||
sudo cp modules/creole.pl Mac/pkg/Oddmuse/modules; \
|
|
||||||
sudo chown -R root:admin Mac/pkg/Oddmuse/modules; \
|
|
||||||
sudo chmod 775 Mac/pkg/Oddmuse/modules; \
|
|
||||||
sudo chmod 644 Mac/pkg/Oddmuse/modules/*; \
|
|
||||||
$(PACKAGEMAKER) -build \
|
|
||||||
-p $(PWD)/$@ \
|
|
||||||
-i $(PWD)/Mac/Info.plist \
|
|
||||||
-d $(PWD)/Mac/Description.plist \
|
|
||||||
-f $(PWD)/Mac/pkg; \
|
|
||||||
fi;
|
|
||||||
|
|
||||||
$(VERSION).dmg: $(VERSION).pkg
|
|
||||||
hdiutil create -srcfolder $< -fs HFS+ -volname "Oddmuse" $@
|
|
||||||
|
|
||||||
# Slackware: .tgz are .tar.gz files used by the installer
|
|
||||||
# Slackware webserver is run by nobody uid/gid 99/99.
|
|
||||||
|
|
||||||
$(VERSION).tgz: wiki.pl modules/creole.pl Mac/config Mac/wiki
|
|
||||||
sudo rm -rf Slack/var Slack/install
|
|
||||||
mkdir -p Slack/var/www/wiki/modules
|
|
||||||
mkdir -p Slack/var/www/cgi-bin
|
|
||||||
mkdir -p Slack/install
|
|
||||||
sudo cp Mac/config Slack/var/www/wiki
|
|
||||||
sudo cp Mac/wiki Slack/var/www/cgi-bin
|
|
||||||
sudo cp README Slack/var/www/wiki
|
|
||||||
sudo cp modules/creole.pl Slack/var/www/wiki/modules
|
|
||||||
sudo cp wiki.pl Slack/var/www/cgi-bin/current
|
|
||||||
sudo sed -e 's/VERSION/$(VERSION_NO)/' < Slack/slack-desc > Slack/install/slack-desc
|
|
||||||
sudo chown -R 0:0 Slack/var Slack/install
|
|
||||||
sudo chgrp 99 Slack/var/www/cgi-bin/wiki
|
|
||||||
sudo chmod 644 Slack/var/www/cgi-bin/current
|
|
||||||
sudo chmod 775 Slack/var/www/cgi-bin/wiki
|
|
||||||
cd Slack && tar czf ../$@ var install
|
|
||||||
|
|
||||||
update-translations: $(TRANSLATIONS)
|
|
||||||
|
|
||||||
upload-translations: always
|
|
||||||
for f in $(TRANSLATIONS); do \
|
|
||||||
cvs status $$f | grep 'Status: Up-to-date'; \
|
|
||||||
wikiput -z "ham" -u "cvs" -s "update" \
|
|
||||||
"http://www.oddmuse.org/cgi-bin/oddmuse/raw/$$f" < $$f; \
|
|
||||||
done
|
|
||||||
|
|
||||||
deb:
|
|
||||||
equivs-build control
|
|
||||||
|
|
||||||
install:
|
|
||||||
@echo This only installs the deb file, not the script itself.
|
|
||||||
dpkg -i oddmuse*.deb
|
|
||||||
|
|
||||||
|
jobs ?= 4
|
||||||
test:
|
test:
|
||||||
prove t
|
prove t/setup.pl
|
||||||
|
prove --jobs=$(jobs) --state=slow,save t
|
||||||
|
|
||||||
package-upload: debian-$(VERSION).tar.gz debian-$(VERSION).tar.gz.sig
|
# Spin up a quick test
|
||||||
curl -T "{debian-$(VERSION).tar.gz,debian-$(VERSION).tar.gz.sig}" \
|
|
||||||
ftp://savannah.gnu.org/incoming/savannah/oddmuse/
|
|
||||||
|
|
||||||
package: debian-$(VERSION).tar.gz
|
development:
|
||||||
gpg --ascii --encrypt $<
|
@if grep --quiet 'ScriptName = "http://127.0.0.1:8080";' test-data/config; then \
|
||||||
|
echo Not overwriting \$$ScriptName in test-data/config; \
|
||||||
|
else \
|
||||||
|
echo '$ScriptName = "http://127.0.0.1:8080";' >> test-data/config; \
|
||||||
|
fi
|
||||||
|
morbo --listen http://*:8080 \
|
||||||
|
--watch wiki.pl --watch test-data/config --watch test-data/modules/ \
|
||||||
|
stuff/mojolicious-app.pl
|
||||||
|
|
||||||
debian-$(VERSION).tar.gz:
|
%.pem:
|
||||||
rm -rf $(VERSION)
|
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem
|
||||||
mkdir $(VERSION)
|
|
||||||
cp README FDL GPL wiki.pl $(VERSION)
|
gemini: cert.pem key.pem
|
||||||
tar czf $@ $(VERSION)
|
perl stuff/gemini-server.pl --wiki_cert_file=cert.pem --wiki_key_file=key.pem
|
||||||
|
|||||||
37
OddMuse.pm
@@ -1,37 +0,0 @@
|
|||||||
# Copyright (C) 2005 Alex Schroeder <alex@emacswiki.org>
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
use Apache2::RequestRec ();
|
|
||||||
use Apache2::RequestIO ();
|
|
||||||
use Apache2::Const -compile => qw(OK);
|
|
||||||
|
|
||||||
package OddMuse;
|
|
||||||
|
|
||||||
$RunCGI = 0;
|
|
||||||
require 'wiki.pl';
|
|
||||||
|
|
||||||
sub handler {
|
|
||||||
my $r = shift;
|
|
||||||
for my $var (qw{DataDir UseConfig ConfigFile ModuleDir ConfigPage
|
|
||||||
AdminPass EditPass ScriptName FullUrl}) {
|
|
||||||
no strict "refs";
|
|
||||||
$$var = $ENV{"Wiki$var"} if exists $ENV{"Wiki$var"}; # symbolic references
|
|
||||||
}
|
|
||||||
DoWikiRequest();
|
|
||||||
return Apache2::Const::OK;
|
|
||||||
}
|
|
||||||
48
README
@@ -1,48 +0,0 @@
|
|||||||
This is the README file distributed together with the Oddmuse script.
|
|
||||||
|
|
||||||
To install the script, copy wiki.pl into your cgi-bin directory. This
|
|
||||||
will store the pages in a temporary directory for you. In order to
|
|
||||||
make this permanent, change the $DataDir option in the script from
|
|
||||||
'/tmp/oddmuse' to 'oddmuse'. This will save the pages in a
|
|
||||||
subdirectory of your cgi-bin directory.
|
|
||||||
|
|
||||||
In order to start your wiki, click on the edit link (the first link
|
|
||||||
below the navigation bar, at the bottom of the page). This will allow
|
|
||||||
you to enter some text for this page. Click the Save button and you
|
|
||||||
are done.
|
|
||||||
|
|
||||||
To add new pages, edit the homepage and add links to new pages. Links
|
|
||||||
are traditionally formed by ConcatenatingCapitalizedWords. This kind
|
|
||||||
of link pattern is called a wiki word.
|
|
||||||
|
|
||||||
Alternatively, put links in [[double square brackets]]. This kind of
|
|
||||||
link pattern is called a free link.
|
|
||||||
|
|
||||||
As long as the new pages don't exist, links to these pages are
|
|
||||||
followed by a clickable question mark. Click on the question mark to
|
|
||||||
create the new page.
|
|
||||||
|
|
||||||
Enjoy your wiki experience.
|
|
||||||
|
|
||||||
Visit http://www.oddmuse.org/ to learn more about the translation
|
|
||||||
files and modules that are part of this package.
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
|
||||||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
|
||||||
any later version published by the Free Software Foundation.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Both the GNU Free Documentation License, and the GNU General Public
|
|
||||||
License are distributed together with this script. See the files FDL
|
|
||||||
and GPL, respectively.
|
|
||||||
197
README.creole
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
This is the README file distributed together with the
|
||||||
|
[[https://oddmuse.org/|Oddmuse]] script.
|
||||||
|
|
||||||
|
== Installing Oddmuse on a Debian System running Apache
|
||||||
|
|
||||||
|
The following instructions require a number of tools. You can make sure
|
||||||
|
they're all installed by issuing the following command as {{{root}}}:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
apt-get install coreutils apache2 sudo wget w3m perl \
|
||||||
|
libwww-perl libxml-rss-perl diffutils
|
||||||
|
}}}
|
||||||
|
|
||||||
|
You probably created an account for yourself. You might have to add this
|
||||||
|
user to the {{{sudo}}} group. Here's how I created my own user as
|
||||||
|
{{{root}}}:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
adduser alex
|
||||||
|
usermod -a -G sudo alex
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Now you can login as {{{alex}}} and do everything else using {{{sudo}}}.
|
||||||
|
|
||||||
|
You need to copy wiki.pl into your cgi-bin directory, and you need to
|
||||||
|
make the script executable. You might also have to change its owner to
|
||||||
|
an appropriate user on your system.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo wget -O /usr/lib/cgi-bin/wiki.pl \
|
||||||
|
http://git.savannah.gnu.org/cgit/oddmuse.git/plain/wiki.pl
|
||||||
|
sudo chmod +x /usr/lib/cgi-bin/wiki.pl
|
||||||
|
sudo chown www-data.www-data /usr/lib/cgi-bin/wiki.pl
|
||||||
|
}}}
|
||||||
|
|
||||||
|
If you're on SUSE, the user might not be {{{www-data}}} but
|
||||||
|
{{{wwwrun}}} without appropriate group:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo chown wwwrun.root /usr/lib/cgi-bin/wiki.pl
|
||||||
|
}}}
|
||||||
|
|
||||||
|
You should be able to test it right now! Visit
|
||||||
|
{{{http://localhost/cgi-bin/wiki.pl}}}. If your site is available from
|
||||||
|
the outside, you will be able to use a normal browser. If don't have a
|
||||||
|
domain name yet, you'll probably have to use a text browser like
|
||||||
|
{{{w3m}}}.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
w3m http://localhost/cgi-bin/wiki.pl
|
||||||
|
}}}
|
||||||
|
|
||||||
|
If you create pages in this wiki, these will get stored in a temporary
|
||||||
|
directory. You need change the data directory from {{{"/tmp/oddmuse"}}}
|
||||||
|
to like {{{"/var/local/oddmuse"}}}. The best way to do this without
|
||||||
|
changing {{{wiki.pl}}} is by editing
|
||||||
|
{{{/etc/apache2/sites-available/default}}}. Add the following line:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
SetEnv WikiDataDir /var/local/oddmuse
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Enable the default site by calling the following command:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo a2ensite default
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Reload the Apache configuration by calling the following command:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo service apache2 reload
|
||||||
|
}}}
|
||||||
|
|
||||||
|
You need to create the new data directory. You webserver runs CGI
|
||||||
|
scripts as {{{www-data}}}. Thus, you need to change the owner and group
|
||||||
|
of the directory to {{{www-data}}}.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo mkdir -p /var/local/oddmuse
|
||||||
|
sudo chown www-data.www-data /var/local/oddmuse
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Done! Visit your wiki and start editing. Click on the edit link (the
|
||||||
|
first link below the navigation bar, at the bottom of the page). This
|
||||||
|
will allow you to enter some text for this page. Click the Save button
|
||||||
|
and you are done.
|
||||||
|
|
||||||
|
To add new pages, edit the homepage and add links to new pages by
|
||||||
|
putting their names in {{{[[double square brackets]]}}}.
|
||||||
|
|
||||||
|
Enjoy your wiki experience.
|
||||||
|
|
||||||
|
Visit https://www.oddmuse.org/ to learn more about the translation
|
||||||
|
files and modules that are part of this package.
|
||||||
|
|
||||||
|
== Checking the Apache Setup
|
||||||
|
|
||||||
|
If you think this information doesn't work for you, here are some things
|
||||||
|
to check.
|
||||||
|
|
||||||
|
Apache's config directory is {{{/etc/apache2/apache2.conf}}}. This is
|
||||||
|
where we get the {{{www-data}}} username from. It says:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
# These need to be set in /etc/apache2/envvars
|
||||||
|
User ${APACHE_RUN_USER}
|
||||||
|
Group ${APACHE_RUN_GROUP}
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Checking {{{/etc/apache2/envvars}}} we see the following:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
export APACHE_RUN_USER=www-data
|
||||||
|
export APACHE_RUN_GROUP=www-data
|
||||||
|
}}}
|
||||||
|
|
||||||
|
So that's what we're using in the {{{chown}}} command in our
|
||||||
|
instructions above.
|
||||||
|
|
||||||
|
The default site is configured in
|
||||||
|
{{{/etc/apache2/sites-available/default}}}. In order for it to be
|
||||||
|
//enabled//, there must be a symlink from a file in
|
||||||
|
{{{/etc/apache2/sites-enabled}}} to the file in
|
||||||
|
{{{sites-available}}}. You can enable it using the following command:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo a2ensite default
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This file also lists the directories we've used in our instructions
|
||||||
|
above.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This means that {{{http://localhost/cgi-bin/wiki.pl}}} will call
|
||||||
|
{{{/usr/lib/cgi-bin/wiki.pl}}}
|
||||||
|
|
||||||
|
Don't forget to reload the Apache configuration as shown above, or
|
||||||
|
simply restart it all:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
sudo service apache2 graceful
|
||||||
|
}}}
|
||||||
|
|
||||||
|
== Using just Perl
|
||||||
|
|
||||||
|
You can use Mojolicious as your web server. There is a simple
|
||||||
|
##server.pl## which you can use. Here's how you might start it:
|
||||||
|
|
||||||
|
{{{
|
||||||
|
mkdir ~/oddmuse
|
||||||
|
WikiDataDir=$HOME/oddmuse perl server.pl daemon
|
||||||
|
}}}
|
||||||
|
|
||||||
|
This makes the server available on {{{http://localhost:3000/wiki}}}.
|
||||||
|
Make sure you create the directory before starting the server!
|
||||||
|
If you don't, you'll get a strange error:
|
||||||
|
`STDERR: : No such file or directory at ... perl5/Mojolicious/Plugin/CGI.pm`.
|
||||||
|
|
||||||
|
If it works, feel free to upgrade to Hypnotoad.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
WikiDataDir=$HOME/oddmuse hypnotoad server.pl
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Note: Hypnotoad uses a different default port. The above makes the
|
||||||
|
server available on {{{http://localhost:8080/wiki}}}. Hypnotoad will
|
||||||
|
keep forking new processes. To stop it, use the {{{-s}}} flag.
|
||||||
|
|
||||||
|
{{{
|
||||||
|
hypnotoad -s server.pl
|
||||||
|
}}}
|
||||||
|
|
||||||
|
== License
|
||||||
|
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||||||
|
any later version published by the Free Software Foundation.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Both the GNU Free Documentation License, and the GNU General Public
|
||||||
|
License are distributed together with this script. See the files
|
||||||
|
[[https://github.com/kensanata/oddmuse/blob/master/FDL|FDL]] and
|
||||||
|
[[https://github.com/kensanata/oddmuse/blob/master/GPL|GPL]],
|
||||||
|
respectively.
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# HOW TO EDIT THIS FILE:
|
|
||||||
# The "handy ruler" below makes it easier to edit a package description. Line
|
|
||||||
# up the first '|' above the ':' following the base package name, and the '|'
|
|
||||||
# on the right side marks the last column you can put a character in. You must
|
|
||||||
# make exactly 11 lines for the formatting to be correct. It's also
|
|
||||||
# customary to leave one space after the ':'.
|
|
||||||
|
|
||||||
|-----handy-ruler------------------------------------------------------|
|
|
||||||
oddmuse: Oddmuse VERSION
|
|
||||||
oddmuse:
|
|
||||||
oddmuse: Oddmuse is the name of the wiki engine being further developed by
|
|
||||||
oddmuse: Alex Schröder. The wiki engine consists of one big Perl script.
|
|
||||||
oddmuse: When installed on a web host, the script generates a wiki -- a
|
|
||||||
oddmuse: web site where users can read pages, change pages, add new pages,
|
|
||||||
oddmuse: and delete old pages. All pages are accessed via the script.
|
|
||||||
oddmuse:
|
|
||||||
oddmuse: This package will also install the Creole markup extension.
|
|
||||||
oddmuse:
|
|
||||||
oddmuse: Package created by Alex Schröder
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
Name: OddMuseWiki
|
|
||||||
Version: 2007.12.31
|
|
||||||
Release: 1suse
|
|
||||||
Group: Applications/Productivity
|
|
||||||
License: /opt/OddMuseWiki/doc/COPYING
|
|
||||||
Summary: Simple user-editted website (wiki)
|
|
||||||
|
|
||||||
Distribution: any perl+webserver+cgi distro
|
|
||||||
Vendor: Alex Schröder
|
|
||||||
Packager: Dr. Robert J. Meier <grandfather@sourceforge.org>
|
|
||||||
URL: http://www.oddmusewiki.org/
|
|
||||||
|
|
||||||
BuildRoot: /var/tmp/rpm-oddmusewiki-root
|
|
||||||
BuildArch: noarch
|
|
||||||
Prefix: /opt/OddMuseWiki
|
|
||||||
Prefix: /srv/www/wiki
|
|
||||||
Prefix: /srv/www/cgi-bin
|
|
||||||
Prefix: /etc/httpd/conf.d
|
|
||||||
Source0: %{name}-%{version}.tar.gz
|
|
||||||
Source1: %{name}-modules-%{version}.tar.gz
|
|
||||||
Source2: %{name}-contents-%{version}.tar.gz
|
|
||||||
|
|
||||||
Provides: wiki
|
|
||||||
Requires: perl >= 5.0.0
|
|
||||||
|
|
||||||
# Avoid automatic dependency calculation macros, as they are seldom portable.
|
|
||||||
AutoReq: no
|
|
||||||
AutoProv: no
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%description
|
|
||||||
OddMuseWiki is a program to run a wiki.
|
|
||||||
A wiki can be used for communication in a team or for documentation,
|
|
||||||
when things have to be quick and easy: Content Management for everybody.
|
|
||||||
|
|
||||||
A wiki enables other people to quickly join efforts. In the office,
|
|
||||||
you can introduce new employees, distribute phone lists, store memos,
|
|
||||||
plan trips, document projects, prepare meetings,
|
|
||||||
or describe internal processes.
|
|
||||||
|
|
||||||
For many free software projects wikis have taken an important role
|
|
||||||
somewhere between manual, FAQ, IRC, and mailing lists.
|
|
||||||
|
|
||||||
OddMuseWiki is very easy to install: Simple installation, compact code,
|
|
||||||
and easy extensibility were the most important design factors.
|
|
||||||
|
|
||||||
Features
|
|
||||||
|
|
||||||
1. Easy to install: Just copy one file into the correct directory.
|
|
||||||
2. No dependencies on version management tools or database installation.
|
|
||||||
3. Web server needs only Perl installed.
|
|
||||||
4. Easy to use for users, easy to hack for programmers.
|
|
||||||
5. Capable of multilingual sites.
|
|
||||||
6. Unicode (UTF-8) per default.
|
|
||||||
7. Valid HTML; CSS friendly.
|
|
||||||
8. Caching on several levels.
|
|
||||||
9. Easy to download.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%prep
|
|
||||||
# Record the environment variables
|
|
||||||
# $RPM_ARCH $RPM_OS - host configuration
|
|
||||||
# $RPM_OPT_FLAGS - c compile flags
|
|
||||||
# $RPM_PACKAGE_[NAME VERSION RELEASE] - spec file fields
|
|
||||||
# $RPM_SOURCE_DIR - base for Source and Patch filenames
|
|
||||||
# $RPM_BUILD_DIR - base for setup macro filenames
|
|
||||||
# $RPM_BUILD_ROOT - %{BuildRoot}
|
|
||||||
# modified by rpmbuild --buildroot
|
|
||||||
# $RPM_DOC_DIR - base for doc macro filenames
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-prep.log; fi
|
|
||||||
|
|
||||||
%setup -q -b1 -b2
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%build
|
|
||||||
# Record the environment variables
|
|
||||||
# Nomimally these are the same as for %prep
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-build.log; fi
|
|
||||||
|
|
||||||
# Nothing to build yet.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%install
|
|
||||||
# Record the environment variables
|
|
||||||
# Nomimally these are the same as for %prep
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-install.log; fi
|
|
||||||
|
|
||||||
rm -rf "$RPM_BUILD_ROOT"
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/opt/OddMuseWiki/cgi-bin
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/opt/OddMuseWiki/doc
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/opt/OddMuseWiki/etc
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/opt/OddMuseWiki/libperl
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/srv/www/cgi-bin
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/srv/www/wiki
|
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/etc/httpd/conf.d
|
|
||||||
|
|
||||||
install cgi-bin/wiki.pl "$RPM_BUILD_ROOT"/opt/OddMuseWiki/cgi-bin
|
|
||||||
install cgi-bin/wiki.pl "$RPM_BUILD_ROOT"/srv/www/cgi-bin
|
|
||||||
install doc/COPYING "$RPM_BUILD_ROOT"/opt/OddMuseWiki/doc
|
|
||||||
install etc/oddmusewiki.conf "$RPM_BUILD_ROOT"/opt/OddMuseWiki/etc
|
|
||||||
install libperl/current libperl/*.pl "$RPM_BUILD_ROOT"/opt/OddMuseWiki/libperl
|
|
||||||
cp -r wiki "$RPM_BUILD_ROOT"/srv/www
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%clean
|
|
||||||
# Record the environment variables
|
|
||||||
# Nomimally these are the same as for %prep
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-clean.log; fi
|
|
||||||
rm -rf "$RPM_BUILD_ROOT"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%pre
|
|
||||||
# Record local environment variables.
|
|
||||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
|
||||||
# modified by --relocate and --prefix arguments
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-pre.log; fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%post
|
|
||||||
# Record local environment variables
|
|
||||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
|
||||||
# modified by --relocate and --prefix arguments
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-post.log; fi
|
|
||||||
|
|
||||||
# Because relocation may change configuration,
|
|
||||||
# it cannot be symlinked into a public access site at rpmbuild -bb time.
|
|
||||||
if [ \( -d "$RPM_INSTALL_PREFIX2" -a -w "$RPM_INSTALL_PREFIX2" \) -o -w "$RPM_INSTALL_PREFIX2"/wiki.pl ]; then
|
|
||||||
cat "$RPM_INSTALL_PREFIX0"/cgi-bin/wiki.pl |
|
|
||||||
perl -pe 's:/opt/OddMuseWiki:'"$RPM_INSTALL_PREFIX0"':;' |
|
|
||||||
perl -pe 's:/srv/www/wiki:'"$RPM_INSTALL_PREFIX1"':;' |
|
|
||||||
cat > "$RPM_INSTALL_PREFIX2"/wiki.pl
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%preun
|
|
||||||
# Record local environment variables
|
|
||||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
|
||||||
# modified by --relocate and --prefix arguments at rpm -i time
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-preun.log; fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%postun
|
|
||||||
# Record local environment variables
|
|
||||||
# $RPM_INSTALL_PREFIX* reflect the Prefix: field(s)
|
|
||||||
# modified by --relocate and --prefix arguments at rpm -i time
|
|
||||||
if [ "$RPM_DUMPENV" != "" ] ; then env | sort > /tmp/rpm-postun.log; fi
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%files
|
|
||||||
# The doc, config, attr and many other macros are well documented in RPM-HOWTO
|
|
||||||
%defattr(0444,root,root)
|
|
||||||
%license
|
|
||||||
%attr(0555,root,root) /opt/OddMuseWiki
|
|
||||||
%config /opt/OddMuseWiki/etc/oddmusewiki.conf
|
|
||||||
%attr(0777,root,root) /srv/www/wiki
|
|
||||||
%attr(0555,root,root) /srv/www/cgi-bin/wiki.pl
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
* Wed Jan 3 2008 Dr. Robert Meier <grandfather@sourceforge.org> 2007.12.13-1suse
|
|
||||||
- copy-and-edit from hello.rpm
|
|
||||||
8
contrib/README.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Code for Special Circumstances
|
||||||
|
==============================
|
||||||
|
|
||||||
|
The files in this directory serve a particular purpose which might be
|
||||||
|
of interest to others. These are not generic scripts (there is a
|
||||||
|
separate directory for those). These are CGI scripts that post to a
|
||||||
|
Campaign Wiki, that allow you to edit wikis using Emacs, that copy
|
||||||
|
data from a particular site and post them to the Emacs Wiki.
|
||||||
37
contrib/campaignwiki/README
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
The files in this directory are used to run https://campaignwiki.org/
|
||||||
|
|
||||||
|
add-link.pl
|
||||||
|
===========
|
||||||
|
|
||||||
|
This is used to add links to the Links To Wisdom wiki. This wiki is a
|
||||||
|
bookmark site: A few pages make up a big unordered list of links in
|
||||||
|
wiki format. add-link is a tool to help users contribute new links to
|
||||||
|
the list.
|
||||||
|
|
||||||
|
https://campaignwiki.org/wiki/LinksToWisdom/HomePage
|
||||||
|
|
||||||
|
copy.pl
|
||||||
|
=======
|
||||||
|
|
||||||
|
This is used to copy the text from a web page to a wiki page. The idea
|
||||||
|
was to keep archive copies of cool pages somewhere. The Blog Archive
|
||||||
|
never got used, though.
|
||||||
|
|
||||||
|
https://campaignwiki.org/wiki/BlogArchive/HomePage
|
||||||
|
|
||||||
|
monster-tag.pl
|
||||||
|
==============
|
||||||
|
|
||||||
|
This is used to quickly tag many pages in the Monsters wiki. The
|
||||||
|
Monsters wiki hasn't been used in a long time, though.
|
||||||
|
|
||||||
|
https://campaignwiki.org/wiki/Monsters/HomePage
|
||||||
|
|
||||||
|
submit.pl
|
||||||
|
=========
|
||||||
|
|
||||||
|
This used to be used to add sites to the Old School RPG Planet. The
|
||||||
|
aggregator was configured via a wiki page on the Planet wiki. It's now
|
||||||
|
abandoned.
|
||||||
|
|
||||||
|
https://campaignwiki.org/wiki/Planet/HomePage
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#! /usr/bin/perl
|
#! /usr/bin/perl
|
||||||
|
|
||||||
# Copyright (C) 2011 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2011–2018 Alex Schroeder <alex@gnu.org>
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -15,23 +15,50 @@
|
|||||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
package OddMuse;
|
package OddMuse;
|
||||||
|
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
use HTML::TreeBuilder;
|
use HTML::TreeBuilder;
|
||||||
|
use JSON::PP;
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
# load Oddmuse core
|
# load Oddmuse core
|
||||||
$RunCGI = 0;
|
$RunCGI = 0;
|
||||||
do "wiki.pl";
|
$DataDir = '/home/alex/campaignwiki';
|
||||||
|
do "/home/alex/farm/wiki.pl";
|
||||||
|
|
||||||
# globals
|
# globals depending on the name of the script
|
||||||
my $name = "OSR Links to Wisdom";
|
my ($self, $name, $wiki);
|
||||||
my $wiki = 'LinksToWisdom';
|
if ($0 eq '/home/alex/campaignwiki.org/add-link.pl') {
|
||||||
my $site = "http://campaignwiki.org/wiki/$wiki";
|
$self = "https://campaignwiki.org/add-link";
|
||||||
|
$name = "OSR Links to Wisdom";
|
||||||
|
$wiki = 'LinksToWisdom';
|
||||||
|
} elsif ($0 eq '/home/alex/campaignwiki.org/add-adventure.pl') {
|
||||||
|
$self = "https://campaignwiki.org/add-adventure";
|
||||||
|
$name = "OSR Links to Adventures";
|
||||||
|
$wiki = 'Adventures';
|
||||||
|
} elsif ($0 eq '/home/alex/campaignwiki.org/add-sf-link.pl') {
|
||||||
|
$name = "OSRSF House Rules Wiki: Uplinked Intelligence";
|
||||||
|
$wiki = 'UplinkedIntelligence';
|
||||||
|
} else {
|
||||||
|
ReportError('Cannot determine wiki!', '500 INTERNAL SERVER ERROR');
|
||||||
|
}
|
||||||
|
|
||||||
|
# derived variables
|
||||||
|
my $site = "https://campaignwiki.org/wiki/$wiki";
|
||||||
# my $site = "http://localhost/wiki.pl";
|
# my $site = "http://localhost/wiki.pl";
|
||||||
my $home = "$site/$HomePage";
|
my $home = "$site/$HomePage";
|
||||||
|
# http://www.emacswiki.org/pics/star.png
|
||||||
|
my $stardata = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAHkAAACzdRTapx3twwD/9qb////1YCa0AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfXAQYCJAu+WhwbAAAAKnRFWHRDb21tZW50AGJ5IFJhZG9taXIgJ1RoZSBTaGVlcCcgRG9waWVybGFza2kVfTXbAAAAYElEQVQI12NgQAKMMIaYAFTAzRDKCHOEMETCnEFyjIJhYS6OggwMoqGhaS7GRgIMjC6uYc5GikA5YRcXIyWwotBgJUWw7lAXsAyDaIihMlhK1FFA0AjEEAESQgJQu4EYAPAPC2XcokgQAAAAAElFTkSuQmCC';
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|
||||||
|
sub canonical {
|
||||||
|
my $url = shift;
|
||||||
|
# handle blogspot domain munging
|
||||||
|
$url =~ s/blogspot(\.[a-z]+)+/blogspot.com/;
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
sub toc {
|
sub toc {
|
||||||
# start with the homepage
|
# start with the homepage
|
||||||
my @values;
|
my @values;
|
||||||
@@ -47,9 +74,60 @@ sub toc {
|
|||||||
$labels{$value} = $label;
|
$labels{$value} = $label;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return \@values, \%labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub top {
|
||||||
|
# start with the homepage
|
||||||
|
my %blog;
|
||||||
|
my $n;
|
||||||
|
for my $id (GetPageContent($HomePage) =~ /\* \[\[(.*?)\]\]/g) {
|
||||||
|
for my $item (GetPageContent(FreeToNormal($id)) =~ /^\*+\s+\[(https?:\/\/[^\/\n\t ]+)/mg) {
|
||||||
|
$n++;
|
||||||
|
$blog{canonical($item)}++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print $q->p("Total links counted: $n.");
|
||||||
|
my @list = sort { $blog{$b} <=> $blog{$a} } keys %blog;
|
||||||
|
# my $max = scalar @list;
|
||||||
|
# $max = 20 if $max > 20;
|
||||||
|
# @list = @list[0 .. $max -1];
|
||||||
|
@list = map {
|
||||||
|
my $domain = substr($_, index($_, '://') + 3);
|
||||||
|
my $term = quotemeta($domain);
|
||||||
|
# handle blogspot domain munging
|
||||||
|
$term =~ s/blogspot\\\.com/blogspot(\\.[a-z]+)+/;
|
||||||
|
$term = QuoteHtml($term);
|
||||||
|
$q->a({-href => $_}, $domain)
|
||||||
|
. " (" . $q->a({-href => "$self/match/$term"}, $blog{$_}) . ")";
|
||||||
|
} @list;
|
||||||
|
return \@list;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub match {
|
||||||
|
my $term = shift;
|
||||||
|
# start with the homepage
|
||||||
|
my @list;
|
||||||
|
my $title;
|
||||||
|
for my $id (GetPageContent($HomePage) =~ /\* \[\[(.*?)\]\]/g) {
|
||||||
|
for my $line (split /\n/, GetPageContent(FreeToNormal($id))) {
|
||||||
|
if ($line =~ /^\*+\s+([^][\n]*)$/) {
|
||||||
|
$title = $1;
|
||||||
|
} elsif ($line =~ /$term/o) {
|
||||||
|
if ($line =~ /^\*+\s+\[(https?:\S+)\s+([^]]+)\]/) {
|
||||||
|
push (@list, $q->a({-href => $1}, $2) . " (" . $title . ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return \@list;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub html_toc {
|
||||||
|
my ($values, $labels) = toc();
|
||||||
return $q->radio_group(-name =>'toc',
|
return $q->radio_group(-name =>'toc',
|
||||||
-values => \@values,
|
-values => $values,
|
||||||
-labels => \%labels,
|
-labels => $labels,
|
||||||
-linebreak=>'true');
|
-linebreak=>'true');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,102 +135,134 @@ sub default {
|
|||||||
print $q->p("Add a link to the " . $q->a({-href=>$home}, $name) . ".");
|
print $q->p("Add a link to the " . $q->a({-href=>$home}, $name) . ".");
|
||||||
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
||||||
print $q->p($q->label({-for=>'url'}, T('URL:')) . ' '
|
print $q->p($q->label({-for=>'url'}, T('URL:')) . ' '
|
||||||
. $q->textfield(-name=>'url', -id=>'url', -size=>50));
|
. $q->textfield(-name=>'url', -id=>'url', -size=>80));
|
||||||
print toc();
|
print $q->p({-style=>'font-size: 10pt'},
|
||||||
print $q->submit('go', 'Add!');
|
"(Drag this bookmarklet to your bookmarks bar for easy access:",
|
||||||
print $q->end_form();
|
|
||||||
print $q->p("Drag this bookmarklet to your bookmarks bar for easy access:",
|
|
||||||
$q->a({-href=>q{javascript:location='}
|
$q->a({-href=>q{javascript:location='}
|
||||||
. $q->url()
|
. $q->url()
|
||||||
. qq{?url='+encodeURIComponent(window.location.href)}},
|
. qq{?url='+encodeURIComponent(window.location.href)}},
|
||||||
"Submit $name") . ".");
|
"Submit $name") . ".)");
|
||||||
|
print html_toc();
|
||||||
|
print $q->submit('go', 'Add!');
|
||||||
|
print $q->end_form();
|
||||||
}
|
}
|
||||||
|
|
||||||
sub check_url {
|
sub links {
|
||||||
my $toc = GetParam('toc');
|
# start with the homepage
|
||||||
return default() unless $toc;
|
my @links; # [["url", "title", "page id"], ...]
|
||||||
my $url = shift;
|
for my $id (GetPageContent($HomePage) =~ /\* \[\[(.*?)\]\]/g) {
|
||||||
if (not GetParam('confirm', 0)) {
|
for my $item (GetPageContent(FreeToNormal($id)) =~ /^\*+\s+\[(https?:\/\/.*?)\]/mg) {
|
||||||
my $name = get_name($url);
|
my ($url, $title) = split(/\s+/, $item, 2);
|
||||||
print $q->p("Please confirm that you want to add "
|
push(@links, [$url, $title, $id]);
|
||||||
. GetUrl($url, $name)
|
|
||||||
. " to the section “$toc”.");
|
|
||||||
print $q->start_form(-method=>'get');
|
|
||||||
print $q->p($q->label({-for=>'name', -style=>'display: inline-block; width:30ex'},
|
|
||||||
T('Use a different link name:')) . ' '
|
|
||||||
. $q->textfield(-style=>'display: inline-block; width:60ex',
|
|
||||||
-name=>'name', -id=>'name', -size=>50, -default=>$name)
|
|
||||||
. $q->br()
|
|
||||||
. $q->label({-for=>'username', -style=>'display: inline-block; width:30ex'},
|
|
||||||
T('Your name for the log file:')) . ' '
|
|
||||||
. $q->textfield(-style=>'display: inline-block; width:60ex',
|
|
||||||
-name=>'username', -id=>'username', -size=>50));
|
|
||||||
my $star = $q->img({-src=>'http://www.emacswiki.org/pics/star.png', -class=>'smiley',
|
|
||||||
-alt=>'star'});
|
|
||||||
print '<p>Optionally: Do you want to rate it?<br />';
|
|
||||||
my $i = 0;
|
|
||||||
foreach my $label ($q->span({-style=>'display: inline-block; width:15ex'}, $star)
|
|
||||||
. 'I might use this for my next campaign',
|
|
||||||
$q->span({-style=>'display: inline-block; width:15ex'}, $star x 2)
|
|
||||||
. 'I have used this in a campaign and it worked as intended',
|
|
||||||
$q->span({-style=>'display: inline-block; width:15ex'}, $star x 3)
|
|
||||||
. 'I have used it in many of my campaigns',
|
|
||||||
$q->span({-style=>'display: inline-block; width:15ex'}, $star x 4)
|
|
||||||
. 'Everybody should give it a try',
|
|
||||||
$q->span({-style=>'display: inline-block; width:15ex'}, $star x 5)
|
|
||||||
. 'Everybody should use it, that is how awesome it is!') {
|
|
||||||
$i++;
|
|
||||||
print qq{<label><input type="radio" name="stars" value="$i" $checked/>$label</label><br />};
|
|
||||||
}
|
}
|
||||||
print '</p>';
|
|
||||||
print $q->hidden('url', $url);
|
|
||||||
print $q->hidden('toc', $toc);
|
|
||||||
print $q->hidden('confirm', 1);
|
|
||||||
print $q->submit('go', 'Continue');
|
|
||||||
print $q->end_form();
|
|
||||||
} else {
|
|
||||||
post_addition($q->param('name'), $url, $toc);
|
|
||||||
}
|
}
|
||||||
|
return @links;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub is_duplicate {
|
||||||
|
my $url = shift;
|
||||||
|
for my $link (links()) {
|
||||||
|
if ($link->[0] eq $url) {
|
||||||
|
print $q->p($q->strong("Oops, we seem to have a problem!"));
|
||||||
|
print $q->p(GetPageLink(NormalToFree($link->[2])),
|
||||||
|
" already links to the URL you submitted:",
|
||||||
|
GetUrl($link->[0], $link->[1]));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub confirm {
|
||||||
|
my ($url, $name, $toc) = @_;
|
||||||
|
print $q->p("Please confirm that you want to add "
|
||||||
|
. GetUrl($url, $name)
|
||||||
|
. " to the section “$toc”.");
|
||||||
|
print $q->start_form(-method=>'get');
|
||||||
|
print $q->p($q->label({-for=>'name', -style=>'display: inline-block; width: 15em'},
|
||||||
|
T('Use a different link name:')) . ' '
|
||||||
|
. $q->textfield(-style=>'display: inline-block; width:50ex',
|
||||||
|
-name=>'name', -id=>'name', -size=>50, -default=>$name)
|
||||||
|
. $q->br()
|
||||||
|
. $q->label({-for=>'summary', -style=>'display: inline-block; width:15em'},
|
||||||
|
T('An optional short summary:')) . ' '
|
||||||
|
. $q->textfield(-style=>'display: inline-block; width:50ex',
|
||||||
|
-name=>'summary', -id=>'summary', -size=>50)
|
||||||
|
. $q->br()
|
||||||
|
. $q->label({-for=>'username', -style=>'display: inline-block; width:15em'},
|
||||||
|
T('Your name for the log file:')) . ' '
|
||||||
|
. $q->textfield(-style=>'display: inline-block; width:50ex',
|
||||||
|
-name=>'username', -id=>'username', -size=>50));
|
||||||
|
my $star = $q->img({-src=>$stardata, -class=>'smiley', -alt=>'☆'});
|
||||||
|
print '<p>Optionally: Do you want to rate it?<br />';
|
||||||
|
my $i = 0;
|
||||||
|
foreach my $label ($q->span({-style=>'display: inline-block; width:3em'}, $star)
|
||||||
|
. 'I might use this for my campaign',
|
||||||
|
$q->span({-style=>'display: inline-block; width:3em'}, $star x 2)
|
||||||
|
. 'I have used this in a campaign and it worked as intended',
|
||||||
|
$q->span({-style=>'display: inline-block; width:3em'}, $star x 3)
|
||||||
|
. 'I have used this in a campaign and it was ' . $q->em('great')) {
|
||||||
|
$i++;
|
||||||
|
print qq{<label><input type="radio" name="stars" value="$i" $checked/>$label</label><br />};
|
||||||
|
}
|
||||||
|
print '</p>';
|
||||||
|
print $q->hidden('url', $url);
|
||||||
|
print $q->hidden('toc', $toc);
|
||||||
|
print $q->hidden('confirm', 1);
|
||||||
|
print $q->submit('go', 'Continue');
|
||||||
|
print $q->end_form();
|
||||||
|
}
|
||||||
|
|
||||||
|
# returns unquoted html
|
||||||
sub get_name {
|
sub get_name {
|
||||||
my $url = shift;
|
my $url = shift;
|
||||||
my $tree = HTML::TreeBuilder->new_from_content(GetRaw($url));
|
my $tree = HTML::TreeBuilder->new_from_content(GetRaw($url));
|
||||||
my $h = $tree->look_down('_tag', 'h1');
|
my $h = $tree->look_down('_tag', 'title');
|
||||||
$h = $tree->look_down('_tag', 'title') unless $h;
|
$h = $tree->look_down('_tag', 'h1') unless $h;
|
||||||
$h = $h->as_text if $h;
|
$h = $h->as_text if $h;
|
||||||
return $h;
|
return $h;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub post_addition {
|
sub post_addition {
|
||||||
my ($name, $url, $toc) = @_;
|
my ($url, $name, $toc, $summary) = @_;
|
||||||
my $id = FreeToNormal($name);
|
my $id = FreeToNormal($name);
|
||||||
my $display = $name;
|
my $display = $name;
|
||||||
utf8::decode($display); # we're dealing with user input
|
utf8::decode($display); # we're dealing with user input
|
||||||
|
utf8::decode($summary); # we're dealing with user input
|
||||||
print $q->p("Adding ", GetUrl($url, $display), " to “$toc”.");
|
print $q->p("Adding ", GetUrl($url, $display), " to “$toc”.");
|
||||||
# start with the homepage
|
# start with the homepage
|
||||||
my @pages = GetPageContent($HomePage) =~ /\* \[\[(.*?)\]\]/g;
|
my @pages = GetPageContent($HomePage) =~ /\* \[\[(.*?)\]\]/g;
|
||||||
for my $id (@pages) {
|
for my $id (@pages) {
|
||||||
return post($id, undef, $name, $url, GetParam('stars', '')) if $id eq $toc;
|
return post($id, undef, $name, $summary, $url, GetParam('stars', '')) if $id eq $toc;
|
||||||
my $data = GetPageContent(FreeToNormal($id));
|
my $data = GetPageContent(FreeToNormal($id));
|
||||||
while ($data =~ /(\*+ ([^][\n]*))$/mg) {
|
while ($data =~ /(\*+ ([^][\n]*))$/mg) {
|
||||||
return post($id, $1, $name, $url, GetParam('stars', '')) if $2 eq $toc;
|
return post($id, $1, $name, $summary, $url, GetParam('stars', '')) if $2 eq $toc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
print $q->p("Whoops. I was unable to find “$toc” in the wiki. Sorry!");
|
print $q->p("Whoops. I was unable to find “$toc” in the wiki. Sorry!");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub post {
|
sub post {
|
||||||
my ($id, $toc, $name, $url, $stars) = @_;
|
my ($id, $toc, $name, $summary, $url, $stars) = @_;
|
||||||
my $data = GetPageContent(FreeToNormal($id));
|
my $data = GetPageContent(FreeToNormal($id));
|
||||||
|
my $re = quotemeta($url);
|
||||||
|
if ($data =~ /$re\s+(.*?)\]/) {
|
||||||
|
my $display = $1;
|
||||||
|
print $q->p($q->strong("Oops, we seem to have a problem!"));
|
||||||
|
print $q->p(GetPageLink(NormalToFree($id)),
|
||||||
|
" already links to the URL you submitted:",
|
||||||
|
GetUrl($url, $display));
|
||||||
|
return;
|
||||||
|
}
|
||||||
$stars = ' ' . (':star:' x $stars) if $stars;
|
$stars = ' ' . (':star:' x $stars) if $stars;
|
||||||
|
$summary = ': ' . $summary if $summary;
|
||||||
if ($toc) {
|
if ($toc) {
|
||||||
$toc =~ /^(\*+)/;
|
$toc =~ /^(\*+)/;
|
||||||
my $depth = "*$1"; # one more!
|
my $depth = "*$1"; # one more!
|
||||||
my $regexp = quotemeta($toc);
|
my $regexp = quotemeta($toc);
|
||||||
$data =~ s/$regexp/$toc\n$depth \[$url $name\]$stars/;
|
$data =~ s/$regexp/$toc\n$depth \[$url $name\]$summary$stars/;
|
||||||
} else {
|
} else {
|
||||||
$data = "* [$url $name]$stars\n" . $data;
|
$data = "* [$url $name]$summary$stars\n" . $data;
|
||||||
}
|
}
|
||||||
my $ua = LWP::UserAgent->new;
|
my $ua = LWP::UserAgent->new;
|
||||||
my %params = (text => $data,
|
my %params = (text => $data,
|
||||||
@@ -166,37 +276,79 @@ sub post {
|
|||||||
my $response = $ua->post($site, \%params);
|
my $response = $ua->post($site, \%params);
|
||||||
if ($response->is_error) {
|
if ($response->is_error) {
|
||||||
print $q->p("The submission failed!");
|
print $q->p("The submission failed!");
|
||||||
print $q->pre($response->status_line . "\n"
|
print $response->content;
|
||||||
. $response->content);
|
|
||||||
} else {
|
} else {
|
||||||
print $q->p("See for yourself: ", GetPageLink($id));
|
print $q->p("See for yourself: ", GetPageLink($id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub main {
|
sub print_end_of_page {
|
||||||
$ConfigFile = "$DataDir/config"; # read the global config file
|
|
||||||
$DataDir = "$DataDir/$wiki"; # but link to the local pages
|
|
||||||
Init(); # read config file (no modules!)
|
|
||||||
$ScriptName = $site; # undo setting in the config file
|
|
||||||
binmode(STDOUT,':utf8');
|
|
||||||
$q->charset('utf8');
|
|
||||||
if ($q->path_info eq '/source') {
|
|
||||||
seek DATA, 0, 0;
|
|
||||||
print "Content-type: text/plain; charset=UTF-8\r\n\r\n", <DATA>;
|
|
||||||
} else {
|
|
||||||
$UserGotoBar = $q->a({-href=>$q->url . '/source'}, 'Source');
|
|
||||||
print GetHeader('', 'Submit a new link');
|
|
||||||
print $q->start_div({-class=>'content index'});
|
|
||||||
if (not GetParam('url')) {
|
|
||||||
default();
|
|
||||||
} else {
|
|
||||||
check_url(GetParam('url'));
|
|
||||||
}
|
|
||||||
print $q->p('Questions? Send mail to Alex Schroeder <'
|
print $q->p('Questions? Send mail to Alex Schroeder <'
|
||||||
. $q->a({-href=>'mailto:kensanata@gmail.com'},
|
. $q->a({-href=>'mailto:kensanata@gmail.com'},
|
||||||
'kensanata@gmail.com') . '>');
|
'kensanata@gmail.com') . '>');
|
||||||
print $q->end_div();
|
print $q->end_div();
|
||||||
PrintFooter();
|
PrintFooter();
|
||||||
|
}
|
||||||
|
|
||||||
|
sub main {
|
||||||
|
$ConfigFile = "$DataDir/config"; # read the global config file
|
||||||
|
$ModuleDir = "$DataDir/modules"; # global modules
|
||||||
|
$DataDir = "$DataDir/$wiki"; # but link to the local pages
|
||||||
|
Init(); # read config file
|
||||||
|
$ScriptName = $site; # undo setting in the config file
|
||||||
|
$FullUrl = $site; #
|
||||||
|
InitPageVariables(); # call again: $ScriptName was wrong
|
||||||
|
$HomePage = 'HomePage'; # $HomePage must not be translated
|
||||||
|
binmode(STDOUT,':utf8');
|
||||||
|
$q->charset('utf8');
|
||||||
|
if ($q->path_info eq '/source') {
|
||||||
|
seek DATA, 0, 0;
|
||||||
|
print "Content-type: text/plain; charset=UTF-8\r\n\r\n", <DATA>;
|
||||||
|
} elsif ($q->path_info eq '/structure') {
|
||||||
|
my ($values, $labels) = toc();
|
||||||
|
my @indented = map {
|
||||||
|
($labels->{$_} || $_) =~ /^( *)/;
|
||||||
|
[$_, length($1)]
|
||||||
|
} @$values;
|
||||||
|
print "Content-type: application/json; charset=UTF-8\r\n\r\n";
|
||||||
|
binmode(STDOUT,':raw'); # because of encode_json
|
||||||
|
print JSON::PP::encode_json(\@indented);
|
||||||
|
} elsif ($q->path_info eq '/toc') {
|
||||||
|
my ($values, $labels) = toc();
|
||||||
|
print "Content-type: application/json; charset=UTF-8\r\n\r\n";
|
||||||
|
binmode(STDOUT,':raw'); # because of encode_json
|
||||||
|
print JSON::PP::encode_json($values);
|
||||||
|
} elsif ($q->path_info eq '/top') {
|
||||||
|
print GetHeader('', 'Top Blogs');
|
||||||
|
print $q->start_div({-class=>'content top'});
|
||||||
|
print $q->ol($q->li(top()));
|
||||||
|
print_end_of_page();
|
||||||
|
} elsif ($q->path_info =~ '^/match/(.*)') {
|
||||||
|
my $term = $1;
|
||||||
|
print GetHeader('', "Entries Matching '$term'");
|
||||||
|
print $q->start_div({-class=>'content match'});
|
||||||
|
print $q->ol($q->li(match($term)));
|
||||||
|
print_end_of_page();
|
||||||
|
} else {
|
||||||
|
push(@UserGotoBarPages, 'Help');
|
||||||
|
$UserGotoBar = $q->a({-href=>$q->url . '/source'}, 'Source');
|
||||||
|
print GetHeader('', 'Submit a new link');
|
||||||
|
print $q->start_div({-class=>'content index'});
|
||||||
|
my $url = canonical(GetParam('url'));
|
||||||
|
my $name = UnquoteHtml(GetParam('name', get_name($url)));
|
||||||
|
my $toc = GetParam('toc');
|
||||||
|
my $confirm = GetParam('confirm');
|
||||||
|
my $summary = GetParam('summary');
|
||||||
|
if (not $url) {
|
||||||
|
default();
|
||||||
|
} elsif (not $toc) {
|
||||||
|
default() if not is_duplicate($url);
|
||||||
|
} elsif (not $confirm) {
|
||||||
|
confirm($url, $name, $toc);
|
||||||
|
} else {
|
||||||
|
post_addition($url, $name, $toc, $summary);
|
||||||
|
}
|
||||||
|
print_end_of_page();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#! /usr/bin/perl
|
#! /usr/bin/perl
|
||||||
|
|
||||||
# Copyright (C) 2011 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2011–2014 Alex Schroeder <alex@gnu.org>
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -17,63 +17,62 @@
|
|||||||
package OddMuse;
|
package OddMuse;
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
use HTML::TreeBuilder;
|
use HTML::TreeBuilder;
|
||||||
|
use utf8;
|
||||||
|
|
||||||
# load Oddmuse core
|
# load Oddmuse core
|
||||||
$RunCGI = 0;
|
$RunCGI = 0;
|
||||||
do "wiki.pl";
|
do "wiki.pl";
|
||||||
|
|
||||||
# globals
|
$default_namespace = 'NameOfYourWiki';
|
||||||
my $wiki = 'BlogArchive';
|
|
||||||
my $site = "http://campaignwiki.org/wiki/$wiki";
|
|
||||||
# my $site = "http://localhost/wiki.pl";
|
|
||||||
my $home = "$site/HomePage";
|
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|
||||||
sub default {
|
sub default {
|
||||||
print $q->p("Copy a blog article to the "
|
my ($url, $ns) = @_;
|
||||||
. $q->a({-href=>$home}, $wiki) . ".");
|
print $q->start_multipart_form(-method=>'get', -class=>'copy');
|
||||||
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
print $q->p("This script helps you copy of a blog post to your Campaign Wiki.");
|
||||||
print $q->p($q->label({-for=>'url'}, T('URL:')) . ' '
|
print $q->p($q->label({-for=>'url', -style=>'display: inline-block; width: 20ex'}, 'Blog post URL:'),
|
||||||
. $q->textfield(-name=>'url', -id=>'url', -size=>50));
|
$q->textfield(-name=>'url', -id=>'url', -size=>50),
|
||||||
|
$q->br(),
|
||||||
|
$q->label({-for=>'ns', -style=>'display: inline-block; width: 20ex'}, 'Name of your wiki:'),
|
||||||
|
$q->textfield(-name=>'ns', -id=>'ns', -size=>50, -default=>$default_namespace));
|
||||||
|
if ($url and not $ns) {
|
||||||
|
print $q->p($q->em('Please provide the name of your wiki. It is mandatory. Use “NameOfYourWiki” if you just want to test something.'));
|
||||||
|
}
|
||||||
print $q->submit('go', 'Go!');
|
print $q->submit('go', 'Go!');
|
||||||
print $q->end_form();
|
print $q->end_form();
|
||||||
print $q->p("Please make sure you’re only submitting your own articles",
|
print $q->p("Please make sure you’re only submitting your own articles",
|
||||||
"or articles with an appropriate license.");
|
"or articles with an appropriate license.");
|
||||||
|
|
||||||
print $q->p("Drag this bookmarklet to your bookmarks bar for easy access:",
|
print $q->p("Drag this bookmarklet to your bookmarks bar for easy access:",
|
||||||
$q->a({-href=>q{javascript:location='http://campaignwiki.org/copy?url='+encodeURIComponent(window.location.href)}}, $wiki) . ".");
|
$q->a({-href=>q{javascript:location='http://campaignwiki.org/copy?url='+encodeURIComponent(window.location.href)}}, 'Copy Blog Post') . ".");
|
||||||
}
|
}
|
||||||
|
|
||||||
sub check_url {
|
sub confirm_overwrite {
|
||||||
my $url = shift;
|
my ($url, $ns, $name) = @_;
|
||||||
print $q->p("Looking at ", $q->a({-href=>$url}, $url));
|
print $q->p("We already have a page with that name: ", GetPageLink($name));
|
||||||
my ($name, $data) = get_data($url);
|
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
||||||
$name = GetParam('name', $name);
|
print $q->p($q->label({-for=>'name'}, T('New name:')) . ' '
|
||||||
if (name_exists($name) and not GetParam('confirm', 0)) {
|
. $q->textfield(-name=>'name', -id=>'name', -size=>50, -default=>$name));
|
||||||
print $q->p("We already have a page with that name: ",
|
print $q->hidden('url', $url);
|
||||||
$q->a({-href=>$duplicate}, $duplicate));
|
print $q->hidden('ns', $ns);
|
||||||
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
print $q->hidden('confirm', 1);
|
||||||
print $q->p($q->label({-for=>'name'}, T('New name:')) . ' '
|
print $q->submit('go', 'Continue');
|
||||||
. $q->textfield(-name=>'name', -id=>'name', -size=>50,
|
print $q->end_form();
|
||||||
-default=>$name));
|
}
|
||||||
print $q->hidden('url', $url);
|
|
||||||
print $q->hidden('confirm', 1);
|
sub confirm_save {
|
||||||
print $q->submit('go', 'Continue');
|
my ($url, $ns, $name) = @_;
|
||||||
print $q->end_form();
|
my $ns = GetParam('ns', $default_namespace);
|
||||||
} elsif (not GetParam('confirm', 0)) {
|
print $q->p("Please confirm that you want to copy",
|
||||||
print $q->p("Please confirm that you want to copy this article to the wiki.");
|
$q->a({-href=>$url}, "this article"), "to", GetPageLink($HomePage, $ns) . ".");
|
||||||
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
print $q->start_multipart_form(-method=>'get', -class=>'submit');
|
||||||
print $q->p($q->label({-for=>'name'}, T('Name:')) . ' '
|
print $q->p($q->label({-for=>'name'}, T('Name:')) . ' '
|
||||||
. $q->textfield(-name=>'name', -id=>'name', -size=>50,
|
. $q->textfield(-name=>'name', -id=>'name', -size=>50, -default=>$name));
|
||||||
-default=>$name));
|
print $q->hidden('url', $url);
|
||||||
print $q->hidden('url', $url);
|
print $q->hidden('ns', $ns);
|
||||||
print $q->hidden('confirm', 1);
|
print $q->hidden('confirm', 1);
|
||||||
print $q->submit('go', 'Continue');
|
print $q->submit('go', 'Continue');
|
||||||
print $q->end_form();
|
print $q->end_form();
|
||||||
} else {
|
|
||||||
post_addition($name, $data, $url);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_data {
|
sub get_data {
|
||||||
@@ -82,24 +81,32 @@ sub get_data {
|
|||||||
my $h = $tree->look_down('_tag', 'h1');
|
my $h = $tree->look_down('_tag', 'h1');
|
||||||
$h = $tree->look_down('_tag', 'title') unless $h;
|
$h = $tree->look_down('_tag', 'title') unless $h;
|
||||||
$h = $h->as_text if $h;
|
$h = $h->as_text if $h;
|
||||||
my $b = $tree->look_down('_tag', 'body');
|
my $b;
|
||||||
if ($b = $tree->look_down('_tag', 'div',
|
if ($b = $tree->look_down('_tag', 'div', 'class', qr/post-body/)) {
|
||||||
'class', qr/post-body/)) {
|
# Blogspot
|
||||||
# blogspot
|
$b = html($b);
|
||||||
|
} elsif ($b = $tree->look_down('_tag', 'div', 'class', qr/content/)) {
|
||||||
|
# Oddmuse
|
||||||
$b = html($b);
|
$b = html($b);
|
||||||
} else {
|
} else {
|
||||||
# no idea, just get the text
|
# default: get it all
|
||||||
$b = $b->as_text if $b;
|
$b = html($tree->look_down('_tag', 'body'));
|
||||||
}
|
}
|
||||||
|
# common illegal character for page names
|
||||||
|
$h =~ s/:/,/g;
|
||||||
return ($h, $b);
|
return ($h, $b);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub html {
|
sub html {
|
||||||
my $tree = shift;
|
my ($tree, $p) = @_;
|
||||||
|
# $p indicates whether we need an empty line or not
|
||||||
my $str;
|
my $str;
|
||||||
for my $element ($tree->content_list()) {
|
for my $element ($tree->content_list()) {
|
||||||
if (not ref $element) {
|
if (not ref $element) {
|
||||||
$str .= $element;
|
$str .= $element;
|
||||||
|
} elsif ($element->tag() eq 'p') {
|
||||||
|
$str .= ($p == 1 ? "\n\n" : "") . html($element);
|
||||||
|
$p = 1;
|
||||||
} elsif ($element->tag() eq 'br') {
|
} elsif ($element->tag() eq 'br') {
|
||||||
$str .= "\n\n";
|
$str .= "\n\n";
|
||||||
} elsif ($element->tag() eq 'span'
|
} elsif ($element->tag() eq 'span'
|
||||||
@@ -107,6 +114,20 @@ sub html {
|
|||||||
$str .= "[b]" . html($element) . "[/b]";
|
$str .= "[b]" . html($element) . "[/b]";
|
||||||
} elsif ($element->tag() =~ m/^(b|i|h[1-6])$/) {
|
} elsif ($element->tag() =~ m/^(b|i|h[1-6])$/) {
|
||||||
$str .= "[$1]" . html($element) . "[/$1]";
|
$str .= "[$1]" . html($element) . "[/$1]";
|
||||||
|
} elsif ($element->tag() eq 'a'
|
||||||
|
and $element->attr('href')) {
|
||||||
|
$str .= "[url=" . $element->attr('href') . "]" . html($element) . "[/url]";
|
||||||
|
} elsif ($element->tag() eq 'img'
|
||||||
|
and $element->attr('src')) {
|
||||||
|
$str .= "[img]" . $element->attr('src') . "[/img]";
|
||||||
|
} elsif ($element->tag() eq 'pre') {
|
||||||
|
$str .= "\n\n[code]\n" . $element->as_text() . "\n[/code]";
|
||||||
|
$p = 1;
|
||||||
|
} elsif ($element->tag() eq 'div'
|
||||||
|
and ($element->attr('style') =~ /float: *(left|right)/
|
||||||
|
or $element->attr('style') =~ /text-align: *(center)/)) {
|
||||||
|
$str .= "\n[$1]" . html($element) . "[/$1]";
|
||||||
|
$p = 1;
|
||||||
} else {
|
} else {
|
||||||
$str .= html($element);
|
$str .= html($element);
|
||||||
}
|
}
|
||||||
@@ -123,25 +144,25 @@ sub name_exists {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub post_addition {
|
sub post_addition {
|
||||||
my ($name, $data, $url) = @_;
|
my ($url, $ns, $name, $data) = @_;
|
||||||
my $id = FreeToNormal($name);
|
my $id = FreeToNormal($name);
|
||||||
print $q->p("Adding ", $q->a({-href=>$url}, $name));
|
print $q->p("Copying ", $q->a({-href=>$url}, "the blog post") . "…");
|
||||||
my $text = "Based on [$url $name].\n----\n" . $data;
|
my $text = "Based on [$url $name].\n----\n" . $data;
|
||||||
my $ua = LWP::UserAgent->new;
|
my $ua = LWP::UserAgent->new;
|
||||||
my %params = (text => $text,
|
my %params = (text => $text,
|
||||||
title => $id,
|
title => $id,
|
||||||
summary => $name,
|
summary => $name,
|
||||||
username => GetParam('username'),
|
username => GetParam('username'),
|
||||||
|
ns => $ns,
|
||||||
pwd => GetParam('pwd'));
|
pwd => GetParam('pwd'));
|
||||||
$params{$QuestionaskerSecretKey} = 1 if $QuestionaskerSecretKey;
|
$params{$QuestionaskerSecretKey} = 1 if $QuestionaskerSecretKey;
|
||||||
my $response = $ua->post($site, \%params);
|
my $response = $ua->post($FullUrl, \%params);
|
||||||
if ($response->is_error) {
|
if ($response->is_error) {
|
||||||
print $q->p("The submission failed!");
|
print $q->p("Copying failed!");
|
||||||
print $q->pre($response->status_line . "\n"
|
print $q->p($q->strong($response->status_line));
|
||||||
. $response->content);
|
print $response->content;
|
||||||
} else {
|
} else {
|
||||||
print $q->p("See for yourself: ",
|
print $q->p("Your copy: ", GetPageLink($name) . ".");
|
||||||
$q->a({-href=>"$site/$id"}, $name));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,12 +173,22 @@ sub main {
|
|||||||
print "Content-type: text/plain; charset=UTF-8\r\n\r\n", <DATA>;
|
print "Content-type: text/plain; charset=UTF-8\r\n\r\n", <DATA>;
|
||||||
} else {
|
} else {
|
||||||
$UserGotoBar .= $q->a({-href=>$q->url . '/source'}, 'Source');
|
$UserGotoBar .= $q->a({-href=>$q->url . '/source'}, 'Source');
|
||||||
print GetHeader('', 'Submit a new blog article');
|
print GetHeader('', 'Copy a blog article');
|
||||||
print $q->start_div({-class=>'content index'});
|
print $q->start_div({-class=>'content index'});
|
||||||
if (not GetParam('url')) {
|
my $url = GetParam('url');
|
||||||
default();
|
my $ns = GetParam('ns');
|
||||||
|
if (not $url or not $ns) {
|
||||||
|
default($url, $ns);
|
||||||
} else {
|
} else {
|
||||||
check_url(GetParam('url'));
|
my ($name, $data) = get_data($url);
|
||||||
|
$name = GetParam('name', $name);
|
||||||
|
if (name_exists($name) and not GetParam('confirm', 0)) {
|
||||||
|
confirm_overwrite($url, $ns, $name);
|
||||||
|
} elsif (not GetParam('confirm', 0)) {
|
||||||
|
confirm_save($url, $ns, $name);
|
||||||
|
} else {
|
||||||
|
post_addition($url, $ns, $name, $data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
print $q->p('Questions? Send mail to Alex Schröder <'
|
print $q->p('Questions? Send mail to Alex Schröder <'
|
||||||
. $q->a({-href=>'mailto:kensanata@gmail.com'},
|
. $q->a({-href=>'mailto:kensanata@gmail.com'},
|
||||||
|
|||||||
14
contrib/campaignwiki/delete.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
if test -z "$2" -o ! -z "$3"; then
|
||||||
|
echo "Usage: delete.sh USERNAME WIKI"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
username=$1
|
||||||
|
wiki=$2
|
||||||
|
|
||||||
|
for p in $(curl --silent "https://campaignwiki.org/wiki/$wiki?action=index;raw=1"); do
|
||||||
|
echo "Deleting: $p"
|
||||||
|
curl -F frodo=1 -F "title=$p" -F text=DeletedPage -F summary=Deleted -F username="$username" "https://campaignwiki.org/wiki/$wiki"
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
0
contrib/campaignwiki/monster-tag.pl
Normal file → Executable file
0
contrib/campaignwiki/submit.pl
Normal file → Executable file
@@ -1,26 +1,20 @@
|
|||||||
#!/usr/bin/perl
|
#!/usr/bin/perl
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2004 Alex Schroeder <alex@emacswiki.org>
|
# Copyright (C) 2004 Alex Schroeder <alex@gnu.org>
|
||||||
# Copyright (C) 2007 Vinicius José Latorre <viniciusjl at ig.com.br>
|
# Copyright (C) 2007 Vinicius José Latorre <viniciusjl at ig.com.br>
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify it under
|
||||||
# it under the terms of the GNU General Public License as published by
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# Foundation, either version 3 of the License, or (at your option) any later
|
||||||
# (at your option) any later version.
|
# version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License along with
|
||||||
# along with this program; if not, write to the
|
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
# $Id: ell-to-wiki.pl,v 1.5 2007/02/15 22:00:26 as Exp $
|
|
||||||
|
|
||||||
use LWP::UserAgent;
|
use LWP::UserAgent;
|
||||||
use XML::Parser;
|
use XML::Parser;
|
||||||
|
|||||||
93
contrib/emacswiki/bootstrap.js
vendored
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
// Public Domain
|
||||||
|
// initial version by Alex Schroeder <alex@gnu.org>
|
||||||
|
// with many improvements by Evgkeni Sampelnikof
|
||||||
|
|
||||||
|
$(function(){
|
||||||
|
|
||||||
|
// add fancy classes
|
||||||
|
$('div.header' ).addClass('container');
|
||||||
|
$('div.wrapper').addClass('container');
|
||||||
|
$('div.footer' ).addClass('container');
|
||||||
|
$('div.footer > .navbar' ).remove();
|
||||||
|
$('.message > p' ).addClass('alert');
|
||||||
|
$('img.portrait').addClass('img-polaroid');
|
||||||
|
|
||||||
|
$('input:text').addClass('input-medium search-query');
|
||||||
|
$('textarea').addClass('span12');
|
||||||
|
$('input:submit').addClass('btn');
|
||||||
|
$('.download a').addClass('btn btn-success');
|
||||||
|
|
||||||
|
$('.footer .gotobar').remove();
|
||||||
|
$('.footer br').first().remove();
|
||||||
|
var $gotobar = $('.gotobar')
|
||||||
|
.after($('<div>').attr('class','navbar')
|
||||||
|
.append($('<div>').attr('class','navbar-inner')
|
||||||
|
.append($('<ul>').attr('class', 'nav'))));
|
||||||
|
var $id = $('h1 a').first().text();
|
||||||
|
var $list = $('.nav')
|
||||||
|
.append($('<li>')
|
||||||
|
.append($('<a>').attr('class', 'brand').attr('href', 'http://www.emacswiki.org/')
|
||||||
|
.append('Emacs Wiki')));
|
||||||
|
$('.gotobar a').each(function() {
|
||||||
|
var $item = $('<li>');
|
||||||
|
$(this).appendTo($item);
|
||||||
|
$item.appendTo($list);
|
||||||
|
if ($(this).text() == $id) {
|
||||||
|
$item.addClass('active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$gotobar.remove();
|
||||||
|
|
||||||
|
// search without labels, without button, without language field
|
||||||
|
$('form.search input[type=submit]').remove();
|
||||||
|
$('form.search label').remove();
|
||||||
|
$('form.search input#searchlang').remove();
|
||||||
|
$('form.search')
|
||||||
|
.css({'float': 'right',
|
||||||
|
'margin-top': '10px'});
|
||||||
|
$('.navbar').append($('form.search'));
|
||||||
|
|
||||||
|
// add button style to some links
|
||||||
|
$('.edit.bar a').addClass('btn');
|
||||||
|
|
||||||
|
// add color to Talk button for a non-existing page
|
||||||
|
$('a.btn.comment.edit').addClass('btn-warning');
|
||||||
|
|
||||||
|
// move article link and talk link below title
|
||||||
|
var $link = $('a.original').add('a.comment');
|
||||||
|
if ($link) {
|
||||||
|
$('.header h1').after($('<p>').append($link));
|
||||||
|
}
|
||||||
|
|
||||||
|
// toc
|
||||||
|
if ($('title').text() == "EmacsWiki: Wikified Emacs Lisp List") {
|
||||||
|
$('.content').addClass('ell');
|
||||||
|
}
|
||||||
|
|
||||||
|
// tables
|
||||||
|
$('table').addClass('table');
|
||||||
|
|
||||||
|
// minor edit checkbox
|
||||||
|
$('input[type=checkbox]').addClass('checkbox');
|
||||||
|
$('input[type=checkbox]').parent().addClass('checkbox');
|
||||||
|
|
||||||
|
// clean up admin page
|
||||||
|
$('li a.clear').parent().remove();
|
||||||
|
$('li a.index').parent().remove();
|
||||||
|
|
||||||
|
$('a[href="http://creativecommons.org/licenses/GPL/2.0/"]')
|
||||||
|
.parent()
|
||||||
|
.css({'margin-right': '120px',
|
||||||
|
'opacity': 0.3,
|
||||||
|
'padding-top': '1em'});
|
||||||
|
$('.footer .bar')
|
||||||
|
.after('<hr />');
|
||||||
|
var footer_wrapper = $('<div/>')
|
||||||
|
.addClass('footer_wrapper');
|
||||||
|
var footer = $('.footer.container');
|
||||||
|
footer.after(footer_wrapper);
|
||||||
|
footer_wrapper.append(footer);
|
||||||
|
var logo_image = $('<img />')
|
||||||
|
.attr('src', 'http://emacswiki.org/ew_logo.png');
|
||||||
|
$('.header .navbar .brand').html(logo_image);
|
||||||
|
});
|
||||||
122
contrib/fix-copyright-years
Executable file
@@ -0,0 +1,122 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2006 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# GNU Radio 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 3, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
||||||
|
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
# Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
# This file is based on code from GNU Radio.
|
||||||
|
# https://github.com/balister/GNU-Radio/blob/master/dtools/bin/fix-copyright-years
|
||||||
|
|
||||||
|
import re
|
||||||
|
import datetime
|
||||||
|
import subprocess
|
||||||
|
import multiprocessing
|
||||||
|
|
||||||
|
def command(*args): return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
|
||||||
|
|
||||||
|
def is_free_software(lines):
|
||||||
|
for line in lines[:50]:
|
||||||
|
if 'This program is free software' in line: return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_copyright_lines(lines):
|
||||||
|
start = -1
|
||||||
|
end = -1
|
||||||
|
for i, line in enumerate(lines[:20]):
|
||||||
|
if line.startswith('# Copyright'):
|
||||||
|
if start == -1: start = i
|
||||||
|
end = i
|
||||||
|
if start == -1: raise Exception
|
||||||
|
return start, end
|
||||||
|
|
||||||
|
def copyright_line(author, years):
|
||||||
|
from_year = years.pop()
|
||||||
|
to_year = from_year
|
||||||
|
for year in years:
|
||||||
|
if year > to_year: to_year = year
|
||||||
|
elif year < from_year: from_year = year
|
||||||
|
|
||||||
|
if from_year == to_year:
|
||||||
|
return '# Copyright (C) %d %s\n' % (from_year, author)
|
||||||
|
else:
|
||||||
|
return '# Copyright (C) %d–%d %s\n' % (from_year, to_year, author)
|
||||||
|
|
||||||
|
author_re = re.compile('\nAuthor: (.*)\nDate:.* (\d\d\d\d) ')
|
||||||
|
|
||||||
|
def fix_co_years(files):
|
||||||
|
for file in files:
|
||||||
|
print file
|
||||||
|
years = {}
|
||||||
|
changed = False
|
||||||
|
lines = open(file).readlines()
|
||||||
|
if not is_free_software(lines):
|
||||||
|
print ' is not Free Software'
|
||||||
|
continue
|
||||||
|
|
||||||
|
# extract authors and years from git log
|
||||||
|
log = command('git', 'log', file)
|
||||||
|
it = re.finditer(author_re, log)
|
||||||
|
for match in it:
|
||||||
|
author, year = match.groups()
|
||||||
|
if author in years:
|
||||||
|
years[author].add(int(year))
|
||||||
|
else:
|
||||||
|
years[author] = set([int(year)])
|
||||||
|
|
||||||
|
# extract copyright beginning and end from
|
||||||
|
try:
|
||||||
|
start, end = get_copyright_lines(lines)
|
||||||
|
except:
|
||||||
|
print ' copyright lines not found'
|
||||||
|
continue
|
||||||
|
|
||||||
|
# only update or add existing authors, don't touch authors not in git log
|
||||||
|
for author in years.keys():
|
||||||
|
found = False
|
||||||
|
for i in range(start, end + 1):
|
||||||
|
if author in lines[i]:
|
||||||
|
line = copyright_line(author, years[author])
|
||||||
|
if line != lines[i]:
|
||||||
|
lines[i] = line
|
||||||
|
changed = True
|
||||||
|
found = True
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not found:
|
||||||
|
lines.insert(end, copyright_line(author, years[author]))
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
# write file
|
||||||
|
if changed:
|
||||||
|
# print ''.join(lines[:30])
|
||||||
|
# print '------------------------------------------------------------------------'
|
||||||
|
open(file, 'w').write(''.join(lines))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# get recursive list of files in the repo
|
||||||
|
files = command('git', 'ls-tree', '--name-only', 'HEAD', '-r').splitlines()
|
||||||
|
# files = ['contrib/campaignwiki/add-link.pl']
|
||||||
|
|
||||||
|
# start n+1 processes to handle the files
|
||||||
|
num_procs = multiprocessing.cpu_count()
|
||||||
|
# num_procs = 1
|
||||||
|
procs = [multiprocessing.Process(
|
||||||
|
target=lambda *files: fix_co_years(files),
|
||||||
|
args=files[num::num_procs],
|
||||||
|
) for num in range(num_procs)]
|
||||||
|
map(multiprocessing.Process.start, procs)
|
||||||
|
map(multiprocessing.Process.join, procs)
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,10 +12,7 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
use CGI;
|
use CGI;
|
||||||
use CGI::Carp qw(fatalsToBrowser);
|
use CGI::Carp qw(fatalsToBrowser);
|
||||||
131
contrib/no-flickr.pl
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# Copyright (C) 2005-2016 Alex Schroeder <alex@gnu.org>
|
||||||
|
#
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use Modern::Perl;
|
||||||
|
use LWP::UserAgent;
|
||||||
|
use utf8;
|
||||||
|
binmode(STDOUT, ":utf8");
|
||||||
|
|
||||||
|
my $ua = LWP::UserAgent->new;
|
||||||
|
|
||||||
|
sub url_encode {
|
||||||
|
my $str = shift;
|
||||||
|
return '' unless $str;
|
||||||
|
utf8::encode($str); # turn to byte string
|
||||||
|
my @letters = split(//, $str);
|
||||||
|
my %safe = map {$_ => 1} ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '-', '_', '.', '!', '~', '*', "'", '(', ')', '#');
|
||||||
|
foreach my $letter (@letters) {
|
||||||
|
$letter = sprintf("%%%02x", ord($letter)) unless $safe{$letter};
|
||||||
|
}
|
||||||
|
return join('', @letters);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_raw {
|
||||||
|
my $uri = shift;
|
||||||
|
my $response = $ua->get($uri);
|
||||||
|
return $response->content if $response->is_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_wiki_page {
|
||||||
|
my ($wiki, $id, $password) = @_;
|
||||||
|
my $parameters = [
|
||||||
|
pwd => $password,
|
||||||
|
action => 'browse',
|
||||||
|
id => $id,
|
||||||
|
raw => 1,
|
||||||
|
];
|
||||||
|
my $response = $ua->post($wiki, $parameters);
|
||||||
|
return $response->decoded_content if $response->is_success;
|
||||||
|
die "Getting $id returned " . $response->status_line;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_wiki_index {
|
||||||
|
my $wiki = shift;
|
||||||
|
my $parameters = [
|
||||||
|
search => "flickr.com",
|
||||||
|
context => 0,
|
||||||
|
raw => 1,
|
||||||
|
];
|
||||||
|
my $response = $ua->post($wiki, $parameters);
|
||||||
|
return $response->decoded_content if $response->is_success;
|
||||||
|
die "Getting the index returned " . $response->status_line;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub post_wiki_page {
|
||||||
|
my ($wiki, $id, $username, $password, $text) = @_;
|
||||||
|
my $parameters = [
|
||||||
|
username => $username,
|
||||||
|
pwd => $password,
|
||||||
|
recent_edit => 'on',
|
||||||
|
text => $text,
|
||||||
|
title => $id,
|
||||||
|
];
|
||||||
|
my $response = $ua->post($wiki, $parameters);
|
||||||
|
die "Posting to $id returned " . $response->status_line unless $response->code == 302;
|
||||||
|
}
|
||||||
|
|
||||||
|
my %seen = ();
|
||||||
|
|
||||||
|
sub write_flickr {
|
||||||
|
my ($id, $flickr, $dir, $file) = @_;
|
||||||
|
say "Found $flickr";
|
||||||
|
warn "$file was seen before: " . $seen{$file} if $seen{$file};
|
||||||
|
die "$file contains unknown characters" if $file =~ /[^a-z0-9_.]/;
|
||||||
|
$seen{$file} = "$id used $flickr";
|
||||||
|
my $bytes = get_raw($flickr) or die("No data for $id");
|
||||||
|
open(my $fh, '>', "$dir/$file") or die "Cannot write $dir/$file";
|
||||||
|
binmode($fh);
|
||||||
|
print $fh $bytes;
|
||||||
|
close($fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub convert_page {
|
||||||
|
my ($wiki, $pics, $dir, $username, $password, $id) = @_;
|
||||||
|
say $id;
|
||||||
|
my $text = get_wiki_page($wiki, $id, $password);
|
||||||
|
my $is_changed = 0;
|
||||||
|
while ($text =~ m!(https://[a-z0-9.]+.flickr.com/(?:[a-z0-9.]+/)?([a-z0-9_]+\.(?:jpg|png)))!) {
|
||||||
|
my $flickr = $1;
|
||||||
|
my $file = $2;
|
||||||
|
write_flickr($id, $flickr, $dir, $file);
|
||||||
|
$is_changed = 1;
|
||||||
|
my $re = quotemeta($flickr);
|
||||||
|
$text =~ s!$flickr!$pics/$file!g;
|
||||||
|
}
|
||||||
|
if ($is_changed) {
|
||||||
|
post_wiki_page($wiki, $id, $username, $password, $text);
|
||||||
|
} else {
|
||||||
|
# die "$id has no flickr matches?\n$text";
|
||||||
|
}
|
||||||
|
sleep(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub convert_site {
|
||||||
|
my ($wiki, $pics, $dir, $username, $password) = @_;
|
||||||
|
my @ids = split(/\n/, get_wiki_index($wiki));
|
||||||
|
for my $id (@ids) {
|
||||||
|
convert_page($wiki, $pics, $dir, $username, $password, $id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
our $AdminPass;
|
||||||
|
do "/home/alex/password.pl";
|
||||||
|
convert_site('https://alexschroeder.ch/wiki',
|
||||||
|
'https://alexschroeder.ch/pics',
|
||||||
|
'/home/alex/alexschroeder.ch/pics',
|
||||||
|
'Alex Schroeder',
|
||||||
|
$AdminPass);
|
||||||
@@ -1,694 +0,0 @@
|
|||||||
;;; oddmuse-curl.el -- edit pages on an Oddmuse wiki using curl
|
|
||||||
;;
|
|
||||||
;; Copyright (C) 2006–2014 Alex Schroeder <alex@gnu.org>
|
|
||||||
;; (C) 2007 rubikitch <rubikitch@ruby-lang.org>
|
|
||||||
;;
|
|
||||||
;; Latest version:
|
|
||||||
;; http://git.savannah.gnu.org/cgit/oddmuse.git/plain/contrib/oddmuse-curl.el
|
|
||||||
;; Discussion, feedback:
|
|
||||||
;; http://www.emacswiki.org/cgi-bin/wiki/OddmuseCurl
|
|
||||||
;;
|
|
||||||
;; 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 3 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;;
|
|
||||||
;; A simple mode to edit pages on Oddmuse wikis using Emacs and the command-line
|
|
||||||
;; HTTP client `curl'.
|
|
||||||
;;
|
|
||||||
;; Since text formatting rules depend on the wiki you're writing for, the
|
|
||||||
;; font-locking can only be an approximation.
|
|
||||||
;;
|
|
||||||
;; Put this file in a directory on your `load-path' and
|
|
||||||
;; add this to your init file:
|
|
||||||
;; (require 'oddmuse)
|
|
||||||
;; (oddmuse-mode-initialize)
|
|
||||||
;; And then use M-x oddmuse-edit to start editing.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(eval-when-compile
|
|
||||||
(require 'cl)
|
|
||||||
(require 'sgml-mode)
|
|
||||||
(require 'skeleton))
|
|
||||||
|
|
||||||
(require 'goto-addr)
|
|
||||||
(require 'info)
|
|
||||||
|
|
||||||
(defcustom oddmuse-directory "~/.emacs.d/oddmuse"
|
|
||||||
"Directory to store oddmuse pages."
|
|
||||||
:type '(string)
|
|
||||||
:group 'oddmuse)
|
|
||||||
|
|
||||||
(defcustom oddmuse-wikis
|
|
||||||
'(("EmacsWiki" "http://www.emacswiki.org/cgi-bin/emacs"
|
|
||||||
utf-8 "uihnscuskc" nil)
|
|
||||||
("OddmuseWiki" "http://www.oddmuse.org/cgi-bin/oddmuse"
|
|
||||||
utf-8 "question" nil))
|
|
||||||
"Alist mapping wiki names to URLs.
|
|
||||||
|
|
||||||
The elements in this list are:
|
|
||||||
|
|
||||||
NAME, the name of the wiki you provide when calling `oddmuse-edit'.
|
|
||||||
|
|
||||||
URL, the base URL of the script used when posting. If the site
|
|
||||||
uses URL rewriting, then you need to extract the URL from the
|
|
||||||
edit page. Emacs Wiki, for example, usually shows an URL such as
|
|
||||||
http://www.emacswiki.org/emacs/Foo, but when you edit the page
|
|
||||||
and examine the page source, you'll find this:
|
|
||||||
|
|
||||||
<form method=\"post\" action=\"http://www.emacswiki.org/cgi-bin/emacs\"
|
|
||||||
enctype=\"multipart/form-data\" accept-charset=\"utf-8\"
|
|
||||||
class=\"edit text\">...</form>
|
|
||||||
|
|
||||||
Thus, the correct value for URL is
|
|
||||||
http://www.emacswiki.org/cgi-bin/emacs.
|
|
||||||
|
|
||||||
ENCODING, a symbol naming a coding-system.
|
|
||||||
|
|
||||||
SECRET, the secret the wiki uses if it has the Question Asker
|
|
||||||
extension enabled. If you're getting 403 responses (edit denied)
|
|
||||||
eventhough you can do it from a browser, examine your cookie in
|
|
||||||
the browser. For Emacs Wiki, for example, my cookie says:
|
|
||||||
|
|
||||||
euihnscuskc%251e1%251eusername%251eAlexSchroeder
|
|
||||||
|
|
||||||
Use `split-string' and split by \"%251e\" and you'll see that
|
|
||||||
\"euihnscuskc\" is the odd one out. The parameter name is the
|
|
||||||
relevant string (its value is always 1).
|
|
||||||
|
|
||||||
USERNAME, your optional username to provide. It defaults to
|
|
||||||
`oddmuse-username'."
|
|
||||||
:type '(repeat (list (string :tag "Wiki")
|
|
||||||
(string :tag "URL")
|
|
||||||
(choice :tag "Coding System"
|
|
||||||
(const :tag "default" utf-8)
|
|
||||||
(symbol :tag "specify"
|
|
||||||
:validate (lambda (widget)
|
|
||||||
(unless (coding-system-p
|
|
||||||
(widget-value widget))
|
|
||||||
(widget-put widget :error
|
|
||||||
"Not a valid coding system")))))
|
|
||||||
(choice :tag "Secret"
|
|
||||||
(const :tag "default" "question")
|
|
||||||
(string :tag "specify"))
|
|
||||||
(choice :tag "Username"
|
|
||||||
(const :tag "default" nil)
|
|
||||||
(string :tag "specify"))))
|
|
||||||
:group 'oddmuse)
|
|
||||||
|
|
||||||
(defcustom oddmuse-username user-full-name
|
|
||||||
"Username to use when posting.
|
|
||||||
Setting a username is the polite thing to do."
|
|
||||||
:type '(string)
|
|
||||||
:group 'oddmuse)
|
|
||||||
|
|
||||||
(defcustom oddmuse-password ""
|
|
||||||
"Password to use when posting.
|
|
||||||
You only need this if you want to edit locked pages and you
|
|
||||||
know an administrator password."
|
|
||||||
:type '(string)
|
|
||||||
:group 'oddmuse)
|
|
||||||
|
|
||||||
(defcustom oddmuse-use-always-minor nil
|
|
||||||
"When t, set all the minor mode bit to all editions.
|
|
||||||
This can be changed for each edition using `oddmuse-toggle-minor'."
|
|
||||||
:type '(boolean)
|
|
||||||
:group 'oddmuse)
|
|
||||||
|
|
||||||
(defvar oddmuse-get-command
|
|
||||||
"curl --silent %w\"?action=browse;raw=2;\"id=%t"
|
|
||||||
"Command to use for publishing pages.
|
|
||||||
It must print the page to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'
|
|
||||||
%t URL encoded pagename, eg. HowTo, How_To, or How%20To")
|
|
||||||
|
|
||||||
(defvar oddmuse-history-command
|
|
||||||
"curl --silent %w\"?action=history;raw=1;\"id=%t"
|
|
||||||
"Command to use for reading the history of a page.
|
|
||||||
It must print the history to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'
|
|
||||||
%t URL encoded pagename, eg. HowTo, How_To, or How%20To")
|
|
||||||
|
|
||||||
(defvar oddmuse-rc-command
|
|
||||||
"curl --silent %w\"?action=rc;raw=1\""
|
|
||||||
"Command to use for Recent Changes.
|
|
||||||
It must print the RSS 3.0 text format to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'")
|
|
||||||
|
|
||||||
(defvar oddmuse-post-command
|
|
||||||
(concat "curl --silent --write-out '%{http_code}'"
|
|
||||||
" --form title='%t'"
|
|
||||||
" --form summary='%s'"
|
|
||||||
" --form username='%u'"
|
|
||||||
" --form password='%p'"
|
|
||||||
" --form %q=1"
|
|
||||||
" --form recent_edit=%m"
|
|
||||||
" --form oldtime=%o"
|
|
||||||
" --form text='<-'"
|
|
||||||
" '%w'")
|
|
||||||
"Command to use for publishing pages.
|
|
||||||
It must accept the page on stdin.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%t pagename
|
|
||||||
%s summary
|
|
||||||
%u username
|
|
||||||
%p password
|
|
||||||
%q question-asker cookie
|
|
||||||
%m minor edit
|
|
||||||
%o oldtime, a timestamp provided by Oddmuse
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'")
|
|
||||||
|
|
||||||
(defvar oddmuse-link-pattern
|
|
||||||
"\\<[[:upper:]]+[[:lower:]]+\\([[:upper:]]+[[:lower:]]*\\)+\\>"
|
|
||||||
"The pattern used for finding WikiName.")
|
|
||||||
|
|
||||||
(defvar oddmuse-wiki nil
|
|
||||||
"The current wiki.
|
|
||||||
Must match a key from `oddmuse-wikis'.")
|
|
||||||
|
|
||||||
(defvar oddmuse-page-name nil
|
|
||||||
"Pagename of the current buffer.")
|
|
||||||
|
|
||||||
(defvar oddmuse-pages-hash (make-hash-table :test 'equal)
|
|
||||||
"The wiki-name / pages pairs.")
|
|
||||||
|
|
||||||
(defvar oddmuse-index-get-command
|
|
||||||
"curl --silent %w\"?action=index;raw=1\""
|
|
||||||
"Command to use for publishing index pages.
|
|
||||||
It must print the page to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'
|
|
||||||
")
|
|
||||||
|
|
||||||
(defvar oddmuse-minor nil
|
|
||||||
"Is this edit a minor change?")
|
|
||||||
|
|
||||||
(defvar oddmuse-revision nil
|
|
||||||
"The ancestor of the current page.
|
|
||||||
This is used by Oddmuse to merge changes.")
|
|
||||||
|
|
||||||
(defun oddmuse-mode-initialize ()
|
|
||||||
(add-to-list 'auto-mode-alist
|
|
||||||
`(,(expand-file-name oddmuse-directory) . oddmuse-mode)))
|
|
||||||
|
|
||||||
(defun oddmuse-creole-markup ()
|
|
||||||
"Implement markup rules for the Creole markup extension."
|
|
||||||
(font-lock-add-keywords
|
|
||||||
nil
|
|
||||||
'(("^=[^=\n]+" 0 '(face info-title-1 help-echo "Creole H1")); = h1
|
|
||||||
("^==[^=\n]+" 0 '(face info-title-2 help-echo "Creole H2")); == h2
|
|
||||||
("^===[^=\n]+" 0 '(face info-title-3 help-echo "Creole H3")); === h3
|
|
||||||
("^====+[^=\n]+" 0 '(face info-title-4 help-echo "Creole H4")); ====h4
|
|
||||||
("\\_<//\\(.*\n\\)*?.*?//" 0 '(face italic help-echo "Creole italic")); //italic//
|
|
||||||
("\\*\\*\\(.*\n\\)*?.*?\\*\\*" 0 '(face bold help-echo "Creole bold")); **bold**
|
|
||||||
("__\\(.*\n\\)*?.*?__" 0 '(face underline help-echo "Creole underline")); __underline__
|
|
||||||
("|+=?" 0 '(face font-lock-string-face help-echo "Creole table cell"))
|
|
||||||
("\\\\\\\\[ \t]+" 0 '(face font-lock-warning-face help-echo "Creole line break"))
|
|
||||||
("^#+ " 0 '(face font-lock-constant-face help-echo "Creole ordered list"))
|
|
||||||
("^- " 0 '(face font-lock-constant-face help-echo "Creole ordered list")))))
|
|
||||||
|
|
||||||
(defun oddmuse-bbcode-markup ()
|
|
||||||
"Implement markup rules for the bbcode markup extension."
|
|
||||||
(font-lock-add-keywords
|
|
||||||
nil
|
|
||||||
`(("\\[b\\]\\(.*\n\\)*?.*?\\[/b\\]"
|
|
||||||
0 '(face bold help-echo "BB code bold"))
|
|
||||||
("\\[i\\]\\(.*\n\\)*?.*?\\[/i\\]"
|
|
||||||
0 '(face italic help-echo "BB code italic"))
|
|
||||||
("\\[u\\]\\(.*\n\\)*?.*?\\[/u\\]"
|
|
||||||
0 '(face underline help-echo "BB code underline"))
|
|
||||||
(,(concat "\\[url=" goto-address-url-regexp "\\]")
|
|
||||||
0 '(face font-lock-builtin-face help-echo "BB code url"))
|
|
||||||
("\\[/?\\(img\\|url\\)\\]"
|
|
||||||
0 '(face font-lock-builtin-face help-echo "BB code url or img"))
|
|
||||||
("\\[s\\(trike\\)?\\]\\(.*\n\\)*?.*?\\[/s\\(trike\\)?\\]"
|
|
||||||
0 '(face strike help-echo "BB code strike"))
|
|
||||||
("\\[/?\\(left\\|right\\|center\\)\\]"
|
|
||||||
0 '(face font-lock-constant-face help-echo "BB code alignment")))))
|
|
||||||
|
|
||||||
(defun oddmuse-usemod-markup ()
|
|
||||||
"Implement markup rules for the Usemod markup extension."
|
|
||||||
(font-lock-add-keywords
|
|
||||||
nil
|
|
||||||
'(("^=[^=\n]+=$"
|
|
||||||
0 '(face info-title-1 help-echo "Usemod H1"))
|
|
||||||
("^==[^=\n]+==$"
|
|
||||||
0 '(face info-title-2 help-echo "Usemod H2"))
|
|
||||||
("^===[^=\n]+===$"
|
|
||||||
0 '(face info-title-3 help-echo "Usemod H3"))
|
|
||||||
("^====+[^=\n]+====$"
|
|
||||||
0 '(face info-title-4 help-echo "Usemod H4"))
|
|
||||||
("^ .+?$"
|
|
||||||
0 '(face font-lock-comment-face help-echo "Usemod block"))
|
|
||||||
("^[#]+ "
|
|
||||||
0 '(face font-lock-constant-face help-echo "Usemod ordered list")))))
|
|
||||||
|
|
||||||
(defun oddmuse-usemod-html-markup ()
|
|
||||||
"Implement markup rules for the HTML option in the Usemod markup extension."
|
|
||||||
(font-lock-add-keywords
|
|
||||||
nil
|
|
||||||
'(("<\\(/?[a-z]+\\)" 1 '(face font-lock-function-name-face help-echo "Usemod HTML"))))
|
|
||||||
(set (make-local-variable 'sgml-tag-alist)
|
|
||||||
`(("b") ("code") ("em") ("i") ("strong") ("nowiki")
|
|
||||||
("pre" \n) ("tt") ("u")))
|
|
||||||
(set (make-local-variable 'skeleton-transformation) 'identity))
|
|
||||||
|
|
||||||
(defun oddmuse-extended-markup ()
|
|
||||||
"Implement markup rules for the Markup extension."
|
|
||||||
(font-lock-add-keywords
|
|
||||||
nil
|
|
||||||
'(("\\*\\w+[[:word:]-%.,:;\'\"!? ]*\\*"
|
|
||||||
0 '(face bold help-echo "Markup bold"))
|
|
||||||
("\\_</\\w+[[:word:]-%.,:;\'\"!? ]*/"
|
|
||||||
0 '(face italic help-echo "Markup italic"))
|
|
||||||
("_\\w+[[:word:]-%.,:;\'\"!? ]*_"
|
|
||||||
0 '(face underline help-echo "Markup underline")))))
|
|
||||||
|
|
||||||
(defun oddmuse-basic-markup ()
|
|
||||||
"Implement markup rules for the basic Oddmuse setup without extensions.
|
|
||||||
This function should come come last in `oddmuse-markup-functions'
|
|
||||||
because of such basic patterns as [.*] which are very generic."
|
|
||||||
(font-lock-add-keywords
|
|
||||||
nil
|
|
||||||
`((,oddmuse-link-pattern
|
|
||||||
0 '(face link help-echo "Basic wiki name"))
|
|
||||||
("\\[\\[.*?\\]\\]"
|
|
||||||
0 '(face link help-echo "Basic free link"))
|
|
||||||
(,(concat "\\[" goto-address-url-regexp "\\( .+?\\)?\\]")
|
|
||||||
0 '(face link help-echo "Basic external free link"))
|
|
||||||
("^\\([*]+\\)"
|
|
||||||
0 '(face font-lock-constant-face help-echo "Basic bullet list"))))
|
|
||||||
(goto-address))
|
|
||||||
|
|
||||||
;; Should determine this automatically based on the version? And cache it per wiki?
|
|
||||||
;; http://emacswiki.org/wiki?action=version
|
|
||||||
(defvar oddmuse-markup-functions
|
|
||||||
'(oddmuse-basic-markup
|
|
||||||
oddmuse-extended-markup
|
|
||||||
oddmuse-usemod-markup
|
|
||||||
oddmuse-creole-markup
|
|
||||||
oddmuse-bbcode-markup)
|
|
||||||
"The list of functions to call when `oddmuse-mode' runs.
|
|
||||||
Later functions take precedence because they call `font-lock-add-keywords'
|
|
||||||
which adds the expressions to the front of the existing list.")
|
|
||||||
|
|
||||||
(define-derived-mode oddmuse-mode text-mode "Odd"
|
|
||||||
"Simple mode to edit wiki pages.
|
|
||||||
|
|
||||||
Use \\[oddmuse-follow] to follow links. With prefix, allows you
|
|
||||||
to specify the target page yourself.
|
|
||||||
|
|
||||||
Use \\[oddmuse-post] to post changes. With prefix, allows you to
|
|
||||||
post the page to a different wiki.
|
|
||||||
|
|
||||||
Use \\[oddmuse-edit] to edit a different page. With prefix,
|
|
||||||
forces a reload of the page instead of just popping to the buffer
|
|
||||||
if you are already editing the page.
|
|
||||||
|
|
||||||
Customize `oddmuse-wikis' to add more wikis to the list.
|
|
||||||
|
|
||||||
Font-locking is controlled by `oddmuse-markup-functions'.
|
|
||||||
|
|
||||||
\\{oddmuse-mode-map}"
|
|
||||||
(mapc 'funcall oddmuse-markup-functions)
|
|
||||||
(font-lock-mode 1)
|
|
||||||
(when buffer-file-name
|
|
||||||
(set (make-local-variable 'oddmuse-wiki)
|
|
||||||
(file-name-nondirectory
|
|
||||||
(substring (file-name-directory buffer-file-name) 0 -1)))
|
|
||||||
(set (make-local-variable 'oddmuse-page-name)
|
|
||||||
(file-name-nondirectory buffer-file-name)))
|
|
||||||
(set (make-local-variable 'oddmuse-minor)
|
|
||||||
oddmuse-use-always-minor)
|
|
||||||
(set (make-local-variable 'oddmuse-revision)
|
|
||||||
(save-excursion
|
|
||||||
(goto-char (point-min))
|
|
||||||
(if (looking-at
|
|
||||||
"\\([0-9]+\\) # Do not delete this line when editing!\n")
|
|
||||||
(prog1 (match-string 1)
|
|
||||||
(replace-match "")
|
|
||||||
(set-buffer-modified-p nil)))))
|
|
||||||
(setq indent-tabs-mode nil))
|
|
||||||
|
|
||||||
(autoload 'sgml-tag "sgml-mode" t)
|
|
||||||
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-t") 'sgml-tag)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-o") 'oddmuse-follow)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-m") 'oddmuse-toggle-minor)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-c") 'oddmuse-post)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-x C-v") 'oddmuse-revert)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-f") 'oddmuse-edit)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-i") 'oddmuse-insert-pagename)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-h") 'oddmuse-history)
|
|
||||||
(define-key oddmuse-mode-map (kbd "C-c C-r") 'oddmuse-rc)
|
|
||||||
|
|
||||||
;; This has been stolen from simple-wiki-edit
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-toggle-minor (&optional arg)
|
|
||||||
"Toggle minor mode state."
|
|
||||||
(interactive)
|
|
||||||
(let ((num (prefix-numeric-value arg)))
|
|
||||||
(cond
|
|
||||||
((or (not arg) (equal num 0))
|
|
||||||
(setq oddmuse-minor (not oddmuse-minor)))
|
|
||||||
((> num 0) (set 'oddmuse-minor t))
|
|
||||||
((< num 0) (set 'oddmuse-minor nil)))
|
|
||||||
(message "Oddmuse Minor set to %S" oddmuse-minor)
|
|
||||||
oddmuse-minor))
|
|
||||||
|
|
||||||
(add-to-list 'minor-mode-alist
|
|
||||||
'(oddmuse-minor " [MINOR]"))
|
|
||||||
|
|
||||||
(defun oddmuse-format-command (command)
|
|
||||||
"Internal: Substitute oddmuse format flags according to `url',
|
|
||||||
`oddmuse-page-name', `summary', `oddmuse-username', `question',
|
|
||||||
`oddmuse-password', `oddmuse-revision'."
|
|
||||||
(let ((hatena "?"))
|
|
||||||
(dolist (pair '(("%w" . url)
|
|
||||||
("%t" . oddmuse-page-name)
|
|
||||||
("%s" . summary)
|
|
||||||
("%u" . oddmuse-username)
|
|
||||||
("%m" . oddmuse-minor)
|
|
||||||
("%p" . oddmuse-password)
|
|
||||||
("%q" . question)
|
|
||||||
("%o" . oddmuse-revision)
|
|
||||||
("%r" . regexp)
|
|
||||||
("%\\?" . hatena)))
|
|
||||||
(when (and (boundp (cdr pair)) (stringp (symbol-value (cdr pair))))
|
|
||||||
(setq command (replace-regexp-in-string (car pair)
|
|
||||||
(symbol-value (cdr pair))
|
|
||||||
command t t))))
|
|
||||||
command))
|
|
||||||
|
|
||||||
(defun oddmuse-read-wiki-and-pagename (&optional required default)
|
|
||||||
"Read an wikiname and a pagename of `oddmuse-wikis' with completion.
|
|
||||||
If provided, REQUIRED and DEFAULT are passed along to `oddmuse-read-pagename'."
|
|
||||||
(let ((wiki (completing-read "Wiki: " oddmuse-wikis nil t oddmuse-wiki)))
|
|
||||||
(list wiki (oddmuse-read-pagename wiki required default))))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-history (wiki pagename)
|
|
||||||
"Show a page's history on a wiki using `view-mode'.
|
|
||||||
WIKI is the name of the wiki as defined in `oddmuse-wikis',
|
|
||||||
PAGENAME is the pagename of the page you want the history of.
|
|
||||||
Use a prefix argument to force a reload of the page."
|
|
||||||
(interactive (oddmuse-read-wiki-and-pagename t oddmuse-page-name))
|
|
||||||
(let ((name (concat wiki ":" pagename " [history]")))
|
|
||||||
(if (and (get-buffer name)
|
|
||||||
(not current-prefix-arg))
|
|
||||||
(pop-to-buffer (get-buffer name))
|
|
||||||
(let* ((wiki-data (assoc wiki oddmuse-wikis))
|
|
||||||
(url (nth 1 wiki-data))
|
|
||||||
(oddmuse-page-name pagename)
|
|
||||||
(command (oddmuse-format-command oddmuse-history-command))
|
|
||||||
(coding (nth 2 wiki-data))
|
|
||||||
(buf (get-buffer-create name)))
|
|
||||||
(set-buffer buf)
|
|
||||||
(erase-buffer)
|
|
||||||
(let ((max-mini-window-height 1))
|
|
||||||
(shell-command command buf))
|
|
||||||
(pop-to-buffer buf)
|
|
||||||
(goto-address)
|
|
||||||
(view-mode)))))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-edit (wiki pagename)
|
|
||||||
"Edit a page on a wiki.
|
|
||||||
WIKI is the name of the wiki as defined in `oddmuse-wikis',
|
|
||||||
PAGENAME is the pagename of the page you want to edit.
|
|
||||||
Use a prefix argument to force a reload of the page."
|
|
||||||
(interactive (oddmuse-read-wiki-and-pagename))
|
|
||||||
(make-directory (concat oddmuse-directory "/" wiki) t)
|
|
||||||
(let ((name (concat wiki ":" pagename)))
|
|
||||||
(if (and (get-buffer name)
|
|
||||||
(not current-prefix-arg))
|
|
||||||
(pop-to-buffer (get-buffer name))
|
|
||||||
(let* ((wiki-data (assoc wiki oddmuse-wikis))
|
|
||||||
(url (nth 1 wiki-data))
|
|
||||||
(oddmuse-page-name pagename)
|
|
||||||
(command (oddmuse-format-command oddmuse-get-command))
|
|
||||||
(coding (nth 2 wiki-data))
|
|
||||||
(buf (find-file-noselect (concat oddmuse-directory "/" wiki "/"
|
|
||||||
pagename)))
|
|
||||||
(coding-system-for-read coding)
|
|
||||||
(coding-system-for-write coding))
|
|
||||||
;; don't use let for dynamically bound variable
|
|
||||||
(set-buffer buf)
|
|
||||||
(unless (equal name (buffer-name)) (rename-buffer name))
|
|
||||||
(erase-buffer)
|
|
||||||
(let ((max-mini-window-height 1))
|
|
||||||
(oddmuse-run "Loading" command buf nil))
|
|
||||||
(pop-to-buffer buf)
|
|
||||||
(oddmuse-mode)))))
|
|
||||||
|
|
||||||
(defalias 'oddmuse-go 'oddmuse-edit)
|
|
||||||
|
|
||||||
(autoload 'word-at-point "thingatpt")
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-follow (arg)
|
|
||||||
"Figure out what page we need to visit
|
|
||||||
and call `oddmuse-edit' on it."
|
|
||||||
(interactive "P")
|
|
||||||
(let ((pagename (or (and arg (oddmuse-read-pagename oddmuse-wiki))
|
|
||||||
(oddmuse-pagename-at-point)
|
|
||||||
(oddmuse-read-pagename oddmuse-wiki))))
|
|
||||||
(oddmuse-edit (or oddmuse-wiki
|
|
||||||
(read-from-minibuffer "URL: "))
|
|
||||||
pagename)))
|
|
||||||
|
|
||||||
(defun oddmuse-current-free-link-contents ()
|
|
||||||
"Free link contents if the point is between [[ and ]]."
|
|
||||||
(save-excursion
|
|
||||||
(let* ((pos (point))
|
|
||||||
(start (search-backward "[[" nil t))
|
|
||||||
(end (search-forward "]]" nil t)))
|
|
||||||
(and start end (>= end pos)
|
|
||||||
(replace-regexp-in-string
|
|
||||||
" " "_"
|
|
||||||
(buffer-substring (+ start 2) (- end 2)))))))
|
|
||||||
|
|
||||||
(defun oddmuse-pagename-at-point ()
|
|
||||||
"Page name at point."
|
|
||||||
(let ((pagename (word-at-point)))
|
|
||||||
(or (oddmuse-current-free-link-contents)
|
|
||||||
(oddmuse-wikiname-p pagename))))
|
|
||||||
|
|
||||||
(defun oddmuse-wikiname-p (pagename)
|
|
||||||
"Whether PAGENAME is WikiName or not."
|
|
||||||
(when pagename
|
|
||||||
(let (case-fold-search)
|
|
||||||
(when (string-match (concat "^" oddmuse-link-pattern "$") pagename)
|
|
||||||
pagename))))
|
|
||||||
|
|
||||||
;; (oddmuse-wikiname-p nil)
|
|
||||||
;; (oddmuse-wikiname-p "WikiName")
|
|
||||||
;; (oddmuse-wikiname-p "not-wikiname")
|
|
||||||
;; (oddmuse-wikiname-p "notWikiName")
|
|
||||||
|
|
||||||
(defun oddmuse-run (mesg command buf on-region)
|
|
||||||
"Print MESG and run COMMAND on the current buffer.
|
|
||||||
MESG should be appropriate for the following uses:
|
|
||||||
\"MESG...\"
|
|
||||||
\"MESG...done\"
|
|
||||||
\"MESG failed: REASON\"
|
|
||||||
Save outpout in BUF and report an appropriate error.
|
|
||||||
ON-REGION indicates whether the commands runs on the region
|
|
||||||
such as when posting, or whether it just runs by itself such
|
|
||||||
as when loading a page."
|
|
||||||
(message "%s using %s..." mesg command)
|
|
||||||
;; If ON-REGION, the resulting HTTP CODE is found in BUF, so check
|
|
||||||
;; that, too.
|
|
||||||
(if (and (= 0 (if on-region
|
|
||||||
(shell-command-on-region (point-min) (point-max) command buf)
|
|
||||||
(shell-command command buf)))
|
|
||||||
(or (not on-region)
|
|
||||||
(string= "302" (with-current-buffer buf
|
|
||||||
(buffer-string)))))
|
|
||||||
(message "%s...done" mesg)
|
|
||||||
(let ((err "Unknown error"))
|
|
||||||
(with-current-buffer buf
|
|
||||||
(when (re-search-forward "<h1>\\(.*?\\)\\.?</h1>" nil t)
|
|
||||||
(setq err (match-string 1))))
|
|
||||||
(error "%s...%s" mesg err))))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-post (summary)
|
|
||||||
"Post the current buffer to the current wiki.
|
|
||||||
The current wiki is taken from `oddmuse-wiki'."
|
|
||||||
(interactive "sSummary: ")
|
|
||||||
;; when using prefix or on a buffer that is not in oddmuse-mode
|
|
||||||
(when (or (not oddmuse-wiki) current-prefix-arg)
|
|
||||||
(set (make-local-variable 'oddmuse-wiki)
|
|
||||||
(completing-read "Wiki: " oddmuse-wikis nil t)))
|
|
||||||
(when (not oddmuse-page-name)
|
|
||||||
(set (make-local-variable 'oddmuse-page-name)
|
|
||||||
(read-from-minibuffer "Pagename: " (buffer-name))))
|
|
||||||
(let* ((list (assoc oddmuse-wiki oddmuse-wikis))
|
|
||||||
(url (nth 1 list))
|
|
||||||
(oddmuse-minor (if oddmuse-minor "on" "off"))
|
|
||||||
(coding (nth 2 list))
|
|
||||||
(coding-system-for-read coding)
|
|
||||||
(coding-system-for-write coding)
|
|
||||||
(question (nth 3 list))
|
|
||||||
(oddmuse-username (or (nth 4 list)
|
|
||||||
oddmuse-username))
|
|
||||||
(command (oddmuse-format-command oddmuse-post-command))
|
|
||||||
(buf (get-buffer-create " *oddmuse-response*"))
|
|
||||||
(text (buffer-string)))
|
|
||||||
(and buffer-file-name (basic-save-buffer))
|
|
||||||
(oddmuse-run "Posting" command buf t)))
|
|
||||||
|
|
||||||
(defun oddmuse-make-completion-table (wiki)
|
|
||||||
"Create pagename completion table for WIKI.
|
|
||||||
If available, return precomputed one."
|
|
||||||
(or (gethash wiki oddmuse-pages-hash)
|
|
||||||
(oddmuse-compute-pagename-completion-table wiki)))
|
|
||||||
|
|
||||||
(defun oddmuse-compute-pagename-completion-table (&optional wiki-arg)
|
|
||||||
"Really fetch the list of pagenames from WIKI.
|
|
||||||
This command is used to reflect new pages to `oddmuse-pages-hash'."
|
|
||||||
(interactive)
|
|
||||||
(let* ((wiki (or wiki-arg
|
|
||||||
(completing-read "Wiki: " oddmuse-wikis nil t oddmuse-wiki)))
|
|
||||||
(url (cadr (assoc wiki oddmuse-wikis)))
|
|
||||||
(command (oddmuse-format-command oddmuse-index-get-command))
|
|
||||||
table)
|
|
||||||
(message "Getting index of all pages...")
|
|
||||||
(prog1
|
|
||||||
(setq table (split-string (shell-command-to-string command)))
|
|
||||||
(puthash wiki table oddmuse-pages-hash)
|
|
||||||
(message "Getting index of all pages...done"))))
|
|
||||||
|
|
||||||
(defun oddmuse-read-pagename (wiki &optional require default)
|
|
||||||
"Read a pagename of WIKI with completion.
|
|
||||||
Optional arguments REQUIRE and DEFAULT are passed on to `completing-read'.
|
|
||||||
Typically you would use t and a `oddmuse-page-name', if that makes sense."
|
|
||||||
(completing-read (if default
|
|
||||||
(concat "Pagename [" default "]: ")
|
|
||||||
"Pagename: ")
|
|
||||||
(oddmuse-make-completion-table wiki)
|
|
||||||
nil require nil nil default))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-rc (&optional include-minor-edits)
|
|
||||||
"Show Recent Changes.
|
|
||||||
With universal argument, reload."
|
|
||||||
(interactive "P")
|
|
||||||
(let* ((wiki (or oddmuse-wiki
|
|
||||||
(completing-read "Wiki: " oddmuse-wikis nil t)))
|
|
||||||
(name (concat "*" wiki " RC*")))
|
|
||||||
(if (and (get-buffer name)
|
|
||||||
(not current-prefix-arg))
|
|
||||||
(pop-to-buffer (get-buffer name))
|
|
||||||
(let* ((wiki-data (assoc wiki oddmuse-wikis))
|
|
||||||
(url (nth 1 wiki-data))
|
|
||||||
(command (oddmuse-format-command oddmuse-rc-command))
|
|
||||||
(coding (nth 2 wiki-data))
|
|
||||||
(buf (get-buffer-create name))
|
|
||||||
(coding-system-for-read coding)
|
|
||||||
(coding-system-for-write coding))
|
|
||||||
(set-buffer buf)
|
|
||||||
(unless (equal name (buffer-name)) (rename-buffer name))
|
|
||||||
(erase-buffer)
|
|
||||||
(let ((max-mini-window-height 1))
|
|
||||||
(oddmuse-run "Load recent changes" command buf nil))
|
|
||||||
(oddmuse-rc-buffer)
|
|
||||||
(set (make-local-variable 'oddmuse-wiki) wiki)))))
|
|
||||||
|
|
||||||
(defun oddmuse-rc-buffer ()
|
|
||||||
"Parse current buffer as RSS 3.0 and display it correctly."
|
|
||||||
(let (result)
|
|
||||||
(dolist (item (cdr (split-string (buffer-string) "\n\n")));; skip first item
|
|
||||||
(let ((data (mapcar (lambda (line)
|
|
||||||
(when (string-match "^\\(.*?\\): \\(.*\\)" line)
|
|
||||||
(cons (match-string 1 line)
|
|
||||||
(match-string 2 line))))
|
|
||||||
(split-string item "\n"))))
|
|
||||||
(setq result (cons data result))))
|
|
||||||
(erase-buffer)
|
|
||||||
(dolist (item (nreverse result))
|
|
||||||
(insert "[[" (cdr (assoc "title" item)) "]] – "
|
|
||||||
(cdr (assoc "generator" item)) "\n"))
|
|
||||||
(goto-char (point-min))
|
|
||||||
(oddmuse-mode)))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-revert ()
|
|
||||||
"Revert this oddmuse page."
|
|
||||||
(interactive)
|
|
||||||
(let ((current-prefix-arg 4))
|
|
||||||
(oddmuse-edit oddmuse-wiki oddmuse-page-name)))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-insert-pagename (pagename)
|
|
||||||
"Insert a PAGENAME of current wiki with completion."
|
|
||||||
(interactive (list (oddmuse-read-pagename oddmuse-wiki)))
|
|
||||||
(insert pagename))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun emacswiki-post (&optional pagename summary)
|
|
||||||
"Post the current buffer to the EmacsWiki.
|
|
||||||
If this command is invoked interactively: with prefix argument,
|
|
||||||
prompts for pagename, otherwise set pagename as basename of
|
|
||||||
`buffer-file-name'.
|
|
||||||
|
|
||||||
This command is intended to post current EmacsLisp program easily."
|
|
||||||
(interactive)
|
|
||||||
(let* ((oddmuse-wiki "EmacsWiki")
|
|
||||||
(oddmuse-page-name (or pagename
|
|
||||||
(and (not current-prefix-arg)
|
|
||||||
buffer-file-name
|
|
||||||
(file-name-nondirectory buffer-file-name))
|
|
||||||
(oddmuse-read-pagename oddmuse-wiki)))
|
|
||||||
(summary (or summary (read-string "Summary: "))))
|
|
||||||
(oddmuse-post summary)))
|
|
||||||
|
|
||||||
(defun oddmuse-url (wiki pagename)
|
|
||||||
"Get the URL of oddmuse wiki."
|
|
||||||
(condition-case v
|
|
||||||
(concat (or (cadr (assoc wiki oddmuse-wikis)) (error)) "/" pagename)
|
|
||||||
(error nil)))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-browse-page (wiki pagename)
|
|
||||||
"Ask a WWW browser to load an Oddmuse page.
|
|
||||||
WIKI is the name of the wiki as defined in `oddmuse-wikis',
|
|
||||||
PAGENAME is the pagename of the page you want to browse."
|
|
||||||
(interactive (oddmuse-read-wiki-and-pagename))
|
|
||||||
(browse-url (oddmuse-url wiki pagename)))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-browse-this-page ()
|
|
||||||
"Ask a WWW browser to load current oddmuse page."
|
|
||||||
(interactive)
|
|
||||||
(oddmuse-browse-page oddmuse-wiki oddmuse-page-name))
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(defun oddmuse-kill-url ()
|
|
||||||
"Make the URL of current oddmuse page the latest kill in the kill ring."
|
|
||||||
(interactive)
|
|
||||||
(kill-new (oddmuse-url oddmuse-wiki oddmuse-page-name)))
|
|
||||||
|
|
||||||
(provide 'oddmuse)
|
|
||||||
|
|
||||||
;;; oddmuse-curl.el ends here
|
|
||||||
108
contrib/oddmuse_stats
Executable file
@@ -0,0 +1,108 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
# -*- perl -*-
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
oddmuse-stats - Plugin to monitor Oddmuse edits
|
||||||
|
|
||||||
|
=head1 CONFIGURATION
|
||||||
|
|
||||||
|
Set env.parent_dirs in the config file. The directories in this list
|
||||||
|
are searched for data directories containing rc.log files. No
|
||||||
|
whitespace in the directory names, sorry.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
[oddmuse_stats]
|
||||||
|
user www-data
|
||||||
|
env.parent_dirs /home/alex /home/alex/campaignwiki
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
Original Author: Alex Schroeder
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
GPLv3
|
||||||
|
|
||||||
|
=head1 MAGIC MARKERS
|
||||||
|
|
||||||
|
#%# family=auto
|
||||||
|
#%# capabilities=autoconf
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
use Munin::Plugin;
|
||||||
|
use File::Basename;
|
||||||
|
|
||||||
|
# The wiki directories may not contain any spaces.
|
||||||
|
# Use the config file to set the environment variable!
|
||||||
|
my @parent_dirs = ();
|
||||||
|
my %logfiles = ();
|
||||||
|
my %names = ();
|
||||||
|
my $debug = $ENV{MUNIN_DEBUG};
|
||||||
|
|
||||||
|
if ($ENV{'parent_dirs'}) {
|
||||||
|
@parent_dirs = split(/ /, $ENV{'parent_dirs'});
|
||||||
|
} else {
|
||||||
|
die "The parent_dirs environment variable must be set.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $parent_dir (@parent_dirs) {
|
||||||
|
warn "opening $parent_dir\n" if $debug;
|
||||||
|
if (opendir(my $dh, $parent_dir)) {
|
||||||
|
while(readdir $dh) {
|
||||||
|
next if $_ eq '.' or $_ eq '..';
|
||||||
|
if (-r "$parent_dir/$_/rc.log") {
|
||||||
|
my $basename = basename($_);
|
||||||
|
$names{clean_fieldname($basename)}
|
||||||
|
= $basename;
|
||||||
|
$logfiles{clean_fieldname($basename)}
|
||||||
|
= "$parent_dir/$_/rc.log";
|
||||||
|
} else {
|
||||||
|
warn "discarding $_\n" if $debug;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir $dh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $yesterday = time() - 86400;
|
||||||
|
|
||||||
|
if ($ARGV[0]) {
|
||||||
|
if ($ARGV[0] eq 'autoconf') {
|
||||||
|
if (keys %logfiles) {
|
||||||
|
print "yes\n";
|
||||||
|
exit 0;
|
||||||
|
} else {
|
||||||
|
print "no (no logfiles found in " . join(", ", @parent_dirs) . ")\n";
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
} elsif ($ARGV[0] eq 'config') {
|
||||||
|
print "graph_title Oddmuse Wikis\n";
|
||||||
|
print "graph_category wikis\n";
|
||||||
|
print "graph_info This graph shows how many edits the wiki had in the last 24h.\n";
|
||||||
|
print "graph_vlabel edits/day\n";
|
||||||
|
print "graph_order";
|
||||||
|
for my $wiki (sort keys %logfiles) {
|
||||||
|
print " $wiki";
|
||||||
|
};
|
||||||
|
print "\n";
|
||||||
|
for my $wiki (sort keys %logfiles) {
|
||||||
|
my $name = $names{$wiki};
|
||||||
|
print "$wiki.label $name\n";
|
||||||
|
}
|
||||||
|
exit 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $wiki (sort keys %logfiles) {
|
||||||
|
open (my $fh, '<', $logfiles{$wiki})
|
||||||
|
or die "cannot open " . $logfiles{$wiki} . ": $!";
|
||||||
|
my $value = 0;
|
||||||
|
while (<$fh>) {
|
||||||
|
my ($ts) = split(/\x1e/);
|
||||||
|
$value++ if $ts and $ts >= $yesterday;
|
||||||
|
}
|
||||||
|
print "$wiki.value $value\n";
|
||||||
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
/* Copyright 2005 Alex Schroeder <alex@emacswiki.org>
|
/* Copyright 2005 Alex Schroeder <alex@emacswiki.org>
|
||||||
based on http://simon.incutio.com/archive/2004/05/30/plinks#p-13
|
based on http://simon.incutio.com/archive/2004/05/30/plinks#p-13
|
||||||
Copyright 2004 Simon Willison
|
Copyright 2004 Simon Willison
|
||||||
|
|
||||||
|
This script adds purple numbers to paragraphs.
|
||||||
|
https://oddmuse.org/wiki/Purple_Numbers_Extension
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function plinkHighlight() {
|
function plinkHighlight() {
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
DirectoryIndex wiki.pl
|
|
||||||
Options ExecCGI SymLinksIfOwnerMatch
|
|
||||||
AddHandler cgi-script .pl
|
|
||||||
|
|
||||||
<IfModule mod_rewrite.c>
|
|
||||||
RewriteEngine on
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
|
||||||
RewriteCond %{REQUEST_URI} !=/favicon.ico
|
|
||||||
RewriteRule ^(.*)$ wiki.pl?$1 [L,QSA]
|
|
||||||
|
|
||||||
# The config file might contain passwords. Also protect possible
|
|
||||||
# backup filenames.
|
|
||||||
RewriteRule ^config(\~|\.bak)?$ wiki.pl/config [L]
|
|
||||||
# The visitor.log file contains IP numbers of visitors.
|
|
||||||
RewriteRule ^visitors.log$ wiki.pl/visitor.log [L]
|
|
||||||
</IfModule>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
all:
|
|
||||||
@echo Please invoke make dist on the top level
|
|
||||||
|
|
||||||
%-simple.tar.gz: README config wiki.pl .htaccess current.pl FDL GPL
|
|
||||||
tar czf $@ $^
|
|
||||||
|
|
||||||
current.pl: ../../wiki.pl
|
|
||||||
cp $^ $@
|
|
||||||
|
|
||||||
FDL: ../../FDL
|
|
||||||
cp $^ $@
|
|
||||||
|
|
||||||
GPL: ../../GPL
|
|
||||||
cp $^ $@
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
This is the README file distributed as part of the simple-install
|
|
||||||
package together with the Oddmuse script.
|
|
||||||
|
|
||||||
Unzip all the files into a directory served by Apache. Get the
|
|
||||||
current.pl file from here: http://emacswiki.org/scripts/current.pl
|
|
||||||
|
|
||||||
Your directory should now contain the following files:
|
|
||||||
|
|
||||||
* README (this file)
|
|
||||||
* .htaccess (information for Apache)
|
|
||||||
* config (a simple config file for you to modify)
|
|
||||||
* wiki.pl (a wrapper script setting the data directory)
|
|
||||||
* current.pl (the main script)
|
|
||||||
* modules (a directory containing modules)
|
|
||||||
* modules/creole.pl (support for the standard wiki markup)
|
|
||||||
|
|
||||||
The wiki pages will be saved in this directory.
|
|
||||||
|
|
||||||
Make sure the www user (or whoever Apache runs under) has write access
|
|
||||||
to this directory. In that directory, try chmod o+w . and see if that
|
|
||||||
helps when you get an error message saying that Oddmuse cannot create
|
|
||||||
the temp directory.
|
|
||||||
|
|
||||||
You need to make sure that your administrator has allowed
|
|
||||||
AllowOverride All in his httpd.conf file for the settings in the
|
|
||||||
.htaccess file provided to have an effect.
|
|
||||||
|
|
||||||
Running Oddmuse will create more files, eventually.
|
|
||||||
|
|
||||||
* pages (the directory containing the pages)
|
|
||||||
* keep (the directory containing older versions of pages)
|
|
||||||
* pageidx (a file containing the names of existing pages)
|
|
||||||
* rc.log (the file used to produce RecentChanges)
|
|
||||||
* visitors.log (the file used to log the most recent visitors)
|
|
||||||
* temp (a temporary directory for log files and the like)
|
|
||||||
|
|
||||||
In order to start your wiki, click on the edit link (the first link
|
|
||||||
below the navigation bar, at the bottom of the page). This will allow
|
|
||||||
you to enter some text for this page. Click the Save button and you
|
|
||||||
are done.
|
|
||||||
|
|
||||||
To add new pages, edit the homepage and add links to new pages. Links
|
|
||||||
are traditionally formed by ConcatenatingCapitalizedWords. This kind
|
|
||||||
of link pattern is called a wiki word.
|
|
||||||
|
|
||||||
Alternatively, put links in [[double square brackets]]. This kind of
|
|
||||||
link pattern is called a free link.
|
|
||||||
|
|
||||||
As long as the new pages don't exist, links to these pages are
|
|
||||||
followed by a clickable question mark. Click on the question mark to
|
|
||||||
create the new page.
|
|
||||||
|
|
||||||
Enjoy your wiki experience.
|
|
||||||
|
|
||||||
Visit http://www.oddmuse.org/ to learn more about the translation
|
|
||||||
files and modules that are part of this package.
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
Permission is granted to copy, distribute and/or modify this document
|
|
||||||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
|
||||||
any later version published by the Free Software Foundation.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Both the GNU Free Documentation License, and the GNU General Public
|
|
||||||
License are distributed together with this script. See the files FDL
|
|
||||||
and GPL, respectively.
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Where to find diff(1) and grep(1)
|
|
||||||
$ENV{PATH} = '/usr/bin:/bin';
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
# This wrapper does nothing but tell Oddmuse to use the current
|
|
||||||
# directory as its data directory.
|
|
||||||
package OddMuse;
|
|
||||||
$DataDir = '.';
|
|
||||||
|
|
||||||
# You need to get the latest copy of this script from
|
|
||||||
# http://emacswiki.org/scripts/current.pl
|
|
||||||
do 'current.pl';
|
|
||||||
114
contrib/undo-double-quotes.pl
Executable file
@@ -0,0 +1,114 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# Copyright (C) 2015 Alex Schroeder <alex@gnu.org>
|
||||||
|
#
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use utf8;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
undef $/; # slurp
|
||||||
|
|
||||||
|
my %index = ();
|
||||||
|
my $verbose = '';
|
||||||
|
|
||||||
|
sub write_file {
|
||||||
|
my ($file, $data) = @_;
|
||||||
|
return unless $data;
|
||||||
|
open(my $fh, '>:utf8', $file) or die "Cannot write $file: $!";
|
||||||
|
print $fh $data;
|
||||||
|
close($fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub replacement_block {
|
||||||
|
my ($block, $pos, @no_go) = @_;
|
||||||
|
|
||||||
|
while (@no_go) {
|
||||||
|
my $first = shift @no_go;
|
||||||
|
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||||
|
return $block if $pos >= $first->[0] and $pos <= $first->[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub translate_file {
|
||||||
|
my ($data) = @_;
|
||||||
|
my @no_go = ();
|
||||||
|
|
||||||
|
while ($data =~ /( <nowiki>.*?<\/nowiki>
|
||||||
|
| <code>.*?<\/code>
|
||||||
|
| ^ <pre> (.*\n)+ <\/pre>
|
||||||
|
| ^ {{{ (.*\n)+ }}} )/gmx) {
|
||||||
|
push @no_go, [pos($data) - length $1, pos($data)];
|
||||||
|
print "no go from " . $no_go[-1]->[0] . ".." . $no_go[-1]->[1] . " for $1\n" if $verbose;
|
||||||
|
}
|
||||||
|
|
||||||
|
# The problem is that these replacements don't adjust @no_go! Perhaps it is good enough?
|
||||||
|
my $subs = '';
|
||||||
|
$subs = $subs || $data =~ s/ ( \[\/quote\] \n \n \[quote\] ) /replacement_block($1, pos($data), @no_go)/gex;
|
||||||
|
return $data if $subs;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub read_file {
|
||||||
|
my $file = shift;
|
||||||
|
open(my $fh, '<:utf8', $file) or die "Cannot read $file: $!";
|
||||||
|
my $data = <$fh>;
|
||||||
|
close($fh);
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub main {
|
||||||
|
my ($dir) = @_;
|
||||||
|
mkdir($dir . '-new') or die "Cannot create $dir-new: $!";
|
||||||
|
print "Indexing files\n";
|
||||||
|
foreach my $file (glob("$dir/.* $dir/*")) {
|
||||||
|
next unless $file =~ /$dir\/(.+)/;
|
||||||
|
my $id = $1;
|
||||||
|
next if $id eq ".";
|
||||||
|
next if $id eq "..";
|
||||||
|
$index{$id} = 1;
|
||||||
|
}
|
||||||
|
print "Converting files\n";
|
||||||
|
foreach my $id (sort keys %index) {
|
||||||
|
# this is where you debug a particular page
|
||||||
|
# $verbose = $id eq '2014-12-18_Emacs_Wiki_Migration';
|
||||||
|
write_file("$dir-new/$id", translate_file(read_file("$dir/$id")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
my $dir = 'raw';
|
||||||
|
my $help = '';
|
||||||
|
|
||||||
|
GetOptions ("dir=s" => \$dir,
|
||||||
|
"help" => \$help);
|
||||||
|
|
||||||
|
if ($help) {
|
||||||
|
print qq{
|
||||||
|
Usage: $0 [--dir=DIR]
|
||||||
|
|
||||||
|
You need to use the raw.pl script to create a directory full of raw
|
||||||
|
wiki text files.
|
||||||
|
|
||||||
|
--dir=DIR is where the raw wiki text files are. Default: raw. The
|
||||||
|
converted files will be stored in DIR-new, ie. in raw-new by
|
||||||
|
default.
|
||||||
|
|
||||||
|
Example: $0 --dir=~/alexschroeder/raw
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
main ($dir);
|
||||||
|
}
|
||||||
170
contrib/undo-local-names.pl
Executable file
@@ -0,0 +1,170 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# Copyright (C) 2015 Alex Schroeder <alex@gnu.org>
|
||||||
|
#
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use utf8;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
undef $/; # slurp
|
||||||
|
|
||||||
|
my %index = ();
|
||||||
|
my $verbose = '';
|
||||||
|
|
||||||
|
my $LinkPattern = '(\p{Uppercase}+\p{Lowercase}+\p{Uppercase}\p{Alphabetic}*)';
|
||||||
|
my $FreeLinkPattern = "([-,.()'%&?;<> _1-9A-Za-z\x{0080}-\x{fffd}]|[-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{fffd}][-,.()'%&?;<> _0-9A-Za-z\x{0080}-\x{fffd}]+)";
|
||||||
|
my $UrlProtocols = 'http|https|ftp|afs|news|nntp|mid|cid|mailto|wais|prospero|telnet|gopher|irc|feed';
|
||||||
|
my $UrlChars = '[-a-zA-Z0-9/@=+$_~*.,;:?!\'"()&#%]'; # see RFC 2396
|
||||||
|
my $FullUrlPattern="((?:$UrlProtocols):$UrlChars+)"; # when used in square brackets
|
||||||
|
|
||||||
|
# either a single letter, or a string that begins with a single letter and ends with a non-space
|
||||||
|
my $words = '([A-Za-z\x{0080}-\x{fffd}](?:[-%.,:;\'"!?0-9 A-Za-z\x{0080}-\x{fffd}]*?[-%.,:;\'"!?0-9A-Za-z\x{0080}-\x{fffd}])?)';
|
||||||
|
# zero-width assertion to prevent km/h from counting
|
||||||
|
my $nowordstart = '(?:(?<=[^-0-9A-Za-z\x{0080}-\x{fffd}])|^)';
|
||||||
|
# zero-width look-ahead assertion to prevent km/h from counting
|
||||||
|
my $nowordend = '(?=[^-0-9A-Za-z\x{0080}-\x{fffd}]|$)';
|
||||||
|
|
||||||
|
my $IrcNickRegexp = qr{[]a-zA-Z^[;\\`_{}|][]^[;\\`_{}|a-zA-Z0-9-]*};
|
||||||
|
|
||||||
|
sub FreeToNormal { # trim all spaces and convert them to underlines
|
||||||
|
my $id = shift;
|
||||||
|
return '' unless $id;
|
||||||
|
$id =~ s/ /_/g;
|
||||||
|
$id =~ s/__+/_/g;
|
||||||
|
$id =~ s/^_//;
|
||||||
|
$id =~ s/_$//;
|
||||||
|
return $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub parse_local_names {
|
||||||
|
my $filename = shift;
|
||||||
|
print "Reading $filename\n";
|
||||||
|
open(my $fh, '<:utf8', $filename) or die "Cannot read $filename: $!";
|
||||||
|
my $data = <$fh>;
|
||||||
|
close($fh);
|
||||||
|
print "Parsing $filename\n";
|
||||||
|
my %names = ();
|
||||||
|
while ($data =~ m/\[$FullUrlPattern\s+([^\]]+?)\]/g) {
|
||||||
|
my ($page, $url) = ($2, $1);
|
||||||
|
my $id = FreeToNormal($page);
|
||||||
|
$names{$id} = $url;
|
||||||
|
}
|
||||||
|
return \%names;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub write_file {
|
||||||
|
my ($file, $data) = @_;
|
||||||
|
return unless $data;
|
||||||
|
open(my $fh, '>:utf8', $file) or die "Cannot write $file: $!";
|
||||||
|
print $fh $data;
|
||||||
|
close($fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub replacement {
|
||||||
|
my ($names, $id, $pos, @no_go) = @_;
|
||||||
|
|
||||||
|
while (@no_go) {
|
||||||
|
my $first = shift @no_go;
|
||||||
|
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||||
|
return $id if $pos >= $first->[0] and $pos <= $first->[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[[$id]]" if exists $index{$id}; # local page exists
|
||||||
|
return $id unless $names->{$id};
|
||||||
|
return '[' . $names->{$id} . ' ' . $id . ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub translate_file {
|
||||||
|
my ($names, $data) = @_;
|
||||||
|
my @no_go = ();
|
||||||
|
|
||||||
|
while ($data =~ /( <nowiki>.*?<\/nowiki>
|
||||||
|
| <code>.*?<\/code>
|
||||||
|
| ^ <pre> (.*\n)+ <\/pre>
|
||||||
|
| ^ {{{ (.*\n)+ }}}
|
||||||
|
| ${nowordstart} \* ${words} \* ${nowordend}
|
||||||
|
| ${nowordstart} \/ ${words} \/ ${nowordend}
|
||||||
|
| ${nowordstart} \_ ${words} \_ ${nowordend}
|
||||||
|
| ${nowordstart} \! ${words} \! ${nowordend}
|
||||||
|
| \[\[ $FreeLinkPattern .*? \]\]
|
||||||
|
| \[ $FullUrlPattern \s+ [^\]]+? \]
|
||||||
|
| ^( \h+.+\n )+
|
||||||
|
| ^(?: \[? \d\d?:\d\d (?:am|pm)? \]? )? \s* < $IrcNickRegexp > )/gmx) {
|
||||||
|
push @no_go, [pos($data) - length $1, pos($data)];
|
||||||
|
print "no go from " . $no_go[-1]->[0] . ".." . $no_go[-1]->[1] . " for $1\n" if $verbose;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $subs = $data =~ s/(?<![:![])\b$LinkPattern(?![:])/replacement($names, $1, pos($data), @no_go)/ge;
|
||||||
|
return $data if $subs;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub read_file {
|
||||||
|
my $file = shift;
|
||||||
|
open(my $fh, '<:utf8', $file) or die "Cannot read $file: $!";
|
||||||
|
my $data = <$fh>;
|
||||||
|
close($fh);
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub main {
|
||||||
|
my ($dir, $local_names) = @_;
|
||||||
|
mkdir($dir . '-new') or die "Cannot create $dir-new: $!";
|
||||||
|
my $names = parse_local_names("$dir/$local_names");
|
||||||
|
print "Indexing files\n";
|
||||||
|
foreach my $file (glob("$dir/.* $dir/*")) {
|
||||||
|
next unless $file =~ /$dir\/(.+)/;
|
||||||
|
my $id = $1;
|
||||||
|
next if $id eq ".";
|
||||||
|
next if $id eq "..";
|
||||||
|
next if $id eq "$local_names";
|
||||||
|
$index{$id} = 1;
|
||||||
|
}
|
||||||
|
print "Converting files\n";
|
||||||
|
foreach my $id (sort keys %index) {
|
||||||
|
# this is where you debug a particular page
|
||||||
|
# $verbose = $id eq '2014-12-18_Emacs_Wiki_Migration';
|
||||||
|
write_file("$dir-new/$id", translate_file($names, read_file("$dir/$id")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
my $names = 'LocalNames';
|
||||||
|
my $dir = 'raw';
|
||||||
|
my $help = '';
|
||||||
|
|
||||||
|
GetOptions ("names=s" => \$names,
|
||||||
|
"dir=s" => \$dir,
|
||||||
|
"help" => \$help);
|
||||||
|
|
||||||
|
if ($help) {
|
||||||
|
print qq{
|
||||||
|
Usage: $0 [--dir=DIR] [--names=LocalNames]
|
||||||
|
|
||||||
|
You need to use the raw.pl script to create a directory full of raw
|
||||||
|
wiki text files.
|
||||||
|
|
||||||
|
--dir=DIR is where the raw wiki text files are. Default: raw. The
|
||||||
|
converted files will be stored in DIR-new, ie. in raw-new by
|
||||||
|
default.
|
||||||
|
|
||||||
|
--names=LocalNames is the page name with all the local names on
|
||||||
|
it. Default: LocalNames
|
||||||
|
|
||||||
|
Example: $0 --dir=~/alexschroeder/raw --names=Names
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
main ($dir, $names);
|
||||||
|
}
|
||||||
128
contrib/undo-usemod.pl
Executable file
@@ -0,0 +1,128 @@
|
|||||||
|
#! /usr/bin/perl -w
|
||||||
|
|
||||||
|
# Copyright (C) 2015 Alex Schroeder <alex@gnu.org>
|
||||||
|
#
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use utf8;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
undef $/; # slurp
|
||||||
|
|
||||||
|
my %index = ();
|
||||||
|
my $verbose = '';
|
||||||
|
|
||||||
|
sub write_file {
|
||||||
|
my ($file, $data) = @_;
|
||||||
|
return unless $data;
|
||||||
|
open(my $fh, '>:utf8', $file) or die "Cannot write $file: $!";
|
||||||
|
print $fh $data;
|
||||||
|
close($fh);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub replacement_block {
|
||||||
|
my ($block, $pos, @no_go) = @_;
|
||||||
|
|
||||||
|
while (@no_go) {
|
||||||
|
my $first = shift @no_go;
|
||||||
|
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||||
|
return $block if $pos >= $first->[0] and $pos <= $first->[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[quote]\n" . join("\n", split(/ \n :+ \h? /x, $block)) . "[/quote]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
sub replacement {
|
||||||
|
my ($block, $tag, $pos, @no_go) = @_;
|
||||||
|
|
||||||
|
while (@no_go) {
|
||||||
|
my $first = shift @no_go;
|
||||||
|
print "Is $pos between " . $first->[0] . " and " . $first->[1] . "?\n" if $verbose;
|
||||||
|
return $block if $pos >= $first->[0] and $pos <= $first->[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tag . $block . $tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub translate_file {
|
||||||
|
my ($data) = @_;
|
||||||
|
my @no_go = ();
|
||||||
|
|
||||||
|
while ($data =~ /( <nowiki>.*?<\/nowiki>
|
||||||
|
| <code>.*?<\/code>
|
||||||
|
| ^ <pre> (.*\n)+ <\/pre>
|
||||||
|
| ^ {{{ (.*\n)+ }}} )/gmx) {
|
||||||
|
push @no_go, [pos($data) - length $1, pos($data)];
|
||||||
|
print "no go from " . $no_go[-1]->[0] . ".." . $no_go[-1]->[1] . " for $1\n" if $verbose;
|
||||||
|
}
|
||||||
|
|
||||||
|
# The problem is that these replacements don't adjust @no_go! Perhaps it is good enough?
|
||||||
|
my $subs = '';
|
||||||
|
$subs = $subs || $data =~ s/ ''' (.*?) ''' /replacement($1, '**', pos($data), @no_go)/gxe;
|
||||||
|
$subs = $subs || $data =~ s/ '' (.*?) '' /replacement($1, '\/\/', pos($data), @no_go)/gxe;
|
||||||
|
$subs = $data =~ s/ ^ :+ \h? ( .* \n (?: .+ \n ) * ) /replacement_block($1, pos($data), @no_go)/gmxe;
|
||||||
|
return $data if $subs;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub read_file {
|
||||||
|
my $file = shift;
|
||||||
|
open(my $fh, '<:utf8', $file) or die "Cannot read $file: $!";
|
||||||
|
my $data = <$fh>;
|
||||||
|
close($fh);
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub main {
|
||||||
|
my ($dir) = @_;
|
||||||
|
mkdir($dir . '-new') or die "Cannot create $dir-new: $!";
|
||||||
|
print "Indexing files\n";
|
||||||
|
foreach my $file (glob("$dir/.* $dir/*")) {
|
||||||
|
next unless $file =~ /$dir\/(.+)/;
|
||||||
|
my $id = $1;
|
||||||
|
next if $id eq ".";
|
||||||
|
next if $id eq "..";
|
||||||
|
$index{$id} = 1;
|
||||||
|
}
|
||||||
|
print "Converting files\n";
|
||||||
|
foreach my $id (sort keys %index) {
|
||||||
|
# this is where you debug a particular page
|
||||||
|
# $verbose = $id eq '2014-12-18_Emacs_Wiki_Migration';
|
||||||
|
write_file("$dir-new/$id", translate_file(read_file("$dir/$id")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
|
||||||
|
my $dir = 'raw';
|
||||||
|
my $help = '';
|
||||||
|
|
||||||
|
GetOptions ("dir=s" => \$dir,
|
||||||
|
"help" => \$help);
|
||||||
|
|
||||||
|
if ($help) {
|
||||||
|
print qq{
|
||||||
|
Usage: $0 [--dir=DIR]
|
||||||
|
|
||||||
|
You need to use the raw.pl script to create a directory full of raw
|
||||||
|
wiki text files.
|
||||||
|
|
||||||
|
--dir=DIR is where the raw wiki text files are. Default: raw. The
|
||||||
|
converted files will be stored in DIR-new, ie. in raw-new by
|
||||||
|
default.
|
||||||
|
|
||||||
|
Example: $0 --dir=~/alexschroeder/raw
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
main ($dir);
|
||||||
|
}
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
;;; vc-oddmuse.el -- add VC support to oddmuse-curl
|
|
||||||
;;
|
|
||||||
;; Copyright (C) 2014 Alex Schroeder <alex@gnu.org>
|
|
||||||
;;
|
|
||||||
;; Latest version:
|
|
||||||
;; http://git.savannah.gnu.org/cgit/oddmuse.git/plain/contrib/vc-oddmuse.el
|
|
||||||
;; Discussion, feedback:
|
|
||||||
;; http://www.emacswiki.org/cgi-bin/wiki/OddmuseCurl
|
|
||||||
;;
|
|
||||||
;; 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 3 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 GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;;
|
|
||||||
;; Add the following to your init file:
|
|
||||||
;;
|
|
||||||
;; (add-to-list 'vc-handled-backends 'oddmuse)
|
|
||||||
|
|
||||||
(add-to-list 'vc-handled-backends 'oddmuse)
|
|
||||||
|
|
||||||
(require 'oddmuse)
|
|
||||||
(require 'diff)
|
|
||||||
|
|
||||||
(defun vc-oddmuse-revision-granularity () 'file)
|
|
||||||
|
|
||||||
(defun vc-oddmuse-registered (file)
|
|
||||||
"Handle files in `oddmuse-directory'."
|
|
||||||
(string-match (concat "^" (expand-file-name oddmuse-directory))
|
|
||||||
(file-name-directory file)))
|
|
||||||
|
|
||||||
(defun vc-oddmuse-state (file)
|
|
||||||
"No idea."
|
|
||||||
'up-to-date)
|
|
||||||
|
|
||||||
(defun vc-oddmuse-working-revision (file)
|
|
||||||
"No idea")
|
|
||||||
|
|
||||||
(defun vc-oddmuse-checkout-model (files)
|
|
||||||
"No locking."
|
|
||||||
'implicit)
|
|
||||||
|
|
||||||
(defun vc-oddmuse-create-repo (file)
|
|
||||||
(error "You cannot create Oddmuse wikis using Emacs."))
|
|
||||||
|
|
||||||
(defun vc-oddmuse-register (files &optional rev comment)
|
|
||||||
"This always works.")
|
|
||||||
|
|
||||||
(defun vc-oddmuse-revert (file &optional contents-done)
|
|
||||||
"No idea"
|
|
||||||
nil)
|
|
||||||
|
|
||||||
(defvar vc-oddmuse-log-command
|
|
||||||
"curl --silent %w\"?action=rc;showedit=1;all=1;from=1;raw=1;match=%r\""
|
|
||||||
"Command to use for publishing index pages.
|
|
||||||
It must print the page to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'
|
|
||||||
%r Regular expression, URL encoded, of the pages to limit ourselves to.
|
|
||||||
This uses the free variable `regexp'.")
|
|
||||||
|
|
||||||
(defun vc-oddmuse-print-log (files buffer &optional shortlog
|
|
||||||
start-revision limit)
|
|
||||||
"Load complete recent changes for the files."
|
|
||||||
(let* ((wiki (or oddmuse-wiki
|
|
||||||
(completing-read "Wiki: " oddmuse-wikis nil t)))
|
|
||||||
(wiki-data (assoc wiki oddmuse-wikis))
|
|
||||||
(url (nth 1 wiki-data))
|
|
||||||
(regexp (concat
|
|
||||||
"^(" ;; Perl regular expression!
|
|
||||||
(mapconcat 'file-name-nondirectory files "|")
|
|
||||||
")$"))
|
|
||||||
(command (oddmuse-format-command vc-oddmuse-log-command))
|
|
||||||
(coding (nth 2 wiki-data))
|
|
||||||
(coding-system-for-read coding)
|
|
||||||
(coding-system-for-write coding)
|
|
||||||
(max-mini-window-height 1))
|
|
||||||
(oddmuse-run "Getting recent changes" command buffer nil))
|
|
||||||
;; Parse current buffer as RSS 3.0 and display it correctly.
|
|
||||||
(save-excursion
|
|
||||||
(with-current-buffer buffer
|
|
||||||
(let (result)
|
|
||||||
(dolist (item (cdr (split-string (buffer-string) "\n\n")));; skip first item
|
|
||||||
(let ((data (mapcar (lambda (line)
|
|
||||||
(when (string-match "^\\(.*?\\): \\(.*\\)" line)
|
|
||||||
(cons (match-string 1 line)
|
|
||||||
(match-string 2 line))))
|
|
||||||
(split-string item "\n"))))
|
|
||||||
(setq result (cons data result))))
|
|
||||||
(dolist (item (nreverse result))
|
|
||||||
(insert "title: " (cdr (assoc "title" item)) "\n"
|
|
||||||
"version: " (cdr (assoc "revision" item)) "\n"
|
|
||||||
"generator: " (cdr (assoc "generator" item)) "\n"
|
|
||||||
"timestamp: " (cdr (assoc "last-modified" item)) "\n\n"
|
|
||||||
" " (or (cdr (assoc "description" item)) ""))
|
|
||||||
(fill-paragraph)
|
|
||||||
(insert "\n\n"))
|
|
||||||
(goto-char (point-min))))))
|
|
||||||
|
|
||||||
(defun vc-oddmuse-log-outgoing ()
|
|
||||||
(error "This is not supported."))
|
|
||||||
|
|
||||||
(defun vc-oddmuse-log-incoming ()
|
|
||||||
(error "This is not supported."))
|
|
||||||
|
|
||||||
(defvar vc-oddmuse-get-revision-command
|
|
||||||
"curl --silent %w\"?action=browse;id=%t;revision=%o;raw=1\""
|
|
||||||
"Command to use to get older revisions of a page.
|
|
||||||
It must print the page to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'
|
|
||||||
%t Page title as provided by `oddmuse-page-name'
|
|
||||||
%o Revision to retrieve as provided by `oddmuse-revision'")
|
|
||||||
|
|
||||||
(defvar vc-oddmuse-get-history-command
|
|
||||||
"curl --silent %w\"?action=history;id=%t;raw=1\""
|
|
||||||
"Command to use to get the history of a page.
|
|
||||||
It must print the page to stdout.
|
|
||||||
|
|
||||||
%? '?' character
|
|
||||||
%w URL of the wiki as provided by `oddmuse-wikis'
|
|
||||||
%t Page title as provided by `oddmuse-page-name'")
|
|
||||||
|
|
||||||
(defun vc-oddmuse-diff (files &optional rev1 rev2 buffer)
|
|
||||||
"Report the differences for FILES."
|
|
||||||
(setq buffer (or buffer (get-buffer-create "*vc-diff*")))
|
|
||||||
(dolist (file files)
|
|
||||||
(setq oddmuse-page-name (file-name-nondirectory file)
|
|
||||||
oddmuse-wiki (or oddmuse-wiki
|
|
||||||
(file-name-nondirectory
|
|
||||||
(directory-file-name
|
|
||||||
(file-name-directory file)))))
|
|
||||||
(let* ((wiki-data (or (assoc oddmuse-wiki oddmuse-wikis)
|
|
||||||
(error "Cannot find data for wiki %s" oddmuse-wiki)))
|
|
||||||
(url (nth 1 wiki-data)))
|
|
||||||
(unless rev1
|
|
||||||
;; Since we don't know the most recent revision we have to fetch
|
|
||||||
;; it from the server every time.
|
|
||||||
(with-temp-buffer
|
|
||||||
(let ((max-mini-window-height 1))
|
|
||||||
(oddmuse-run "Determining latest revision"
|
|
||||||
(oddmuse-format-command vc-oddmuse-get-history-command)
|
|
||||||
(current-buffer) nil))
|
|
||||||
(if (re-search-forward "^revision: \\([0-9]+\\)$" nil t)
|
|
||||||
(setq rev1 (match-string 1))
|
|
||||||
(error "Cannot determine the latest revision from the page history"))))
|
|
||||||
(dolist (rev (list rev1 rev2))
|
|
||||||
(when (and rev
|
|
||||||
(not (file-readable-p (concat oddmuse-directory
|
|
||||||
"/" oddmuse-wiki "/"
|
|
||||||
oddmuse-page-name
|
|
||||||
".~" rev "~"))))
|
|
||||||
(let* ((oddmuse-revision rev)
|
|
||||||
(command (oddmuse-format-command vc-oddmuse-get-revision-command))
|
|
||||||
(coding (nth 2 wiki-data))
|
|
||||||
(filename (concat oddmuse-directory "/" oddmuse-wiki "/"
|
|
||||||
oddmuse-page-name ".~" rev "~"))
|
|
||||||
(coding-system-for-read coding)
|
|
||||||
(coding-system-for-write coding))
|
|
||||||
(with-temp-buffer
|
|
||||||
(let ((max-mini-window-height 1))
|
|
||||||
(oddmuse-run (concat "Downloading revision " rev)
|
|
||||||
command (current-buffer) nil))
|
|
||||||
(write-file filename)))))
|
|
||||||
(diff-no-select
|
|
||||||
(if rev1
|
|
||||||
(concat oddmuse-directory "/" oddmuse-wiki "/" oddmuse-page-name ".~" rev1 "~")
|
|
||||||
file)
|
|
||||||
(if rev2
|
|
||||||
(concat oddmuse-directory "/" oddmuse-wiki "/" oddmuse-page-name ".~" rev2 "~")
|
|
||||||
file)
|
|
||||||
nil
|
|
||||||
(vc-switches 'oddmuse 'diff)
|
|
||||||
buffer))))
|
|
||||||
|
|
||||||
(provide 'vc-oddmuse)
|
|
||||||
14
control
@@ -1,14 +0,0 @@
|
|||||||
Maintainer: Alex Schroeder <alex@oddmuse.org>
|
|
||||||
Section: web
|
|
||||||
Priority: optional
|
|
||||||
Standards-Version: 3.5.10
|
|
||||||
|
|
||||||
Package: oddmuse
|
|
||||||
Architecture: any
|
|
||||||
Depends: httpd, perl5, perl-modules
|
|
||||||
Suggests: libwww-perl, libxml-rss-perl, libmime-base64-perl, diff
|
|
||||||
Description: wiki engine
|
|
||||||
A "wiki" is a website that is usally collaboratively edited
|
|
||||||
by its users, including the ability to alter text written by
|
|
||||||
other users. It is a simple and efficient content management
|
|
||||||
system (CMS).
|
|
||||||
@@ -74,6 +74,55 @@ h1 a:visited, h2 a:visited, h3 a:visited {
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* for download buttons and the like */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.4em 0.6em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon {
|
||||||
|
color: #363;
|
||||||
|
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a.pencil {
|
||||||
|
padding-left: 1ex;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
visible: hidden;
|
||||||
|
transition: visibility 0s 1s, opacity 1s linear;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
*:hover > a.pencil {
|
||||||
|
visible: visible;
|
||||||
|
transition: opacity .5s linear;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
a.pencil {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.number {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* stop floating content from flowing over the footer */
|
/* stop floating content from flowing over the footer */
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
@@ -110,6 +159,15 @@ pre, code, tt {
|
|||||||
line-height: 110%;
|
line-height: 110%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
/* styling for divs that will be invisible when printing
|
/* styling for divs that will be invisible when printing
|
||||||
when printing. */
|
when printing. */
|
||||||
|
|
||||||
@@ -235,8 +293,8 @@ div.comment h2 {
|
|||||||
margin-top: 5em;
|
margin-top: 5em;
|
||||||
}
|
}
|
||||||
/* comment pages with username, homepage, and email subscription */
|
/* comment pages with username, homepage, and email subscription */
|
||||||
.comment span { display: block; }
|
.comment form span { display: block; }
|
||||||
.comment span label { display: inline-block; width: 10em; }
|
.comment form span label { display: inline-block; width: 10em; }
|
||||||
/* IE sucks */
|
/* IE sucks */
|
||||||
.comment input#username,
|
.comment input#username,
|
||||||
.comment input#homepage,
|
.comment input#homepage,
|
||||||
@@ -336,6 +394,10 @@ div.image span.caption {
|
|||||||
margin: 0 1em;
|
margin: 0 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.left { float:left; margin-right: 1em; }
|
.left { float:left; margin-right: 1em; }
|
||||||
.right { float:right; margin-left: 1em; }
|
.right { float:right; margin-left: 1em; }
|
||||||
.half a img { height: 50%; width: 50%; }
|
.half a img { height: 50%; width: 50%; }
|
||||||
|
|||||||
632
css/alex-2014.css
Normal file
@@ -0,0 +1,632 @@
|
|||||||
|
/* font-face includes TTF for PDF generation */
|
||||||
|
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Noticia Text'), local('NoticiaText-Regular)'), url('/fonts/NoticiaText-Regular.woff') format('woff') url('/fonts/NoticiaText-Regular.ttf') format('truetype');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Noticia Text'), local('NoticiaText-Regular)'), url('/fonts/NoticiaText-Regular.woff') format('woff') url('/fonts/NoticiaText-Regular.ttf') format('truetype');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Noticia Text'), local('NoticiaText-Regular)'), url('/fonts/NoticiaText-Regular.woff') format('woff') url('/fonts/NoticiaText-Regular.ttf') format('truetype');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Noticia Text Bold'), local('NoticiaText-Bold)'), url('/fonts/NoticiaText-Bold.woff') format('woff') url('/fonts/NoticiaText-Bold.ttf') format('truetype');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Noticia Text Bold'), local('NoticiaText-Bold)'), url('/fonts/NoticiaText-Bold.woff') format('woff') url('/fonts/NoticiaText-Bold.ttf') format('truetype');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Noticia Text Bold'), local('NoticiaText-Bold)'), url('/fonts/NoticiaText-Bold.woff') format('woff') url('/fonts/NoticiaText-Bold.ttf') format('truetype');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Noticia Text Italic'), local('NoticiaText-Italic)'), url('/fonts/NoticiaText-Italic.woff') format('woff') url('/fonts/NoticiaText-Italic.ttf') format('truetype');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Noticia Text Italic'), local('NoticiaText-Italic)'), url('/fonts/NoticiaText-Italic.woff') format('woff') url('/fonts/NoticiaText-Italic.ttf') format('truetype');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Noticia Text Italic'), local('NoticiaText-Italic)'), url('/fonts/NoticiaText-Italic.woff') format('woff') url('/fonts/NoticiaText-Italic.ttf') format('truetype');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
|
}
|
||||||
|
/* vietnamese */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Noticia Text Bold Italic'), local('NoticiaText-BoldItalic)'), url('/fonts/NoticiaText-BoldItalic.woff') format('woff') url('/fonts/NoticiaText-BoldItalic.ttf') format('truetype');
|
||||||
|
unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB;
|
||||||
|
}
|
||||||
|
/* latin-ext */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Noticia Text Bold Italic'), local('NoticiaText-BoldItalic)'), url('/fonts/NoticiaText-BoldItalic.woff') format('woff') url('/fonts/NoticiaText-BoldItalic.ttf') format('truetype');
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
||||||
|
}
|
||||||
|
/* latin */
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Noticia Text';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Noticia Text Bold Italic'), local('NoticiaText-BoldItalic)'), url('/fonts/NoticiaText-BoldItalic.woff') format('woff') url('/fonts/NoticiaText-BoldItalic.ttf') format('truetype');
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Symbola';
|
||||||
|
src: local('Symbola'), url('/fonts/Symbola.woff') format('woff') url('/fonts/Symbola.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
body, rss {
|
||||||
|
font-family: "Noticia Text", Symbola, serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 14pt;
|
||||||
|
margin: 1em 3em;
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide all the crap */
|
||||||
|
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
||||||
|
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
||||||
|
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.content a.book,
|
||||||
|
div.content a.movie {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a cite {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
img[alt="RSS"] { display: none }
|
||||||
|
a.rss { font-size: 8pt }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headings: we can use larger sizes if we use a lighter color.
|
||||||
|
we cannot inherit the font-family because header and footer use a narrow font. */
|
||||||
|
|
||||||
|
h1, h2, h3, title {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1, channel title {
|
||||||
|
font-size: 32pt;
|
||||||
|
margin: 1em 0 0.5em 0;
|
||||||
|
padding: 0.4em 0;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 18pt;
|
||||||
|
margin: 2em 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0;
|
||||||
|
margin: 1em 0 0 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headers in the journal are smaller */
|
||||||
|
|
||||||
|
div.journal h1, item title {
|
||||||
|
font-size: inherit;
|
||||||
|
padding: 0;
|
||||||
|
clear: both;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
div.journal h2 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
div.journal h3 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
div.journal hr {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
p.more {
|
||||||
|
margin-top: 3em;
|
||||||
|
}
|
||||||
|
/* Links in headings appear on journal pages. */
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a {
|
||||||
|
color:inherit;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for download buttons and the like */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.4em 0.6em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon {
|
||||||
|
color: #363;
|
||||||
|
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a.pencil {
|
||||||
|
padding-left: 1ex;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
visibility: hidden;
|
||||||
|
transition: visibility 0s 1s, opacity 1s linear;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
*:hover > a.pencil {
|
||||||
|
visibility: visible;
|
||||||
|
transition: opacity .5s linear;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
a.pencil {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.number {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop floating content from flowing over the footer */
|
||||||
|
|
||||||
|
hr {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the distance between links in the navigation bars */
|
||||||
|
|
||||||
|
span.bar a {
|
||||||
|
margin-right: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a img {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search box in the top bar */
|
||||||
|
|
||||||
|
.header form, .header p {
|
||||||
|
display: inline;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
||||||
|
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
||||||
|
visibility: hidden; position: absolute;
|
||||||
|
}
|
||||||
|
/* wrap on the iphone */
|
||||||
|
@media media only screen and (max-device-width: 480px) {
|
||||||
|
}
|
||||||
|
|
||||||
|
.header input {
|
||||||
|
width: 10ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other form fields */
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
|
||||||
|
textarea, pre, code, tt {
|
||||||
|
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, "Symbola";
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* styling for divs that will be invisible when printing
|
||||||
|
when printing. */
|
||||||
|
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer form.search {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.rc li + li {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
div.rc li strong, table.history strong, strong.description {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
}
|
||||||
|
div.diff {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color: #ffffaf;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color: #cfffcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.refer {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.message {
|
||||||
|
background-color:#fee;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.xml {
|
||||||
|
border:none;
|
||||||
|
padding:1px;
|
||||||
|
}
|
||||||
|
a.small img {
|
||||||
|
max-width:300px;
|
||||||
|
}
|
||||||
|
a.large img {
|
||||||
|
max-width:600px;
|
||||||
|
}
|
||||||
|
div.sister {
|
||||||
|
margin-right:1ex;
|
||||||
|
background-color:inherit;
|
||||||
|
}
|
||||||
|
div.sister p {
|
||||||
|
margin-top:0;
|
||||||
|
}
|
||||||
|
div.sister hr {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.sister img {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.near, div.definition {
|
||||||
|
background-color:#efe;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
float:right;
|
||||||
|
border:1px dotted #000;
|
||||||
|
padding:0 1em;
|
||||||
|
}
|
||||||
|
div.sidebar ul {
|
||||||
|
padding-left:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replacements, features */
|
||||||
|
|
||||||
|
ins {
|
||||||
|
color: #b33;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
acronym, abbr {
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
font-variant:small-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interlink prefix not shown */
|
||||||
|
a .site, a .separator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
a cite { font:inherit; }
|
||||||
|
/* browser borkage */
|
||||||
|
textarea[name="text"] { width:97%; height:80%; }
|
||||||
|
textarea[name="summary"] { width:97%; height:3em; }
|
||||||
|
/* comments */
|
||||||
|
textarea[name="aftertext"] { width:97%; height:10em; }
|
||||||
|
div.commentshown {
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 2em 0;
|
||||||
|
}
|
||||||
|
div.commenthidden {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.commentshown {
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
p.comment {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.comment {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
div.comment h2 {
|
||||||
|
margin-top: 5em;
|
||||||
|
}
|
||||||
|
/* comment pages with username, homepage, and email subscription */
|
||||||
|
.comment form span { display: block; }
|
||||||
|
.comment form span label { display: inline-block; width: 10em; }
|
||||||
|
/* IE sucks */
|
||||||
|
.comment input#username,
|
||||||
|
.comment input#homepage,
|
||||||
|
.comment input#mail { width: 20em; }
|
||||||
|
|
||||||
|
/* cal */
|
||||||
|
div.month { padding:0; margin:0 2ex; }
|
||||||
|
body > div.month {
|
||||||
|
float:right;
|
||||||
|
background-color: inherit;
|
||||||
|
border:solid thin;
|
||||||
|
padding:0 1ex;
|
||||||
|
}
|
||||||
|
div.year > div.month {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
div.footer {
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
div.content div.month a.edit {
|
||||||
|
color:inherit;
|
||||||
|
font-weight:inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* history tables and other tables */
|
||||||
|
table.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
td.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.user {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 1em;
|
||||||
|
margin: 1em 2em;
|
||||||
|
}
|
||||||
|
table.user tr td, table.user tr th {
|
||||||
|
border: none;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.arab tr th {
|
||||||
|
font-weight:normal;
|
||||||
|
text-align:left;
|
||||||
|
vertical-align:top;
|
||||||
|
}
|
||||||
|
table.arab, table.arab tr th, table.arab tr td {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
th.nobreak {
|
||||||
|
white-space:nowrap;
|
||||||
|
}
|
||||||
|
table.full { width:99%; margin-left:1px; }
|
||||||
|
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
||||||
|
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
||||||
|
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
||||||
|
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
||||||
|
table.t td { vertical-align: top; }
|
||||||
|
td.half { width:50%; }
|
||||||
|
td.third { width:33%; }
|
||||||
|
|
||||||
|
form table td { padding:5px; }
|
||||||
|
|
||||||
|
/* lists */
|
||||||
|
dd { padding-bottom:0.5ex; }
|
||||||
|
dl.inside dt { float:left; }
|
||||||
|
/* search */
|
||||||
|
div.search span.result { font-size:larger; }
|
||||||
|
div.search span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.search p.result { display:none; }
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
margin: 0 0 0 1ex;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid #000;
|
||||||
|
opacity: 0.3;
|
||||||
|
background-color:#ffe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* images */
|
||||||
|
|
||||||
|
div.content a.feed img, div.journal a.feed img,
|
||||||
|
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
||||||
|
div.content a.inline img, div.journal a.inline img,
|
||||||
|
div.content li a.image img, div.journal li a.image img {
|
||||||
|
margin: 0; padding: 0; border: none;
|
||||||
|
}
|
||||||
|
div.image a img {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left { float:left; margin-right: 1em; }
|
||||||
|
.right { float:right; margin-left: 1em; }
|
||||||
|
.half a img { height: 50%; width: 50%; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
.center { text-align:center; }
|
||||||
|
table.aside {
|
||||||
|
float:right;
|
||||||
|
width:40%;
|
||||||
|
margin-left: 1em;
|
||||||
|
padding: 1ex;
|
||||||
|
border: 1px dotted #666;
|
||||||
|
}
|
||||||
|
table.aside td {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
div.sidebar {
|
||||||
|
float:right; width: 250px;
|
||||||
|
text-align: right;
|
||||||
|
border: none;
|
||||||
|
margin: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bigsidebar {
|
||||||
|
float:right;
|
||||||
|
width: 500px;
|
||||||
|
border: none;
|
||||||
|
margin-left: 1ex;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
||||||
|
dl.irc dt span.time { float:left; }
|
||||||
|
dl.irc dd { margin-left:22ex; }
|
||||||
|
|
||||||
|
/* portrait */
|
||||||
|
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
.portrait { float: left; font-size: small; margin-right: 1em; }
|
||||||
|
.portrait a { color: #999; }
|
||||||
|
|
||||||
|
div.left { float:left; margin:1em; padding: 0.5em; }
|
||||||
|
div.left p { display:table-cell; }
|
||||||
|
div.left p + p { display:table-caption; caption-side:bottom; }
|
||||||
|
|
||||||
|
p.table a { float:left; width:20ex; }
|
||||||
|
p.table + p { clear:both; }
|
||||||
|
|
||||||
|
/* no bleeding
|
||||||
|
@media screen {
|
||||||
|
div.content, div.rc {
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
|
/* rss */
|
||||||
|
|
||||||
|
channel * { display: block; }
|
||||||
|
|
||||||
|
channel title {
|
||||||
|
margin-top: 30pt;
|
||||||
|
}
|
||||||
|
copyright {
|
||||||
|
font-size: 14pt;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
channel > link:before {
|
||||||
|
font-size: 18pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1em;
|
||||||
|
padding: 0.5em;
|
||||||
|
content: "This is an RSS feed, designed to be read in a feed reader.";
|
||||||
|
color: red;
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
|
link, license {
|
||||||
|
font-size: 11pt;
|
||||||
|
margin-bottom: 9pt;
|
||||||
|
}
|
||||||
|
username:before { content: "Last edited by "; }
|
||||||
|
username:after { content: "."; }
|
||||||
|
generator:before { content: "Feed generated by "; }
|
||||||
|
generator:after { content: "."; }
|
||||||
|
channel description {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
item description {
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
docs, language,
|
||||||
|
pubDate, lastBuildDate, ttl, guid, category, comments,
|
||||||
|
docs, image title, image link,
|
||||||
|
status, version, diff, history, importance {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
539
css/alex-2015.css
Normal file
@@ -0,0 +1,539 @@
|
|||||||
|
/* This file is in the public domain. */
|
||||||
|
|
||||||
|
body, rss {
|
||||||
|
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 14pt;
|
||||||
|
margin: 1em 3em;
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide all the crap */
|
||||||
|
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
||||||
|
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
||||||
|
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.content a.book,
|
||||||
|
div.content a.movie {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a cite {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
img[alt="RSS"] { display: none }
|
||||||
|
a.rss { font-size: 8pt }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headings: we can use larger sizes if we use a lighter color.
|
||||||
|
we cannot inherit the font-family because header and footer use a narrow font. */
|
||||||
|
|
||||||
|
h1, h2, h3, title {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1, channel title {
|
||||||
|
font-size: 32pt;
|
||||||
|
margin: 1em 0 0.5em 0;
|
||||||
|
padding: 0.4em 0;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 18pt;
|
||||||
|
margin: 2em 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0;
|
||||||
|
margin: 1em 0 0 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headers in the journal are smaller */
|
||||||
|
|
||||||
|
div.journal h1, item title {
|
||||||
|
font-size: inherit;
|
||||||
|
padding: 0;
|
||||||
|
clear: both;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
div.journal h2 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
div.journal h3 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
div.journal hr {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
p.more {
|
||||||
|
margin-top: 3em;
|
||||||
|
}
|
||||||
|
/* Links in headings appear on journal pages. */
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a {
|
||||||
|
color:inherit;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for download buttons and the like */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.4em 0.6em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon {
|
||||||
|
color: #363;
|
||||||
|
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a.pencil {
|
||||||
|
padding-left: 1ex;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
visibility: hidden;
|
||||||
|
transition: visibility 0s 1s, opacity 1s linear;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
*:hover > a.pencil {
|
||||||
|
visibility: visible;
|
||||||
|
transition: opacity .5s linear;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
a.pencil {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.number {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop floating content from flowing over the footer */
|
||||||
|
|
||||||
|
hr {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the distance between links in the navigation bars */
|
||||||
|
|
||||||
|
span.bar a {
|
||||||
|
margin-right: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a img {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search box in the top bar */
|
||||||
|
|
||||||
|
.header form, .header p {
|
||||||
|
display: inline;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
||||||
|
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
||||||
|
visibility: hidden; position: absolute;
|
||||||
|
}
|
||||||
|
/* wrap on the iphone */
|
||||||
|
@media only screen and (max-device-width: 480px) {
|
||||||
|
}
|
||||||
|
|
||||||
|
.header input {
|
||||||
|
width: 10ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other form fields */
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
|
||||||
|
textarea, pre, code, tt {
|
||||||
|
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, "Symbola";
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* styling for divs that will be invisible when printing
|
||||||
|
when printing. */
|
||||||
|
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer form.search {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.rc li + li {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
div.rc li strong, table.history strong, strong.description {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
}
|
||||||
|
div.diff {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color: #ffffaf;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color: #cfffcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.refer {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.message {
|
||||||
|
background-color:#fee;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.xml {
|
||||||
|
border:none;
|
||||||
|
padding:1px;
|
||||||
|
}
|
||||||
|
a.small img {
|
||||||
|
max-width:300px;
|
||||||
|
}
|
||||||
|
a.large img {
|
||||||
|
max-width:600px;
|
||||||
|
}
|
||||||
|
div.sister {
|
||||||
|
margin-right:1ex;
|
||||||
|
background-color:inherit;
|
||||||
|
}
|
||||||
|
div.sister p {
|
||||||
|
margin-top:0;
|
||||||
|
}
|
||||||
|
div.sister hr {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.sister img {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.near, div.definition {
|
||||||
|
background-color:#efe;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
float:right;
|
||||||
|
border:1px dotted #000;
|
||||||
|
padding:0 1em;
|
||||||
|
}
|
||||||
|
div.sidebar ul {
|
||||||
|
padding-left:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replacements, features */
|
||||||
|
|
||||||
|
ins {
|
||||||
|
color: #b33;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
acronym, abbr {
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
font-variant:small-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interlink prefix not shown */
|
||||||
|
a .site, a .separator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
a cite { font:inherit; }
|
||||||
|
/* browser borkage */
|
||||||
|
textarea[name="text"] { width:97%; height:80%; }
|
||||||
|
textarea[name="summary"] { width:97%; height:3em; }
|
||||||
|
/* comments */
|
||||||
|
textarea[name="aftertext"] { width:97%; height:10em; }
|
||||||
|
div.commentshown {
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 2em 0;
|
||||||
|
}
|
||||||
|
div.commenthidden {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.commentshown {
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
p.comment {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.comment {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
div.comment h2 {
|
||||||
|
margin-top: 5em;
|
||||||
|
}
|
||||||
|
/* comment pages with username, homepage, and email subscription */
|
||||||
|
.comment form span { display: block; }
|
||||||
|
.comment form span label { display: inline-block; width: 10em; }
|
||||||
|
/* IE sucks */
|
||||||
|
.comment input#username,
|
||||||
|
.comment input#homepage,
|
||||||
|
.comment input#mail { width: 20em; }
|
||||||
|
|
||||||
|
/* cal */
|
||||||
|
div.month { padding:0; margin:0 2ex; }
|
||||||
|
body > div.month {
|
||||||
|
float:right;
|
||||||
|
background-color: inherit;
|
||||||
|
border:solid thin;
|
||||||
|
padding:0 1ex;
|
||||||
|
}
|
||||||
|
.year > .month {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
.month .title a.local {
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
.month a.local {
|
||||||
|
background-color: #ddf;
|
||||||
|
}
|
||||||
|
.month a.today {
|
||||||
|
background-color: #fdd;
|
||||||
|
}
|
||||||
|
.month a {
|
||||||
|
color:inherit;
|
||||||
|
font-weight:inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
/* history tables and other tables */
|
||||||
|
table.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
td.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.user {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 1em;
|
||||||
|
margin: 1em 2em;
|
||||||
|
}
|
||||||
|
table.user tr td, table.user tr th {
|
||||||
|
border: none;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.arab tr th {
|
||||||
|
font-weight:normal;
|
||||||
|
text-align:left;
|
||||||
|
vertical-align:top;
|
||||||
|
}
|
||||||
|
table.arab, table.arab tr th, table.arab tr td {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
th.nobreak {
|
||||||
|
white-space:nowrap;
|
||||||
|
}
|
||||||
|
table.full { width:99%; margin-left:1px; }
|
||||||
|
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
||||||
|
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
||||||
|
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
||||||
|
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
||||||
|
table.t td { vertical-align: top; }
|
||||||
|
td.half { width:50%; }
|
||||||
|
td.third { width:33%; }
|
||||||
|
|
||||||
|
form table td { padding:5px; }
|
||||||
|
|
||||||
|
/* lists */
|
||||||
|
dd { padding-bottom:0.5ex; }
|
||||||
|
dl.inside dt { float:left; }
|
||||||
|
/* search */
|
||||||
|
div.search span.result { font-size:larger; }
|
||||||
|
div.search span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.search p.result { display:none; }
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
margin: 0 0 0 1ex;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid #000;
|
||||||
|
opacity: 0.3;
|
||||||
|
background-color:#ffe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* images */
|
||||||
|
|
||||||
|
div.content a.feed img, div.journal a.feed img,
|
||||||
|
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
||||||
|
div.content a.inline img, div.journal a.inline img,
|
||||||
|
div.content li a.image img, div.journal li a.image img {
|
||||||
|
margin: 0; padding: 0; border: none;
|
||||||
|
}
|
||||||
|
div.image a img {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left { float:left; margin-right: 1em; }
|
||||||
|
.right { float:right; margin-left: 1em; }
|
||||||
|
.half a img { height: 50%; width: 50%; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
.center { text-align:center; }
|
||||||
|
table.aside {
|
||||||
|
float:right;
|
||||||
|
width:40%;
|
||||||
|
margin-left: 1em;
|
||||||
|
padding: 1ex;
|
||||||
|
border: 1px dotted #666;
|
||||||
|
}
|
||||||
|
table.aside td {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
div.sidebar {
|
||||||
|
float:right; width: 250px;
|
||||||
|
text-align: right;
|
||||||
|
border: none;
|
||||||
|
margin: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bigsidebar {
|
||||||
|
float:right;
|
||||||
|
width: 500px;
|
||||||
|
border: none;
|
||||||
|
margin-left: 1ex;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
||||||
|
dl.irc dt span.time { float:left; }
|
||||||
|
dl.irc dd { margin-left:22ex; }
|
||||||
|
|
||||||
|
/* portrait */
|
||||||
|
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
.portrait { float: left; font-size: small; margin-right: 1em; }
|
||||||
|
.portrait a { color: #999; }
|
||||||
|
|
||||||
|
div.left { float:left; margin:1em; padding: 0.5em; }
|
||||||
|
div.left p { display:table-cell; }
|
||||||
|
div.left p + p { display:table-caption; caption-side:bottom; }
|
||||||
|
|
||||||
|
p.table a { float:left; width:20ex; }
|
||||||
|
p.table + p { clear:both; }
|
||||||
|
|
||||||
|
/* no bleeding
|
||||||
|
@media screen {
|
||||||
|
div.content, div.rc {
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
|
/* rss */
|
||||||
|
|
||||||
|
channel * { display: block; }
|
||||||
|
|
||||||
|
channel title {
|
||||||
|
margin-top: 30pt;
|
||||||
|
}
|
||||||
|
copyright {
|
||||||
|
font-size: 14pt;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
channel > link:before {
|
||||||
|
font-size: 18pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1em;
|
||||||
|
padding: 0.5em;
|
||||||
|
content: "This is an RSS feed, designed to be read in a feed reader.";
|
||||||
|
color: red;
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
|
link, license {
|
||||||
|
font-size: 11pt;
|
||||||
|
margin-bottom: 9pt;
|
||||||
|
}
|
||||||
|
username:before { content: "Last edited by "; }
|
||||||
|
username:after { content: "."; }
|
||||||
|
generator:before { content: "Feed generated by "; }
|
||||||
|
generator:after { content: "."; }
|
||||||
|
channel description {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
item description {
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
docs, language,
|
||||||
|
pubDate, lastBuildDate, ttl, guid, category, comments,
|
||||||
|
docs, image title, image link,
|
||||||
|
status, version, diff, history, importance {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
536
css/alex-2016.css
Normal file
@@ -0,0 +1,536 @@
|
|||||||
|
/* This file is in the public domain. */
|
||||||
|
html{ text-align: center; }
|
||||||
|
|
||||||
|
body, rss {
|
||||||
|
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 14pt;
|
||||||
|
padding: 1em 3em;
|
||||||
|
max-width: 72ex;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide all the crap */
|
||||||
|
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
||||||
|
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
||||||
|
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.content a.book,
|
||||||
|
div.content a.movie {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a cite {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
img[alt="RSS"] { display: none }
|
||||||
|
a.rss { font-size: 8pt }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headings: we can use larger sizes if we use a lighter color.
|
||||||
|
we cannot inherit the font-family because header and footer use a narrow font. */
|
||||||
|
|
||||||
|
h1, h2, h3, title {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1, channel title {
|
||||||
|
font-size: 32pt;
|
||||||
|
margin: 1em 0 0.5em 0;
|
||||||
|
padding: 0.4em 0;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 18pt;
|
||||||
|
margin: 2em 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0;
|
||||||
|
margin: 1em 0 0 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headers in the journal are smaller */
|
||||||
|
|
||||||
|
div.journal h1, item title {
|
||||||
|
font-size: inherit;
|
||||||
|
padding: 0;
|
||||||
|
clear: both;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
div.journal h2 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
div.journal h3 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
div.journal hr {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
p.more {
|
||||||
|
margin-top: 3em;
|
||||||
|
}
|
||||||
|
/* Links in headings appear on journal pages. */
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a {
|
||||||
|
color:inherit;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for download buttons and the like */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.4em 0.6em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon {
|
||||||
|
color: #363;
|
||||||
|
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a.pencil {
|
||||||
|
padding-left: 1ex;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
visibility: hidden;
|
||||||
|
transition: visibility 0s 1s, opacity 1s linear;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
*:hover > a.pencil {
|
||||||
|
visibility: visible;
|
||||||
|
transition: opacity .5s linear;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
a.pencil {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.number {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop floating content from flowing over the footer */
|
||||||
|
|
||||||
|
hr {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the distance between links in the navigation bars */
|
||||||
|
|
||||||
|
span.bar a {
|
||||||
|
margin-right: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a img {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search box in the top bar */
|
||||||
|
|
||||||
|
.header form, .header p {
|
||||||
|
display: inline;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
||||||
|
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
||||||
|
visibility: hidden; position: absolute;
|
||||||
|
}
|
||||||
|
/* wrap on the iphone */
|
||||||
|
@media only screen and (max-device-width: 480px) {
|
||||||
|
}
|
||||||
|
|
||||||
|
.header input {
|
||||||
|
width: 10ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other form fields */
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
|
||||||
|
textarea, pre, code, tt {
|
||||||
|
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, "Symbola";
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* styling for divs that will be invisible when printing
|
||||||
|
when printing. */
|
||||||
|
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer form.search {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.rc li + li {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
div.rc li strong, table.history strong, strong.description {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
}
|
||||||
|
div.diff {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color: #ffffaf;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color: #cfffcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.refer {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.message {
|
||||||
|
background-color:#fee;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.xml {
|
||||||
|
border:none;
|
||||||
|
padding:1px;
|
||||||
|
}
|
||||||
|
a.small img {
|
||||||
|
max-width:300px;
|
||||||
|
}
|
||||||
|
a.large img {
|
||||||
|
max-width:600px;
|
||||||
|
}
|
||||||
|
div.sister {
|
||||||
|
margin-right:1ex;
|
||||||
|
background-color:inherit;
|
||||||
|
}
|
||||||
|
div.sister p {
|
||||||
|
margin-top:0;
|
||||||
|
}
|
||||||
|
div.sister hr {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.sister img {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.near, div.definition {
|
||||||
|
background-color:#efe;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
float:right;
|
||||||
|
border:1px dotted #000;
|
||||||
|
padding:0 1em;
|
||||||
|
}
|
||||||
|
div.sidebar ul {
|
||||||
|
padding-left:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replacements, features */
|
||||||
|
|
||||||
|
ins {
|
||||||
|
font-style: italic;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
acronym, abbr {
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
font-variant:small-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interlink prefix not shown */
|
||||||
|
a .site, a .separator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
a cite { font:inherit; }
|
||||||
|
/* browser borkage */
|
||||||
|
textarea[name="text"] { width:97%; height:80%; }
|
||||||
|
textarea[name="summary"] { width:97%; height:3em; }
|
||||||
|
/* comments */
|
||||||
|
textarea[name="aftertext"] { width:97%; height:10em; }
|
||||||
|
div.commentshown {
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 2em 0;
|
||||||
|
}
|
||||||
|
div.commenthidden {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.commentshown {
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
p.comment {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.comment {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
div.comment h2 {
|
||||||
|
margin-top: 5em;
|
||||||
|
}
|
||||||
|
/* comment pages with username, homepage, and email subscription */
|
||||||
|
.comment form span { display: block; }
|
||||||
|
.comment form span label { display: inline-block; width: 10em; }
|
||||||
|
/* IE sucks */
|
||||||
|
.comment input#username,
|
||||||
|
.comment input#homepage,
|
||||||
|
.comment input#mail { width: 20em; }
|
||||||
|
|
||||||
|
/* cal */
|
||||||
|
div.month { padding:0; margin:0 2ex; }
|
||||||
|
body > div.month {
|
||||||
|
float:right;
|
||||||
|
background-color: inherit;
|
||||||
|
border:solid thin;
|
||||||
|
padding:0 1ex;
|
||||||
|
}
|
||||||
|
.year > .month {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
.month .title a.local {
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
.month a.local {
|
||||||
|
background-color: #ddf;
|
||||||
|
}
|
||||||
|
.month a.today {
|
||||||
|
background-color: #fdd;
|
||||||
|
}
|
||||||
|
.month a {
|
||||||
|
color:inherit;
|
||||||
|
font-weight:inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
/* history tables and other tables */
|
||||||
|
table.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
td.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.user {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 1em;
|
||||||
|
margin: 1em 2em;
|
||||||
|
}
|
||||||
|
table.user tr td, table.user tr th {
|
||||||
|
border: none;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.arab tr th {
|
||||||
|
font-weight:normal;
|
||||||
|
text-align:left;
|
||||||
|
vertical-align:top;
|
||||||
|
}
|
||||||
|
table.arab, table.arab tr th, table.arab tr td {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
th.nobreak {
|
||||||
|
white-space:nowrap;
|
||||||
|
}
|
||||||
|
table.full { width:99%; margin-left:1px; }
|
||||||
|
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
||||||
|
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
||||||
|
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
||||||
|
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
||||||
|
table.t td { vertical-align: top; }
|
||||||
|
td.half { width:50%; }
|
||||||
|
td.third { width:33%; }
|
||||||
|
|
||||||
|
form table td { padding:5px; }
|
||||||
|
|
||||||
|
/* lists */
|
||||||
|
dd { padding-bottom:0.5ex; }
|
||||||
|
dl.inside dt { float:left; }
|
||||||
|
/* search */
|
||||||
|
div.search span.result { font-size:larger; }
|
||||||
|
div.search span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.search p.result { display:none; }
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
margin: 0 0 0 1ex;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid #000;
|
||||||
|
opacity: 0.3;
|
||||||
|
background-color:#ffe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* images */
|
||||||
|
|
||||||
|
div.content a.feed img, div.journal a.feed img,
|
||||||
|
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
||||||
|
div.content a.inline img, div.journal a.inline img,
|
||||||
|
div.content li a.image img, div.journal li a.image img {
|
||||||
|
margin: 0; padding: 0; border: none;
|
||||||
|
}
|
||||||
|
div.image a img {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left { float:left; margin-right: 1em; }
|
||||||
|
.right { float:right; margin-left: 1em; }
|
||||||
|
.half img { height: 50%; width: 50%; }
|
||||||
|
.face img { width: 200px; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
.center { text-align:center; }
|
||||||
|
table.aside {
|
||||||
|
float:right;
|
||||||
|
width:40%;
|
||||||
|
margin-left: 1em;
|
||||||
|
padding: 1ex;
|
||||||
|
border: 1px dotted #666;
|
||||||
|
}
|
||||||
|
table.aside td {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
div.sidebar {
|
||||||
|
float:right; width: 250px;
|
||||||
|
text-align: right;
|
||||||
|
border: none;
|
||||||
|
margin: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bigsidebar {
|
||||||
|
float:right;
|
||||||
|
width: 500px;
|
||||||
|
border: none;
|
||||||
|
margin-left: 1ex;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
||||||
|
dl.irc dt span.time { float:left; }
|
||||||
|
dl.irc dd { margin-left:22ex; }
|
||||||
|
|
||||||
|
/* portrait */
|
||||||
|
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
.portrait { float: left; font-size: small; margin-right: 1em; }
|
||||||
|
.portrait a { color: #999; }
|
||||||
|
|
||||||
|
div.left { float:left; margin:1em; padding: 0.5em; }
|
||||||
|
div.left p { display:table-cell; }
|
||||||
|
div.left p + p { display:table-caption; caption-side:bottom; }
|
||||||
|
|
||||||
|
p.table a { float:left; width:20ex; }
|
||||||
|
p.table + p { clear:both; }
|
||||||
|
|
||||||
|
/* rss */
|
||||||
|
|
||||||
|
channel * { display: block; }
|
||||||
|
|
||||||
|
channel title {
|
||||||
|
margin-top: 30pt;
|
||||||
|
}
|
||||||
|
copyright {
|
||||||
|
font-size: 14pt;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
channel > link:before {
|
||||||
|
font-size: 18pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1em;
|
||||||
|
padding: 0.5em;
|
||||||
|
content: "This is an RSS feed, designed to be read in a feed reader.";
|
||||||
|
color: red;
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
|
link, license {
|
||||||
|
font-size: 11pt;
|
||||||
|
margin-bottom: 9pt;
|
||||||
|
}
|
||||||
|
username:before { content: "Last edited by "; }
|
||||||
|
username:after { content: "."; }
|
||||||
|
generator:before { content: "Feed generated by "; }
|
||||||
|
generator:after { content: "."; }
|
||||||
|
channel description {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
item description {
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
docs, language,
|
||||||
|
pubDate, lastBuildDate, ttl, guid, category, comments,
|
||||||
|
docs, image title, image link,
|
||||||
|
status, version, diff, history, importance {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
544
css/alex-2017.css
Normal file
@@ -0,0 +1,544 @@
|
|||||||
|
/* This file is in the public domain. */
|
||||||
|
html{ text-align: center; }
|
||||||
|
|
||||||
|
body, rss {
|
||||||
|
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 14pt;
|
||||||
|
padding: 1em 3em;
|
||||||
|
max-width: 72ex;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
@import url(file:///home/alex/alexschroeder.ch/css/alex-2017.css) print;
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide all the crap */
|
||||||
|
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
||||||
|
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
||||||
|
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.content a.book,
|
||||||
|
div.content a.movie {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a cite {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
img[alt="RSS"] { display: none }
|
||||||
|
a.rss { font-size: 8pt }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headings: we can use larger sizes if we use a lighter color.
|
||||||
|
we cannot inherit the font-family because header and footer use a narrow font. */
|
||||||
|
|
||||||
|
h1, h2, h3, title {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1, channel title {
|
||||||
|
font-size: 32pt;
|
||||||
|
margin: 1em 0 0.5em 0;
|
||||||
|
padding: 0.4em 0;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 18pt;
|
||||||
|
margin: 2em 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0;
|
||||||
|
margin: 1em 0 0 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headers in the journal are smaller */
|
||||||
|
|
||||||
|
div.journal h1, item title {
|
||||||
|
font-size: inherit;
|
||||||
|
padding: 0;
|
||||||
|
clear: both;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
div.journal h2 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
div.journal h3 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
div.journal hr {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
p.more {
|
||||||
|
margin-top: 3em;
|
||||||
|
}
|
||||||
|
/* Links in headings appear on journal pages. */
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a {
|
||||||
|
color:inherit;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for download buttons and the like */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.4em 0.6em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon {
|
||||||
|
color: #363;
|
||||||
|
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a.pencil {
|
||||||
|
padding-left: 1ex;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
visibility: hidden;
|
||||||
|
transition: visibility 0s 1s, opacity 1s linear;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
*:hover > a.pencil {
|
||||||
|
visibility: visible;
|
||||||
|
transition: opacity .5s linear;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
a.pencil {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.number {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop floating content from flowing over the footer */
|
||||||
|
|
||||||
|
hr {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the distance between links in the navigation bars */
|
||||||
|
|
||||||
|
span.bar a {
|
||||||
|
margin-right: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a img {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search box in the top bar */
|
||||||
|
|
||||||
|
.header form, .header p {
|
||||||
|
display: inline;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
||||||
|
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
||||||
|
visibility: hidden; position: absolute;
|
||||||
|
}
|
||||||
|
/* wrap on the iphone */
|
||||||
|
@media only screen and (max-device-width: 480px) {
|
||||||
|
}
|
||||||
|
|
||||||
|
.header input {
|
||||||
|
width: 10ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other form fields */
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
|
||||||
|
textarea, pre, code, tt {
|
||||||
|
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, "Symbola";
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* styling for divs that will be invisible when printing
|
||||||
|
when printing. */
|
||||||
|
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer form.search {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.rc li + li {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
div.rc li strong, table.history strong, strong.description {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
}
|
||||||
|
div.diff {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color: #ffffaf;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color: #cfffcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.refer {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.message {
|
||||||
|
background-color:#fee;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.xml {
|
||||||
|
border:none;
|
||||||
|
padding:1px;
|
||||||
|
}
|
||||||
|
a.small img {
|
||||||
|
max-width:300px;
|
||||||
|
}
|
||||||
|
a.large img {
|
||||||
|
max-width:600px;
|
||||||
|
}
|
||||||
|
div.sister {
|
||||||
|
margin-right:1ex;
|
||||||
|
background-color:inherit;
|
||||||
|
}
|
||||||
|
div.sister p {
|
||||||
|
margin-top:0;
|
||||||
|
}
|
||||||
|
div.sister hr {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.sister img {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.near, div.definition {
|
||||||
|
background-color:#efe;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
float:right;
|
||||||
|
border:1px dotted #000;
|
||||||
|
padding:0 1em;
|
||||||
|
}
|
||||||
|
div.sidebar ul {
|
||||||
|
padding-left:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replacements, features */
|
||||||
|
|
||||||
|
ins {
|
||||||
|
font-style: italic;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
acronym, abbr {
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
font-variant:small-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interlink prefix not shown */
|
||||||
|
a .site, a .separator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
a cite { font:inherit; }
|
||||||
|
/* browser borkage */
|
||||||
|
textarea[name="text"] { width:97%; height:80%; }
|
||||||
|
textarea[name="summary"] { width:97%; height:3em; }
|
||||||
|
/* comments */
|
||||||
|
textarea[name="aftertext"] { width:97%; height:10em; }
|
||||||
|
div.commentshown {
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 2em 0;
|
||||||
|
}
|
||||||
|
div.commenthidden {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.commentshown {
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
p.comment {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.comment {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
div.comment h2 {
|
||||||
|
margin-top: 5em;
|
||||||
|
}
|
||||||
|
/* comment pages with username, homepage, and email subscription */
|
||||||
|
.comment form span { display: block; }
|
||||||
|
.comment form span label { display: inline-block; width: 10em; }
|
||||||
|
/* IE sucks */
|
||||||
|
.comment input#username,
|
||||||
|
.comment input#homepage,
|
||||||
|
.comment input#mail { width: 20em; }
|
||||||
|
|
||||||
|
/* cal */
|
||||||
|
div.month { padding:0; margin:0 2ex; }
|
||||||
|
body > div.month {
|
||||||
|
float:right;
|
||||||
|
background-color: inherit;
|
||||||
|
border:solid thin;
|
||||||
|
padding:0 1ex;
|
||||||
|
}
|
||||||
|
.year > .month {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
.month .title a.local {
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
.month a.local {
|
||||||
|
background-color: #ddf;
|
||||||
|
}
|
||||||
|
.month a.today {
|
||||||
|
background-color: #fdd;
|
||||||
|
}
|
||||||
|
.month a {
|
||||||
|
color:inherit;
|
||||||
|
font-weight:inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
/* history tables and other tables */
|
||||||
|
table.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
td.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 1em;
|
||||||
|
margin: 1em 2em;
|
||||||
|
}
|
||||||
|
table tr td, table tr th {
|
||||||
|
border: none;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.arab tr th {
|
||||||
|
font-weight:normal;
|
||||||
|
text-align:left;
|
||||||
|
vertical-align:top;
|
||||||
|
}
|
||||||
|
table.arab, table.arab tr th, table.arab tr td {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
th.nobreak {
|
||||||
|
white-space:nowrap;
|
||||||
|
}
|
||||||
|
table.full { width:99%; margin-left:1px; }
|
||||||
|
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
||||||
|
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
||||||
|
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
||||||
|
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
||||||
|
table.t td { vertical-align: top; }
|
||||||
|
td.half { width:50%; }
|
||||||
|
td.third { width:33%; }
|
||||||
|
|
||||||
|
form table td { padding:5px; }
|
||||||
|
|
||||||
|
/* lists */
|
||||||
|
dd { padding-bottom:0.5ex; }
|
||||||
|
dl.inside dt { float:left; }
|
||||||
|
/* search */
|
||||||
|
div.search span.result { font-size:larger; }
|
||||||
|
div.search span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.search p.result { display:none; }
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
margin: 0 0 0 1ex;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid #000;
|
||||||
|
opacity: 0.3;
|
||||||
|
background-color:#ffe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* images */
|
||||||
|
|
||||||
|
div.content a.feed img, div.journal a.feed img,
|
||||||
|
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
||||||
|
div.content a.inline img, div.journal a.inline img,
|
||||||
|
div.content li a.image img, div.journal li a.image img {
|
||||||
|
margin: 0; padding: 0; border: none;
|
||||||
|
}
|
||||||
|
div.image a img {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left { float:left; margin-right: 1em; }
|
||||||
|
.right { float:right; margin-left: 1em; }
|
||||||
|
.half img { height: 50%; width: 50%; }
|
||||||
|
.face img { width: 200px; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
.center { text-align:center; }
|
||||||
|
table.aside {
|
||||||
|
float:right;
|
||||||
|
width:40%;
|
||||||
|
margin-left: 1em;
|
||||||
|
padding: 1ex;
|
||||||
|
border: 1px dotted #666;
|
||||||
|
}
|
||||||
|
table.aside td {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
div.sidebar {
|
||||||
|
float:right; width: 250px;
|
||||||
|
text-align: right;
|
||||||
|
border: none;
|
||||||
|
margin: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bigsidebar {
|
||||||
|
float:right;
|
||||||
|
width: 500px;
|
||||||
|
border: none;
|
||||||
|
margin-left: 1ex;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
||||||
|
dl.irc dt span.time { float:left; }
|
||||||
|
dl.irc dd { margin-left:22ex; }
|
||||||
|
|
||||||
|
/* portrait */
|
||||||
|
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
.portrait { float: left; font-size: small; margin-right: 1em; }
|
||||||
|
.portrait a { color: #999; }
|
||||||
|
|
||||||
|
div.left { float:left; margin:1em; padding: 0.5em; }
|
||||||
|
div.left p { display:table-cell; }
|
||||||
|
div.left p + p { display:table-caption; caption-side:bottom; }
|
||||||
|
|
||||||
|
p.table a { float:left; width:20ex; }
|
||||||
|
p.table + p { clear:both; }
|
||||||
|
|
||||||
|
/* mastodon */
|
||||||
|
|
||||||
|
div.mastodon { padding: 0 2em }
|
||||||
|
div.mastodon .status {padding-top: 1ex; border-bottom: 1px solid grey;}
|
||||||
|
div.mastodon .status:first-child {border-top: 1px solid grey;}
|
||||||
|
|
||||||
|
/* rss */
|
||||||
|
|
||||||
|
channel * { display: block; }
|
||||||
|
|
||||||
|
channel title {
|
||||||
|
margin-top: 30pt;
|
||||||
|
}
|
||||||
|
copyright {
|
||||||
|
font-size: 14pt;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
channel:before {
|
||||||
|
font-size: 14pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1em;
|
||||||
|
padding: 0.5em;
|
||||||
|
content: "This document is to be read in a feed reader. The item content is escaped HTML, which makes it hard to read for humans. Sorry!";
|
||||||
|
color: red;
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
|
license {
|
||||||
|
font-size: 11pt;
|
||||||
|
margin-bottom: 9pt;
|
||||||
|
}
|
||||||
|
contributor:before { content: "Last edited by "; }
|
||||||
|
contributor:after { content: "."; }
|
||||||
|
generator:before { content: "Feed generated by "; }
|
||||||
|
generator:after { content: "."; }
|
||||||
|
channel description {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
item description {
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
link, managingEditor, webMaster, license, url,
|
||||||
|
docs, language,
|
||||||
|
pubDate, lastBuildDate, ttl, guid, category, comments,
|
||||||
|
docs, image title, image link,
|
||||||
|
status, version, diff, history, importance {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
615
css/alex-2018.css
Normal file
@@ -0,0 +1,615 @@
|
|||||||
|
/* This file is in the public domain. */
|
||||||
|
html{ text-align: center; }
|
||||||
|
|
||||||
|
body, rss {
|
||||||
|
font-family: "DejaVu Serif", Palatino, serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 16pt;
|
||||||
|
padding: 1em 3em;
|
||||||
|
max-width: 72ex;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
color: #000;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-device-width: 600px) {
|
||||||
|
body {
|
||||||
|
padding: 1ex;
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
|
||||||
|
textarea, pre, code, tt {
|
||||||
|
font-family: "DejaVu Mono", "Andale Mono", Monaco, "Courier New", Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre, code, tt {
|
||||||
|
font-size: 12pt; /* fits 80ex */
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
@import url(file:///home/alex/alexschroeder.ch/css/alex-2017.css) print;
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide all the crap */
|
||||||
|
div.diff, div.diff+hr, div.refer, div.near, div.definition, div.sister,
|
||||||
|
div.cal, div.footer, span.specialdays, span.gotobar, a.edit, a.number span,
|
||||||
|
div.rc form, form.tiny, p.comment, p#plus1, div.g-plusone, div.content a.feed {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.content a.book,
|
||||||
|
div.content a.movie {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a cite {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
img[alt="RSS"] { display: none }
|
||||||
|
a.rss { font-size: 8pt }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headings: we can use larger sizes if we use a lighter color.
|
||||||
|
we cannot inherit the font-family because header and footer use a narrow font. */
|
||||||
|
|
||||||
|
h1, h2, h3, title {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1, channel title {
|
||||||
|
font-size: 32pt;
|
||||||
|
margin: 1em 0 0.5em 0;
|
||||||
|
padding: 0.4em 0;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 18pt;
|
||||||
|
margin: 2em 0 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0;
|
||||||
|
margin: 1em 0 0 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* headers in the journal are smaller */
|
||||||
|
|
||||||
|
div.journal h1, item title {
|
||||||
|
font-size: inherit;
|
||||||
|
padding: 0;
|
||||||
|
clear: both;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
div.journal h2 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
div.journal h3 {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
div.journal hr {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
p.more {
|
||||||
|
margin-top: 3em;
|
||||||
|
}
|
||||||
|
/* Links in headings appear on journal pages. */
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a {
|
||||||
|
color:inherit;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for download buttons and the like */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 120%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.4em 0.6em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset, 0px 1px 3px black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button .icon {
|
||||||
|
color: #363;
|
||||||
|
text-shadow: 0px -1px 1px white, 0px 1px 3px #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
|
||||||
|
a.pencil {
|
||||||
|
padding-left: 1ex;
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
visibility: hidden;
|
||||||
|
transition: visibility 0s 1s, opacity 1s linear;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
*:hover > a.pencil {
|
||||||
|
visibility: visible;
|
||||||
|
transition: opacity .5s linear;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
a.pencil {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.number {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop floating content from flowing over the footer */
|
||||||
|
|
||||||
|
hr {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the distance between links in the navigation bars */
|
||||||
|
|
||||||
|
span.bar a {
|
||||||
|
margin-right: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a img {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search box in the top bar */
|
||||||
|
|
||||||
|
.header form, .header p {
|
||||||
|
display: inline;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
label[for="searchlang"], #searchlang, .header input[type="submit"] {
|
||||||
|
/* don't use display: none! http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form */
|
||||||
|
visibility: hidden; position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header input {
|
||||||
|
width: 10ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* other form fields */
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* styling for divs that will be invisible when printing
|
||||||
|
when printing. */
|
||||||
|
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
div.header, div.footer, div.near, div.definition, p.comment, a.tag {
|
||||||
|
font-size: 8pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer form.search {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Recent Changes */
|
||||||
|
|
||||||
|
div.rc {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
div.rc li + li {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
div.rc li strong, table.history strong, strong.description {
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
}
|
||||||
|
.red {
|
||||||
|
background: red;
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orange {
|
||||||
|
background: orange;
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yellow {
|
||||||
|
background: yellow;
|
||||||
|
color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.green {
|
||||||
|
background: green;
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blue {
|
||||||
|
background: blue;
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.indigo {
|
||||||
|
background: indigo;
|
||||||
|
color: indigo;
|
||||||
|
}
|
||||||
|
|
||||||
|
.violet {
|
||||||
|
background: violet;
|
||||||
|
color: violet;
|
||||||
|
}
|
||||||
|
|
||||||
|
.white {
|
||||||
|
background: white;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ip-code {
|
||||||
|
border: 1px solid #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Diff */
|
||||||
|
|
||||||
|
div.diff {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color: #ffffaf;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color: #cfffcf;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.refer {
|
||||||
|
padding-left: 5%;
|
||||||
|
padding-right: 5%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.message {
|
||||||
|
background-color:#fee;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.xml {
|
||||||
|
border:none;
|
||||||
|
padding:1px;
|
||||||
|
}
|
||||||
|
a.small img {
|
||||||
|
max-width:300px;
|
||||||
|
}
|
||||||
|
a.large img {
|
||||||
|
max-width:600px;
|
||||||
|
}
|
||||||
|
div.sister {
|
||||||
|
margin-right:1ex;
|
||||||
|
background-color:inherit;
|
||||||
|
}
|
||||||
|
div.sister p {
|
||||||
|
margin-top:0;
|
||||||
|
}
|
||||||
|
div.sister hr {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.sister img {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.near, div.definition {
|
||||||
|
background-color:#efe;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
float:right;
|
||||||
|
border:1px dotted #000;
|
||||||
|
padding:0 1em;
|
||||||
|
}
|
||||||
|
div.sidebar ul {
|
||||||
|
padding-left:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replacements, features */
|
||||||
|
|
||||||
|
ins {
|
||||||
|
font-style: italic;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
acronym, abbr {
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
font-variant:small-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Interlink prefix not shown */
|
||||||
|
a .site, a .separator {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
a cite { font:inherit; }
|
||||||
|
/* browser borkage */
|
||||||
|
textarea[name="text"] { width:97%; height:80%; }
|
||||||
|
textarea[name="summary"] { width:97%; height:3em; }
|
||||||
|
/* comments */
|
||||||
|
textarea[name="aftertext"] { width:97%; height:10em; }
|
||||||
|
div.commentshown {
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 2em 0;
|
||||||
|
}
|
||||||
|
div.commenthidden {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
div.commentshown {
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
p.comment {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.comment {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
div.comment h2 {
|
||||||
|
margin-top: 5em;
|
||||||
|
}
|
||||||
|
/* comment pages with username, homepage, and email subscription */
|
||||||
|
.comment form span { display: block; }
|
||||||
|
.comment form span label { display: inline-block; width: 10em; }
|
||||||
|
/* IE sucks */
|
||||||
|
.comment input#username,
|
||||||
|
.comment input#homepage,
|
||||||
|
.comment input#mail { width: 20em; }
|
||||||
|
|
||||||
|
/* cal */
|
||||||
|
div.month { padding:0; margin:0 2ex; }
|
||||||
|
body > div.month {
|
||||||
|
float:right;
|
||||||
|
background-color: inherit;
|
||||||
|
border:solid thin;
|
||||||
|
padding:0 1ex;
|
||||||
|
}
|
||||||
|
.year > .month {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
.month .title a.local {
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
.month a.local {
|
||||||
|
background-color: #ddf;
|
||||||
|
}
|
||||||
|
.month a.today {
|
||||||
|
background-color: #fdd;
|
||||||
|
}
|
||||||
|
.month a {
|
||||||
|
color:inherit;
|
||||||
|
font-weight:inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
/* history tables and other tables */
|
||||||
|
table.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
td.history {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 1em;
|
||||||
|
margin: 1em 2em;
|
||||||
|
}
|
||||||
|
table tr td, table tr th {
|
||||||
|
border: none;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.arab tr th {
|
||||||
|
font-weight:normal;
|
||||||
|
text-align:left;
|
||||||
|
vertical-align:top;
|
||||||
|
}
|
||||||
|
table.arab, table.arab tr th, table.arab tr td {
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
th.nobreak {
|
||||||
|
white-space:nowrap;
|
||||||
|
}
|
||||||
|
table.full { width:99%; margin-left:1px; }
|
||||||
|
table.j td, table.j th, table tr td.j, table tr th.j, .j { text-align:justify; }
|
||||||
|
table.l td, table.l th, table tr td.l, table tr th.l, .l { text-align:left; }
|
||||||
|
table.r td, table.r th, table tr td.r, table tr th.r, .r { text-align:right; }
|
||||||
|
table.c td, table.c th, table tr td.c, table tr th.c, .c { text-align:center; }
|
||||||
|
table.t td { vertical-align: top; }
|
||||||
|
td.half { width:50%; }
|
||||||
|
td.third { width:33%; }
|
||||||
|
|
||||||
|
form table td { padding:5px; }
|
||||||
|
|
||||||
|
/* lists */
|
||||||
|
dd { padding-bottom:0.5ex; }
|
||||||
|
dl.inside dt { float:left; }
|
||||||
|
/* search */
|
||||||
|
div.search span.result { font-size:larger; }
|
||||||
|
div.search span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.search p.result { display:none; }
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
margin: 0 0 0 1ex;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid #000;
|
||||||
|
opacity: 0.3;
|
||||||
|
background-color:#ffe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* images */
|
||||||
|
|
||||||
|
div.content a.feed img, div.journal a.feed img,
|
||||||
|
div.content a img.smiley, div.journal a img.smiley, img.smiley,
|
||||||
|
div.content a.inline img, div.journal a.inline img,
|
||||||
|
div.content li a.image img, div.journal li a.image img {
|
||||||
|
margin: 0; padding: 0; border: none;
|
||||||
|
}
|
||||||
|
div.image a img {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left { float:left; margin-right: 1em; }
|
||||||
|
.right { float:right; margin-left: 1em; }
|
||||||
|
.half img { height: 50%; width: 50%; }
|
||||||
|
.face img { width: 200px; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
.center { text-align:center; }
|
||||||
|
table.aside {
|
||||||
|
float:right;
|
||||||
|
width:40%;
|
||||||
|
margin-left: 1em;
|
||||||
|
padding: 1ex;
|
||||||
|
border: 1px dotted #666;
|
||||||
|
}
|
||||||
|
table.aside td {
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
div.sidebar {
|
||||||
|
float:right; width: 250px;
|
||||||
|
text-align: right;
|
||||||
|
border: none;
|
||||||
|
margin: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bigsidebar {
|
||||||
|
float:right;
|
||||||
|
width: 500px;
|
||||||
|
border: none;
|
||||||
|
margin-left: 1ex;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
dl.irc dt { width:20ex; float:left; text-align:right; clear:left; }
|
||||||
|
dl.irc dt span.time { float:left; }
|
||||||
|
dl.irc dd { margin-left:22ex; }
|
||||||
|
|
||||||
|
/* portrait */
|
||||||
|
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
.portrait { float: left; font-size: small; margin-right: 1em; }
|
||||||
|
.portrait a { color: #999; }
|
||||||
|
|
||||||
|
div.left { float:left; margin:1em; padding: 0.5em; }
|
||||||
|
div.left p { display:table-cell; }
|
||||||
|
div.left p + p { display:table-caption; caption-side:bottom; }
|
||||||
|
|
||||||
|
p.table a { float:left; width:20ex; }
|
||||||
|
p.table + p { clear:both; }
|
||||||
|
|
||||||
|
/* mastodon */
|
||||||
|
|
||||||
|
div.mastodon { padding: 0 2em }
|
||||||
|
div.mastodon .status {padding-top: 1ex; border-bottom: 1px solid grey;}
|
||||||
|
div.mastodon .status:first-child {border-top: 1px solid grey;}
|
||||||
|
|
||||||
|
/* terminal "screenshots" */
|
||||||
|
|
||||||
|
.terminal {
|
||||||
|
width: 80%;
|
||||||
|
margin: 50px auto 100px auto;
|
||||||
|
padding: 5px;
|
||||||
|
font-size: 62%; /* fits 80ex */
|
||||||
|
border: 1px solid #999;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 25px 50px #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* rss */
|
||||||
|
|
||||||
|
channel * { display: block; }
|
||||||
|
|
||||||
|
channel title {
|
||||||
|
margin-top: 30pt;
|
||||||
|
}
|
||||||
|
copyright {
|
||||||
|
font-size: 14pt;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
channel:before {
|
||||||
|
font-size: 14pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1em;
|
||||||
|
padding: 0.5em;
|
||||||
|
content: "This document is to be read in a feed reader. The item content is escaped HTML, which makes it hard to read for humans. Sorry!";
|
||||||
|
color: red;
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
|
license {
|
||||||
|
font-size: 11pt;
|
||||||
|
margin-bottom: 9pt;
|
||||||
|
}
|
||||||
|
contributor:before { content: "Last edited by "; }
|
||||||
|
contributor:after { content: "."; }
|
||||||
|
generator:before { content: "Feed generated by "; }
|
||||||
|
generator:after { content: "."; }
|
||||||
|
channel description {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
item description {
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
link, managingEditor, webMaster, license, url,
|
||||||
|
docs, language,
|
||||||
|
pubDate, lastBuildDate, ttl, guid, category, comments,
|
||||||
|
docs, image title, image link,
|
||||||
|
status, version, diff, history, importance {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
347
css/bootstrap.css
vendored
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
/* Public Domain
|
||||||
|
Written by Alex Schroeder and Evgkeni Sampelnikof */
|
||||||
|
textarea { width:100%; }
|
||||||
|
h1 a { color: inherit }
|
||||||
|
div.journal h1 { font-size:large; }
|
||||||
|
table { margin-bottom: 1em; }
|
||||||
|
|
||||||
|
div.diff { padding-left:5%; padding-right:5%; }
|
||||||
|
div.old { background-color:#FFFFAF; }
|
||||||
|
div.new { background-color:#CFFFCF; }
|
||||||
|
|
||||||
|
img.portrait { float: left; clear: left; margin: 1ex; border:#999 1px solid; }
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
div.portrait { float: left; clear: left; font-size: xx-small; margin-right: 1em; }
|
||||||
|
div.portrait img.portrait { float: none; margin: 0; }
|
||||||
|
div.portrait a { text-decoration: none; color: #999; }
|
||||||
|
div.color {
|
||||||
|
clear: both;
|
||||||
|
padding: 1ex 2em;
|
||||||
|
margin: 0 -1em;
|
||||||
|
box-shadow: inset 40px 0px 20px -20px #EEEEEE,
|
||||||
|
inset -40px 0px 20px -20px #EEEEEE;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left { float:left; margin-right:1em; }
|
||||||
|
.right { float:right; margin-left:1em; }
|
||||||
|
|
||||||
|
div.two, div.one {
|
||||||
|
color: #444;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
margin: 7px -1em;
|
||||||
|
box-shadow: inset 40px 0px 20px -20px #EEEEEE,
|
||||||
|
inset -40px 0px 20px -20px #EEEEEE,
|
||||||
|
0px 8px 4px -8px #ccc,
|
||||||
|
0px -6px 4px -8px #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.irc .time { display: none; }
|
||||||
|
dl.irc dt { float: left; text-align: right; width: 13ex; }
|
||||||
|
dl.irc dd { margin-left: 15ex; display: block; }
|
||||||
|
|
||||||
|
div.toc {
|
||||||
|
background-color: #FAFAFA;
|
||||||
|
border: 1px solid #dddddd;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 90%;
|
||||||
|
margin: 3em 0 1em;
|
||||||
|
padding: 1em 0px 0px 1em;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
div.toc li {
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
.ell .toc li {
|
||||||
|
display: inline;
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
div.letter { column-count: 3; -webkit-column-count: 3; -moz-column-count: 3 }
|
||||||
|
|
||||||
|
.footer .edit.bar {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.specialdays {
|
||||||
|
line-height: 1em; /* has no effect: set for div.header instead? */
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer .time {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
color: #666;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
color: #888;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer .legal {
|
||||||
|
text-align: justify;
|
||||||
|
-moz-text-align-last: center;
|
||||||
|
text-align-last: center;
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.4em;
|
||||||
|
margin: 0 120px 0;
|
||||||
|
padding: 1em 0 0;
|
||||||
|
}
|
||||||
|
.footer .legal a {
|
||||||
|
color: #888;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.translation.bar {
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* .include.WikiLanguageMenu could share those styles,
|
||||||
|
(altough it might be better to leave it left-aligned) */
|
||||||
|
|
||||||
|
.translation.bar a:nth-child(n+2) {
|
||||||
|
border-left: 1px solid #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.translation.bar a {
|
||||||
|
padding: 6px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .nav > li > a.brand {
|
||||||
|
color: #C76A0D;
|
||||||
|
padding: 5px 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #C76A0D;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #8F3E0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
word-wrap: break-word;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
background-color: #EEEEEE;
|
||||||
|
color: #000;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border-top: #ccc 1px solid;
|
||||||
|
border-bottom: #fff 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer_wrapper {
|
||||||
|
background: #EEEEEE;
|
||||||
|
background: linear-gradient(to bottom, #EEEEEE, #CCCCCC);
|
||||||
|
padding-bottom: 20px;
|
||||||
|
margin-left: -20px;
|
||||||
|
margin-right: -20px;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer.container hr:first-child {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.footer hr {
|
||||||
|
margin: 10px 100px 0;
|
||||||
|
}
|
||||||
|
.footer.container {
|
||||||
|
padding-top: 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
background: radial-gradient(
|
||||||
|
50% 8px at top,
|
||||||
|
rgba(0, 0, 0, 0.3) 0%,
|
||||||
|
rgba(0, 0, 0, 0) 100%
|
||||||
|
);
|
||||||
|
box-shadow: 0 -1px 2px -2px white;
|
||||||
|
/* border-top: 1px #ccc solid; */
|
||||||
|
}
|
||||||
|
body, li {
|
||||||
|
line-height: 2em;
|
||||||
|
}
|
||||||
|
h1, h2, h3 {
|
||||||
|
text-shadow: 1px 1px white;
|
||||||
|
}
|
||||||
|
.navbar-inner {
|
||||||
|
border-radius: 0 0 4px 4px;
|
||||||
|
border-width: 0 1px 1px;
|
||||||
|
}
|
||||||
|
.navbar .nav > li > a {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
label[for="searchlang"], input#searchlang {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width:480px){
|
||||||
|
h1 { font-size: 1.8em; }
|
||||||
|
.navbar .nav > li > a {
|
||||||
|
padding: 0px 2px;
|
||||||
|
line-height: 10px;
|
||||||
|
}
|
||||||
|
/* hide CC logo */
|
||||||
|
.footer .licence {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
/* make legal foo*/
|
||||||
|
.footer .legal {
|
||||||
|
margin: 5px 5px 5px;
|
||||||
|
}
|
||||||
|
.footer .bar a {
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Right-alignment. Will make it harder to achieve responsive behaviour:
|
||||||
|
|
||||||
|
twitter.github.com/bootstrap/components.html#navbar
|
||||||
|
Look for "Responsive navbar" heading.
|
||||||
|
|
||||||
|
If this is undesirable, remove the lines with the "RA" comment;
|
||||||
|
*/
|
||||||
|
|
||||||
|
.navbar .nav {
|
||||||
|
text-align: right; /* RA */
|
||||||
|
*text-align: left; /* RA */
|
||||||
|
width: 100%; /* RA */
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .nav > li:first-child {
|
||||||
|
float: left; /* RA */
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .nav > li {
|
||||||
|
display: inline-block; /* RA */
|
||||||
|
float: none; /* RA */
|
||||||
|
*float: left;
|
||||||
|
*display: inline;
|
||||||
|
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea:focus,
|
||||||
|
input[type="text"]:focus,
|
||||||
|
input[type="password"]:focus,
|
||||||
|
input[type="datetime"]:focus,
|
||||||
|
input[type="datetime-local"]:focus,
|
||||||
|
input[type="date"]:focus,
|
||||||
|
input[type="month"]:focus,
|
||||||
|
input[type="time"]:focus,
|
||||||
|
input[type="week"]:focus,
|
||||||
|
input[type="number"]:focus,
|
||||||
|
input[type="email"]:focus,
|
||||||
|
input[type="url"]:focus,
|
||||||
|
input[type="search"]:focus,
|
||||||
|
input[type="tel"]:focus,
|
||||||
|
input[type="color"]:focus,
|
||||||
|
.uneditable-input:focus {
|
||||||
|
border-color: rgba(236,160,73,.8);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0,0,0,.075),
|
||||||
|
0 0 8px rgba(236,160,73,.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IE7/8 Flexibility */
|
||||||
|
|
||||||
|
.container,
|
||||||
|
.navbar-static-top .container,
|
||||||
|
.navbar-fixed-top .container,
|
||||||
|
.navbar-fixed-bottom .container {
|
||||||
|
width: auto;
|
||||||
|
max-width: 940px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't widen the layout past 940 */
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
.container,
|
||||||
|
.navbar-static-top .container,
|
||||||
|
.navbar-fixed-top .container,
|
||||||
|
.navbar-fixed-bottom .container {
|
||||||
|
width: 940px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.comment {
|
||||||
|
background: radial-gradient(
|
||||||
|
50% 8px at top,
|
||||||
|
rgba(0, 0, 0, 0.3) 0%,
|
||||||
|
rgba(0, 0, 0, 0) 100%
|
||||||
|
);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
box-shadow: 0 -1px 2px -2px white;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.comment p:nth-child(2) {
|
||||||
|
color: #666;
|
||||||
|
/* line-height: 15px; */
|
||||||
|
font-size: 0.9em;
|
||||||
|
line-height: 1.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.comment p:nth-child(1) {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment textarea {
|
||||||
|
width: 100%;
|
||||||
|
*width: auto;
|
||||||
|
resize: vertical;
|
||||||
|
*resize: both;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* highlighting source code */
|
||||||
|
|
||||||
|
span.builtin { color: #483d8b; } /* DarkSlateBlue */
|
||||||
|
span.comment { color: #b22222; } /* Firebrick */
|
||||||
|
span.constant { color: #008b8b; } /* DarkCyan */
|
||||||
|
span.function { color: #0000ff; } /* Blue1 */
|
||||||
|
span.keyword { color: #7f007f; } /* Purple */
|
||||||
|
span.string { color: #8b475d; } /* VioletRed4 */
|
||||||
|
span.type { color: #228b22; } /* ForestGreen */
|
||||||
|
span.warning { color: #ff0000; font-weight: bold; } /* Red1 */
|
||||||
|
span.comment span,
|
||||||
|
span.string span { color: inherit; }
|
||||||
|
span.comment span.important.constant,
|
||||||
|
span.string span.important.constant { color: #008b8b; }
|
||||||
|
|
||||||
|
/* old: Equivalent to Output::HTML */
|
||||||
|
|
||||||
|
span.linecomment { color: #b22222; } /* firebrick */
|
||||||
|
span.blockcomment { color: #b22222; } /* firebrick */
|
||||||
|
span.prepro { color: purple; }
|
||||||
|
span.select { font-weight: bold; }
|
||||||
|
span.quote { color: #8b475d; } /* VioletRed4 */
|
||||||
|
span.category_1 { color: teal; }
|
||||||
|
span.category_2 { color: blue; }
|
||||||
|
span.category_3 { color: blue; }
|
||||||
|
|
||||||
|
code {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Local Variables: */
|
||||||
|
/* css-indent-offset: 4 */
|
||||||
|
/* End: */
|
||||||
@@ -115,6 +115,7 @@ div.toc h2 {
|
|||||||
|
|
||||||
/* get rid of useless "10 results found" when using indexed search. */
|
/* get rid of useless "10 results found" when using indexed search. */
|
||||||
div.search p.result { display:none; }
|
div.search p.result { display:none; }
|
||||||
|
label[for="searchlang"], input#searchlang { display: none; }
|
||||||
|
|
||||||
form.tiny, form.tiny p {
|
form.tiny, form.tiny p {
|
||||||
display:inline;
|
display:inline;
|
||||||
@@ -335,7 +336,22 @@ div.month a.local {
|
|||||||
|
|
||||||
/* highlighting */
|
/* highlighting */
|
||||||
|
|
||||||
/* Equivalent to Output::HTML */
|
/* highlighting source code */
|
||||||
|
|
||||||
|
span.builtin { color: #483d8b; } /* DarkSlateBlue */
|
||||||
|
span.comment { color: #b22222; } /* Firebrick */
|
||||||
|
span.constant { color: #008b8b; } /* DarkCyan */
|
||||||
|
span.function { color: #0000ff; } /* Blue1 */
|
||||||
|
span.keyword { color: #7f007f; } /* Purple */
|
||||||
|
span.string { color: #8b475d; } /* VioletRed4 */
|
||||||
|
span.type { color: #228b22; } /* ForestGreen */
|
||||||
|
span.warning { color: #ff0000; font-weight: bold; } /* Red1 */
|
||||||
|
span.comment span,
|
||||||
|
span.string span { color: inherit; }
|
||||||
|
span.comment span.important.constant,
|
||||||
|
span.string span.important.constant { color: #008b8b; }
|
||||||
|
|
||||||
|
/* old: Equivalent to Output::HTML */
|
||||||
|
|
||||||
span.linecomment { color: green; }
|
span.linecomment { color: green; }
|
||||||
span.blockcomment { color: green; }
|
span.blockcomment { color: green; }
|
||||||
|
|||||||
@@ -321,7 +321,6 @@ div.sister {
|
|||||||
float:left;
|
float:left;
|
||||||
margin-right:1ex;
|
margin-right:1ex;
|
||||||
padding-right:1ex;
|
padding-right:1ex;
|
||||||
border-right:1px dashed;
|
|
||||||
}
|
}
|
||||||
div.sister p { padding:1ex; margin:0; }
|
div.sister p { padding:1ex; margin:0; }
|
||||||
div.sister hr { display:none; }
|
div.sister hr { display:none; }
|
||||||
|
|||||||
425
css/latex.css
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
/*!
|
||||||
|
* LaTeX.css (https://latex.now.sh/)
|
||||||
|
*
|
||||||
|
* Source: https://github.com/vincentdoerig/latex-css
|
||||||
|
* Licensed under MIT (https://github.com/vincentdoerig/latex-css/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Latin Modern';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-display: swap;
|
||||||
|
src: url('/style/fonts/LM-regular.woff2') format('woff2'),
|
||||||
|
url('/style/fonts/LM-regular.woff') format('woff'),
|
||||||
|
url('/style/fonts/LM-regular.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Latin Modern';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: normal;
|
||||||
|
font-display: swap;
|
||||||
|
src: url('/style/fonts/LM-italic.woff2') format('woff2'),
|
||||||
|
url('/style/fonts/LM-italic.woff') format('woff'),
|
||||||
|
url('/style/fonts/LM-italic.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Latin Modern';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: bold;
|
||||||
|
font-display: swap;
|
||||||
|
src: url('/style/fonts/LM-bold.woff2') format('woff2'),
|
||||||
|
url('/style/fonts/LM-bold.woff') format('woff'),
|
||||||
|
url('/style/fonts/LM-bold.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Latin Modern';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: bold;
|
||||||
|
font-display: swap;
|
||||||
|
src: url('/style/fonts/LM-bold-italic.woff2') format('woff2'),
|
||||||
|
url('/style/fonts/LM-bold-italic.woff') format('woff'),
|
||||||
|
url('/style/fonts/LM-bold-italic.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Box sizing rules */
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove default margin */
|
||||||
|
body,
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
p,
|
||||||
|
ul[class],
|
||||||
|
ol[class],
|
||||||
|
li,
|
||||||
|
figure,
|
||||||
|
figcaption,
|
||||||
|
dl,
|
||||||
|
dd {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make default font-size 1rem and add smooth scrolling to anchors */
|
||||||
|
html {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Latin Modern', Georgia, Cambria, 'DejaVu Serif', 'Times New Roman', Times, serif;
|
||||||
|
line-height: 1.4;
|
||||||
|
max-width: 80ch;
|
||||||
|
min-height: 100vh;
|
||||||
|
overflow-x: hidden;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem 1.25rem;
|
||||||
|
|
||||||
|
counter-reset: theorem;
|
||||||
|
counter-reset: definition;
|
||||||
|
|
||||||
|
color: hsl(0, 5%, 10%);
|
||||||
|
background-color: hsl(210, 20%, 98%);
|
||||||
|
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Justify and hyphenate all paragraphs */
|
||||||
|
p {
|
||||||
|
text-align: justify;
|
||||||
|
hyphens: auto;
|
||||||
|
-webkit-hyphens: auto;
|
||||||
|
-moz-hyphens: auto;
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A elements that don't have a class get default styles */
|
||||||
|
a:not([class]) {
|
||||||
|
text-decoration-skip-ink: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make links red */
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #a00;
|
||||||
|
}
|
||||||
|
a:visited {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #800;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:focus {
|
||||||
|
outline-offset: 2px;
|
||||||
|
outline: 2px solid hsl(220, 90%, 52%);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Ueberschriften mit Links nur dezent einfärben */
|
||||||
|
h1 a, h1 a:visited,
|
||||||
|
h2 a, h2 a:visited,
|
||||||
|
h3 a, h3 a:visited,
|
||||||
|
h4 a, h4 a:visited,
|
||||||
|
h5 a, h5 a:visited,
|
||||||
|
h6 a, h6 a:visited {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* goto bar */
|
||||||
|
div.menu form.search {
|
||||||
|
font-size:75%;
|
||||||
|
margin-top:2em;
|
||||||
|
margin-bottom:3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.menu span.gotobar a.local,
|
||||||
|
div.menu span.gotobar a.local:visited {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #1e133c87;
|
||||||
|
margin-right:1.1em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make images easier to work with */
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inherit fonts for inputs and buttons */
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent textarea from overflowing */
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Natural flow and rhythm in articles by default */
|
||||||
|
article > * + * {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styles for inline code or code snippets */
|
||||||
|
code,
|
||||||
|
pre,
|
||||||
|
kbd {
|
||||||
|
font-family: Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
|
||||||
|
monospace;
|
||||||
|
font-size: 85%;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
padding: 1rem 1.4rem;
|
||||||
|
max-width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: hsl(210, 28%, 93%);
|
||||||
|
}
|
||||||
|
pre code {
|
||||||
|
font-size: 95%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
kbd {
|
||||||
|
background: hsl(210, 5%, 100%);
|
||||||
|
border: 1px solid hsl(210, 5%, 70%);
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-size: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make table 100% width, add borders between rows */
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
text-align: left;
|
||||||
|
padding: 0.5rem;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
border-bottom: 1px solid hsl(0, 0%, 85%);
|
||||||
|
}
|
||||||
|
thead th {
|
||||||
|
border-bottom: 2px solid hsl(0, 0%, 70%);
|
||||||
|
}
|
||||||
|
tfoot th {
|
||||||
|
border-top: 2px solid hsl(0, 0%, 70%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Center align the title */
|
||||||
|
h1:first-child {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nested ordered list for ToC */
|
||||||
|
nav ol {
|
||||||
|
counter-reset: item;
|
||||||
|
padding-left: 2rem;
|
||||||
|
}
|
||||||
|
nav li {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
nav li:before {
|
||||||
|
content: counters(item, '.') ' ';
|
||||||
|
counter-increment: item;
|
||||||
|
padding-right: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Center definitions (most useful for display equations) */
|
||||||
|
dl dd {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Theorem */
|
||||||
|
.theorem {
|
||||||
|
counter-increment: theorem;
|
||||||
|
display: block;
|
||||||
|
margin: 12px 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.theorem::before {
|
||||||
|
content: 'Satz ' counter(theorem) '. ';
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lemma */
|
||||||
|
.lemma {
|
||||||
|
counter-increment: theorem;
|
||||||
|
display: block;
|
||||||
|
margin: 12px 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.lemma::before {
|
||||||
|
content: 'Lemma ' counter(theorem) '. ';
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Proof */
|
||||||
|
.proof {
|
||||||
|
display: block;
|
||||||
|
margin: 12px 0;
|
||||||
|
font-style: normal;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.proof::before {
|
||||||
|
content: 'Beweis. ' attr(title);
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.proof:after {
|
||||||
|
content: '◾️';
|
||||||
|
position: absolute;
|
||||||
|
right: -12px;
|
||||||
|
bottom: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Definition */
|
||||||
|
.definition {
|
||||||
|
counter-increment: definition;
|
||||||
|
display: block;
|
||||||
|
margin: 12px 0;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
.definition::before {
|
||||||
|
content: 'Definition ' counter(definition) '. ';
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Center align author name, use small caps and add vertical spacing */
|
||||||
|
.author {
|
||||||
|
margin: 0.85rem 0;
|
||||||
|
font-variant-caps: small-caps;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make footnote text smaller and left align it (looks bad with long URLs) */
|
||||||
|
.footnotes p {
|
||||||
|
text-align: left;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-size: 85%;
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
.footnotes {
|
||||||
|
border-top: 1px solid hsl(0, 0%, 39%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Center title and paragraph */
|
||||||
|
.abstract,
|
||||||
|
.abstract p {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.abstract {
|
||||||
|
margin: 2.25rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Format the LaTeX symbol correctly (a higher up, e lower) */
|
||||||
|
.latex span:nth-child(1) {
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 0.75em;
|
||||||
|
vertical-align: 0.28em;
|
||||||
|
margin-left: -0.48em;
|
||||||
|
margin-right: -0.15em;
|
||||||
|
line-height: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.latex span:nth-child(2) {
|
||||||
|
text-transform: uppercase;
|
||||||
|
vertical-align: -0.5ex;
|
||||||
|
margin-left: -0.1667em;
|
||||||
|
margin-right: -0.125em;
|
||||||
|
line-height: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Heading typography */
|
||||||
|
h1 {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
line-height: 3.25rem;
|
||||||
|
margin-bottom: 1.625rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 1.7rem;
|
||||||
|
line-height: 2rem;
|
||||||
|
margin-top: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
margin-top: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin-top: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
font-size: 1rem;
|
||||||
|
margin-top: 1.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: normal;
|
||||||
|
margin-top: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
line-height: 1.625rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 + h2 {
|
||||||
|
margin-top: 1.625rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 + h3,
|
||||||
|
h3 + h4,
|
||||||
|
h4 + h5 {
|
||||||
|
margin-top: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 + h6 {
|
||||||
|
margin-top: -0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
margin-bottom: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.diff div.old {
|
||||||
|
background-color: #FFFFAF;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.diff div.new {
|
||||||
|
background-color: #CFFFCF;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content blockquote {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
266
css/light.css
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
/* This file is in the public domain. */
|
||||||
|
|
||||||
|
/* Esteban is nice, but bold is not so nice, and on Windows it suffers.
|
||||||
|
@import url(http://fonts.googleapis.com/css?family=Esteban&subset=latin,latin-ext);
|
||||||
|
|
||||||
|
For campaignwiki.org, we need to use the same URL in the config file when
|
||||||
|
calling wkhtmltopdf.
|
||||||
|
|
||||||
|
@import url(https://fonts.googleapis.com/css?family=Noticia+Text:400,400italic,700italic,700&subset=latin,latin-ext); */
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
||||||
|
font-size: 14pt;
|
||||||
|
color: #000;
|
||||||
|
background-color: #eed;
|
||||||
|
margin:1em 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea, pre, code, tt {
|
||||||
|
font-family: "Andale Mono", Monaco, "Courier New", Courier, monospace, Symbola;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body {
|
||||||
|
background-color: white;
|
||||||
|
font-family: Times, serif;
|
||||||
|
font-size:10pt;
|
||||||
|
}
|
||||||
|
/* Printing from Firefox */
|
||||||
|
svg {
|
||||||
|
transform: translate(-1.5cm, -1cm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iPhone */
|
||||||
|
|
||||||
|
@media only screen and (max-device-width: 480px) {
|
||||||
|
img { max-width: 480px !important; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iPad */
|
||||||
|
|
||||||
|
@media only screen and (min-device-width: 481px) and (max-device-width: 900px) {
|
||||||
|
body { font-size: 150%; }
|
||||||
|
textarea,input { font-size: 100%; }
|
||||||
|
img { max-width: 550px !important; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* general */
|
||||||
|
.browse { min-height: 3em; }
|
||||||
|
.header form, .header p { margin: 0; }
|
||||||
|
/* hide the buttons but don't use display:none because of
|
||||||
|
http://stackoverflow.com/questions/5665203/getting-iphone-go-button-to-submit-form
|
||||||
|
.header input[type="submit"] { position: absolute; visibility: hidden; } */
|
||||||
|
.header input { width: 6em; font-size: 80%; }
|
||||||
|
.header input[type="checkbox"] { width: 1em; }
|
||||||
|
.footer { clear:both; font-size: 90%; }
|
||||||
|
.content input { font-size: 80%; line-height: 125%; }
|
||||||
|
|
||||||
|
/* comments, footer */
|
||||||
|
div.commentshown {
|
||||||
|
padding-bottom: 1ex;
|
||||||
|
padding-left: 2em;
|
||||||
|
border-left: 2px solid black;
|
||||||
|
font-size: smaller;
|
||||||
|
}
|
||||||
|
div.commenthidden { display:none; }
|
||||||
|
div.commentshown { display:block; }
|
||||||
|
/* comment pages with username, homepage, and email subscription */
|
||||||
|
.comment span { display: block; }
|
||||||
|
.comment span label {
|
||||||
|
display: inline-block; width: 10em;
|
||||||
|
}
|
||||||
|
input#mail, input#homepage, input#username {
|
||||||
|
display: inline-block; width: 20em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* titles */
|
||||||
|
h1 {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 150%;
|
||||||
|
padding: 1em 0;
|
||||||
|
}
|
||||||
|
h1 a:link, h1 a:visited {
|
||||||
|
color: inherit;
|
||||||
|
background-color: inherit;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 130%;
|
||||||
|
padding: 1em 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
h1 a, h2 a, h3 a, h4 a { font-style: normal; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
a:link {
|
||||||
|
color: #851;
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
a:visited {
|
||||||
|
color: #542;
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
a:active {
|
||||||
|
color:#a41;
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 150%;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0.3em 0.5em;
|
||||||
|
text-shadow: 0px -1px 0px #ccc;
|
||||||
|
background-color: #cfa;
|
||||||
|
border: 1px solid #9d8;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 0px 1px 3px white inset,
|
||||||
|
0px 1px 3px black;
|
||||||
|
}
|
||||||
|
.button a {
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.bar a { padding-right: 1em; }
|
||||||
|
@media print {
|
||||||
|
a, a:link, a:visited {
|
||||||
|
color:#000;
|
||||||
|
text-decoration:none;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
a.edit, div.footer, form, span.gotobar, a.number span { display:none; }
|
||||||
|
img[smiley] { line-height: inherit; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* edit paragraphs: no more */
|
||||||
|
a.pencil { display: none; }
|
||||||
|
|
||||||
|
/* table of contents */
|
||||||
|
.toc {
|
||||||
|
font-size: smaller;
|
||||||
|
border-left: 1em solid #886;
|
||||||
|
}
|
||||||
|
.toc ol {
|
||||||
|
list-style-type: none;
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
.toc a {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* images with links, captions, etc */
|
||||||
|
div.image { display: inline; margin: 1em; font-size: 90%; text-align: center; }
|
||||||
|
.left { float: left; margin-right: 1em; }
|
||||||
|
.right { float: right; margin-left: 1em; }
|
||||||
|
div.right .right { float: none; }
|
||||||
|
div.left .left { float: none; }
|
||||||
|
.caption { padding: 0 1em; }
|
||||||
|
.license { font-size: small; }
|
||||||
|
.aside {
|
||||||
|
font-size: small;
|
||||||
|
width: 30%;
|
||||||
|
float: right;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
.aside img.smiley { height: 1em; }
|
||||||
|
.narrow {
|
||||||
|
width: 70%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a img { border: 1px solid #333; }
|
||||||
|
.fit img { width: 80%; text-align: center; margin: 2em 8%; }
|
||||||
|
.half img { width: 50%; height: 50%; text-align: center; margin: 2em 8%; }
|
||||||
|
.noborder img { border: none; }
|
||||||
|
.twenty img { max-width: 20em; }
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
clear: right;
|
||||||
|
border-style:none;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-bottom: 1ex;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hexmap a img { background: #fff; border: none; }
|
||||||
|
|
||||||
|
/* fancy bold underline */
|
||||||
|
em.underline { font-weight: bold; }
|
||||||
|
|
||||||
|
/* editing, previewing */
|
||||||
|
textarea { width:100%; }
|
||||||
|
div.edit { padding-right: 1em; }
|
||||||
|
div.diff { padding-left:5%; padding-right:5%; }
|
||||||
|
div.old { background-color:#FFFFAF; }
|
||||||
|
div.new { background-color:#CFFFCF; }
|
||||||
|
/* div.message { background-color:#FEE; } */
|
||||||
|
div.message {
|
||||||
|
background-color: inherit;
|
||||||
|
font-size: smaller;
|
||||||
|
}
|
||||||
|
table.history { border-style:none; }
|
||||||
|
td.history { border-style:none; }
|
||||||
|
div.history span.dash + strong { font-weight: normal; }
|
||||||
|
span.result { font-size:larger; }
|
||||||
|
span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.rc hr { display: none; }
|
||||||
|
div.rc li { padding-bottom: 0.5em; }
|
||||||
|
div.rc li strong { font-weight: normal; }
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
table.user {
|
||||||
|
margin: 1em 0;
|
||||||
|
padding: 0 1em;
|
||||||
|
border-top: 1px solid black;
|
||||||
|
border-bottom: 1px solid black;
|
||||||
|
}
|
||||||
|
div.aside table.user {
|
||||||
|
margin: 1em 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
table.user td, table.user th {
|
||||||
|
border-style: none;
|
||||||
|
padding:5px 10px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.user th { font-weight:bold; }
|
||||||
|
table.user td.r { text-align:right; }
|
||||||
|
table.user td.l { text-align:left; }
|
||||||
|
table.user td.c { text-align:center; }
|
||||||
|
table.user td.j { text-align:justify; }
|
||||||
|
table.user td.mark { background-color:yellow; }
|
||||||
|
tr:empty { display: block; height: 0.5em; }
|
||||||
|
@media print {
|
||||||
|
table {
|
||||||
|
font-size: 9pt;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
table.user td, table.user th {
|
||||||
|
padding: 0 1ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calendar */
|
||||||
|
div.month { margin:0; padding:0; font-size:x-small; float:right; }
|
||||||
|
div.content div.month { float:none; }
|
||||||
|
div.year div.month { float:left; font-size:medium; padding:1ex; }
|
||||||
|
div.month pre { margin:0; padding:0 0 0 1ex; }
|
||||||
|
div.month a { text-decoration:none; font: inherit; }
|
||||||
|
div.month span.title a { font: inherit; }
|
||||||
|
/* no difference between a.exact and a.collection */
|
||||||
|
div.month a.local { font-weight: bold; }
|
||||||
|
div.month a.local:link { color: #562; }
|
||||||
|
div.month a.local:visited { color: #542; }
|
||||||
|
div.month a.today { background-color: #faa; }
|
||||||
|
div.month span.title a.local { font-weight: normal; color: #842; }
|
||||||
|
@media print {
|
||||||
|
div.month { display: none; }
|
||||||
|
div.year div.month { display: block; }
|
||||||
|
div.year div.month a { display: inline; }
|
||||||
|
}
|
||||||
88
css/minimal.css
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
body { background-color:#FFF; color:#000; margin:1em 2em; }
|
||||||
|
@media only screen and (max-device-width: 480px) {
|
||||||
|
body { font-size: 300%; }
|
||||||
|
}
|
||||||
|
textarea { width:100%; }
|
||||||
|
a:link { color:#00F; }
|
||||||
|
a:visited { color:#A0A; }
|
||||||
|
a:active { color:#F00; }
|
||||||
|
a.alias { text-decoration:none; border-bottom: thin dashed; }
|
||||||
|
a.near:link { color:#093; }
|
||||||
|
a.near:visited { color:#550; }
|
||||||
|
img.logo { float: right; clear: right; border-style:none; }
|
||||||
|
div.diff { padding-left:5%; padding-right:5%; }
|
||||||
|
div.old { background-color:#FFFFAF; }
|
||||||
|
div.new { background-color:#CFFFCF; }
|
||||||
|
div.message { background-color:#FEE; }
|
||||||
|
div.journal h1 { font-size:large; }
|
||||||
|
table.history { border-style:none; }
|
||||||
|
td.history { border-style:none; }
|
||||||
|
span.result { font-size:larger; }
|
||||||
|
span.info { font-size:smaller; font-style:italic; }
|
||||||
|
div.rss { background-color:#EEF; }
|
||||||
|
div.search { background-color:#F1F5FF }
|
||||||
|
div.sister { float:left; margin-right:1ex; background-color:#FFF; }
|
||||||
|
div.sister p { margin-top:0; }
|
||||||
|
div.sister img { border:none; }
|
||||||
|
div.near, div.definition { background-color:#EFE; }
|
||||||
|
div.near p, div.definition p { margin-top:0; }
|
||||||
|
form.comment span { display: block; }
|
||||||
|
@media print {
|
||||||
|
body { font:12pt sans-serif; }
|
||||||
|
a, a:link, a:visited { color:#000; text-decoration:none; font-style:oblique; }
|
||||||
|
h1 a, h2 a, h3 a, h4 a { font-style:normal; }
|
||||||
|
a.edit, div.footer, form, span.gotobar, a.number span { display:none; }
|
||||||
|
a[class="url number"]:after, a[class="inter number"]:after { content:"[" attr(href) "]"; }
|
||||||
|
a[class="local number"]:after { content:"[" attr(title) "]"; }
|
||||||
|
img[smiley] { line-height: inherit; }
|
||||||
|
}
|
||||||
|
/* calendar */
|
||||||
|
div.month { margin:0; padding:0; font-size:x-small; float:right; }
|
||||||
|
div.content div.month { float:none; }
|
||||||
|
div.footer { clear:both; }
|
||||||
|
div.year div.month { float:left; font-size:medium; padding:1ex; }
|
||||||
|
div.month pre { margin:0; padding:0 0 0 1ex; background-color:#ffe; }
|
||||||
|
div.month a { text-decoration:none; color:inherit; }
|
||||||
|
div.month span.title a { background-color:inherit; }
|
||||||
|
div.month a.exact { background-color:#eef; }
|
||||||
|
div.month a.collection { background-color:#ccf; }
|
||||||
|
div.month a.today { background-color:#fcc; }
|
||||||
|
div.month a[class~="today"][class~="exact"] { background-color:#fcf; }
|
||||||
|
div.month a[class~="today"][class~="collection"] { background-color:#faf; }
|
||||||
|
@media print {
|
||||||
|
div.month { display: none; }
|
||||||
|
div.year div.month { display: block; }
|
||||||
|
div.year div.month a { display: inline; }
|
||||||
|
}
|
||||||
|
/* crumbs */
|
||||||
|
span.crumbs { font-size: smaller; }
|
||||||
|
/* dynamic comments */
|
||||||
|
div.commenthidden { display:none; }
|
||||||
|
div.commentshown { display:block; background-color:#ffc; padding:1ex; }
|
||||||
|
/* irc */
|
||||||
|
dl.irc dt { width:12ex; float:left; text-align:right; }
|
||||||
|
dl.irc dd { margin-left:15ex; }
|
||||||
|
/* page trail */
|
||||||
|
@media print { span.trail { display: none; }}
|
||||||
|
/* portrait support */
|
||||||
|
img.portrait { float: left; clear: left; margin: 1ex; border:#999 1px solid; }
|
||||||
|
div.footer, div.comment, hr { clear: both; }
|
||||||
|
div.portrait { float: left; clear: left; font-size: xx-small; margin-right: 1em; }
|
||||||
|
div.portrait img.portrait { float: none; margin: 0; }
|
||||||
|
div.portrait a { text-decoration: none; color: #999; }
|
||||||
|
div.color { clear: both; }
|
||||||
|
div.one { background-color: #ddd; }
|
||||||
|
/* referrer tracking */
|
||||||
|
div.refer { padding-left:5%; padding-right:5%; font-size:smaller; }
|
||||||
|
@media print { div.refer { display:none; }}
|
||||||
|
/* usemod, tables, long tables */
|
||||||
|
table.user { border-style:solid; border-width:thin; }
|
||||||
|
table.user td, table.user th { border-style:solid; border-width:thin; padding:5px; }
|
||||||
|
table.user th { font-weight:bold; }
|
||||||
|
table.user td.r { text-align:right; }
|
||||||
|
table.user td.l { text-align:left; }
|
||||||
|
table.user td.c { text-align:center; }
|
||||||
|
table.user td.j { text-align:justify; }
|
||||||
|
table.user td.mark { background-color:yellow; }
|
||||||
|
/* sidebar */
|
||||||
|
div.sidebar { float: left; margin-right: 2em; margin-bottom: 3em; }
|
||||||
@@ -28,7 +28,7 @@ body {
|
|||||||
padding:2% 5%;
|
padding:2% 5%;
|
||||||
margin:0;
|
margin:0;
|
||||||
font-family: "Gentium Basic", "Bookman Old Style", "Times New Roman", serif;
|
font-family: "Gentium Basic", "Bookman Old Style", "Times New Roman", serif;
|
||||||
font-size: 18pt;
|
font-size: 16pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.header h1 {
|
div.header h1 {
|
||||||
@@ -129,9 +129,15 @@ dd {
|
|||||||
margin-bottom:1ex;
|
margin-bottom:1ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea { width:100%; height:80%; }
|
textarea {
|
||||||
|
width:100%;
|
||||||
|
height:80%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
textarea#summary { height: 3em; }
|
textarea#summary { height: 3em; }
|
||||||
|
input {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
div.image span.caption {
|
div.image span.caption {
|
||||||
margin: 0 1em;
|
margin: 0 1em;
|
||||||
}
|
}
|
||||||
@@ -191,6 +197,19 @@ hr {
|
|||||||
div.footer hr {
|
div.footer hr {
|
||||||
height:4px;
|
height:4px;
|
||||||
margin: 2em 0 1ex 0;
|
margin: 2em 0 1ex 0;
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content > div.comment {
|
||||||
|
border-top: none;
|
||||||
|
padding-top: none;
|
||||||
|
border-left: 1ex solid #bbb;
|
||||||
|
padding-left: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.wrapper > div.comment {
|
||||||
|
border-top: 2px solid #000;
|
||||||
|
padding-top: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
@@ -199,9 +218,13 @@ pre {
|
|||||||
margin-right: 2em;
|
margin-right: 2em;
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
overflow:hidden;
|
overflow:hidden;
|
||||||
font-size: smaller;
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
}
|
}
|
||||||
|
|
||||||
div.footer hr {
|
tt, pre, code {
|
||||||
clear:both;
|
font-size: 80%;
|
||||||
}
|
};
|
||||||
|
|||||||
250
css/oddmuse-2014.css
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Basic';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Basic'), local('GentiumBasic'), url(/fonts/GenBasR.woff) format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Basic';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Gentium Basic Bold'), local('GentiumBasic-Bold'), url(/fonts/GenBasB.woff) format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Basic';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Basic Italic'), local('GentiumBasic-Italic'), url(/fonts/GenBasI.woff) format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Basic';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Gentium Basic Bold Italic'), local('GentiumBasic-BoldItalic'), url(/fonts/GenBasBI.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Plus';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Plus'), local('GentiumPlus'), url(/fonts/GentiumPlus-R.woff) format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Gentium Plus';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Gentium Plus Italic'), local('GentiumPlus-Italic'), url(/fonts/GentiumPlus-I.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Symbola';
|
||||||
|
src: local('Symbola'), url('/fonts/Symbola.woff') format('woff') url('/fonts/Symbola.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background:#fff;
|
||||||
|
padding:2% 5%;
|
||||||
|
margin:0;
|
||||||
|
font-family: "Gentium Basic", "Gentium Plus", "Symbola", serif;
|
||||||
|
font-size: 16pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.header h1 {
|
||||||
|
margin-top:2ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #a00;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited {
|
||||||
|
color: #d88;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.header h1 a:hover, h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover,
|
||||||
|
a:hover, span.caption a.image:hover {
|
||||||
|
background:#fee;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.logo {
|
||||||
|
float: right;
|
||||||
|
clear: right;
|
||||||
|
border-style:none;
|
||||||
|
background-color:#fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.image:hover {
|
||||||
|
background:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.image:hover img {
|
||||||
|
background:#fee;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* a.definition soll aussehen wie h2 */
|
||||||
|
h2, p a.definition {
|
||||||
|
display:block;
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Such Link im h1 soll nicht auffallen. */
|
||||||
|
h1, h2, h3, h4, h1 a, h1 a:visited, p a.definition {
|
||||||
|
color:#666;
|
||||||
|
font-size: 30pt;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 4ex 0 1ex 0;
|
||||||
|
padding: 0;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3, h4 {
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
div.diff {
|
||||||
|
padding: 1em 3em;
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color:#FFFFAF;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color:#CFFFCF;
|
||||||
|
}
|
||||||
|
div.old p, div.new p {
|
||||||
|
padding: 0.5em 0;
|
||||||
|
}
|
||||||
|
div.refer { padding-left:5%; padding-right:5%; font-size:smaller; }
|
||||||
|
div[class="content refer"] p { margin-top:2em; }
|
||||||
|
div.content div.refer hr { display:none; }
|
||||||
|
div.content div.refer { padding:0; font-size:medium; }
|
||||||
|
div.content div.refer p { margin:0; }
|
||||||
|
div.refer a { display:block; }
|
||||||
|
table.history { border-style:none; }
|
||||||
|
td.history { border-style:none; }
|
||||||
|
|
||||||
|
table.user {
|
||||||
|
border-style: none;
|
||||||
|
margin-left: 3em;
|
||||||
|
}
|
||||||
|
table.user tr td {
|
||||||
|
border-style: none;
|
||||||
|
padding:0.5ex 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
font-weight:bold;
|
||||||
|
}
|
||||||
|
dd {
|
||||||
|
margin-bottom:1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
width:100%;
|
||||||
|
height:80%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
textarea#summary { height: 3em; }
|
||||||
|
input {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
li img, img.smiley, .noborder img {
|
||||||
|
border:none;
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
background:#fff;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
/* Google +1 */
|
||||||
|
a#plus1 img {
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.header img, div.footer img { border:0; padding:0; margin:0; }
|
||||||
|
/* No goto bar at the bottom. */
|
||||||
|
.footer .gotobar, .footer .edit br { display: none; }
|
||||||
|
|
||||||
|
.left { float:left; }
|
||||||
|
.right { float:right; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float:none;
|
||||||
|
}
|
||||||
|
.center { text-align:center; }
|
||||||
|
|
||||||
|
span.author {
|
||||||
|
color: #501;
|
||||||
|
}
|
||||||
|
span.bar a {
|
||||||
|
padding-right:1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rc .author {
|
||||||
|
color: #655;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rc strong {
|
||||||
|
font-weight: normal;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rc li {
|
||||||
|
position:relative;
|
||||||
|
padding: 1ex 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border:none;
|
||||||
|
color:black;
|
||||||
|
background-color:#000;
|
||||||
|
height:2px;
|
||||||
|
margin-top:2ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer hr {
|
||||||
|
height:4px;
|
||||||
|
margin: 2em 0 1ex 0;
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content > div.comment {
|
||||||
|
border-top: none;
|
||||||
|
padding-top: none;
|
||||||
|
border-left: 1ex solid #bbb;
|
||||||
|
padding-left: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.wrapper > div.comment {
|
||||||
|
border-top: 2px solid #000;
|
||||||
|
padding-top: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-right: 2em;
|
||||||
|
white-space: pre;
|
||||||
|
overflow:hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
tt, pre, code {
|
||||||
|
font-size: 80%;
|
||||||
|
};
|
||||||
@@ -58,8 +58,12 @@ div.left .left, div.right .right {
|
|||||||
span.author {
|
span.author {
|
||||||
color: #501;
|
color: #501;
|
||||||
}
|
}
|
||||||
|
span.bar a:first-child {
|
||||||
|
margin-left:-0.5ex;
|
||||||
|
}
|
||||||
span.bar a {
|
span.bar a {
|
||||||
padding-right:1ex;
|
padding-right:0.5ex;
|
||||||
|
padding-left:-0.5ex;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
background:#fff;
|
background:#fff;
|
||||||
|
|||||||
363
css/wiki.css
@@ -1,88 +1,281 @@
|
|||||||
body { background-color:#FFF; color:#000; margin:1em 2em; }
|
/* This is the default CSS file for Oddmuse wikis. It is dedicated to
|
||||||
@media only screen and (max-device-width: 480px) {
|
the public domain. You can copy, modify, distribute and use the
|
||||||
body { font-size: 300%; }
|
work, even for commercial purposes, all without asking permission.
|
||||||
|
https://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: #fff;
|
||||||
|
padding: 2% 5%;
|
||||||
|
margin: 0;
|
||||||
|
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
|
||||||
|
font-size: 15pt;
|
||||||
}
|
}
|
||||||
textarea { width:100%; }
|
|
||||||
a:link { color:#00F; }
|
div.header h1 {
|
||||||
a:visited { color:#A0A; }
|
margin-top: 2ex;
|
||||||
a:active { color:#F00; }
|
|
||||||
a.alias { text-decoration:none; border-bottom: thin dashed; }
|
|
||||||
a.near:link { color:#093; }
|
|
||||||
a.near:visited { color:#550; }
|
|
||||||
img.logo { float: right; clear: right; border-style:none; }
|
|
||||||
div.diff { padding-left:5%; padding-right:5%; }
|
|
||||||
div.old { background-color:#FFFFAF; }
|
|
||||||
div.new { background-color:#CFFFCF; }
|
|
||||||
div.message { background-color:#FEE; }
|
|
||||||
div.journal h1 { font-size:large; }
|
|
||||||
table.history { border-style:none; }
|
|
||||||
td.history { border-style:none; }
|
|
||||||
span.result { font-size:larger; }
|
|
||||||
span.info { font-size:smaller; font-style:italic; }
|
|
||||||
div.rss { background-color:#EEF; }
|
|
||||||
div.search { background-color:#F1F5FF }
|
|
||||||
div.sister { float:left; margin-right:1ex; background-color:#FFF; }
|
|
||||||
div.sister p { margin-top:0; }
|
|
||||||
div.sister img { border:none; }
|
|
||||||
div.near, div.definition { background-color:#EFE; }
|
|
||||||
div.near p, div.definition p { margin-top:0; }
|
|
||||||
form.comment span { display: block; }
|
|
||||||
@media print {
|
|
||||||
body { font:12pt sans-serif; }
|
|
||||||
a, a:link, a:visited { color:#000; text-decoration:none; font-style:oblique; }
|
|
||||||
h1 a, h2 a, h3 a, h4 a { font-style:normal; }
|
|
||||||
a.edit, div.footer, form, span.gotobar, a.number span { display:none; }
|
|
||||||
a[class="url number"]:after, a[class="inter number"]:after { content:"[" attr(href) "]"; }
|
|
||||||
a[class="local number"]:after { content:"[" attr(title) "]"; }
|
|
||||||
img[smiley] { line-height: inherit; }
|
|
||||||
}
|
}
|
||||||
/* calendar */
|
|
||||||
div.month { margin:0; padding:0; font-size:x-small; float:right; }
|
a {
|
||||||
div.content div.month { float:none; }
|
text-decoration: none;
|
||||||
div.footer { clear:both; }
|
color: #a00;
|
||||||
div.year div.month { float:left; font-size:medium; padding:1ex; }
|
}
|
||||||
div.month pre { margin:0; padding:0 0 0 1ex; background-color:#ffe; }
|
|
||||||
div.month a { text-decoration:none; color:inherit; }
|
a:visited {
|
||||||
div.month span.title a { background-color:inherit; }
|
color: #d88;
|
||||||
div.month a.exact { background-color:#eef; }
|
}
|
||||||
div.month a.collection { background-color:#ccf; }
|
|
||||||
div.month a.today { background-color:#fcc; }
|
div.header h1 a:hover, h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover,
|
||||||
div.month a[class~="today"][class~="exact"] { background-color:#fcf; }
|
a:hover, span.caption a.image:hover {
|
||||||
div.month a[class~="today"][class~="collection"] { background-color:#faf; }
|
background: #fee;
|
||||||
@media print {
|
}
|
||||||
div.month { display: none; }
|
|
||||||
div.year div.month { display: block; }
|
img.logo {
|
||||||
div.year div.month a { display: inline; }
|
float: right;
|
||||||
|
clear: right;
|
||||||
|
border-style: none;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0 1em;
|
||||||
|
max-width: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.image:hover {
|
||||||
|
background: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.image:hover img {
|
||||||
|
background: #fee;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* a.definition soll aussehen wie h2 */
|
||||||
|
h2, p > a.definition {
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Such Link im h1 soll nicht auffallen. */
|
||||||
|
h1, h2, h3, h4, h1 a, h1 a:visited, p > a.definition {
|
||||||
|
color: #666;
|
||||||
|
font-size: 30pt;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 4ex 0 1ex 0;
|
||||||
|
padding: 0;
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3, h4 {
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.diff {
|
||||||
|
padding: 1em 3em;
|
||||||
|
}
|
||||||
|
div.old {
|
||||||
|
background-color: #FFFFAF;
|
||||||
|
}
|
||||||
|
div.new {
|
||||||
|
background-color: #CFFFCF;
|
||||||
|
}
|
||||||
|
div.old p, div.new p {
|
||||||
|
padding: 0.5em 0;
|
||||||
|
}
|
||||||
|
div.refer { padding-left: 5%; padding-right: 5%; font-size: smaller; }
|
||||||
|
div[class="content refer"] p { margin-top: 2em; }
|
||||||
|
div.content div.refer hr { display: none; }
|
||||||
|
div.content div.refer { padding: 0; font-size: medium; }
|
||||||
|
div.content div.refer p { margin: 0; }
|
||||||
|
div.refer a { display: block; }
|
||||||
|
table.history { border-style: none; }
|
||||||
|
td.history { border-style: none; }
|
||||||
|
|
||||||
|
table.user {
|
||||||
|
border-style: none;
|
||||||
|
margin-left: 3em;
|
||||||
|
}
|
||||||
|
table.user tr td {
|
||||||
|
border-style: none;
|
||||||
|
padding: 0.5ex 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
dd {
|
||||||
|
margin-bottom: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 80%;
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
textarea#summary { height: 3em; }
|
||||||
|
input {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
div.image span.caption {
|
||||||
|
margin: 0 1em;
|
||||||
|
}
|
||||||
|
li img, img.smiley, .noborder img {
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
background: #fff;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
/* Google +1 */
|
||||||
|
a#plus1 img {
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.header img, div.footer img { border: 0; padding: 0; margin: 0; }
|
||||||
|
/* No goto bar at the bottom. */
|
||||||
|
.footer .gotobar, .footer .edit br { display: none; }
|
||||||
|
|
||||||
|
.left { float: left; }
|
||||||
|
.right { float: right; }
|
||||||
|
div.left .left, div.right .right {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
.center { text-align: center; }
|
||||||
|
|
||||||
|
span.author {
|
||||||
|
color: #501;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.bar a:first-child {
|
||||||
|
margin-left: -0.5ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.bar a {
|
||||||
|
padding-right: 0.5ex;
|
||||||
|
padding-left: 0.5ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rc .author {
|
||||||
|
color: #655;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rc strong {
|
||||||
|
font-weight: normal;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rc li {
|
||||||
|
position: relative;
|
||||||
|
padding: 1ex 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red {
|
||||||
|
background: red;
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orange {
|
||||||
|
background: orange;
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yellow {
|
||||||
|
background: yellow;
|
||||||
|
color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.green {
|
||||||
|
background: green;
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blue {
|
||||||
|
background: blue;
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.indigo {
|
||||||
|
background: indigo;
|
||||||
|
color: indigo;
|
||||||
|
}
|
||||||
|
|
||||||
|
.violet {
|
||||||
|
background: violet;
|
||||||
|
color: violet;
|
||||||
|
}
|
||||||
|
|
||||||
|
.white {
|
||||||
|
background: white;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ip-code {
|
||||||
|
border: 1px solid #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: none;
|
||||||
|
color: black;
|
||||||
|
background-color: #000;
|
||||||
|
height: 2px;
|
||||||
|
margin-top: 2ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.footer hr {
|
||||||
|
height: 4px;
|
||||||
|
margin: 2em 0 1ex 0;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content > div.comment {
|
||||||
|
border-top: none;
|
||||||
|
padding-top: 0;
|
||||||
|
border-left: 1ex solid #bbb;
|
||||||
|
padding-left: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.wrapper > div.comment {
|
||||||
|
border-top: 2px solid #000;
|
||||||
|
padding-top: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-right: 2em;
|
||||||
|
white-space: pre;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: pre-wrap; /* CSS 3 */
|
||||||
|
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
||||||
|
white-space: -pre-wrap; /* Opera 4-6 */
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||||
|
}
|
||||||
|
|
||||||
|
tt, pre, code {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: #eee;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for https://oddmuse.org/wiki/All_Modules */
|
||||||
|
.foo_list + .journal h1 {
|
||||||
|
font: inherit;
|
||||||
|
border: none;
|
||||||
|
display: list-item;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.foo_list + .journal a {
|
||||||
|
font: inherit;
|
||||||
|
border: none;
|
||||||
|
text-decoration: none;
|
||||||
|
color: #a00;
|
||||||
}
|
}
|
||||||
/* crumbs */
|
|
||||||
span.crumbs { font-size: smaller; }
|
|
||||||
/* dynamic comments */
|
|
||||||
div.commenthidden { display:none; }
|
|
||||||
div.commentshown { display:block; background-color:#ffc; padding:1ex; }
|
|
||||||
/* irc */
|
|
||||||
dl.irc dt { width:12ex; float:left; text-align:right; }
|
|
||||||
dl.irc dd { margin-left:15ex; }
|
|
||||||
/* page trail */
|
|
||||||
@media print { span.trail { display: none; }}
|
|
||||||
/* portrait support */
|
|
||||||
img.portrait { float: left; clear: left; margin: 1ex; border:#999 1px solid; }
|
|
||||||
div.footer, div.comment, hr { clear: both; }
|
|
||||||
div.portrait { float: left; clear: left; font-size: xx-small; margin-right: 1em; }
|
|
||||||
div.portrait img.portrait { float: none; margin: 0; }
|
|
||||||
div.portrait a { text-decoration: none; color: #999; }
|
|
||||||
div.color { clear: both; }
|
|
||||||
div.one { background-color: #ddd; }
|
|
||||||
/* referrer tracking */
|
|
||||||
div.refer { padding-left:5%; padding-right:5%; font-size:smaller; }
|
|
||||||
@media print { div.refer { display:none; }}
|
|
||||||
/* usemod, tables, long tables */
|
|
||||||
table.user { border-style:solid; border-width:thin; }
|
|
||||||
table.user td, table.user th { border-style:solid; border-width:thin; padding:5px; }
|
|
||||||
table.user th { font-weight:bold; }
|
|
||||||
table.user td.r { text-align:right; }
|
|
||||||
table.user td.l { text-align:left; }
|
|
||||||
table.user td.c { text-align:center; }
|
|
||||||
table.user td.j { text-align:justify; }
|
|
||||||
table.user td.mark { background-color:yellow; }
|
|
||||||
/* sidebar */
|
|
||||||
div.sidebar { float: left; margin-right: 2em; margin-bottom: 3em; }
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# minimum
|
|
||||||
apt-get install perl-modules
|
|
||||||
# recommended
|
|
||||||
apt-get install diff libwww-perl libxml-rss-perl
|
|
||||||
# optional
|
|
||||||
apt-get install libcgi-fast-perl
|
|
||||||
1
description
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Oddmuse
|
||||||
202
info-ref
@@ -1,202 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
# Copyright (C) 2005 Alex Schroeder <alex@emacswiki.org>
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use CGI;
|
|
||||||
use LWP::UserAgent;
|
|
||||||
use XML::LibXML;
|
|
||||||
use URI;
|
|
||||||
|
|
||||||
my @indexes = qw(
|
|
||||||
http://www.gnu.org/software/emacs/manual/html_node/Command-Index.html
|
|
||||||
http://www.gnu.org/software/emacs/manual/html_node/Variable-Index.html
|
|
||||||
http://www.gnu.org/software/emacs/manual/html_node/Concept-Index.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_728.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_729.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_730.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_731.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_732.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_733.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_734.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_735.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_736.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_737.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_738.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_739.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_740.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_741.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_742.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_743.html
|
|
||||||
http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_744.html
|
|
||||||
);
|
|
||||||
|
|
||||||
my $db = '/org/org.emacswiki/htdocs/emacs/info-ref.dat';
|
|
||||||
|
|
||||||
my $nl = "\n";
|
|
||||||
my $fs = "\023";
|
|
||||||
my $gs = "\024";
|
|
||||||
my $rs = "\025";
|
|
||||||
|
|
||||||
my $q = new CGI;
|
|
||||||
ProcessRequest();
|
|
||||||
|
|
||||||
sub ProcessRequest {
|
|
||||||
if ($q->param('init')) {
|
|
||||||
Initialize();
|
|
||||||
} elsif ($q->param('find')) {
|
|
||||||
Find($q->param('find'));
|
|
||||||
} else {
|
|
||||||
ShowForm();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ShowForm {
|
|
||||||
print $q->header, $q->start_html,
|
|
||||||
$q->start_form, "Index entry: ", $q->textfield('find'), $q->submit, $q->end_form,
|
|
||||||
$q->p('$Id: info-ref,v 1.6 2005/08/31 14:01:17 as Exp $'),
|
|
||||||
$q->end_html;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub Find {
|
|
||||||
my $str = shift;
|
|
||||||
my %map = ();
|
|
||||||
my $data = ReadFileOrDie($db);
|
|
||||||
foreach my $line (split(/$nl/, $data)) {
|
|
||||||
my ($key, $rest) = split(/$fs/, $line);
|
|
||||||
$map{$key} = ();
|
|
||||||
foreach my $a (split(/$gs/, $rest)) {
|
|
||||||
my ($link, $label) = split(/$rs/, $a);
|
|
||||||
$map{$key}{$link} = $label;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
my @links = keys %{$map{$str}};
|
|
||||||
if ($#links < 0) {
|
|
||||||
ReportError("No matches found for '$str'", '404 Not Found');
|
|
||||||
} elsif ($#links == 0) {
|
|
||||||
print $q->redirect($links[0]);
|
|
||||||
} else {
|
|
||||||
my @list = map { $q->a({-href=>$_}, $map{$str}{$_}) } @links;
|
|
||||||
print $q->header, $q->h1($str), $q->ol($q->li(\@list));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub Initialize {
|
|
||||||
my %map = ();
|
|
||||||
print $q->header, $q->start_html;
|
|
||||||
foreach my $url (@indexes) {
|
|
||||||
print $q->p($url);;
|
|
||||||
# determine base URI
|
|
||||||
my $base = URI->new($url);
|
|
||||||
# fetch and parse data
|
|
||||||
my $data = GetRaw($url);
|
|
||||||
# some markup fixes for the elisp manual
|
|
||||||
$data =~ s/&([<"])/&$1/g;
|
|
||||||
$data =~ s/<([<"])/<$1/g;
|
|
||||||
$data =~ s/="fn_"">/="fn_"">/;
|
|
||||||
$data =~ s/<!DOCTYPE.*?>//;
|
|
||||||
$data =~ s'</?font.*?>''gi;
|
|
||||||
$data =~ s'</table><br></P>'</table><br>';
|
|
||||||
my $parser = XML::LibXML->new();
|
|
||||||
my $doc;
|
|
||||||
eval { $doc = $parser->parse_html_string($data); };
|
|
||||||
print $q->p($@) if $@;
|
|
||||||
next if $@;
|
|
||||||
# emacs manual
|
|
||||||
my @nodelist = $doc->findnodes('/html/body/ul/li');
|
|
||||||
foreach my $node (@nodelist) {
|
|
||||||
my $text = $node->textContent;
|
|
||||||
my ($key) = split(/: /, $text);
|
|
||||||
my $a = $node->findnodes('descendant::a')->[0];
|
|
||||||
my $label = $a->textContent;
|
|
||||||
my $link = $a->getAttribute('href');
|
|
||||||
my $l = URI->new_abs($link, $base);
|
|
||||||
# print "$key -> $label $l\n";
|
|
||||||
$map{$key} = () unless $map{$key};
|
|
||||||
$map{$key}{$l->canonical} = $label;
|
|
||||||
}
|
|
||||||
# elisp manual
|
|
||||||
@nodelist = $doc->findnodes('descendant::table[position()=3]/descendant::tr');
|
|
||||||
foreach my $node (@nodelist) {
|
|
||||||
my ($item, $section) = $node->findnodes('td/a');
|
|
||||||
next unless $item and $section;
|
|
||||||
my $key = $item->textContent;
|
|
||||||
my $label = $section->textContent;
|
|
||||||
my $link = $item->getAttribute('href');
|
|
||||||
my $l = URI->new_abs($link, $base);
|
|
||||||
# print "$key -> $label $l\n";
|
|
||||||
$map{$key} = () unless $map{$key};
|
|
||||||
$map{$key}{$l->canonical} = $label;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
my $data = join($nl, map {
|
|
||||||
my $key = $_;
|
|
||||||
$key . $fs . join($gs, map {
|
|
||||||
my $link = $_;
|
|
||||||
join($rs, $link, $map{$key}{$link});
|
|
||||||
} keys %{$map{$_}})
|
|
||||||
} keys %map);
|
|
||||||
WriteStringToFile($db, $data);
|
|
||||||
print $q->p('Database initialized'), $q->end_html;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub GetRaw {
|
|
||||||
my $uri = shift;
|
|
||||||
return unless eval { require LWP::UserAgent; };
|
|
||||||
my $ua = LWP::UserAgent->new;
|
|
||||||
my $response = $ua->get($uri);
|
|
||||||
return $response->content;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ReadFile {
|
|
||||||
my ($filename) = @_;
|
|
||||||
my ($data);
|
|
||||||
local $/ = undef; # Read complete files
|
|
||||||
if (open(IN, "<$filename")) {
|
|
||||||
$data=<IN>;
|
|
||||||
close IN;
|
|
||||||
return (1, $data);
|
|
||||||
}
|
|
||||||
return (0, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ReadFileOrDie {
|
|
||||||
my ($filename) = @_;
|
|
||||||
my ($status, $data);
|
|
||||||
($status, $data) = ReadFile($filename);
|
|
||||||
if (!$status) {
|
|
||||||
ReportError("Cannot open $filename: $!", '500 Internal Server Error');
|
|
||||||
}
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub WriteStringToFile {
|
|
||||||
my ($file, $string) = @_;
|
|
||||||
open(OUT, ">$file")
|
|
||||||
or ReportError("Cannot write $file: $!", '500 Internal Server Error');
|
|
||||||
print OUT $string;
|
|
||||||
close(OUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ReportError { # fatal!
|
|
||||||
my ($errmsg, $status, $log) = @_;
|
|
||||||
print $q->header(-status => $status);
|
|
||||||
print $q->start_html, $q->h2($errmsg), $q->end_html;
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
BIN
logo/falky/Neris/Neris-Black.otf
Normal file
BIN
logo/falky/Neris/Neris-BlackItalic.otf
Normal file
BIN
logo/falky/Neris/Neris-Light.otf
Normal file
BIN
logo/falky/Neris/Neris-LightItalic.otf
Normal file
BIN
logo/falky/Neris/Neris-SemiBold.otf
Normal file
BIN
logo/falky/Neris/Neris-SemiBoldItalic.otf
Normal file
BIN
logo/falky/Neris/Neris-Thin.otf
Normal file
BIN
logo/falky/Neris/Neris-ThinItalic.otf
Normal file
15
logo/falky/README.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
Falky schreibt:
|
||||||
|
|
||||||
|
Zum Thema Rechte am Logo möchte ich erstmal sagen, dass es mir primär
|
||||||
|
darum ging den Auftritt von oddmuse.org aufzuhübschen. Also du/ihr
|
||||||
|
sollt durch das Logo unterstützt werden, nicht eingeschränkt.
|
||||||
|
|
||||||
|
Welche Lizenz das ab besten leisten, da hab ich keinen Schimmer.
|
||||||
|
|
||||||
|
Schön wäre, wenn irgendwo ein verweis auf "Falky [falky.de]"
|
||||||
|
auftaucht, der soll aber nicht bei jeder Verwendung auftauchen,
|
||||||
|
sondern irgendwo 'auffindbar' an 'zentraler' Stelle - halt irgendwo
|
||||||
|
auf der Homepage, dass ich darauf verweisen kann und dass niemand was
|
||||||
|
anderes behaupten kann. Das wäre es schon. Und ja, falls jemand das
|
||||||
|
logo für ein anderes Projekt verwenden möchte, kann man ja höflich
|
||||||
|
nochmal fragen oder so.
|
||||||
BIN
logo/falky/oddmuse.banner.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
25
logo/falky/oddmuse.banner.svg
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-61 -1 177 62">
|
||||||
|
|
||||||
|
<rect fill="#FFF" x="-60" y="0" width="175" height="60"/>
|
||||||
|
|
||||||
|
<text style="font:400 6px Neris Black" fill="#000" x="2" y="18">powered by</text>
|
||||||
|
<text style="font:400 16px Neris Thin" fill="#000" x="2" y="34">Oddmuse<tspan style="font-family:Neris Black">.org</tspan></text>
|
||||||
|
|
||||||
|
<g id="new" transform="translate(-30,30) scale(.18,.18)" >
|
||||||
|
<circle fill="#FFF" stroke="#000" stroke-width="3" cx="0" cy="0" r="160.5"/>
|
||||||
|
<g id="new" transform="rotate(207.2)" >
|
||||||
|
|
||||||
|
<path fill="#000" d="m42 -77 q24 0 38 20 c14 -1 42 -18 52 -29 c-1 50 -26 68 -44 70 c0 90 -44 141 -88 141 c-44 0 -88 -51 -88 -141 c-18 -2 -43 -20 -44 -70 c10 11 38 28 52 29 q14 -20 38 -20z"/>
|
||||||
|
<path fill="#000" transform="translate(0,60) rotate(-14)" d="m -22 46q1 50 22 50q21 0 22 -50z"/>
|
||||||
|
|
||||||
|
<path stroke="#FFF" stroke-width="4" fill="#000" d="m0 17 c 30 0 36 -2 46 -2 c 18 0 32 16 32 51 c 0 34 -12 50 -32 50 c-16 0 -26 -5 -46 -5 c-20 0 -30 5 -46 5 c-20 0 -33 -18 -32 -50 c0 -36 16 -52 32 -51 c10 0 16 2 46 2z"/>
|
||||||
|
<circle fill="#FFF" cx="44" cy="49" r="12"/> <circle fill="#FFF" cx="-44" cy="49" r="12"/>
|
||||||
|
|
||||||
|
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
||||||
|
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#000" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
||||||
|
|
||||||
|
</g></g>
|
||||||
|
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
BIN
logo/falky/oddmuse.icon.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
19
logo/falky/oddmuse.icon.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-100 -100 200 200" >
|
||||||
|
|
||||||
|
<rect fill="#D88" x="-100" y="-100" width="200" height="200"/>
|
||||||
|
|
||||||
|
<g id="new" transform="rotate(180) translate(0,-19)" >
|
||||||
|
|
||||||
|
<path fill="#A00" d="m42 -77 q18 0 33 14 q 12 -6 23 -16 q-2 25 -10 43 c0 110 -44 155 -88 155 c-44 0 -88 -44 -88 -155 q-8 -18 -10 -43 q11 10 23 16 q15 -14 33 -14z"/>
|
||||||
|
|
||||||
|
<path stroke="#FFF" stroke-width="6" fill="#A00" d="m0 16 c30 0 38 -2 48 -2 c17 0 33 16 33 52 c0 34 -12 52 -31 52 c-15 0 -30 -7 -50 -7 c-20 0 -35 7 -50 7 c-19 0 -31 -18 -31 -52 c0 -36 16 -52 33 -52 c10 0 18 2 48 2z"/>
|
||||||
|
<circle fill="#FFF" cx="45" cy="49" r="12"/> <circle fill="#FFF" cx="-45" cy="49" r="12"/>
|
||||||
|
|
||||||
|
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
||||||
|
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#666" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
||||||
|
|
||||||
|
</g>
|
||||||
|
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
BIN
logo/falky/oddmuse.logo.png
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
22
logo/falky/oddmuse.logo.svg
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-162 -162 324 324">
|
||||||
|
|
||||||
|
<circle fill="#FEE" stroke="#000" stroke-width="3" cx="0" cy="0" r="160.5"/>
|
||||||
|
|
||||||
|
<g id="new" transform="rotate(210)" >
|
||||||
|
|
||||||
|
<path fill="#A00" d="m42 -77 q24 0 38 20 c14 -1 42 -18 52 -29 c-1 50 -26 68 -44 70 c0 90 -44 141 -88 141 c-44 0 -88 -51 -88 -141 c-18 -2 -43 -20 -44 -70 c10 11 38 28 52 29 q14 -20 38 -20z"/>
|
||||||
|
<path fill="#A00" transform="translate(0,60) rotate(-14)" d="m -22 46q1 50 22 50q21 0 22 -50z"/>
|
||||||
|
|
||||||
|
<path stroke="#FFF" stroke-width="4" fill="#D88" d="m0 17 c 30 0 36 -2 46 -2 c 18 0 32 16 32 51 c 0 34 -12 50 -32 50 c-16 0 -26 -5 -46 -5 c-20 0 -30 5 -46 5 c-20 0 -33 -18 -32 -50 c0 -36 16 -52 32 -51 c10 0 16 2 46 2z"/>
|
||||||
|
<circle fill="#FFF" cx="44" cy="49" r="12"/> <circle fill="#FFF" cx="-44" cy="49" r="12"/>
|
||||||
|
|
||||||
|
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
||||||
|
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#666" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
||||||
|
|
||||||
|
</g>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
24
logo/falky/oddmuse.siegel.svg
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-162 -162 324 324">
|
||||||
|
|
||||||
|
<circle fill="#FFF" stroke="#000" stroke-width="3" cx="0" cy="0" r="160.5"/>
|
||||||
|
|
||||||
|
<text style="font:400 27px Neris Black" fill="#000" text-anchor="middle" x="-5" y="137">Oddmuse</text>
|
||||||
|
|
||||||
|
<g id="new" transform="rotate(210)" >
|
||||||
|
|
||||||
|
<path fill="#000" d="m42 -77 q24 0 38 20 c14 -1 42 -18 52 -29 c-1 50 -26 68 -44 70 c0 90 -44 141 -88 141 c-44 0 -88 -51 -88 -141 c-18 -2 -43 -20 -44 -70 c10 11 38 28 52 29 q14 -20 38 -20z"/>
|
||||||
|
<path fill="#000" transform="translate(0,60) rotate(-14)" d="m -22 46q1 50 22 50q21 0 22 -50z"/>
|
||||||
|
|
||||||
|
<path stroke="#FFF" stroke-width="4" fill="#000" d="m0 17 c 30 0 36 -2 46 -2 c 18 0 32 16 32 51 c 0 34 -12 50 -32 50 c-16 0 -26 -5 -46 -5 c-20 0 -30 5 -46 5 c-20 0 -33 -18 -32 -50 c0 -36 16 -52 32 -51 c10 0 16 2 46 2z"/>
|
||||||
|
<circle fill="#FFF" cx="44" cy="49" r="12"/> <circle fill="#FFF" cx="-44" cy="49" r="12"/>
|
||||||
|
|
||||||
|
<circle fill="#FFF" cx="42" cy="-31" r="40"/> <circle fill="#000" cx="42" cy="-31" r="20.5"/>
|
||||||
|
<circle fill="#FFF" cx="-42" cy="-31" r="40"/> <path fill="#000" transform="translate(-42,-31) rotate(55)" d="m-7 7 v20 q7 2 14 0 v-20 h20 q2 -7 0 -14 h-20 v-20 q -7 -2 -14 0 v20 h-20 q-2 7 0 14z"/>
|
||||||
|
|
||||||
|
</g>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
BIN
logo/falky/preview/oddmuse-preview.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
logo/falky/preview/oddmuse.icon-preview.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
logo/falky/preview/oddmuse.org-preview.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
logo/falky/testmonial.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
4
logo/murray/README.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
The logo is licensed under the [GNU Free Documentation
|
||||||
|
License](http://www.emacswiki.org/FDL) as well as the [CC BY
|
||||||
|
2.0](http://creativecommons.org/licenses/by/2.0/) license. The author
|
||||||
|
is [Murray Altheim](http://www.altheim.com/murray/).
|
||||||
BIN
logo/murray/oddmuse-logo.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
100
logo/murray/oddmuse-logo.svg
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://web.resource.org/cc/"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:version="0.41"
|
||||||
|
sodipodi:docname="oddmuse-logo.svg"
|
||||||
|
sodipodi:docbase="/Users/alex/Pictures/Oddmuse"
|
||||||
|
height="1000pt"
|
||||||
|
width="1000pt"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
id="svg1">
|
||||||
|
<metadata
|
||||||
|
id="metadata32">
|
||||||
|
<rdf:RDF
|
||||||
|
id="RDF34">
|
||||||
|
<cc:Work
|
||||||
|
id="Work36"
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format
|
||||||
|
id="format38">image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||||
|
id="type40" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs3" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:current-layer="svg1"
|
||||||
|
inkscape:window-y="22"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-height="535"
|
||||||
|
inkscape:window-width="640"
|
||||||
|
inkscape:cy="625.00000"
|
||||||
|
inkscape:cx="625.00000"
|
||||||
|
inkscape:zoom="0.28960000"
|
||||||
|
id="base" />
|
||||||
|
<g
|
||||||
|
transform="translate(-155.7935,22.13440)"
|
||||||
|
id="g176">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.021740,0.000000,0.000000,1.021740,-299.4160,85.75640)"
|
||||||
|
sodipodi:ry="148.93437"
|
||||||
|
sodipodi:rx="142.30524"
|
||||||
|
sodipodi:cy="475.27606"
|
||||||
|
sodipodi:cx="1066.8474"
|
||||||
|
d="M 1209.1526 475.27606 A 142.30524 148.93437 0 1 1 924.54218,475.27606 A 142.30524 148.93437 0 1 1 1209.1526 475.27606 z"
|
||||||
|
id="path166"
|
||||||
|
style="fill:#ffde00;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:22.021299;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
transform="matrix(0.591973,0.000000,0.000000,0.523224,159.0800,309.0390)"
|
||||||
|
sodipodi:ry="148.93437"
|
||||||
|
sodipodi:rx="142.30524"
|
||||||
|
sodipodi:cy="475.27606"
|
||||||
|
sodipodi:cx="1066.8474"
|
||||||
|
d="M 1209.1526 475.27606 A 142.30524 148.93437 0 1 1 924.54218,475.27606 A 142.30524 148.93437 0 1 1 1209.1526 475.27606 z"
|
||||||
|
id="path168"
|
||||||
|
style="fill:#ffde00;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:38.609402;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<rect
|
||||||
|
transform="translate(-1.416020,0.000000)"
|
||||||
|
y="561.16870"
|
||||||
|
x="694.39026"
|
||||||
|
height="88.691116"
|
||||||
|
width="195.30150"
|
||||||
|
id="rect170"
|
||||||
|
style="font-size:12.000000;fill:#ffde00;fill-opacity:1.0000000;fill-rule:evenodd;stroke-width:1.0000000pt" />
|
||||||
|
<g
|
||||||
|
id="g173">
|
||||||
|
<path
|
||||||
|
transform="translate(185.0000,-158.7500)"
|
||||||
|
sodipodi:ry="31.250000"
|
||||||
|
sodipodi:rx="25.000000"
|
||||||
|
sodipodi:cy="783.75000"
|
||||||
|
sodipodi:cx="565.00000"
|
||||||
|
d="M 590.00000 783.75000 A 25.000000 31.250000 0 1 1 540.00000,783.75000 A 25.000000 31.250000 0 1 1 590.00000 783.75000 z"
|
||||||
|
id="path171"
|
||||||
|
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<path
|
||||||
|
transform="translate(266.2500,-158.7500)"
|
||||||
|
sodipodi:ry="31.250000"
|
||||||
|
sodipodi:rx="25.000000"
|
||||||
|
sodipodi:cy="783.75000"
|
||||||
|
sodipodi:cx="565.00000"
|
||||||
|
d="M 590.00000 783.75000 A 25.000000 31.250000 0 1 1 540.00000,783.75000 A 25.000000 31.250000 0 1 1 590.00000 783.75000 z"
|
||||||
|
id="path172"
|
||||||
|
style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -12,10 +12,7 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
package OddMuse;
|
package OddMuse;
|
||||||
|
|
||||||
@@ -27,7 +24,7 @@ my @path = split(/\//, $ENV{REDIRECT_URL});
|
|||||||
my $file = $path[$#path];
|
my $file = $path[$#path];
|
||||||
|
|
||||||
# for dynamic pages
|
# for dynamic pages
|
||||||
use vars qw($NotFoundHandlerExceptionsPage);
|
our ($NotFoundHandlerExceptionsPage);
|
||||||
$NotFoundHandlerExceptionsPage = 'NoCachePages';
|
$NotFoundHandlerExceptionsPage = 'NoCachePages';
|
||||||
$RunCGI = 0;
|
$RunCGI = 0;
|
||||||
do $script;
|
do $script;
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Copyright (C) 2004, 2005 Fletcher T. Penney <fletcher@freeshell.org>
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/aawrapperdiv.pl">aawrapperdiv.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/WrapperDiv_Module">WrapperDiv Module</a></p>';
|
|
||||||
|
|
||||||
|
|
||||||
*OldGetHeader = *GetHeader;
|
|
||||||
*GetHeader = *WrapperGetHeader;
|
|
||||||
|
|
||||||
sub WrapperGetHeader {
|
|
||||||
my ($id, $title, $oldId, $nocache, $status) = @_;
|
|
||||||
my $result = OldGetHeader ($id, $title, $oldId, $nocache, $status);
|
|
||||||
$result .= $q->start_div({-class=>'wrapper'});
|
|
||||||
}
|
|
||||||
|
|
||||||
*OldPrintFooter = *PrintFooter;
|
|
||||||
*PrintFooter = *WrapperPrintFooter;
|
|
||||||
|
|
||||||
sub WrapperPrintFooter {
|
|
||||||
my ($id, $rev, $comment) = @_;
|
|
||||||
print $q->start_div({-class=>'wrapper close'});
|
|
||||||
print $q->end_div(), $q->end_div();
|
|
||||||
OldPrintFooter($id, $rev, $comment);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
39
modules/accesskeys.pl
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Copyright (C) 2014 Alex-Daniel Jakimenko <alex.jakimenko@gmail.com>
|
||||||
|
# Copyright (C) 2014 Alex Schroeder <alex@gnu.org>
|
||||||
|
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
AddModuleDescription('accesskeys.pl', 'Links With AccessKeys Extension');
|
||||||
|
|
||||||
|
our (@MyRules, $FreeLinkPattern);
|
||||||
|
|
||||||
|
push(@MyRules, \&LinksWithAccessKeys);
|
||||||
|
sub LinksWithAccessKeys {
|
||||||
|
if (m/\G(\[\[$FreeLinkPattern\{(.)\}\]\])/cg) {
|
||||||
|
my ($id, $key) = ($2, $3);
|
||||||
|
Dirty($1);
|
||||||
|
$id = FreeToNormal($id);
|
||||||
|
my ($class, $resolved, $title, $exists) = ResolveId($id);
|
||||||
|
my $text = NormalToFree($id);
|
||||||
|
if ($resolved) { # anchors don't exist as pages, therefore do not use $exists
|
||||||
|
print ScriptLink(UrlEncode($resolved), $text, $class, undef, $title, $key);
|
||||||
|
} else {
|
||||||
|
print "[[" . QuoteHtml($text) . GetEditLink($id, '?') . "]]";
|
||||||
|
}
|
||||||
|
return ''; # this is a dirty rule that depends the definition of other pages
|
||||||
|
}
|
||||||
|
return; # the rule didn't match
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,12 +11,14 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/admin.pl">admin.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Admin_Power_Extension">Admin Power Extension</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
our ($q, %Page, %Action, $IndexFile, $PageDir, $KeepDir, @MyAdminCode, $RefererDir);
|
||||||
|
|
||||||
|
AddModuleDescription('admin.pl', 'Admin Power Extension');
|
||||||
|
|
||||||
$Action{delete} = \&AdminPowerDelete;
|
$Action{delete} = \&AdminPowerDelete;
|
||||||
$Action{rename} = \&AdminPowerRename;
|
$Action{rename} = \&AdminPowerRename;
|
||||||
@@ -31,15 +33,15 @@ sub AdminPowerDelete {
|
|||||||
OpenPage($id);
|
OpenPage($id);
|
||||||
my $status = DeletePage($id);
|
my $status = DeletePage($id);
|
||||||
if ($status) {
|
if ($status) {
|
||||||
print $q->p(GetPageLink($id) . ' ' . T('not deleted: ')) . $status;
|
print $q->p(GetPageLink($id) . ' ' . T('not deleted:') . ' ' . $status);
|
||||||
} else {
|
} else {
|
||||||
print $q->p(GetPageLink($id) . ' ' . T('deleted'));
|
print $q->p(GetPageLink($id) . ' ' . T('deleted'));
|
||||||
WriteRcLog($id, Ts('Deleted %s', $id), 0, $Page{revision},
|
WriteRcLog($id, Ts('Deleted %s', $id), 0, $Page{revision},
|
||||||
GetParam('username', ''), GetRemoteHost(), $Page{languages},
|
GetParam('username', ''), $q->remote_addr(), $Page{languages},
|
||||||
GetCluster($Page{text}));
|
GetCluster($Page{text}));
|
||||||
}
|
}
|
||||||
# Regenerate index on next request
|
# Regenerate index on next request
|
||||||
unlink($IndexFile);
|
Unlink($IndexFile);
|
||||||
ReleaseLock();
|
ReleaseLock();
|
||||||
print $q->p(T('Main lock released.'));
|
print $q->p(T('Main lock released.'));
|
||||||
PrintFooter();
|
PrintFooter();
|
||||||
@@ -56,38 +58,38 @@ sub AdminPowerRename {
|
|||||||
print $q->p(T('Main lock obtained.'));
|
print $q->p(T('Main lock obtained.'));
|
||||||
# page file -- only check for existing or missing pages here
|
# page file -- only check for existing or missing pages here
|
||||||
my $fname = GetPageFile($id);
|
my $fname = GetPageFile($id);
|
||||||
ReportError(Ts('The page %s does not exist', $id), '400 BAD REQUEST') unless -f $fname;
|
ReportError(Ts('The page %s does not exist', $id), '400 BAD REQUEST') unless IsFile($fname);
|
||||||
my $newfname = GetPageFile($new);
|
my $newfname = GetPageFile($new);
|
||||||
ReportError(Ts('The page %s already exists', $new), '400 BAD REQUEST') if -f $newfname;
|
ReportError(Ts('The page %s already exists', $new), '400 BAD REQUEST') if IsFile($newfname);
|
||||||
# Regenerate index on next request -- remove this before errors can occur!
|
# Regenerate index on next request -- remove this before errors can occur!
|
||||||
unlink($IndexFile);
|
Unlink($IndexFile);
|
||||||
# page file
|
# page file
|
||||||
CreatePageDir($PageDir, $new); # It might not exist yet
|
CreateDir($PageDir); # It might not exist yet
|
||||||
rename($fname, $newfname)
|
Rename($fname, $newfname)
|
||||||
or ReportError(Tss('Cannot rename %1 to %2', $fname, $newfname) . ": $!", '500 INTERNAL SERVER ERROR');
|
or ReportError(Tss('Cannot rename %1 to %2', $fname, $newfname) . ": $!", '500 INTERNAL SERVER ERROR');
|
||||||
# keep directory
|
# keep directory
|
||||||
my $kdir = GetKeepDir($id);
|
my $kdir = GetKeepDir($id);
|
||||||
my $newkdir = GetKeepDir($new);
|
my $newkdir = GetKeepDir($new);
|
||||||
CreatePageDir($KeepDir, $new); # It might not exist yet (only the parent directory!)
|
CreateDir($KeepDir); # It might not exist yet (only the parent directory!)
|
||||||
rename($kdir, $newkdir)
|
Rename($kdir, $newkdir)
|
||||||
or ReportError(Tss('Cannot rename %1 to %2', $kdir, $newkdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
or ReportError(Tss('Cannot rename %1 to %2', $kdir, $newkdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||||
if -d $kdir;
|
if IsDir($kdir);
|
||||||
# refer file
|
# refer file
|
||||||
if (defined(&GetRefererFile)) {
|
if (defined(&GetRefererFile)) {
|
||||||
my $rdir = GetRefererFile($id);
|
my $rdir = GetRefererFile($id);
|
||||||
my $newrdir = GetRefererFile($new);
|
my $newrdir = GetRefererFile($new);
|
||||||
CreatePageDir($RefererDir, $new); # It might not exist yet
|
CreateDir($RefererDir); # It might not exist yet
|
||||||
rename($rdir, $newrdir)
|
Rename($rdir, $newrdir)
|
||||||
or ReportError(Tss('Cannot rename %1 to %2', $rdir, $newrdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
or ReportError(Tss('Cannot rename %1 to %2', $rdir, $newrdir) . ": $!", '500 INTERNAL SERVER ERROR')
|
||||||
if -d $rdir;
|
if IsDir($rdir);
|
||||||
}
|
}
|
||||||
# RecentChanges
|
# RecentChanges
|
||||||
OpenPage($new);
|
OpenPage($new);
|
||||||
WriteRcLog($id, Ts('Renamed to %s', $new), 0, $Page{revision},
|
WriteRcLog($id, Ts('Renamed to %s', $new), 0, $Page{revision},
|
||||||
GetParam('username', ''), GetRemoteHost(), $Page{languages},
|
GetParam('username', ''), $q->remote_addr(), $Page{languages},
|
||||||
GetCluster($Page{text}));
|
GetCluster($Page{text}));
|
||||||
WriteRcLog($new, Ts('Renamed from %s', $id), 0, $Page{revision},
|
WriteRcLog($new, Ts('Renamed from %s', $id), 0, $Page{revision},
|
||||||
GetParam('username', ''), GetRemoteHost(), $Page{languages},
|
GetParam('username', ''), $q->remote_addr(), $Page{languages},
|
||||||
GetCluster($Page{text}));
|
GetCluster($Page{text}));
|
||||||
print $q->p(Tss('Renamed %1 to %2.', GetPageLink($id), GetPageLink($new)));
|
print $q->p(Tss('Renamed %1 to %2.', GetPageLink($id), GetPageLink($new)));
|
||||||
ReleaseLock();
|
ReleaseLock();
|
||||||
|
|||||||
@@ -14,20 +14,24 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/adsense.pl">adsense.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/AdSense_Module">AdSense Module</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
use vars qw($AdSensePageName $AdSensePlace);
|
AddModuleDescription('adsense.pl', 'AdSense Module');
|
||||||
|
|
||||||
|
our (@MyInitVariables, @MyFooters);
|
||||||
|
our ($AdSensePageName, $AdSensePlace);
|
||||||
|
|
||||||
push (@MyInitVariables, \&AdSenseInit);
|
push (@MyInitVariables, \&AdSenseInit);
|
||||||
|
|
||||||
sub AdSenseInit {
|
sub AdSenseInit {
|
||||||
$AdSensePageName = "AdSense" unless $AdSensePageName;
|
$AdSensePageName = "AdSense" unless $AdSensePageName;
|
||||||
$AdSensePlace = "top" unless $AdSensePlace;
|
$AdSensePlace = "top" unless $AdSensePlace;
|
||||||
if ($AdSensePlace eq 'bottom') { # Process adsense after all modules have been loaded
|
if ($AdSensePlace eq 'bottom') { # Process adsense after all modules have been loaded
|
||||||
push (@MyFooters, \&GetAdSense);
|
push (@MyFooters, \&GetAdSense);
|
||||||
} elsif ($AdSensePlace eq 'top') {
|
} elsif ($AdSensePlace eq 'top') {
|
||||||
*AdSenseOldGetHtmlHeader = *GetHtmlHeader;
|
*AdSenseOldGetHtmlHeader = \&GetHtmlHeader;
|
||||||
*GetHtmlHeader = *AdSenseNewGetHtmlHeader;
|
*GetHtmlHeader = \&AdSenseNewGetHtmlHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,4 +44,3 @@ sub AdSenseNewGetHtmlHeader {
|
|||||||
sub GetAdSense {
|
sub GetAdSense {
|
||||||
return GetPageContent($AdSensePageName) if GetParam('action', 'browse') eq 'browse';
|
return GetPageContent($AdSensePageName) if GetParam('action', 'browse') eq 'browse';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
37
modules/advanced-uploads.pl
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Copyright (C) 2014 Alex-Daniel Jakimenko <alex.jakimenko@gmail.com>
|
||||||
|
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
AddModuleDescription('advanced-uploads.pl', 'Advanced File Upload Extension');
|
||||||
|
|
||||||
|
our ($q, $HtmlHeaders);
|
||||||
|
$HtmlHeaders .= '<script type="text/javascript" src="/js/uploader.js"></script>';
|
||||||
|
|
||||||
|
*AdvancedUploadsOldGetTextArea = \&GetTextArea;
|
||||||
|
*GetTextArea = \&AdvancedUploadsNewGetTextArea;
|
||||||
|
|
||||||
|
sub AdvancedUploadsNewGetTextArea {
|
||||||
|
my ($name, $text, $rows) = @_;
|
||||||
|
return AdvancedUploadsOldGetTextArea(@_) . $q->br() . ($name =~ 'text|aftertext' ? GetUploadForm() : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetUploadForm {
|
||||||
|
return $q->span({-class=>'upload'}, $q->label({-for=>'fileToUpload'}, T('Attach file:')),
|
||||||
|
$q->filefield(-name=>'fileToUpload', -id=>'fileToUpload', -multiple=>'multiple', -onChange=>'fileSelected()', -size=>20),
|
||||||
|
$q->span({-id=>'fileSize'}, ''),
|
||||||
|
$q->button(-name=>'uploadButton', -value=>T('Upload'), -onClick=>'uploadFile()'),
|
||||||
|
$q->span({-id=>'progressNumber'}));
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,14 +11,15 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/age.pl">age.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Age_Indication_Extension">Age Indication Extension</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
use vars qw(%AgeEffect $AgeParameter);
|
AddModuleDescription('age.pl', 'Age Indication Extension');
|
||||||
|
|
||||||
|
our (%Page, $Now, $ScriptName);
|
||||||
|
our (%AgeEffect, $AgeParameter);
|
||||||
|
|
||||||
# map page age to theme
|
# map page age to theme
|
||||||
%AgeEffect = (60*60*24 => 'day',
|
%AgeEffect = (60*60*24 => 'day',
|
||||||
@@ -31,8 +32,8 @@ use vars qw(%AgeEffect $AgeParameter);
|
|||||||
# if using creationdate.pl.
|
# if using creationdate.pl.
|
||||||
$AgeParameter = 'ts';
|
$AgeParameter = 'ts';
|
||||||
|
|
||||||
*OldAgeGetHeader = *GetHeader;
|
*OldAgeGetHeader = \&GetHeader;
|
||||||
*GetHeader = *NewAgeGetHeader;
|
*GetHeader = \&NewAgeGetHeader;
|
||||||
|
|
||||||
sub NewAgeGetHeader {
|
sub NewAgeGetHeader {
|
||||||
my $header = OldAgeGetHeader(@_);
|
my $header = OldAgeGetHeader(@_);
|
||||||
@@ -46,7 +47,7 @@ sub NewAgeGetHeader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $header unless $theme;
|
return $header unless $theme;
|
||||||
$oldtheme = GetParam('theme', $ScriptName);
|
my $oldtheme = GetParam('theme', $ScriptName);
|
||||||
$header =~ s/class="$oldtheme"/class="$theme"/; # touch as little as possible
|
$header =~ s/class="$oldtheme"/class="$theme"/; # touch as little as possible
|
||||||
return $header;
|
return $header;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,17 +11,19 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/aggregate.pl">aggregate.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Front_Page_Extension">Front Page Extension</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
AddModuleDescription('aggregate.pl', 'Front Page Extension');
|
||||||
|
|
||||||
|
our ($q, $bol, %Action, %Page, $OpenPageName, $UseDiff, $UsePathInfo, $RssStyleSheet, $RssLicense, $RssRights, $RssImageUrl, $CommentsPrefix, $SiteName, $ScriptName, $HomePage, $SiteDescription, @MyRules, $LastUpdate, $InterWikiMoniker);
|
||||||
|
|
||||||
push(@MyRules, \&AggregateRule);
|
push(@MyRules, \&AggregateRule);
|
||||||
|
|
||||||
sub AggregateRule {
|
sub AggregateRule {
|
||||||
if ($bol && m/\G(<aggregate\s+((("[^\"&]+",?\s*)+)|(sort\s+)?search\s+(.+?))>)/gc) {
|
if ($bol && m/\G(<aggregate\s+((("[^\"&]+",?\s*)+)|(sort\s+)?search\s+(.+?))>)/cg) {
|
||||||
Clean(CloseHtmlEnvironments());
|
Clean(CloseHtmlEnvironments());
|
||||||
Dirty($1);
|
Dirty($1);
|
||||||
my ($oldpos, $old_, $str, $sort, $search) = ((pos), $_, $3, $5, $6);
|
my ($oldpos, $old_, $str, $sort, $search) = ((pos), $_, $3, $5, $6);
|
||||||
@@ -61,7 +63,7 @@ sub AggregateRule {
|
|||||||
($_, pos) = ($old_, $oldpos); # restore \G (assignment order matters!)
|
($_, pos) = ($old_, $oldpos); # restore \G (assignment order matters!)
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Action{aggregate} = \&DoAggregate;
|
$Action{aggregate} = \&DoAggregate;
|
||||||
@@ -121,8 +123,8 @@ sub DoAggregate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach my $id (@pages) {
|
foreach my $id (@pages) {
|
||||||
my %data = ParseData(ReadFileOrDie(GetPageFile(FreeToNormal($id))));
|
my $data = ParseData(ReadFileOrDie(GetPageFile(FreeToNormal($id))));
|
||||||
my $page = $data{text};
|
my $page = $data->{text};
|
||||||
my $size = length($page);
|
my $size = length($page);
|
||||||
my $i = index($page, "\n=");
|
my $i = index($page, "\n=");
|
||||||
my $j = index($page, "\n----");
|
my $j = index($page, "\n----");
|
||||||
@@ -131,20 +133,15 @@ sub DoAggregate {
|
|||||||
$page =~ s/^=.*\n//; # if it starts with a header
|
$page =~ s/^=.*\n//; # if it starts with a header
|
||||||
my $name = $id;
|
my $name = $id;
|
||||||
$name =~ s/_/ /g;
|
$name =~ s/_/ /g;
|
||||||
my $date = TimeToRFC822($data{ts});
|
my $date = TimeToRFC822($data->{ts});
|
||||||
my $host = $data{host};
|
my $host = $data->{host};
|
||||||
my $username = $data{username};
|
my $username = $data->{username};
|
||||||
$username = QuoteHtml($username);
|
$username = QuoteHtml($username);
|
||||||
$username = $host unless $username;
|
$username = $host unless $username;
|
||||||
my $minor = $data{minor};
|
my $minor = $data->{minor};
|
||||||
my $revision = $data{revision};
|
my $revision = $data->{revision};
|
||||||
my $cluster = GetCluster($page);
|
my $cluster = GetCluster($page);
|
||||||
my $description;
|
my $description = ToString(sub { ApplyRules(QuoteHtml($page), 1, 0, undef, 'p') });
|
||||||
{
|
|
||||||
local *STDOUT;
|
|
||||||
open(STDOUT, '>', \$description) or die "Can't open memory file: $!";
|
|
||||||
ApplyRules(QuoteHtml($page), 1, 0, undef, 'p');
|
|
||||||
}
|
|
||||||
$description .= $q->p(GetPageLink($id, T('Learn more...')))
|
$description .= $q->p(GetPageLink($id, T('Learn more...')))
|
||||||
if length($page) < $size;
|
if length($page) < $size;
|
||||||
$rss .= "\n<item>\n";
|
$rss .= "\n<item>\n";
|
||||||
|
|||||||
116
modules/agree-disagree.pl
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Copyright (C) 2005 Bayle Shanks http://purl.net/net/bshanks
|
||||||
|
#
|
||||||
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
our ($Now, @MyMacros, @MyRules, $DefaultStyleSheet, $q, $bol);
|
||||||
|
|
||||||
|
AddModuleDescription('agree-disagree.pl', 'AgreeDisagreePlugin');
|
||||||
|
|
||||||
|
push(@MyRules, \&AgreeDisagreeSupportRule);
|
||||||
|
|
||||||
|
push(@MyMacros, sub{ s/\[\+\]/"[+:" . GetParam('username', T('Anonymous'))
|
||||||
|
. ':' . TimeToText($Now) . "]"/eg });
|
||||||
|
push(@MyMacros, sub{ s/\[\+(:[^]:]+)\]/"[+$1:" . TimeToText($Now) . "]"/eg });
|
||||||
|
push(@MyMacros, sub{ s/\[\-\]/"[-:" . GetParam('username', T('Anonymous'))
|
||||||
|
. ':' . TimeToText($Now) . "]"/eg });
|
||||||
|
push(@MyMacros, sub{ s/\[\-(:[^]:]+)\]/"[-$1:" . TimeToText($Now) . "]"/eg });
|
||||||
|
|
||||||
|
|
||||||
|
$DefaultStyleSheet .= <<'EOT' unless $DefaultStyleSheet =~ /div\.agree/; # mod_perl?
|
||||||
|
div.agreeCount {
|
||||||
|
float: left;
|
||||||
|
clear: left;
|
||||||
|
background-color: Green;
|
||||||
|
padding-left: .5em;
|
||||||
|
padding-right: .5em;
|
||||||
|
padding-top: .5em;
|
||||||
|
padding-bottom: .5em;
|
||||||
|
}
|
||||||
|
div.disagreeCount {
|
||||||
|
float: left;
|
||||||
|
clear: right;
|
||||||
|
background-color: Red;
|
||||||
|
padding-left: .5em;
|
||||||
|
padding-right: .5em;
|
||||||
|
padding-top: .5em;
|
||||||
|
padding-bottom: .5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.agreeNames {
|
||||||
|
float: left;
|
||||||
|
background-color: Green;
|
||||||
|
font-size: xx-small;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
div.disagreeNames {
|
||||||
|
float: left;
|
||||||
|
background-color: Red;
|
||||||
|
font-size: xx-small;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EOT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
my %AgreePortraits = ();
|
||||||
|
|
||||||
|
|
||||||
|
sub AgreeDisagreeSupportRule {
|
||||||
|
if ($bol) {
|
||||||
|
if ($bol && m/(\G(\s*\[\+(.*?)\]|\s*\[-(.*?)\])+)/cgs) {
|
||||||
|
|
||||||
|
my $votes = $1;
|
||||||
|
my @ayes = ();
|
||||||
|
my @nayes = ();
|
||||||
|
while ($votes =~ m/\G.*?\[\+(.*?)\]/cgs) {
|
||||||
|
my ($ignore, $name, $time) = split(/:/, $1, 3);
|
||||||
|
push(@ayes, $name);
|
||||||
|
}
|
||||||
|
my $votes2 = $votes;
|
||||||
|
while ($votes2 =~ m/\G.*?\[-(.*?)\]/cgs) {
|
||||||
|
my ($ignore, $name, $time) = split(/:/, $1, 3);
|
||||||
|
push(@nayes, $name);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $html = CloseHtmlEnvironments() ;
|
||||||
|
$html .= $q->div({-class=>'agreeCount'}) . ($#ayes+1) . ' ' . '</div>' ;
|
||||||
|
|
||||||
|
$html .= $q->div({-class=>'agreeNames'}) . printNames(@ayes) . '</div>' ;
|
||||||
|
$html .= $q->div({-class=>'disagreeCount'}) . ' ' . ($#nayes+1) . '</div>' ;
|
||||||
|
$html .= $q->div({-class=>'disagreeNames'}) . printNames(@nayes) . '</div>' ;
|
||||||
|
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub printNames {
|
||||||
|
my @names = @_;
|
||||||
|
|
||||||
|
my $html = '';
|
||||||
|
foreach my $name (@names) {
|
||||||
|
$html .= "$name<br>";
|
||||||
|
}
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,16 +11,18 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/all.pl">all.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/All_Action">All Action</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
AddModuleDescription('all.pl', 'All Action');
|
||||||
|
|
||||||
|
our ($q, %Action, $HomePage, $UrlProtocols);
|
||||||
|
|
||||||
$Action{all} = \&DoPrintAllPages;
|
$Action{all} = \&DoPrintAllPages;
|
||||||
|
|
||||||
my $Monolithic = 0;
|
our $Monolithic = 0;
|
||||||
|
|
||||||
sub DoPrintAllPages {
|
sub DoPrintAllPages {
|
||||||
return if (!UserIsAdminOrError());
|
return if (!UserIsAdminOrError());
|
||||||
@@ -28,12 +30,12 @@ sub DoPrintAllPages {
|
|||||||
print GetHeader('', T('Complete Content'))
|
print GetHeader('', T('Complete Content'))
|
||||||
. $q->p(Ts('The main page is %s.', $q->a({-href=>'#' . $HomePage}, $HomePage)));
|
. $q->p(Ts('The main page is %s.', $q->a({-href=>'#' . $HomePage}, $HomePage)));
|
||||||
print $q->p($q->b(Ts('(for %s)', GetParam('lang', 0)))) if GetParam('lang', 0);
|
print $q->p($q->b(Ts('(for %s)', GetParam('lang', 0)))) if GetParam('lang', 0);
|
||||||
PrintAllPages(0, 0, undef, AllPagesList());
|
PrintAllPages(0, 0, undef, undef, AllPagesList());
|
||||||
PrintFooter();
|
PrintFooter();
|
||||||
}
|
}
|
||||||
|
|
||||||
*OldAllScriptLink = *ScriptLink;
|
*OldAllScriptLink = \&ScriptLink;
|
||||||
*ScriptLink = *NewAllScriptLink;
|
*ScriptLink = \&NewAllScriptLink;
|
||||||
|
|
||||||
sub NewAllScriptLink {
|
sub NewAllScriptLink {
|
||||||
my ($action, $text, $class, $name, $title, $accesskey, $nofollow) = @_;
|
my ($action, $text, $class, $name, $title, $accesskey, $nofollow) = @_;
|
||||||
@@ -41,6 +43,7 @@ sub NewAllScriptLink {
|
|||||||
and $action !~ /^($UrlProtocols)\%3a/
|
and $action !~ /^($UrlProtocols)\%3a/
|
||||||
and $action !~ /^\%2f/
|
and $action !~ /^\%2f/
|
||||||
and $action !~ /=/) {
|
and $action !~ /=/) {
|
||||||
|
my %params;
|
||||||
$params{-href} = '#' . $action;
|
$params{-href} = '#' . $action;
|
||||||
$params{'-class'} = $class if $class;
|
$params{'-class'} = $class if $class;
|
||||||
$params{'-name'} = $name if $name;
|
$params{'-name'} = $name if $name;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 2004, 2005, 2009 Alex Schroeder <alex@gnu.org>
|
# Copyright (C) 2004–2015 Alex Schroeder <alex@gnu.org>
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -12,18 +12,22 @@
|
|||||||
# You should have received a copy of the GNU General Public License along with
|
# You should have received a copy of the GNU General Public License along with
|
||||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/anchors.pl">anchors.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Local_Anchor_Extension">Local Anchor Extension</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
|
AddModuleDescription('anchors.pl', 'Local Anchor Extension');
|
||||||
|
|
||||||
|
our ($q, %Page, $FootnoteNumber, $FreeLinkPattern, @MyRules, $BracketWiki);
|
||||||
push(@MyRules, \&AnchorsRule);
|
push(@MyRules, \&AnchorsRule);
|
||||||
|
|
||||||
sub AnchorsRule {
|
sub AnchorsRule {
|
||||||
if (m/\G\[\[\#$FreeLinkPattern\]\]/gc) {
|
if (m/\G\[\[\#$FreeLinkPattern\]\]/cg) {
|
||||||
return $q->a({-href=>'#' . FreeToNormal($1), -class=>'local anchor'}, $1);
|
return $q->a({-href=>'#' . FreeToNormal($1), -class=>'local anchor'}, $1);
|
||||||
} elsif ($BracketWiki && m/\G\[\[\#$FreeLinkPattern\|([^\]]+)\]\]/gc) {
|
} elsif ($BracketWiki && m/\G\[\[\#$FreeLinkPattern\|([^\]]+)\]\]/cg) {
|
||||||
return $q->a({-href=>'#' . FreeToNormal($1), -class=>'local anchor'}, $2);
|
return $q->a({-href=>'#' . FreeToNormal($1), -class=>'local anchor'}, $2);
|
||||||
} elsif ($BracketWiki && m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\|([^\]]+)\]\])/cog
|
} elsif ($BracketWiki && m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\|([^\]]+)\]\])/cg
|
||||||
or m/\G(\[\[\[$FreeLinkPattern\#$FreeLinkPattern\]\]\])/cog
|
or m/\G(\[\[\[$FreeLinkPattern\#$FreeLinkPattern\]\]\])/cg
|
||||||
or m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\]\])/cog) {
|
or m/\G(\[\[$FreeLinkPattern\#$FreeLinkPattern\]\])/cg) {
|
||||||
# This one is not a dirty rule because the output is always a page
|
# This one is not a dirty rule because the output is always a page
|
||||||
# link, never an edit link (unlike normal free links).
|
# link, never an edit link (unlike normal free links).
|
||||||
my $bracket = (substr($1, 0, 3) eq '[[[');
|
my $bracket = (substr($1, 0, 3) eq '[[[');
|
||||||
@@ -35,14 +39,30 @@ sub AnchorsRule {
|
|||||||
if (!$text && $bracket) {
|
if (!$text && $bracket) {
|
||||||
$text = BracketLink(++$FootnoteNumber); # s/_/ /g happens further down!
|
$text = BracketLink(++$FootnoteNumber); # s/_/ /g happens further down!
|
||||||
$class .= ' number';
|
$class .= ' number';
|
||||||
$title = $id; # override title
|
# Since we're displaying a number such as [1], the title attribute should tell us where this will go.
|
||||||
$title =~ s/_/ /g if $free;
|
$title = "$2 ($3)";
|
||||||
|
# The user might have writen [[[FooBar#one two]]] or [[[FooBar#one_two]]]
|
||||||
|
$title =~ s/_/ /g;
|
||||||
}
|
}
|
||||||
$text = $id unless $text;
|
$text = $id unless $text;
|
||||||
$text =~ s/_/ /g;
|
$text =~ s/_/ /g;
|
||||||
return ScriptLink(UrlEncode($id), $text, $class, undef, $title);
|
return ScriptLink(UrlEncode($id), $text, $class, undef, $title);
|
||||||
} elsif (m/\G\[\:$FreeLinkPattern\]/gc) {
|
} elsif (m/\G\[\:$FreeLinkPattern\]/cg) {
|
||||||
return $q->a({-name=>FreeToNormal($1), -class=>'anchor'}, '');
|
return $q->a({-name=>FreeToNormal($1), -class=>'anchor'}, '');
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*OldAnchorsBrowsePage=\&BrowsePage;
|
||||||
|
*BrowsePage=\&NewAnchorsBrowsePage;
|
||||||
|
|
||||||
|
sub NewAnchorsBrowsePage {
|
||||||
|
my ($id) = @_;
|
||||||
|
OpenPage($id);
|
||||||
|
if (not GetParam('revision', '')
|
||||||
|
and not GetParam('oldid', '')
|
||||||
|
and $Page{text} =~ /^\#REDIRECT\s+\[\[$FreeLinkPattern\#$FreeLinkPattern\]\]/) {
|
||||||
|
return ReBrowsePage(FreeToNormal($1 . '#' . $2), $id);
|
||||||
|
}
|
||||||
|
return OldAnchorsBrowsePage(@_);
|
||||||
}
|
}
|
||||||
|
|||||||
51
modules/antispam.pl
Executable file → Normal file
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,14 +11,15 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/antispam.pl">antispam.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Antispam_Module">Antispam Module</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
use vars qw($DoMaskEmail $CreateMailtoLinks);
|
AddModuleDescription('antispam.pl', 'Antispam Module');
|
||||||
|
|
||||||
|
our (@MyRules);
|
||||||
|
our ($DoMaskEmail, $CreateMailtoLinks, $EmailRegExp);
|
||||||
|
|
||||||
$DoMaskEmail = 1; # Mask all email, not just those in []'s
|
$DoMaskEmail = 1; # Mask all email, not just those in []'s
|
||||||
$CreateMailtoLinks = 1; # Create mailto's for all addresses
|
$CreateMailtoLinks = 1; # Create mailto's for all addresses
|
||||||
@@ -27,33 +28,33 @@ $EmailRegExp = '[\w\.\-]+@([\w\-]+\.)+[\w]+';
|
|||||||
|
|
||||||
|
|
||||||
push(@MyRules, \&MaskEmailRule);
|
push(@MyRules, \&MaskEmailRule);
|
||||||
|
|
||||||
sub MaskEmailRule {
|
sub MaskEmailRule {
|
||||||
# Allow [email@foo.bar Email Me] links
|
# Allow [email@foo.bar Email Me] links
|
||||||
if (m/\G\[($EmailRegExp(\s\w+)*\s*)\]/igc) {
|
if (m/\G\[($EmailRegExp(\s\w+)*\s*)\]/cgi) {
|
||||||
$chunk = $1;
|
my $chunk = $1;
|
||||||
$chunk =~ s/($EmailRegExp)//i;
|
$chunk =~ s/($EmailRegExp)//i;
|
||||||
$email = $1;
|
my $email = $1;
|
||||||
$chunk =~ s/^\s*//;
|
$chunk =~ s/^\s*//;
|
||||||
$chunk =~ s/\s*$//;
|
$chunk =~ s/\s*$//;
|
||||||
|
|
||||||
$masked="";
|
my $masked = '';
|
||||||
@decimal = unpack('C*', $email);
|
my @decimal = unpack('C*', $email);
|
||||||
foreach $i (@decimal) {
|
for (@decimal) {
|
||||||
$masked.="&#".$i.";";
|
$masked .= '&#' . $_ . ';';
|
||||||
}
|
}
|
||||||
$email = $masked;
|
$email = $masked;
|
||||||
$chunk = $email if $chunk eq "";
|
$chunk = $email if $chunk eq "";
|
||||||
return "<a href=\"mailto:" . $email . "\">$chunk</a>";
|
return "<a href=\"mailto:$email\">$chunk</a>";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m/\G($EmailRegExp)/igc) {
|
if (m/\G($EmailRegExp)/cgi) {
|
||||||
$email=$1;
|
my $email = $1;
|
||||||
if ($DoMaskEmail) {
|
if ($DoMaskEmail) {
|
||||||
$masked="";
|
my $masked="";
|
||||||
@decimal = unpack('C*', $email);
|
my @decimal = unpack('C*', $email);
|
||||||
foreach $i (@decimal) {
|
for (@decimal) {
|
||||||
$masked.="&#".$i.";";
|
$masked .= '&#' . $_ . ';';
|
||||||
}
|
}
|
||||||
$email = $masked;
|
$email = $masked;
|
||||||
}
|
}
|
||||||
@@ -62,5 +63,5 @@ sub MaskEmailRule {
|
|||||||
}
|
}
|
||||||
return $email;
|
return $email;
|
||||||
}
|
}
|
||||||
return undef;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
@@ -11,15 +11,17 @@
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# 59 Temple Place, Suite 330
|
|
||||||
# Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
$ModulesDescription .= '<p><a href="http://git.savannah.gnu.org/cgit/oddmuse.git/tree/modules/archive.pl">archive.pl</a>, see <a href="http://www.oddmuse.org/cgi-bin/oddmuse/Archive_Extension">Archive Extension</a></p>';
|
use strict;
|
||||||
|
use v5.10;
|
||||||
|
|
||||||
*OldArchiveGetHeader = *GetHeader;
|
AddModuleDescription('archive.pl', 'Archive Extension');
|
||||||
*GetHeader = *NewArchiveGetHeader;
|
|
||||||
|
our ($q);
|
||||||
|
|
||||||
|
*OldArchiveGetHeader = \&GetHeader;
|
||||||
|
*GetHeader = \&NewArchiveGetHeader;
|
||||||
|
|
||||||
# this assumes that *all* calls to GetHeader will print!
|
# this assumes that *all* calls to GetHeader will print!
|
||||||
sub NewArchiveGetHeader {
|
sub NewArchiveGetHeader {
|
||||||
@@ -32,7 +34,7 @@ sub NewArchiveGetHeader {
|
|||||||
print $q->div({-class=>'archive'},
|
print $q->div({-class=>'archive'},
|
||||||
$q->p($q->span(T('Archive:')),
|
$q->p($q->span(T('Archive:')),
|
||||||
map {
|
map {
|
||||||
$key = $_;
|
my $key = $_;
|
||||||
my ($year, $month) = split(/-/, $key);
|
my ($year, $month) = split(/-/, $key);
|
||||||
if (defined(&month_name)) {
|
if (defined(&month_name)) {
|
||||||
ScriptLink('action=collect;match=' . UrlEncode("^$year-$month"),
|
ScriptLink('action=collect;match=' . UrlEncode("^$year-$month"),
|
||||||
|
|||||||