123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- # -*- 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,
- ())
|