161 lines
6.6 KiB
Java
161 lines
6.6 KiB
Java
# -*- encoding: UTF-8 -*-
|
|
# Lightproof grammar checker for LibreOffice and OpenOffice.org
|
|
# 2009-2012 (c) László Németh (nemeth at numbertext org), license: MPL 1.1 / GPLv3+ / LGPLv3+
|
|
|
|
import uno, unohelper, os, sys, traceback
|
|
from lightproof_impl_en import locales
|
|
from lightproof_impl_en import pkg
|
|
import lightproof_impl_en
|
|
import lightproof_handler_en
|
|
|
|
from com.sun.star.linguistic2 import XProofreader, XSupportedLocales
|
|
from com.sun.star.linguistic2 import ProofreadingResult, SingleProofreadingError
|
|
from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName
|
|
from com.sun.star.lang import Locale
|
|
# reload in obj.reload in Python 3
|
|
try:
|
|
from obj import reload
|
|
except:
|
|
pass
|
|
|
|
class Lightproof( unohelper.Base, XProofreader, XServiceInfo, XServiceName, XServiceDisplayName, XSupportedLocales):
|
|
|
|
def __init__( self, ctx, *args ):
|
|
self.ctx = ctx
|
|
self.ServiceName = "com.sun.star.linguistic2.Proofreader"
|
|
self.ImplementationName = "org.libreoffice.comp.pyuno.Lightproof." + pkg
|
|
self.SupportedServiceNames = (self.ServiceName, )
|
|
self.locales = []
|
|
for i in locales:
|
|
l = locales[i]
|
|
self.locales += [Locale(l[0], l[1], l[2])]
|
|
self.locales = tuple(self.locales)
|
|
currentContext = uno.getComponentContext()
|
|
lightproof_impl_en.SMGR = currentContext.ServiceManager
|
|
lightproof_impl_en.spellchecker = \
|
|
lightproof_impl_en.SMGR.createInstanceWithContext("com.sun.star.linguistic2.SpellChecker", currentContext)
|
|
lightproof_handler_en.load(currentContext)
|
|
|
|
# XServiceName method implementations
|
|
def getServiceName(self):
|
|
return self.ImplementationName
|
|
|
|
# XServiceInfo method implementations
|
|
def getImplementationName (self):
|
|
return self.ImplementationName
|
|
|
|
def supportsService(self, ServiceName):
|
|
return (ServiceName in self.SupportedServiceNames)
|
|
|
|
def getSupportedServiceNames (self):
|
|
return self.SupportedServiceNames
|
|
|
|
# XSupportedLocales
|
|
def hasLocale(self, aLocale):
|
|
if aLocale in self.locales:
|
|
return True
|
|
for i in self.locales:
|
|
if (i.Country == aLocale.Country or i.Country == "") and aLocale.Language == i.Language:
|
|
return True
|
|
return False
|
|
|
|
def getLocales(self):
|
|
return self.locales
|
|
|
|
# XProofreader
|
|
def isSpellChecker(self):
|
|
return False
|
|
|
|
def doProofreading(self, nDocId, rText, rLocale, nStartOfSentencePos, \
|
|
nSuggestedSentenceEndPos, rProperties):
|
|
aRes = uno.createUnoStruct( "com.sun.star.linguistic2.ProofreadingResult" )
|
|
aRes.aDocumentIdentifier = nDocId
|
|
aRes.aText = rText
|
|
aRes.aLocale = rLocale
|
|
aRes.nStartOfSentencePosition = nStartOfSentencePos
|
|
aRes.nStartOfNextSentencePosition = nSuggestedSentenceEndPos
|
|
aRes.aProperties = ()
|
|
aRes.xProofreader = self
|
|
aRes.aErrors = ()
|
|
# PATCH FOR LO 4
|
|
# Fix for http://nabble.documentfoundation.org/Grammar-checker-Undocumented-change-in-the-API-for-LO-4-td4030639.html
|
|
if nStartOfSentencePos != 0:
|
|
return aRes
|
|
aRes.nStartOfNextSentencePosition = len(rText)
|
|
if len(rProperties) > 0 and rProperties[0].Name == "Update":
|
|
try:
|
|
import lightproof_compile_en
|
|
try:
|
|
code = lightproof_compile_en.c(rProperties[0].Value, rLocale.Language, True)
|
|
except Exception as e:
|
|
aRes.aText, aRes.nStartOfSentencePosition = e
|
|
return aRes
|
|
path = lightproof_impl_en.get_path()
|
|
f = open(path.replace("_impl", ""), "w")
|
|
f.write("dic = %s" % code["rules"])
|
|
f.close()
|
|
if pkg in lightproof_impl_en.langrule:
|
|
mo = lightproof_impl_en.langrule[pkg]
|
|
reload(mo)
|
|
lightproof_impl_en.compile_rules(mo.dic)
|
|
lightproof_impl_en.langrule[pkg] = mo
|
|
if "code" in code:
|
|
f = open(path, "r")
|
|
ft = f.read()
|
|
f.close()
|
|
f = open(path, "w")
|
|
f.write(ft[:ft.find("# [code]") + 8] + "\n" + code["code"])
|
|
f.close()
|
|
try:
|
|
reload(lightproof_impl_en)
|
|
except Exception as e:
|
|
aRes.aText = e.args[0]
|
|
if e.args[1][3] == "": # "expected an indented block" (end of file)
|
|
aRes.nStartOfSentencePosition = len(rText.split("\n"))
|
|
else:
|
|
aRes.nStartOfSentencePosition = rText.split("\n").index(e.args[1][3][:-1]) + 1
|
|
return aRes
|
|
aRes.aText = ""
|
|
return aRes
|
|
except:
|
|
if 'PYUNO_LOGLEVEL' in os.environ:
|
|
print(traceback.format_exc())
|
|
|
|
l = rText[aRes.nStartOfNextSentencePosition:aRes.nStartOfNextSentencePosition+1]
|
|
while l == " ":
|
|
aRes.nStartOfNextSentencePosition = aRes.nStartOfNextSentencePosition + 1
|
|
l = rText[aRes.nStartOfNextSentencePosition:aRes.nStartOfNextSentencePosition+1]
|
|
if aRes.nStartOfNextSentencePosition == nSuggestedSentenceEndPos and l!="":
|
|
aRes.nStartOfNextSentencePosition = nSuggestedSentenceEndPos + 1
|
|
aRes.nBehindEndOfSentencePosition = aRes.nStartOfNextSentencePosition
|
|
|
|
try:
|
|
aRes.aErrors = lightproof_impl_en.proofread( nDocId, rText, rLocale, \
|
|
nStartOfSentencePos, aRes.nBehindEndOfSentencePosition, rProperties)
|
|
except Exception as e:
|
|
if len(rProperties) > 0 and rProperties[0].Name == "Debug" and len(e.args) == 2:
|
|
aRes.aText, aRes.nStartOfSentencePosition = e
|
|
else:
|
|
if 'PYUNO_LOGLEVEL' in os.environ:
|
|
print(traceback.format_exc())
|
|
return aRes
|
|
|
|
def ignoreRule(self, rid, aLocale):
|
|
lightproof_impl_en.ignore[rid] = 1
|
|
|
|
def resetIgnoreRules(self):
|
|
lightproof_impl_en.ignore = {}
|
|
|
|
# XServiceDisplayName
|
|
def getServiceDisplayName(self, aLocale):
|
|
return lightproof_impl_en.name
|
|
|
|
g_ImplementationHelper = unohelper.ImplementationHelper()
|
|
g_ImplementationHelper.addImplementation( Lightproof, \
|
|
"org.libreoffice.comp.pyuno.Lightproof." + pkg,
|
|
("com.sun.star.linguistic2.Proofreader",))
|
|
|
|
g_ImplementationHelper.addImplementation( lightproof_handler_en.LightproofOptionsEventHandler, \
|
|
"org.libreoffice.comp.pyuno.LightproofOptionsEventHandler." + pkg,
|
|
())
|