From: Łukasz Rekucki Date: Tue, 8 Sep 2009 23:52:14 +0000 (+0200) Subject: Skroty klawiszowe z Ctrl i Shift. Update przyciskow. X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/4419f93a01685b9864a6e78cb905c803ec0970b0 Skroty klawiszowe z Ctrl i Shift. Update przyciskow. --- diff --git a/apps/explorer/forms.py b/apps/explorer/forms.py index da8a1179..e453f1fd 100644 --- a/apps/explorer/forms.py +++ b/apps/explorer/forms.py @@ -62,6 +62,7 @@ class BookUploadForm(forms.Form): file = forms.FileField(label='Source OCR file') bookname = forms.RegexField(regex='[\w-]+', \ label='Publication name', help_text='Example: slowacki-beniowski') + autoxml = forms.BooleanField(required=False, initial=True, label=u"Generate DublinCore template") class ImageFoldersForm(forms.Form): folders = forms.ChoiceField(required=False) @@ -78,13 +79,13 @@ class DublinCoreForm(forms.Form): kinds = ListField() genres = ListField() created_at = forms.DateField() - released_to_public_domain_at = forms.DateField() + released_to_public_domain_at = forms.DateField(required=False) editors = ListField(widget=forms.Textarea, required=False, converter=person_conv) translators = ListField(widget=forms.Textarea, required=False, converter=person_conv) technical_editors = ListField(widget=forms.Textarea, required=False, converter=person_conv) publisher = forms.CharField() - source_name = forms.CharField(widget=forms.Textarea) - source_url = forms.URLField(verify_exists=False) + source_name = forms.CharField(widget=forms.Textarea, required=False) + source_url = forms.URLField(verify_exists=False, required=False) url = forms.URLField(verify_exists=False) parts = forms.CharField(widget=forms.Textarea, required=False) license = forms.CharField(required=False) diff --git a/apps/explorer/views.py b/apps/explorer/views.py index 18f79b3e..b3cc09bc 100644 --- a/apps/explorer/views.py +++ b/apps/explorer/views.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- import urllib2 import hg -from librarian import html, parser, dcparser, ParseError, ValidationError +from datetime import date + +from librarian import html, parser, dcparser, wrap_text +from librarian import ParseError, ValidationError from django.conf import settings from django.contrib.auth.decorators import login_required, permission_required @@ -65,9 +68,12 @@ def file_upload(request, repo): f = request.FILES['file'] decoded = f.read().decode('utf-8') path = form.cleaned_data['bookname'] + + if form.cleaned_data['autoxml']: + decoded = wrap_text(decoded, unicode(date.today()) ) def upload_action(): - repo._add_file(path ,decoded.encode('utf-8') ) + repo._add_file(path, decoded.encode('utf-8') ) repo._commit(message="File %s uploaded by user %s" % \ (path, request.user.username), user=request.user.username) diff --git a/apps/toolbar/admin.py b/apps/toolbar/admin.py index 58b5f746..dca934cc 100644 --- a/apps/toolbar/admin.py +++ b/apps/toolbar/admin.py @@ -12,8 +12,41 @@ from toolbar import models # list_editable = ('position',) +class KeyModSelector(forms.MultiWidget): + def __init__(self): + super(KeyModSelector, self).__init__( + [forms.CheckboxInput() for x in xrange(0,3)]) + + def decompress(self, v): + r = [(v&0x01) != 0, (v&0x02) != 0, (v&0x04) != 0] + print "DECOMPRESS: " , v, repr(r) + return r + + def format_output(self, widgets): + out = u'' + out += u'

' + widgets[0] + u' Alt

' + out += u'

' + widgets[1] + u' Ctrl

' + out += u'

' + widgets[2] + u' Shift

