summaryrefslogtreecommitdiff
path: root/http/index.html
blob: c43a2ac3451952357dce7dc122a17708c208e56e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
<html>
  <head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	<title>DealConvert by mkl</title>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
    <script src="dealconvert.js"></script>
  </head>
  <body style="overflow-y: scroll">
    <div class="container">
      <div class="page-header">
        <a href="#" class="faq-btn btn btn-info float-right" data-toggle="collapse" data-trigger="hover" data-content="FAQ" data-placement="bottom" data-target="#faq">ⓘ</a>
        <h1>Konwerter rozdań</h1>
        <p><a href="https://github.com/emkael/deal-convert/">Deal-convert</a>, autor: <a href="https://emkael.info/">Michał Klichowicz</a></p>
      </div>
    </div>
    <div class="container collapse mb-3" id="faq">
      <div class="card">
        <div class="card-header bg-info text-white">
          Pytania i odpowiedzi
        </div>
        <div class="card-body">
          <dl>
            <dt>Czemu konwerter mi nie zadziałał?</dt>
            <dd>
              Nie wiem, prześlij mi problemowy plik z opisem błędu <a href="mailto:klichowicz.michal@gmail.com">mailem</a> albo od razu <a href="https://github.com/emkael/deal-convert/issues/">do systemu śledzenia błędów</a>.<br />
              Pliki wszystkich formatów wygenerowane poprawnie i z ciągłą numeracją rozdań od 1 (np. wygenerowane przez BigDeala) powinny konwertować się we wszystkie strony bez problemu. Nie wszystkie formaty plików są udokumentowane w sposób pozwalający obsłużyć je kompleksowo, na przykład formaty <code>DUP</code> i <code>DLM</code> (stary i nowy format Duplimate) zawierają dużo opcji, które konwerter ignoruje, a czasami wręcz wprost przyznaje, że nie wie, jak się zachować. Jeśli masz jakieś informacje, które mogłyby usprawnić wsparcie takich formatów, pisz jak wyżej.
            </dd>
            <dt>Czemu konwerter nie wspiera formatu X?</dt>
            <dd>
              Bo nie obsługiwał go BigDeal w momencie, kiedy konwerter powstawał.<br />
              Wyjątkiem są "ślepe" formaty Duplimate, które były wyodrębione w BigDeal, ale nie są obsługiwane, a różnią się od "jawnych" formatów Duplimate tylko określonymi opcjami. Oba te formaty są prawidłowo importowane, konwerter zapisuje jednak tylko do plików "jawnych".<br />
              W przyszłości rozważane jest wsparcie dla formatu <code>LIN</code>. Jeśli chcesz obsługi jakiegoś innego formatu, pisz jak wyżej.
            </dd>
            <dt>Czemu w pliku PBN nie ma analizy w widne?</dt>
            <dd>
              <s>Nie ma, pracuję nad tym. Możesz ją sobie łatwo (i szybko!) wykonać przy pomocy <a href="https://github.com/emkael/bcdd/">BCDD</a>.</s><br />
              Jak to "nie ma"? Może masz popsuty plik.<br />
              Jest, wspomagana silnikiem <a href="http://bcalc.w8.pl/" target="_blank">BCalc</a>.
            </dd>
            <dt>Czemu dostaję mnóstwo ostrzeżeń <kbd>.xxx file format assumes consequent deal numbers from 1</kbd>?</dt>
            <dd>Niektóre formaty nie przechowują numerów rozdań. W takich sytuacjach, zarówno przy imporcie, jak i eksporcie, konwerter zakłada, że rozdania mają kolejne numery, od 1. Może to doprowadzić do zmiany numeracji rozdań, jeśli oryginalny plik nie zaczynał się od rozdania nr 1 albo numeracja zawierała dziury.</dd>
            <dt>Czemu mój PBN nie chce się otworzyć w BigDealu?</dt>
            <dd>
              BigDeal zakłada, że numeracja rozdań w pliku PBN zaczyna się od 1. Możliwy jest eksport do PBN plików, które nie spełniają tego warunku (np. formaty Duplimate robią tak powszechnie).<br />
              Jest łatwy sposób, aby poradzić sobie z tym problemem:
              <ol>
                <li>Wyeksportować rozkłady do plik <code>DLM</code>.</li>
                <li>Odnaleźć w pliku <code>DLM</code> linię <kbd>From board=X</kbd>.</li>
                <li>Zmienić ją na <kbd>From board=1</kbd>.</li>
                <li>Tak spreparowany plik skonwertować do <code>PBN</code>.</li>
                <li>Prawdopodobnie konwerter zgłosi błąd sumy kontrolnej, można go ignorować, jeśli nie chce się używać pośredniego pliku <code>DLM</code>.</li>
                <li>Wynikowy plik <code>PBN</code> rozpoczyna się od rozdania nr 1 i jest uzupełniony rozdaniami z 13-kartowymi kolorami w każdej z rąk.</li>
              </ol>
            <dt>Czy to bezpieczne, tak wysyłać rozkłady do Internetu?</dt>
            <dd>
              Doskonałe pytanie!<br />
              Nie jestem oczywiście w stanie zapewnić, że przesyłane w ten sposób rozkłady są w 100% odporne na wyciek, ale ze strony konwertera:
              <ul>
                <li>zapewniam szyfrowane połączenie HTTPS</li>
                <li>udostępniam <a href="https://github.com/emkael/deal-convert/">kod źródłowy całości narzędzia</a></li>
                <li>nie przechowuję oryginalnych plików wejściowych na serwerze</li>
                <li>pliki wynikowe przechowuję przez <strong>15 minut</strong> od momentu wygenerowania</li>
                <li>pliki wynikowe dostępne są tylko w tej samej sesji przeglądarki, w której zostały wygenerowane</li>
              </ul>
              Ogólnie, jeśli zachować elementarne środki ostrożności, tj. niekorzystanie z konwertera w niezaufanych sieciach oraz z niezaufanych komputerów, konwerter niesie dużo mniejsze ryzyko niż np. zostawienie rozkładów na pamięci przenośnej na sali gry czy wysyłanie ich pocztą elektroniczną.
            </dd>
          </dl>
        </div>
      </div>
    </div>
    <div class="container">
      <form id="converter-input">
        <div class="form-group">
          <label for="input-files">Wrzuć pliki wejściowe:</label>
          <input type="file" multiple="multiple" class="form-control-file" id="input-files" name="input-files">
        </div>
        <div class="form-group collapse" id="output-formats">
          <label>Wybierz formaty wyjściowe:</label>
          <div class="row">
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="ber" id="output-ber" />
                <label class="form-check-label" for="output-ber">Bernasconi (BER)</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="bhg" id="output-bhg" />
                <label class="form-check-label" for="output-bhg">Borel Hand Generator (BHG)</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="bri" id="output-bri" />
                <label class="form-check-label" for="output-bri">BRI</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="cds" id="output-cds" />
                <label class="form-check-label" for="output-cds">CDS-2000 (CDS)</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="csv" id="output-csv" />
                <label class="form-check-label" for="output-csv">CSV</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="dge" id="output-dge" />
                <label class="form-check-label" for="output-dge">DGE</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="dlm" id="output-dlm" />
                <label class="form-check-label" for="output-dlm">New Duplimate (DLM)</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="dup" id="output-dup" />
                <label class="form-check-label" for="output-dup">Old Duplimate (DUP)</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="pbn" id="output-pbn" />
                <label class="form-check-label" for="output-pbn">Portable Bridge Notation (PBN)</label>
              </div>
            </div>
            <div class="col-md-6 col-lg-4">
              <div class="form-check">
                <input class="form-check-input" type="checkbox" name="output" value="rzd" id="output-rzd" />
                <label class="form-check-label" for="output-rzd">KoPS (RZD)</label>
              </div>
            </div>
          </div>
        </div>
        <div class="form-group collapse" id="submit-panel">
          <button type="submit" class="btn btn-primary" id="submit-btn" disabled="disabled">Konwertuj</button>
          <div class="form-check-inline">
            <input class="form-check-input" type="checkbox" name="display" value="yes" id="display-boards" />
            <label class="form-check-label" for="display-boards">Wyświetl podgląd rozkładów</label>
          </div>
        </div>
      </form>
    </div>
    <template id="file-output-group">
      <div class="container output-group mb-1">
        <div class="card">
          <div class="card-header file-header"></div>
          <div class="card-body file-body">
            <div class="card file-boards-panel mb-2">
              <button class="btn card-header bg-primary text-white text-left" data-toggle="collapse" role="button" data-target="#boards-panel-body">
                Podgląd rozkładów
              </button>
              <div id="boards-panel-body" class="collapse collapsed card-body">
                <div class="board-body d-flex" style="flex-flow: row wrap; align-content: flex-start; justify-content: space-around"></div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </template>
    <template id="file-output">
      <div class="d-flex btn-group m-1">
        <a class="btn file-status" data-toggle="poppler" data-trigger="click hover" data-placement="bottom" data-html="true"></a>
        <a class="btn w-100 text-left p-2 file-name"></a>
        <a class="btn ml-auto btn-primary file-link">Pobierz</a>
      </div>
    </template>
    <template id="file-output-warning">
      <div class="alert alert-warning"></div>
    </template>
    <template id="file-output-error">
      <div class="alert alert-danger"></div>
    </template>
    <template id="board-preview">
      <div class="card m-2" style="width: 20rem;">
        <div class="card-header">
          <h5 class="card-title">Rozdanie <span class="board-number"></span></h5>
        </div>
        <div class="card-body">
          <table class="table table-sm table-borderless m-auto">
            <tr>
              <td rowspan="4" colspan="2"></td>
              <td><b>♠</b></td>
              <td class="board-north-spades"></td>
              <td rowspan="4" colspan="2"></td>
            </tr>
            <tr>
              <td><b class="text-danger">♥</b></td>
              <td class="board-north-hearts"></td>
            </tr>
            <tr>
              <td><b class="text-danger">♦</b></td>
              <td class="board-north-diamonds"></td>
            </tr>
            <tr>
              <td><b>♣</b></td>
              <td class="board-north-clubs"></td>
            </tr>
            <tr>
              <td><b>♠</b></td>
              <td class="board-west-spades"></td>
              <td rowspan="4" colspan="2" class="text-center align-middle"><img class="board-conditions" /></td>
              <td><b>♠</b></td>
              <td class="board-east-spades"></td>
            </tr>
            <tr>
              <td><b class="text-danger">♥</b></td>
              <td class="board-west-hearts"></td>
              <td><b class="text-danger">♥</b></td>
              <td class="board-east-hearts"></td>
            </tr>
            <tr>
              <td><b class="text-danger">♦</b></td>
              <td class="board-west-diamonds"></td>
              <td><b class="text-danger">♦</b></td>
              <td class="board-east-diamonds"></td>
            </tr>
            <tr>
              <td><b>♣</b></td>
              <td class="board-west-clubs"></td>
              <td><b>♣</b></td>
              <td class="board-east-clubs"></td>
            </tr>
            <tr>
              <td rowspan="4" colspan="2"></td>
              <td><b>♠</b></td>
              <td class="board-south-spades"></td>
              <td rowspan="4" colspan="2"></td>
            </tr>
            <tr>
              <td><b class="text-danger">♥</b></td>
              <td class="board-south-hearts"></td>
            </tr>
            <tr>
              <td><b class="text-danger">♦</b></td>
              <td class="board-south-diamonds"></td>
            </tr>
            <tr>
              <td><b>♣</b></td>
              <td class="board-south-clubs"></td>
            </tr>
          </table>
        </div>
      </div>
    </template>
  </body>
</html>