119 lines
3.4 KiB
Python
119 lines
3.4 KiB
Python
# Copyright (c) 2008 Joost Cassee
|
|
# Licensed under the terms of the MIT License (see LICENSE.txt)
|
|
|
|
import json
|
|
import logging
|
|
|
|
from django.http import HttpResponse, JsonResponse
|
|
from django.shortcuts import render
|
|
from django.urls import reverse
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
|
|
from tinymce.compressor import gzip_compressor
|
|
|
|
try:
|
|
import enchant
|
|
except ImportError:
|
|
enchant = None
|
|
|
|
|
|
@csrf_exempt
|
|
def spell_check(request):
|
|
"""
|
|
Returns a response that implements the TinyMCE spellchecker protocol.
|
|
"""
|
|
try:
|
|
if not enchant:
|
|
raise RuntimeError(
|
|
"install pyenchant for spellchecker functionality")
|
|
|
|
method = request.POST.get("method")
|
|
text = request.POST.get("text")
|
|
lang = request.POST.get("lang")
|
|
|
|
if not enchant.dict_exists(lang):
|
|
e_msg = f"Dictionary not found for language '{lang}', check pyenchant."
|
|
raise RuntimeError(e_msg)
|
|
|
|
checker = enchant.Dict(lang)
|
|
|
|
def sanitize_words(text):
|
|
"""
|
|
Sanitize words in text and recommend suggestions for wrong words.
|
|
"""
|
|
suggested_words = {}
|
|
words = text.split()
|
|
for word in words:
|
|
word.strip()
|
|
word.strip(".,:;'\"")
|
|
if not checker.check(word):
|
|
suggested_words[word] = checker.suggest(word)
|
|
return suggested_words
|
|
|
|
if method == "spellcheck":
|
|
output = {"words": sanitize_words(text)}
|
|
else:
|
|
e_msg = f"Got an unexpected method '{method}'"
|
|
raise RuntimeError(e_msg)
|
|
|
|
except Exception as err:
|
|
logging.exception("Error running spellchecker")
|
|
output = {"error": str(err)}
|
|
|
|
return JsonResponse(output)
|
|
|
|
|
|
def flatpages_link_list(request):
|
|
"""
|
|
Returns a HttpResponse whose content is a Javascript file representing a
|
|
list of links to flatpages.
|
|
"""
|
|
from django.contrib.flatpages.models import FlatPage
|
|
|
|
link_list = [(page.title, page.url) for page in FlatPage.objects.all()]
|
|
return render_to_link_list(link_list)
|
|
|
|
|
|
def compressor(request):
|
|
"""
|
|
Returns a GZip-compressed response.
|
|
"""
|
|
return gzip_compressor(request)
|
|
|
|
|
|
def render_to_link_list(link_list):
|
|
"""
|
|
Returns a HttpResponse whose content is a Javascript file representing a
|
|
list of links suitable for use wit the TinyMCE external_link_list_url
|
|
configuration option. The link_list parameter must be a list of 2-tuples.
|
|
"""
|
|
return render_to_js_vardef("tinyMCELinkList", link_list)
|
|
|
|
|
|
def render_to_image_list(image_list):
|
|
"""
|
|
Returns a HttpResponse whose content is a Javascript file representing a
|
|
list of images suitable for use wit the TinyMCE external_image_list_url
|
|
configuration option. The image_list parameter must be a list of 2-tuples.
|
|
"""
|
|
return render_to_js_vardef("tinyMCEImageList", image_list)
|
|
|
|
|
|
def render_to_js_vardef(var_name, var_value):
|
|
output = f"var {var_name} = {json.dumps(var_value)};"
|
|
return HttpResponse(output, content_type="application/x-javascript")
|
|
|
|
|
|
def filebrowser(request):
|
|
try:
|
|
fb_url = reverse("fb_browse")
|
|
except Exception:
|
|
fb_url = reverse("filebrowser:fb_browse")
|
|
|
|
return render(
|
|
request,
|
|
"tinymce/filebrowser.js",
|
|
{"fb_url": fb_url},
|
|
content_type="application/javascript",
|
|
)
|