' + return out + +class KeyModField(forms.MultiValueField): + + def __init__(self): + super(KeyModField, self).__init__(\ + fields=tuple(forms.BooleanField() for x in xrange(0,3)), \ + widget=KeyModSelector() ) + + def compress(self, dl): + v = int(dl[0]) | (int(dl[1]) << 1) | (int(dl[2]) << 2) + print "COMPRESS", v + return v + + class ButtonAdminForm(forms.ModelForm): - model = models.Button + key_mod = KeyModField() + + class Meta: + model = models.Button def clean_params(self): value = self.cleaned_data['params'] @@ -22,9 +55,11 @@ class ButtonAdminForm(forms.ModelForm): except Exception, e: raise forms.ValidationError(e) + + class ButtonAdmin(admin.ModelAdmin): form = ButtonAdminForm - list_display = ('label', 'scriptlet', 'key', 'params') + list_display = ('label', 'scriptlet', 'hotkey_name', 'params') prepopulated_fields = {'slug': ('label',)} admin.site.register(models.Button, ButtonAdmin) diff --git a/apps/toolbar/models.py b/apps/toolbar/models.py index ae101e07..004fde9f 100644 --- a/apps/toolbar/models.py +++ b/apps/toolbar/models.py @@ -24,6 +24,7 @@ class Button(models.Model): # ui related stuff key = models.CharField(blank=True, max_length=1) + key_mod = models.PositiveIntegerField(blank=True, default=1) tooltip = models.CharField(blank=True, max_length=120) # Why the button is restricted to have the same position in each group ? @@ -33,6 +34,20 @@ class Button(models.Model): class Meta: ordering = ('label',) verbose_name, verbose_name_plural = _('button'), _('buttons') + + def hotkey_code(self): + return ord(self.key.upper()) | (self.key_mod << 8) + + def hotkey_name(self): + if not self.key: + return '' + + mods = [] + if self.key_mod & 0x01: mods.append('Alt') + if self.key_mod & 0x02: mods.append('Ctrl') + if self.key_mod & 0x04: mods.append('Shift') + mods.append('"'+self.key+'"') + return '+'.join(mods) def __unicode__(self): return self.label diff --git a/apps/toolbar/templates/toolbar/toolbar.html b/apps/toolbar/templates/toolbar/toolbar.html index 21135305..a6241d1e 100644 --- a/apps/toolbar/templates/toolbar/toolbar.html +++ b/apps/toolbar/templates/toolbar/toolbar.html @@ -19,7 +19,7 @@ diff --git a/apps/toolbar/templatetags/toolbar_tags.py b/apps/toolbar/templatetags/toolbar_tags.py index e29c8a0d..a38ed017 100644 --- a/apps/toolbar/templatetags/toolbar_tags.py +++ b/apps/toolbar/templatetags/toolbar_tags.py @@ -7,8 +7,3 @@ register = template.Library() def toolbar(): groups = models.ButtonGroup.objects.all() return {'groups': groups} - -@register.filter -def keycode(value): - return ord(str(value).upper()) - diff --git a/fixtures/przyciski.xml b/fixtures/przyciski.xml old mode 100644 new mode 100755 index ea1d7246..ec2acaba --- a/fixtures/przyciski.xml +++ b/fixtures/przyciski.xml @@ -1,1108 +1,982 @@ - - - - Akapity i długie cytaty - akapity-i-dlugie-cytaty - 0 - - - Autokorekta - autokorekta - 0 - - - Bloki - bloki - 0 - - - Bloki początkowe - bloki-poczatkowe - 0 - - - Deklaracje - deklaracje - 0 - - - Dramat wierszowany - dramat-wierszowany - 0 - - - Dramat współczesny - dramat-wspolczesny - 0 - - - Elementy początkowe - elementy-poczatkowe - 0 - - - Mastery - mastery - 0 - - - Nagłówki - naglowki - 0 - - - Początek dramatu - poczatek-dramatu - 0 - - - Polecenia - polecenia - 0 - - - Strukturalne - strukturalne - 0 - - - Style znakowe - style-znakowe - 0 - - - Wersy - wersy - 0 - - - Widok - display_options - 2 - - - A<sup>+</sup> - increase_font_size - {"change": 2} - codemirror_fontsize - + - Zwiększ rozmiar czcionki. - - - - - - A<sup>-</sup> - descrease_font_size - {"change": -2} - codemirror_fontsize - - - Zmniejsz rozmiar czcionki. - - - - - - A<sup>=</sup> - reset_font_size - {"fontSize": 13} - codemirror_fontsize - = - Przywróć orginalny rozmiar czcionki. - - - - - - A<sup>↓</sup> - tolowercase - [] - lowercase - u - Zamień wielkie litery na małe. - - - - - - Podstawowa - basic_correction - {"exprs": [["\n\\d+\n", "\n"], ["-\\s*\n+", ""], ["\\,\\.\\.|\\.\\,\\.|\\.\\.\\,", "..."]]} - fulltextregexp - - Wykonuję operację z novel-pages i poem-pages. - - - - - - Usuń spację - strip_whitespace - {"exprs": [["^\\s+|\\s+$", ""], ["\\s+", " "]]} - lineregexp - - Usuwa zbędne spację z dokumentu. - - - - - - Zamień Cudzysłowy - zamien-cudzyslowy - {"exprs": [["\u00bb|\u201e", ",,"], ["\u00ab", "\""], ["\"([\u0104\u0118\u00d3\u0141\u017b\u0179\u0106\u0143\u0105\u017c\u017a\u015b\u0144\u00f3\u0142\u0107\\w])", ",,$1"]]} - lineregexp - - - - - - - - Zamień dywiz - zamien_dywiz - {"exprs": [["(\\d)[\u2014-](\\d)", "$1--$2"], ["\u2014", "---"]]} - lineregexp - - Zamienia '—' na '---', oraz '1—2' na '1--2'. - - - - - - akapit - akapit - {"tag": "akap"} - insert_tag - - - - - - - - akapit cd. - akapit-cd - {"tag": "akap_cd"} - insert_tag - - - - - - - - akapit dialogowy - akapit-dialogowy - {"tag": "akap_dialog"} - insert_tag - - - - - - - - akt - akt - {"tag": "akt"} - insert_tag - - - - - - - - autor - autor - {"tag": "autor"} - insert_tag - - - - - - - - część/księga - czesc - {"tag": "naglowek_czesc"} - insert_tag - - - - - - - - dedykacja - dedykacja - {"tag": "dedykacja"} - insert_tag - - - - - - - - dedykacja - dedykacja - {"tag": "dedykacja"} - insert_tag - - - - - - - - didaskalia - didaskalia - {"tag": "didaskalia"} - insert_tag - - - - - - - - didaskalia - didaskalia - {"tag": "didaskalia"} - insert_tag - - - - - - - - didaskalia wewn. - didaskalia-wewn - {"tag": "didask_tekst"} - insert_tag - - - - - - - - didaskalia wewn. - didaskalia-wewn - {"tag": "didask_tekst"} - insert_tag - - - - - - - - dramat wiersz. - dramat-wiersz - {"tag": "dramat_wierszowany_l"} - insert_tag - - - - - - - - dramat wiersz./w. łam - dramat-wiersz-w-lam - {"tag": "dramat_wierszowany_lp"} - insert_tag - - - - - - - - dramat współczesny - dramat-wspolczesny - {"tag": "dramat_wspolczesny"} - insert_tag - - - - - - - - dzieło nadrzędne - dzielo-nadrzedne - {"tag": "dzielo_nadrzedne"} - insert_tag - - - - - - - - długi cyt. poet. - dlugi-cyt-poet - {"tag": "poezja_cyt"} - insert_tag - - - - - - - - długi cyta. poet. - dlugi-cyt-poet - {"tag": "poezja_cyt"} - insert_tag - - - - - - - - długi cytat - dlugi-cytat - {"tag": "dlugi_cyt"} - insert_tag - - - - - - - - - ekstra - ekstra - {"tag": "ekstra"} - insert_tag - - - - - - - - kwestia - kwestia - {"tag": "kwestia"} - insert_tag - - - - - - - - kwestia - kwestia - {"tag": "kwestia"} - insert_tag - - - - - - - - liryka - liryka - {"tag": "liryka_l"} - insert_tag - - - - - - - - liryka/w. łam - liryka-w-lam - {"tag": "liryka_lp"} - insert_tag - - - - - - - - mamtemat. - matemat - {"tag": "mat"} - insert_tag - - - - - - - - motto - motto - {"tag": "motto"} - insert_tag - - - - - - - - motto - motto - {"tag": "motto"} - insert_tag - - - - - - - - motto podpis - motto-podpis - {"tag": "motto_podpis"} - insert_tag - - - - - - - - nagłówek kwestii - naglowek-kwestii - {"tag": "naglowek_osoba"} - insert_tag - - - - - - - - nota - nota - {"tag": "nota"} - insert_tag - - - - - - - - opowiadanie - opowiadanie - {"tag": "opowiadanie"} - insert_tag - - - - - - - - osoba - osoba - {"tag": "osoba"} - insert_tag - - - - - - - - osoba - osoba - {"tag": "osoba"} - insert_tag - - - - - - - - podrozdział - podrozdzial - {"tag": "naglowek_podrozdzial"} - insert_tag - - - - - - - - podtytuł - podtytul - {"tag": "podtytul"} - insert_tag - - - - - - - - powieść - powiesc - {"tag": "powiesc"} - insert_tag - - - - - - - - przypis autorski - przypis-autorski - {"tag": "pa"} - insert_tag - - - - - - - - przypis edytorski - przypis-edytorski - {"tag": "pe"} - insert_tag - - - - - - - - przypis redaktorski - przypis-redaktorski - {"tag": "pr"} - insert_tag - - - - - - - - przypis tłumacza - przypis-tlumacza - {"tag": "pt"} - insert_tag - - - - - - - - rozdział - rozdzial - {"tag": "naglowek_rozdzial"} - insert_tag - - - - - - - - scena - scena - {"tag": "naglowek_scena"} - insert_tag - - - - - - - - sep. asteryks - sep-asteryks - {"tag": "sekcja_asteryks"} - insert_tag - - - - - - - - sep. linia - sep-linia - {"tag": "separator_linia"} - insert_tag - - - - - - - - sep. światło - sep-swiatlo - {"tag": "sekcja_swiatlo"} - insert_tag - - - - - - - - strofa - strofa - {"tag": "strofa"} - insert_tag - - - - - - - - słowo obce - slowo-obce - {"tag": "slowo_obce"} - insert_tag - - - - - - - - tagi główne - tagi-glowne - {"tag": "utwor"} - insert_tag - - - - - - - - tytuł - tytul - {"tag": "nazwa_utworu"} - insert_tag - - - - - - - - tytuł dzieła - tytul-dziela - {"tag": "tytul_dziela", "attrs": {"typ": " "}} - insert_tag - - - - - - - - uwaga - uwaga - {"tag": "uwaga"} - insert_tag - - - - - - - - wers akap. - wers-akap - {"tag": "wers_akap"} - insert_tag - - - - - - - - wers akap. - wers-akap - {"tag": "wers_akap"} - insert_tag - - - - - - - - wers cd. - wers-cd - {"tag": "wers_cd"} - insert_tag - - - - - - - - wers cd. - wers-cd - {"tag": "wers_cd"} - insert_tag - - - - - - - - wers wcięty - wers-wciety - {"tag": "wers_wciety"} - insert_tag - - - - - - - - wers wcięty - wers-wciety - {"tag": "wers_wciety"} - insert_tag - - - - - - - - www - www - {"tag": "www"} - insert_tag - - - - - - - - wyróżnienie - wyroznienie - {"tag": "wyroznienie"} - insert_tag - - - - - - - - wywiad - wywiad - {"tag": "wywiad"} - insert_tag - - - - - - - - wywiad odpowiedź - wywiad-odpowiedz - {"tag": "wywiad_odp"} - insert_tag - - - - - - - - wywiad pytanie - wywiad-pytanie - {"tag": "wywiad_pyt"} - insert_tag - - - - - - - - zastępnik wersu - zastepnik-wersu - {"tag": "zastepnik_wersu"} - insert_tag - - - - - - - - śródtytuł - srodtytul - {"tag": "srodtytul"} - insert_tag - - - - - - - - var texteditor = panel.texteditor; - -var text = texteditor.selection(); - -var out = '<'+params.tag; - -for (var attr in params.attrs) { - - out += ' '+attr+'="' + params.attrs[attr] + '"'; - -}; - -out += '>'; - -out += text; - -out += '</' + params.tag + '>'; - - - -texteditor.replaceSelection(out); - - - -if (text.length == 0) { - - var pos = texteditor.cursorPosition(); - - texteditor.selectLines(pos.line, pos.character + params.tag.length + 2); - -} - - - -panel.fireEvent('contentChanged'); - - - // params: {exprs: list of {expr: "", repl: "" [, opts: "g"]}} - -var cm = panel.texteditor; - - - -var exprs = $.map(params.exprs, function(expr) { - - var opts = "g"; - - if(expr.length > 2) - - opts = expr[2]; - - return {rx: new RegExp(expr[0], opts), repl: expr[1]}; - -}); - - - -var partial = true; - -var text = cm.selection(); - - - -if(!text) { - - var cpos = cm.cursorPosition(); - - cpos.line = cm.lineNumber(cpos.line) - - cm.selectLines(cm.firstLine(), 0, cm.lastLine(), 0); - - text = cm.selection(); - - partial = false; - -} - - - -var changed = false; - -var lines = text.split('\n'); - -var lines = $.map(lines, function(line) { - - var old_line = line; - - $(exprs).each(function() { - - var expr = this; - - line = line.replace(expr.rx, expr.repl); - - }); - - if(old_line != line) changed = true; - - return line; - -}); - - - -if(changed) - -{ - - cm.replaceSelection( lines.join('\n') ); - - panel.fireEvent('contentChanged'); - -} - - - -if(!partial) - - cm.selectLines( cm.nthLine(cpos.line), cpos.character ) - - - var texteditor = panel.texteditor; - -var frameBody = $('body', $(texteditor.frame).contents()); - - - -if(params.fontSize) { - - frameBody.css('font-size', params.fontSize); - -} - -else { - - var old_size = parseInt(frameBody.css('font-size')); - - frameBody.css('font-size', old_size + (params.change || 0) ); - -} - - - var cm = panel.texteditor; - -var exprs = $.map(params.exprs, function(expr) { - - var opts = "mg"; - - if(expr.length > 2) - - opts = expr[2]; - - return {rx: new RegExp(expr[0], opts), repl: expr[1]}; - -}); - - - -var partial = true; - -var text = cm.selection(); - - - -if(!text) { - - var cpos = cm.cursorPosition(); - - cpos.line = cm.lineNumber(cpos.line) - - cm.selectLines(cm.firstLine(), 0, cm.lastLine(), 0); - - text = cm.selection(); - - partial = false; - -} - - - -var original = text; - - - -$(exprs).each(function() { - - text = text.replace(this.rx, this.repl); - -}); - - - -if( original != text) { - - cm.replaceSelection(text); - - panel.fireEvent('contentChanged'); - -} - - - -if(!partial) { - - cm.selectLines( cm.nthLine(cpos.line), cpos.character ); - -} - - - params.each(function() { - - editor.callScriptlet(this[0], this[1]); - -}); - - - var cm = panel.texteditor; - -var text = cm.selection(); - -if(!text) return; - -var repl = text.toLowerCase(); - -if(repl != text) { - - cm.replaceSelection(repl); - - panel.fireEvent('contentChanged'); - -}; - - + + + + Akapity i długie cytaty + akapity-i-dlugie-cytaty + 0 + + + Autokorekta + autokorekta + 0 + + + Bloki + bloki + 0 + + + Dramat wierszowany + dramat-wierszowany + 0 + + + Dramat współczesny + dramat-wspolczesny + 0 + + + Elementy początkowe + elementy-poczatkowe + 0 + + + Nagłówki + naglowki + 0 + + + Początek dramatu + poczatek-dramatu + 0 + + + Polecenia + polecenia + 0 + + + Strukturalne + strukturalne + 0 + + + Style znakowe + style-znakowe + 0 + + + Wersy + wersy + 0 + + + Widok + display_options + 2 + + + A<sup>+</sup> + increase_font_size + {"change": 2} + codemirror_fontsize + + + Zwiększ rozmiar czcionki. + + + + + + A<sup>-</sup> + descrease_font_size + {"change": -2} + codemirror_fontsize + - + Zmniejsz rozmiar czcionki. + + + + + + A<sup>=</sup> + reset_font_size + {"fontSize": 13} + codemirror_fontsize + = + Przywróć orginalny rozmiar czcionki. + + + + + + A<sup>↓</sup> + tolowercase + [] + lowercase + u + Zamień wielkie litery na małe. + + + + + + akapit + akapit + {"tag": "akap"} + insert_tag + + + + + + + + akapit cd. + akapit-cd + {"tag": "akap_cd"} + insert_tag + + + + + + + + akapit dialogowy + akapit-dialogowy + {"tag": "akap_dialog"} + insert_tag + + + + + + + + akt + akt + {"tag": "akt"} + insert_tag + + + + + + + + autor + autor + {"tag": "autor"} + insert_tag + + + + + + + + część/księga + czesc + {"tag": "naglowek_czesc"} + insert_tag + + + + + + + + dedykacja + dedykacja + {"tag": "dedykacja"} + insert_tag + + + + + + + + + didaskalia + didaskalia + {"tag": "didaskalia"} + insert_tag + + + + + + + + + didaskalia początkowe + didaskalia-poczatkowe + {"tag": "miejsce_czas"} + insert_tag + + + + + + + + didaskalia wewn. + didaskalia-wewn + {"tag": "didask_tekst"} + insert_tag + + + + + + + + + dramat wiersz. + dramat-wiersz + {"tag": "dramat_wierszowany_l"} + insert_tag + + + + + + + + dramat wiersz./w. łam + dramat-wiersz-w-lam + {"tag": "dramat_wierszowany_lp"} + insert_tag + + + + + + + + dramat współczesny + dramat-wspolczesny + {"tag": "dramat_wspolczesny"} + insert_tag + + + + + + + + dzieło nadrzędne + dzielo-nadrzedne + {"tag": "dzielo_nadrzedne"} + insert_tag + + + + + + + + długi cyt. poet. + dlugi-cyt-poet + {"tag": "poezja_cyt"} + insert_tag + + + + + + + + + długi cytat + dlugi-cytat + {"tag": "dlugi_cyt"} + insert_tag + + + + + + + + + ekstra + ekstra + {"tag": "ekstra"} + insert_tag + + + + + + + + kwestia + kwestia + {"tag": "kwestia"} + insert_tag + + + + + + + + + liryka + liryka + {"tag": "liryka_l"} + insert_tag + + + + + + + + liryka/w. łam + liryka-w-lam + {"tag": "liryka_lp"} + insert_tag + + + + + + + + lista osób: pole + lista-osob-pole + {"tag": "lista_osoba", "attrs": {"typ": ""}} + insert_tag + + + + + + + + mamtemat. + matemat + {"tag": "mat"} + insert_tag + + + + + + + + motto + motto + {"tag": "motto"} + insert_tag + + + + + + + + + motto podpis + motto-podpis + {"tag": "motto_podpis"} + insert_tag + + + + + + + + nagłówek kwestii + naglowek-kwestii + {"tag": "naglowek_osoba"} + insert_tag + + + + + + + + nota + nota + {"tag": "nota"} + insert_tag + + + + + + + + opowiadanie + opowiadanie + {"tag": "opowiadanie"} + insert_tag + + + + + + + + osoba + osoba + {"tag": "osoba"} + insert_tag + + + + + + + + + podrozdział + podrozdzial + {"tag": "naglowek_podrozdzial"} + insert_tag + + + + + + + + Podstawowa + basic_correction + {"exprs": [["\n\\d+\n", "\n"], ["-\\s*\n+", ""], ["\\,\\.\\.|\\.\\,\\.|\\.\\.\\,", "..."]]} + fulltextregexp + + Wykonuję operację z novel-pages i poem-pages. + + + + + + podtytuł + podtytul + {"tag": "podtytul"} + insert_tag + + + + + + + + powieść + powiesc + {"tag": "powiesc"} + insert_tag + + + + + + + + przypis autorski + przypis-autorski + {"tag": "pa"} + insert_tag + + + + + + + + przypis edytorski + przypis-edytorski + {"tag": "pe"} + insert_tag + + + + + + + + przypis redaktorski + przypis-redaktorski + {"tag": "pr"} + insert_tag + + + + + + + + przypis tłumacza + przypis-tlumacza + {"tag": "pt"} + insert_tag + + + + + + + + rozdział + rozdzial + {"tag": "naglowek_rozdzial"} + insert_tag + + + + + + + + scena + scena + {"tag": "naglowek_scena"} + insert_tag + + + + + + + + sep. asteryks + sep-asteryks + {"tag": "sekcja_asteryks"} + insert_tag + + + + + + + + sep. linia + sep-linia + {"tag": "separator_linia"} + insert_tag + + + + + + + + sep. światło + sep-swiatlo + {"tag": "sekcja_swiatlo"} + insert_tag + + + + + + + + śródtytuł + srodtytul + {"tag": "srodtytul"} + insert_tag + + + + + + + + strofa + strofa + {"tag": "strofa"} + insert_tag + s + + + + + + + + słowo obce + slowo-obce + {"tag": "slowo_obce"} + insert_tag + + + + + + + + tagi główne + tagi-glowne + {"tag": "utwor"} + insert_tag + + + + + + + + tytuł + tytul + {"tag": "nazwa_utworu"} + insert_tag + + + + + + + + tytuł dzieła + tytul-dziela + {"tag": "tytul_dziela", "attrs": {"typ": "1"}} + insert_tag + + + + + + + + Usuń spację + strip_whitespace + {"exprs": [["^\\s+|\\s+$", ""], ["\\s+", " "]]} + lineregexp + + Usuwa zbędne spację z dokumentu. + + + + + + uwaga + uwaga + {"tag": "uwaga"} + insert_tag + + + + + + + + wers akap. + wers-akap + {"tag": "wers_akap"} + insert_tag + + + + + + + + + wers cd. + wers-cd + {"tag": "wers_cd"} + insert_tag + + + + + + + + + Wers wcięty + wers-wciety + {"tag": "wers_wciety", "attrs": {"typ": ""}} + insert_tag + + + + + + + + + www + www + {"tag": "www"} + insert_tag + + + + + + + + wyróżnienie + wyroznienie + {"tag": "wyroznienie"} + insert_tag + + + + + + + + wywiad + wywiad + {"tag": "wywiad"} + insert_tag + + + + + + + + wywiad odpowiedź + wywiad-odpowiedz + {"tag": "wywiad_odp"} + insert_tag + + + + + + + + wywiad pytanie + wywiad-pytanie + {"tag": "wywiad_pyt"} + insert_tag + + + + + + + + Zamień cudzysłowy + zamien-cudzyslowy + {"exprs": [["\u00bb|\u201e", ",,"], ["\u00ab", "\""], ["\"([\u0104\u0118\u00d3\u0141\u017b\u0179\u0106\u0143\u0105\u017c\u017a\u015b\u0144\u00f3\u0142\u0107\\w])", ",,$1"]]} + lineregexp + + + + + + + + Zamień dywiz + zamien_dywiz + {"exprs": [["(\\d)[\u2014-](\\d)", "$1--$2"], ["\u2014", "---"]]} + lineregexp + + Zamienia '—' na '---', oraz '1—2' na '1--2'. + + + + + + zastępnik wersu + zastepnik-wersu + {"tag": "zastepnik_wersu"} + insert_tag + + + + + + + + var texteditor = panel.texteditor; + +var text = texteditor.selection(); + +var out = '<'+params.tag; + +for (var attr in params.attrs) { + + out += ' '+attr+'="' + params.attrs[attr] + '"'; + +}; + +out += '>'; + +out += text; + +out += '</' + params.tag + '>'; + + + +texteditor.replaceSelection(out); + + + +if (text.length == 0) { + + var pos = texteditor.cursorPosition(); + + texteditor.selectLines(pos.line, pos.character + params.tag.length + 2); + +} + + + +panel.fireEvent('contentChanged'); + + + editor.showPopup('generic-info', 'Przetwarzanie zaznaczonego tekstu...', '', -1); + +var cm = panel.texteditor; +var exprs = $.map(params.exprs, function(expr) { + + var opts = "g"; + + if(expr.length > 2) + + opts = expr[2]; + + return {rx: new RegExp(expr[0], opts), repl: expr[1]}; + +}); + + + +var partial = true; + +var text = cm.selection(); + + + +if(!text) { + + var cpos = cm.cursorPosition(); + + cpos.line = cm.lineNumber(cpos.line) + + cm.selectLines(cm.firstLine(), 0, cm.lastLine(), 0); + + text = cm.selection(); + + partial = false; + +} + + + +var changed = 0; +var lines = text.split('\n'); +var lines = $.map(lines, function(line) { + var old_line = line; + $(exprs).each(function() { + var expr = this; + line = line.replace(expr.rx, expr.repl); + }); + + if(old_line != line) changed += 1; + return line; +}); + +if(changed > 0) +{ + cm.replaceSelection( lines.join('\n') ); + panel.fireEvent('contentChanged'); + editor.showPopup('generic-yes', 'Zmieniono ' + changed + ' linii.', 1500); + editor.advancePopupQueue(); +} +else { + editor.showPopup('generic-info', 'Brak zmian w tekście', 1500); + editor.advancePopupQueue(); +} + +if(!partial) + cm.selectLines( cm.nthLine(cpos.line), cpos.character ) + + + var texteditor = panel.texteditor; + +var frameBody = $('body', $(texteditor.frame).contents()); + + + +if(params.fontSize) { + + frameBody.css('font-size', params.fontSize); + +} + +else { + + var old_size = parseInt(frameBody.css('font-size')); + + frameBody.css('font-size', old_size + (params.change || 0) ); + +} + + + editor.showPopup('generic-info', 'Przetwarzanie zaznaczonego tekstu...', '', -1); + +var cm = panel.texteditor; + +var exprs = $.map(params.exprs, function(expr) { + var opts = "mg"; + if(expr.length > 2) + opts = expr[2]; + + return {rx: new RegExp(expr[0], opts), repl: expr[1]}; +}); + +var partial = true; +var text = cm.selection(); + +if(!text) { + var cpos = cm.cursorPosition(); + cpos.line = cm.lineNumber(cpos.line) + cm.selectLines(cm.firstLine(), 0, cm.lastLine(), 0); + + text = cm.selection(); + partial = false; +} + + + +var original = text; +$(exprs).each(function() { + text = text.replace(this.rx, this.repl); +}); + +if( original != text) +{ + cm.replaceSelection(text); + panel.fireEvent('contentChanged'); + editor.showPopup('generic-yes', 'Zmieniono tekst' ); + editor.advancePopupQueue(); +} +else { + editor.showPopup('generic-info', 'Brak zmian w tekście.'); + editor.advancePopupQueue(); +} + +if(!partial) { + cm.selectLines( cm.nthLine(cpos.line), cpos.character ); +} + + + params.each(function() { + + editor.callScriptlet(this[0], this[1]); + +}); + + + var cm = panel.texteditor; + +var text = cm.selection(); + +if(!text) return; + +var repl = text.toLowerCase(); + +if(repl != text) { + + cm.replaceSelection(repl); + + panel.fireEvent('contentChanged'); + +}; + + diff --git a/fixtures/przyciski.yaml b/fixtures/przyciski.yaml deleted file mode 100644 index a8cef760..00000000 --- a/fixtures/przyciski.yaml +++ /dev/null @@ -1,73 +0,0 @@ -- fields: {name: Autokorekta, position: 0, slug: autokorekta} - model: toolbar.buttongroup - pk: 2 -- fields: {name: Formatowanie, position: 0, slug: formatowanie} - model: toolbar.buttongroup - pk: 1 -- fields: - group: [2] - key: '' - label: Novelpages - params: "({exprs: [\r\n [\"\\\\,\\\\.\\\\.|\\\\.\\\\,\\\\.|\\\\.\\\\.\\\\,\"\ - , \"...\"],\r\n [\"\u201E\", \",,\"] /* DOUBLE LOW-9 QUOTATION MARK */\r\n\ - ]})\r\n " - scriptlet: lineregexp - slug: novelpages - tooltip: "Wykonuj\u0119 operacj\u0119 z novel-pages." - model: toolbar.button - pk: 4 -- fields: - group: [2] - key: '' - label: "Usu\u0144 spacj\u0119" - params: '({exprs: [ ["^\\s+|\\s+$", ""], ["\\s+", " "] ]})' - scriptlet: lineregexp - slug: strip_whitespace - tooltip: "Usuwa zb\u0119dne spacj\u0119 z dokumentu." - model: toolbar.button - pk: 3 -- fields: - group: [1] - key: w - label: Wers - params: '({tag: ''wers''})' - scriptlet: insert_tag - slug: insert_verse - tooltip: Otacza zaznaczony tekst tagiem 'wers'. - model: toolbar.button - pk: 1 -- fields: - group: [2] - key: '' - label: "Zamie\u0144 dywiz" - params: "({exprs:[ [\"\u2014\",\"---\"] ]})" - scriptlet: lineregexp - slug: zamien_dywiz - tooltip: "Zamienia '\u2014' na '---'." - model: toolbar.button - pk: 2 -- fields: {code: "$.log(editor, panel, params);\r\n\r\nvar texteditor = panel.texteditor;\r\ - \nvar text = texteditor.selection();\r\ntexteditor.replaceSelection('<' + params.tag\ - \ + '>' + text + '');\r\nif (text.length == 0) \r\n{\r\n\ - \ var pos = texteditor.cursorPosition();\r\n texteditor.selectLines(pos.line,\ - \ pos.character + params.tag.length + 2);\r\n}\r\n\r\npanel.fireEvent('contentChanged');"} - model: toolbar.scriptlet - pk: insert_tag -- fields: {code: "// params: {exprs: list of {expr: \"\", repl: \"\" [, opts: \"g\"\ - ]}}\r\nvar cm = panel.texteditor;\r\n\r\nvar exprs = $.map(params.exprs, function(expr)\ - \ {\r\n var opts = \"g\";\r\n if(expr.length > 2)\r\n opts = expr[2];\r\ - \n return {rx: new RegExp(expr[0], opts), repl: expr[1]};\r\n});\r\n\r\n\ - var selection = cm.selection();\r\n\r\nif(selection) \r\n{\r\n var lines\ - \ = selection.split('\\n');\r\n lines = $.map(lines, function(line) { \r\n\ - \ $(exprs).each(function() { \r\n var expr = this;\r\n \ - \ line = line.replace(expr.rx, expr.repl);\r\n });\r\n \ - \ return line;\r\n });\r\n cm.replaceSelection( lines.join('\\n') );\r\ - \n}\r\nelse {\r\n var line = cm.firstLine();\r\n do {\r\n var content\ - \ = cm.lineContent(line);\r\n $.log(\"Swapping line: $\" + content +\ - \ \"$\");\r\n \r\n $(exprs).each(function() { var expr = this;\r\n\ - \ content = content.replace(expr.rx, expr.repl);\r\n });\r\ - \n cm.setLineContent(line, content);\r\n line = cm.nextLine(line);\r\ - \n } while( !(line === false) );\r\n}"} - model: toolbar.scriptlet - pk: lineregexp - diff --git a/project/static/js/editor.js b/project/static/js/editor.js index 3490b9a1..f7f4cf31 100644 --- a/project/static/js/editor.js +++ b/project/static/js/editor.js @@ -1,3 +1,21 @@ +function Hotkey(code) { + this.code = code + this.has_alt = ((code & 0x01 << 8) != 0) + this.has_ctrl = ((code & 0x01 << 9) != 0) + this.has_shift = ((code & 0x01 << 10) != 0) + this.character = String.fromCharCode(code & 0xff) +} + + +Hotkey.prototype.toString = function() { + mods = [] + if(this.has_alt) mods.push('Alt') + if(this.has_ctrl) mods.push('Ctrl') + if(this.has_shift) mods.push('Shift') + mods.push('"'+this.character+'"') + return mods.join('+') +} + function Panel(panelWrap) { var self = this; self.hotkeys = []; @@ -122,12 +140,12 @@ Panel.prototype.connectToolbar = function() // connect group-switch buttons var group_buttons = $('*.toolbar-tabs-container button', toolbar); - $.log('Found groups:', group_buttons); + // $.log('Found groups:', group_buttons); group_buttons.each(function() { var group = $(this); var group_name = group.attr('ui:group'); - $.log('Connecting group: ' + group_name); + // $.log('Connecting group: ' + group_name); group.click(function() { // change the active group @@ -151,6 +169,7 @@ Panel.prototype.connectToolbar = function() action_buttons.each(function() { var button = $(this); var hk = button.attr('ui:hotkey'); + if(hk) hk = new Hotkey( parseInt(hk) ); try { var params = $.evalJSON(button.attr('ui:action-params')); @@ -166,15 +185,18 @@ Panel.prototype.connectToolbar = function() // connect button button.click(callback); - + // connect hotkey - if(hk) self.hotkeys[parseInt(hk)] = callback; - + if(hk) { + self.hotkeys[hk.code] = callback; + $.log('hotkey', hk); + } + // tooltip if (button.attr('ui:tooltip') ) { var tooltip = button.attr('ui:tooltip'); - if(hk) tooltip += ' [Alt+'+hk+']'; + if(hk) tooltip += ' ['+hk+']'; button.wTooltip({ delay: 1000, @@ -193,13 +215,24 @@ Panel.prototype.connectToolbar = function() Panel.prototype.hotkeyPressed = function(event) { - var callback = this.hotkeys[event.keyCode]; + code = event.keyCode; + if(event.altKey) code = code | 0x100; + if(event.ctrlKey) code = code | 0x200; + if(event.shiftKey) code = code | 0x400; + + var callback = this.hotkeys[code]; if(callback) callback(); } Panel.prototype.isHotkey = function(event) { - if( event.altKey && (this.hotkeys[event.keyCode] != null) ) + code = event.keyCode; + if(event.altKey) code = code | 0x100; + if(event.ctrlKey) code = code | 0x200; + if(event.shiftKey) code = code | 0x400; + + if(this.hotkeys[code] != null) return true; + return false; } @@ -522,7 +555,7 @@ Editor.prototype.showPopup = function(name, text, timeout) var box = $('#message-box > #' + name); $('*.data', box).html(text || ''); - box.fadeIn(); + box.fadeIn(100); if(timeout > 0) setTimeout( $.fbind(self, self.advancePopupQueue), timeout); @@ -534,14 +567,14 @@ Editor.prototype.advancePopupQueue = function() { if(elem) { var box = $('#message-box > #' + elem[0]); - box.fadeOut(200, function() + box.fadeOut(100, function() { - $('*.data', box).html(); + $('*.data', box).html(''); if( self.popupQueue.length > 0) { var ibox = $('#message-box > #' + self.popupQueue[0][0]); - $('*.data', ibox).html(self.popupQueue[0][1]); - ibox.fadeIn(); + $('*.data', ibox).html(self.popupQueue[0][1] || ''); + ibox.fadeIn(100); if(self.popupQueue[0][2] > 0) setTimeout( $.fbind(self, self.advancePopupQueue), self.popupQueue[0][2]); } diff --git a/project/templates/explorer/file_list.html b/project/templates/explorer/file_list.html index a36d353a..d47a158a 100644 --- a/project/templates/explorer/file_list.html +++ b/project/templates/explorer/file_list.html @@ -48,7 +48,9 @@ $(function() {

Dodaj nowy utwór

- {{ bookform.as_p }} +

+

+

diff --git a/project/templates/explorer/panels/xmleditor.html b/project/templates/explorer/panels/xmleditor.html index 3a1baf1c..5c622bbf 100644 --- a/project/templates/explorer/panels/xmleditor.html +++ b/project/templates/explorer/panels/xmleditor.html @@ -16,7 +16,7 @@ panel_hooks = { var textareaId = 'xmleditor-' + Math.ceil(Math.random() * 1000000000); $('textarea', panel).attr('id', textareaId); - var texteditor = CodeMirror.fromTextArea(textareaId, { + var texteditor = CodeMirror.fromTextArea(textareaId, { parserfile: 'parsexml.js', path: "{{STATIC_URL}}js/codemirror/", stylesheet: "{{STATIC_URL}}css/xmlcolors.css",