Hello, Attached patch implements a filter for Django templates.
Regads, Sergey
Index: Makefile.am =================================================================== RCS file: /sources/aspell/aspell/Makefile.am,v retrieving revision 1.64 diff -p -u -r1.64 Makefile.am --- Makefile.am 7 Jul 2011 06:21:05 -0000 1.64 +++ Makefile.am 10 Mar 2012 14:52:13 -0000 @@ -182,7 +182,8 @@ optfiles = \ modules/filter/html-filter.info\ modules/filter/context-filter.info\ modules/filter/nroff-filter.info\ - modules/filter/texinfo-filter.info + modules/filter/texinfo-filter.info\ + modules/filter/django-filter.info ### Add any extra data files your filter uses here fltdata = \ @@ -222,7 +223,8 @@ libaspell_la_SOURCES +=\ modules/filter/sgml.cpp\ modules/filter/context.cpp\ modules/filter/nroff.cpp\ - modules/filter/texinfo.cpp + modules/filter/texinfo.cpp\ + modules/filter/django.cpp else # not COMPILE_IN_FILTERS @@ -233,7 +235,8 @@ filter_ldflags = -module -avoid-version ### must look like lib<filtername>-filter.la see development manual filter_LTLIBRARIES = email-filter.la tex-filter.la\ sgml-filter.la context-filter.la\ - nroff-filter.la texinfo-filter.la + nroff-filter.la texinfo-filter.la\ + django-filter.la email_filter_la_SOURCES = modules/filter/email.cpp email_filter_la_LIBADD = libaspell.la @@ -259,6 +262,10 @@ texinfo_filter_la_SOURCES = modules/fil texinfo_filter_la_LIBADD = libaspell.la texinfo_filter_la_LDFLAGS = ${filter_ldflags} +django_filter_la_SOURCES = modules/filter/django.cpp +django_filter_la_LIBADD = libaspell.la +django_filter_la_LDFLAGS = ${filter_ldflags} + ### Before this line add the corresponding <yourfilterlibrary>_SOURCES and ### <yourfilterlibrary>_LIBADD lines. The later at least has to look ### like <yourfilterlibrary>_LIBADD = ${top_builddir}/lib/libaspell.la --- /dev/null 2008-08-31 00:18:45.000000000 +0300 +++ modules/filter/django.cpp 2012-03-10 13:08:16.000000000 +0200 @@ -0,0 +1,130 @@ +/* This file is part of The New Aspell + + Copyright (C) 2012 Sergey Poznyakoff + + GNU Aspell free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + GNU Aspell 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with GNU Aspell. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <stdio.h> + +#include "settings.h" +#include "asc_ctype.hpp" +#include "config.hpp" +#include "indiv_filter.hpp" +#include "string_map.hpp" +#include "mutable_container.hpp" +#include "clone_ptr.hpp" +#include "filter_char_vector.hpp" + +namespace +{ + using namespace aspell; + + class DjangoFilter : public NormalFilter + { + private: + enum filter_state { + initial, // initial state: print everything + brace, // open brace seen + escape, // within Django braces: skip until close_brace + maybe_close // close_brace[0] seen + } state; + + char close_brace[2]; // sequence of characters that ends brace state. + + bool inline process_char (FilterChar::Chr c); + + public: + + PosibErr<bool> setup(Config *) + { + set_name("django"); + set_order_num(0.20); + reset(); + return true; + }; + void reset() + { + state = initial; + }; + void process(FilterChar * &, FilterChar * &); + }; + + bool DjangoFilter::process_char(FilterChar::Chr c) + { + switch (state) + { + case initial: + if (c == '{') + state = brace; + return false; + + case brace: + switch (c) + { + case '#': /* comment */ + case '%': /* code */ + close_brace[0] = c; + close_brace[1] = '}'; + state = escape; + break; + + case '{': /* variable reference */ + close_brace[0] = '}'; + close_brace[1] = '}'; + state = escape; + break; + + default: + state = initial; + } + return false; + + case escape: + if (c == close_brace[0]) + state = maybe_close; + return true; + + case maybe_close: + if (c == close_brace[1]) + state = initial; + else + state = escape; + return false; + } + return true; + } + + void DjangoFilter::process(FilterChar * & str, FilterChar * & stop) + { + FilterChar * cur = str; + for (; cur != stop; cur++) + { + if (process_char (*cur)) + *cur = ' '; + } + } +} + +C_EXPORT +IndividualFilter * new_aspell_django_filter() { + return new DjangoFilter; +} +
_______________________________________________ Aspell-devel mailing list Aspell-devel@gnu.org https://lists.gnu.org/mailman/listinfo/aspell-devel