r46251 - in /packages/bibus/trunk/debian: bibOOoBase.py changelog rules

beathovn-guest at users.alioth.debian.org beathovn-guest at users.alioth.debian.org
Sun Sep 8 19:28:58 UTC 2013


Author: beathovn-guest
Date: Sun Sep  8 19:28:54 2013
New Revision: 46251

URL: http://svn.debian.org/wsvn/debian-science/?sc=1&rev=46251
Log:
Add bibOOoBase.py from upstream CVS that makes bibus cooperate with LibreOffice 4.1.1

Added:
    packages/bibus/trunk/debian/bibOOoBase.py
Modified:
    packages/bibus/trunk/debian/changelog
    packages/bibus/trunk/debian/rules

Added: packages/bibus/trunk/debian/bibOOoBase.py
URL: http://svn.debian.org/wsvn/debian-science/packages/bibus/trunk/debian/bibOOoBase.py?rev=46251&op=file
==============================================================================
--- packages/bibus/trunk/debian/bibOOoBase.py	(added)
+++ packages/bibus/trunk/debian/bibOOoBase.py	Sun Sep  8 19:28:54 2013
@@ -0,0 +1,864 @@
+# Copyright 2004,2005 Pierre Martineau <pmartino at users.sourceforge.net>
+# This file is part of bibOOo, a python package to manipulate
+# bibliography in an OpenOffice.org writer document.
+#
+# bibOOo is part of Bibus a free software;
+# you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#/home/pmartino/Desktop/Bibus/bibus-cvs/bibus/bibOOo/bibOOoBase.py
+# bibOOo 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Bibus; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.
+#
+# this class implements basic interaction between a biliographic software and OOo
+
+    # py2.2, to be removed in python 2.3
+import sys, os
+import uno
+# below we commented the normal way to call the class/constants
+# the form used is to be compatible with cx_freeze
+#from com.sun.star.connection import NoConnectException
+NoConnectException = uno.getClass("com.sun.star.connection.NoConnectException")
+#from com.sun.star.uno  import RuntimeException
+RuntimeException = uno.getClass("com.sun.star.uno.RuntimeException")
+#from com.sun.star.lang import IllegalArgumentException, DisposedException
+IllegalArgumentException = uno.getClass("com.sun.star.lang.IllegalArgumentException")
+DisposedException = uno.getClass("com.sun.star.lang.DisposedException")
+#from com.sun.star.io import IOException
+IOException = uno.getClass("com.sun.star.io.IOException")
+#from com.sun.star.container import NoSuchElementException
+NoSuchElementException = uno.getClass("com.sun.star.container.NoSuchElementException")
+#from com.sun.star.util import URL
+URL = uno.getClass("com.sun.star.util.URL")
+#from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
+PARAGRAPH_BREAK = uno.getConstantByName("com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK")
+#from com.sun.star.beans import PropertyValue
+PropertyValue = uno.getClass("com.sun.star.beans.PropertyValue")
+#from com.sun.star.beans.PropertyState import DIRECT_VALUE
+# DIRECT_VALUE = uno.getConstantByName("com.sun.star.beans.PropertyState.DIRECT_VALUE")
+DIRECT_VALUE = uno.Enum("com.sun.star.beans.PropertyState","DIRECT_VALUE")
+#from com.sun.star.lang import Locale
+Locale = uno.getClass("com.sun.star.lang.Locale")
+# Styles
+#from com.sun.star.awt.FontSlant import ITALIC, NONE
+#FontSlantNone = NONE
+#ITALIC = uno.getConstantByName("com.sun.star.awt.FontSlant.ITALIC")
+ITALIC = uno.Enum("com.sun.star.awt.FontSlant","ITALIC")
+#FontSlantNone = uno.getConstantByName("com.sun.star.awt.FontSlant.NONE")
+FontSlantNone = uno.Enum("com.sun.star.awt.FontSlant","NONE")
+#from com.sun.star.awt.FontWeight import BOLD, NORMAL
+BOLD = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
+NORMAL = uno.getConstantByName("com.sun.star.awt.FontWeight.NORMAL")
+#from com.sun.star.awt.FontUnderline import SINGLE, NONE
+#FontUnderlineNone = NONE
+SINGLE = uno.getConstantByName("com.sun.star.awt.FontUnderline.SINGLE")
+FontUnderlineNone = uno.getConstantByName("com.sun.star.awt.FontUnderline.NONE")
+#from com.sun.star.style.CaseMap import UPPERCASE,SMALLCAPS, NONE
+#CaseMapNone = NONE
+UPPERCASE = uno.getConstantByName("com.sun.star.style.CaseMap.UPPERCASE")
+SMALLCAPS = uno.getConstantByName("com.sun.star.style.CaseMap.SMALLCAPS")
+CaseMapNone = uno.getConstantByName("com.sun.star.style.CaseMap.NONE")
+#
+
+from bibOOo.CONST import *
+
+class bibOOo_Error(Exception):
+    """Main error class
+    bibOOo_Error--|
+                  |-----bibOOo_NoConnect-----|
+                  |                          |----bibOOo_NoOffice
+                  |                          |----bibOOo_NoWriter
+                  |
+                  |-----bibOOo_ExecError-----|
+                                             |----bibOOo_PositionError
+                                             |----bibOOo_StyleError
+                                             |----bibOOo_IOError
+    """
+    msg = ''
+    def __init__(self,OOo=''):
+        self.OOo = OOo    # we propagate the OOo error message in this attribute or an additional information
+
+class bibOOo_NoConnect(bibOOo_Error):
+    """Global class for connection error"""
+    msg = _("Cannot connect to Openoffice. See Documentation.")
+class bibOOo_NoOffice(bibOOo_NoConnect):
+    """We were not able to connect to a OOo instance"""
+    msg = _("Cannot connect to Openoffice. See Documentation.")
+class bibOOo_NoWriter(bibOOo_NoConnect):
+    """The top most OOo document is not a writer doc"""
+    msg = _("The front document in OOo must be a Writer document.")
+
+class bibOOo_ExecError(bibOOo_Error):
+    """Parent class for all error related to bibOOo specific problems"""
+    msg = _("Non allowed operation""")
+class bibOOo_PositionError(bibOOo_ExecError):
+    """We are trying to apply a function at a non suited position"""
+    msg = _("Incorrect position")
+class bibOOo_StyleError(bibOOo_ExecError):
+    """Error in the style file"""
+    msg = _("Style format Error")
+class bibOOo_IOError(bibOOo_ExecError):
+    """File error operation"""
+    msg = _("File error operation")
+
+class bibOOo_Ref(object):
+    """This class is a wrapper for OOo in-text citations
+    You can access the citation
+    as attributes : bibRef.Author etc...
+    Can be used to set or read citations in the current doc"""
+
+    def __init__(self,bibOOo_instance,OOoRef=None,ref=(),dbdict={}):
+        """
+        model is the document model in which we want to create the citation.
+        bibOOo_instance is needed only if OOoRef == None
+        OORef = "com.sun.star.text.TextField.Bibliography"
+        if OORef == None, we create a "com.sun.star.text.TextField.Bibliography"
+        from
+                a list/tuple = (identifier,BibliographicType,....,ISBN)
+                or
+                dbdict = dictionary = {'Identifier':'toto', 'BibliographicType':1, 'Address':'NY', 'Annote':'Note', ...}
+                the dbdict.keys() may be incomplete => Absent fields will be set to '', BibliographicType to 1 = ARTICLE
+        or an empty reference of type = 1 (ARTICLE)
+        then in all cases we wrap the OOo object
+        """
+        if not OOoRef:
+            self.OOoRef = bibOOo_instance.model.createInstance("com.sun.star.text.TextField.Bibliography")
+            if ref:
+                self.setRef(ref)
+                #tmp = [ PropertyValue(field,0,ref[OO_BIBLIOGRAPHIC_FIELDS[field]],DIRECT_VALUE) for field in OO_BIB_FIELDS ]
+            elif dbdict:
+                tmp=[]
+                for field in OO_BIB_FIELDS:
+                    try: tmp.append( PropertyValue(field,0,dbdict[field],DIRECT_VALUE) )
+                    except KeyError: tmp.append( PropertyValue(field,0,'',DIRECT_VALUE) )
+                if 'BibliographicType' in list(dbdict.keys()):
+                    tmp[1] = PropertyValue('BibiliographicType',0,dbdict['BibliographicType'],DIRECT_VALUE)    # to correct spelling error in OOo
+                if tmp[1].Value == '':
+                    tmp[1] = PropertyValue('BibiliographicType',0,1,DIRECT_VALUE)    # default type == ARTICLE
+                self.OOoRef.Fields = tuple(tmp)
+            else:
+                #tmp = [ PropertyValue(field,0,'',DIRECT_VALUE) for field in OO_BIB_FIELDS ]
+                #tmp[1] = PropertyValue('BibiliographicType',0,1,DIRECT_VALUE) # ARTICLE
+                self.setRef( ('', 1, '', '', '','', '', '', '', '', '','', '', '', '', '', '', '','', '', '', '', '', '', '', '','', '', '', '', '') )
+            #self.OOoRef.Fields = tuple(tmp)
+        else:
+            self.OOoRef = OOoRef
+            
+    #def __eq__(self,other):                            # suppressed because it did not work in Ubuntu 7.10
+    #    return self.Identifier == other.Identifier
+        
+    #def __ne__(self,other):
+    #    return self.Identifier != other.Identifier
+
+    def __getattr__(self,attr):
+        """ If it is a BIBLIOGRAPHIC_FIELDS, we return the value
+        otherwise, we return the attribute of the OORef
+        This way we can directly access the method of the OOo ref object """
+        if attr in OO_BIB_FIELDS:
+            return self.OOoRef.Fields[OO_BIBLIOGRAPHIC_FIELDS[attr]].Value
+        elif attr == 'BibliographicType':    # spelling error in OOo
+            return self.OOoRef.Fields[1].Value
+        else:
+            return getattr(self.OOoRef,attr)
+
+    def __setattr__(self,attr,value):
+        if attr in OO_BIB_FIELDS:
+            tmp = list(self.OOoRef.Fields)
+            tmp[OO_BIBLIOGRAPHIC_FIELDS[attr]] = PropertyValue(attr,0,value,DIRECT_VALUE)
+            self.OOoRef.Fields = tuple(tmp)
+        elif attr == 'BibliographicType':    # spelling error in OOo
+            tmp = list(self.OOoRef.Fields)
+            tmp[1] = PropertyValue('BibiliographicType',0,value,DIRECT_VALUE)
+            self.OOoRef.Fields = tuple(tmp)
+        elif attr == 'OOoRef':
+            object.__setattr__(self,'OOoRef',value)
+        else:
+            raise AttributeError
+
+    def setRef(self,ref):
+        """
+        Set the values of the reference using the data in
+        ref which is a list/tuple.
+        This is much faster than setting field by field
+        """
+        tmp = [ PropertyValue(field,0,ref[OO_BIBLIOGRAPHIC_FIELDS[field]],DIRECT_VALUE) for field in OO_BIB_FIELDS ]
+        self.OOoRef.Fields = tuple(tmp)
+
+
+class bibOOoBase(object):
+    """This is the main class to interact with OOo"""
+# ------------------------ Connection setup ------------------------------
+    def __init__(self,con_type=1,host='localhost',port=8100,pipe='OOo_pipe'):
+        """We connect to the running OOo instance
+        con_type = connection_type = 1 if pipe ; 0 if TCP
+        host = host for TCP
+        port = port for TCP
+        pipe = pipe name
+        """
+        if con_type == 0:
+            OO_CON_STR = "uno:socket,host=%s,port=%s;urp;StarOffice.ComponentContext"%(host,port)
+        else:
+            OO_CON_STR = "uno:pipe,name=%s;urp;StarOffice.ComponentContext"%pipe
+        # get the uno component context from the PyUNO runtime
+        localContext = uno.getComponentContext()
+        # create the UnoUrlResolver
+        resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext )
+        try:
+            # connect to the running office
+            ctx = resolver.resolve( OO_CON_STR )
+            self.smgr = ctx.ServiceManager
+            # get the central desktop object
+            self.desktop = self.smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
+            # some utilities
+            self.transformer = MagicTransformer( ctx )    # this is to force PropertyValue.Value to the desired type because of a python bug
+            self.oTrans = self.smgr.createInstanceWithContext("com.sun.star.util.URLTransformer", ctx ) # used in __freezeBib to format URL
+            #
+        except NoConnectException as e:
+            raise bibOOo_NoOffice(e.Message)
+        except IllegalArgumentException as e:
+            #print "The url is invalid (%s)" % e.Message
+            raise bibOOo_NoOffice(e.Message)
+        except RuntimeException as e:
+               #print "An unknown error occured (%s)" % e.Message
+               raise bibOOo_NoOffice(e.Message)
+
+    def connectToWriter(self, hilight = False, backColor = 0x00FFFF00, createBib = True, end = True):
+        """connect to the top OOo document if it is a writer doc"""
+        self.bib = None                    # bibliographic index
+        try:
+            self.model = self.desktop.getCurrentComponent()
+            if self.model and self.model.getImplementationName() == 'SwXTextDocument':    # this is a text document
+                self.controller = self.model.getCurrentController()
+                self.cursor = self.controller.getViewCursor()    # Current ViewCursor
+                # access the document's text property
+                self.text = self.model.Text
+                # look for the first bibliography index or create a new one at the end if no biblio index present
+                bibFound = False
+                for i in range(self.model.getDocumentIndexes().getCount()):
+                    self.bib = self.model.getDocumentIndexes().getByIndex(i)
+                    if self.bib.getServiceName() == 'com.sun.star.text.Bibliography':
+                        bibFound = True
+                        break
+                if not bibFound and createBib:
+                    # we create the bibliography index at the end of the document
+                    self.createIndex(end)
+                # we get the com.sun.star.text.FieldMaster.Bibliography after eventually creating it
+                try:
+                    self.tfm = self.model.getTextFieldMasters().getByName('com.sun.star.text.FieldMaster.Bibliography')    # the biblio TextFieldMaster
+                except NoSuchElementException:
+                    self.tfm = self.model.createInstance("com.sun.star.text.FieldMaster.Bibliography")
+                self.stylesList = self.model.getStyleFamilies()    # styles set XIndexAccess (XStyleFamiliesSupplier interface)
+                self.__createBaseStyles()                    # create the styles if needed
+                self.hilightCitations(hilight, background = backColor)    # hilight citations if required. Just change the CharStyle
+                #self.setIndexFormat()                        # set the biblio format REMOVED BECAUSE IT IS TOO SLOW !!!!
+            else:
+                #print "You must have a text document opened in OpenOffice.org in oder to be able to use this menu"
+                raise bibOOo_NoWriter
+        except DisposedException as e:
+            raise bibOOo_NoOffice(e.Message)
+
+# ------------------------ iteration ------------------------------
+    def __iter__(self):
+        for cit in self.getCitations(None):
+            yield cit
+
+# functions to get a sorted list of citations
+    def __isFused(self,x,y,cursor):
+        """Return True if the two citations x & y are separated only by spaces => can be fused"""
+        try:
+            cursor.gotoRange(x.Anchor.End,False)
+            if not x.Anchor.Text.compareRegionStarts(cursor,y.Anchor):
+                return True            # we should not need it but it does not work if the two ranges start at the same position
+            cursor.gotoRange(y.Anchor.Start,True)
+            return not bool(cursor.String.strip(' '))    # if only white spaces between citations => we fuse them
+        #except IllegalArgumentException:
+        except:
+            return False                                # we are not in the same Text or something goes wrong
+
+    def groupCitations(self,refs):
+        """We group the citations in refs list.
+        We return a list of list.
+        Each list is a group of citations
+        i.e. citations separated by blank spaces"""
+        refs_out=[]
+        if refs:
+            lastref = refs[0]
+            tmp_range=[lastref]
+            tmpcursor = lastref.Anchor.Text.createTextCursor()
+            for ref in refs[1:]:
+                if self.__isFused(lastref,ref,tmpcursor):
+                    tmp_range.append(ref)
+                else:
+                    refs_out.append(tmp_range)
+                    tmp_range = [ref]
+                    tmpcursor = ref.Anchor.Text.createTextCursor()
+                lastref = ref
+            refs_out.append(tmp_range)
+        return refs_out
+
+    def getCitations(self,order=None):
+        """Return a list of the citations ordered as
+        order == None : unsorted
+        order == index : order of the bibliographic index
+        order == document : order in the document
+        order == group : list of list. Order as document. When citations are consecutives they are in a sub-list.
+        Exemple: "Start doc [1] [2] continue [3] continue [4][5]" will give: [[1,2],[3],[4,5]]
+        """
+        # we first update the index and references.
+        #updateRef()                    # we update the references to be up-to-date
+        #refs = list(self.tfm.getPropertyValue('DependentTextFields'))    # we get the references
+        refs = [ bibOOo_Ref(self,ref) for ref in self.tfm.getPropertyValue('DependentTextFields') ]    # we get the references and wrap them in bibOOo_Ref objects
+        lbb = len(self.tfm.BracketBefore)    # used later to get the numbers without the brackets
+        lba = -len(self.tfm.BracketAfter)
+        if order == None:
+            return refs
+        elif order == 'index':
+            SavedState = self.tfm.IsNumberEntries
+            self.tfm.IsNumberEntries = True            # we number citations to get the order of them
+            self.model.getTextFields().refresh()
+            #
+            tmplist = [(int(x.getPresentation(False)[lbb:len(x.getPresentation(False))+lba]), x) for x in refs]
+            tmplist.sort()
+            refs = [x for (key, x) in tmplist]
+            #
+            self.tfm.IsNumberEntries = SavedState            # we reverse to the original state
+            return refs
+        else:
+            # to sort by document:
+            # 1) We put for each ref a unique identifier (a number)
+            # 2) We ask OOo to sort by doc + numbers. As identifiers are uniques => each ref has its own number = order
+            # 3) We sort using the getPresentation(False)
+            # 4) We put back the correct identifiers
+            # 1)
+            savedIdentifiers=[]
+            i = 0
+            for ref in refs:
+                savedIdentifiers.append(ref.Identifier)
+                ref.Identifier = repr(i)
+                i = i+1
+            # 2)
+            SavedState = self.tfm.IsNumberEntries, self.tfm.IsSortByPosition
+            self.tfm.IsNumberEntries = True
+            self.tfm.IsSortByPosition = True
+            self.model.getTextFields().refresh()
+            # 3)
+            tmplist = [(int(x.getPresentation(False)[lbb:len(x.getPresentation(False))+lba]), x) for x in refs]
+            tmplist.sort()
+            refs = [x for (key, x) in tmplist]
+            # 4)
+            for ref in refs:
+                ref.Identifier = savedIdentifiers[int(ref.Identifier)]
+            #
+            self.model.getTextFields().refresh()
+            self.tfm.IsNumberEntries, self.tfm.IsSortByPosition = SavedState
+            if order == 'document': return refs
+            if order == 'group' : return self.groupCitations(refs)                    # order = 'group'
+            raise ValueError('What are we doing here? bibOOo line 357. order = %r is not a correct value.'%order)
+# end of functions to get a sorted list of citations
+
+
+
+# ------------------------ Index ------------------------------
+    def createIndex(self,end = True):
+        """create bibliographic index at the end if True, or at the current cursor position if False"""
+        cursor = self.text.createTextCursor()
+        if end: cursor.gotoEnd(False)                # we create at the end of the doc
+        else: cursor.gotoRange(self.cursor,False)    # or at the view cursor
+        self.text.insertControlCharacter(cursor,PARAGRAPH_BREAK,False)
+        self.bib = self.model.createInstance("com.sun.star.text.Bibliography")
+        self.text.insertTextContent(cursor,self.bib,False)
+        if self.text.compareRegionEnds(self.cursor,cursor) == 0: # the viewcursor was at the end of the doc
+            self.cursor.gotoRange(self.bib.getAnchor().getStart(),False)    # we must relocate it before the index
+            self.cursor.goLeft(1,False)            # we are now just before the index
+        self.bib.update()                        # update the new index (title, etc.)
+
+    def updateIndex(self):
+        """Update bibliography index"""
+        self.model.getTextFields().refresh()    # refresh the fields in case citation format has changed
+        if self.bib: self.bib.update()            # update de la biblio if it exists
+
+    def setIndexFormat(self,format):
+        """
+        set the format of the bibliographic index
+        format is a dictionary:
+        format.keys() = ['SortKeys', 'Title', 'Locale', 'IsNumberEntries', 'SortAlgorithm', 'IsSortByPosition', 'Bracket']
+        exemples:
+        format['index']['Locale']  = 'en_US'
+        format['index']['Title'] = 'Bibliography'
+        format['index']['IsNumberEntries'] = True | False
+        format['index']['SortAlgorithm'] = 'alphanumeric'
+        format['index']['IsSortByPosition'] = True | False    True = sorted in doc order ; False =  sorted as in defined in SortKeys
+        format['index']['Bracket'] = '[]'
+        format['index']['SortKeys'] = ((4, True), (23, True)) = ( (field1,ascending),(field2,ascending), ... )
+        field1, field2 = zero based index of the field in CONST.OO_BIB_FIELDS ( 4 = Author ; 23 = Year )
+        ascending = True
+        descending = False
+        format['ordering']['ARTICLE'] = tuple of tuple = ('text',text,style) | ('field',field_name,style) | ('tab',value,TabStopFillCharacter) | ('tab',None,TabStopFillCharacter)
+        where style = bibOOo_italic | bibOOo_bold ...
+        for tabs, if value = None => right aligned
+        exemple :  ( ('field', u'Author', 0), ('text', u' (', 0), ('field', u'Year', 0), ('text', u')', 0) ) = Einstein (1920)
+        this must be defined for all the references types = BIB_TYPE
+        you can use format['ordering']['JOURNAL'] = format['ordering']['ARTICLE'] etc.. to save space
+        """
+        if not self.bib: return        # if no bib, we it will crash
+        # set Bibliography service
+        self.bib.Locale = Locale(format['index']['Locale'][:2],format['index']['Locale'][-2:],'')
+        self.bib.SortAlgorithm = format['index']['SortAlgorithm']
+        self.bib.Title = format['index']['Title']
+        # set Bibliography FieldMaster
+        self.tfm.IsNumberEntries = bool(format['index']['IsNumberEntries'])
+        self.tfm.IsSortByPosition = bool(format['index']['IsSortByPosition'])
+        if format['index']['Bracket']:
+            self.tfm.BracketBefore = format['index']['Bracket'][0]
+            self.tfm.BracketAfter = format['index']['Bracket'][1]
+        else:
+            self.tfm.BracketBefore = ''
+            self.tfm.BracketAfter = ''
+        # set Bibliography FieldMaster SortKeys
+        tmp = [ ( PropertyValue('SortKey',0,i[0],DIRECT_VALUE) , PropertyValue('IsSortAscending',0,bool(i[1]),DIRECT_VALUE) ) for i in format['index']['SortKeys'] ]
+        self.tfm.SortKeys = tuple(tmp)
+        # set Bibliography service LevelFormat (=fields ordering)
+        for reftype in BIB_TYPE:
+            tmp=[]
+            for token in tuple(format['ordering'][reftype]):
+                if token[0] == 'text':
+                    tmp.append((PropertyValue("TokenType",0,"TokenText",DIRECT_VALUE),\
+                    PropertyValue("CharacterStyleName",0,self.__setStyleName(token[2]),DIRECT_VALUE),\
+                    PropertyValue("Text",0,token[1],DIRECT_VALUE)))
+                elif token[0] == 'field':
+                    tmp.append((PropertyValue("TokenType",0,"TokenBibliographyDataField",DIRECT_VALUE),\
+                    PropertyValue("CharacterStyleName",0,self.__setStyleName(token[2]),DIRECT_VALUE),\
+                    PropertyValue("BibliographyDataField",0,OO_BIBLIOGRAPHIC_FIELDS[token[1]],DIRECT_VALUE)))
+                elif token[0] == 'tab':
+                    if token[1] != None:
+                        # PropertyValue("TabStopPosition",0,uno.Any('long',token[1]),DIRECT_VALUE), # does not work!
+                        # the two following lines are a workaround for this bug.
+                        special = PropertyValue("TabStopPosition",0,token[1],DIRECT_VALUE)
+                        special = self.transformer.transform( special, "Value" , uno.Any( "long", token[1] ) )
+                        tmp.append((PropertyValue("TokenType",0,"TokenTabStop",DIRECT_VALUE),\
+                        special,\
+                        PropertyValue("TabStopFillCharacter",0,token[2],DIRECT_VALUE),\
+                        PropertyValue("CharacterStyleName",0,"",DIRECT_VALUE)))
+                    else:
+                        tmp.append((PropertyValue("TokenType",0,"TokenTabStop",DIRECT_VALUE),\
+                        PropertyValue("TabStopRightAligned",0,True,DIRECT_VALUE),\
+                        PropertyValue("TabStopFillCharacter",0,token[2],DIRECT_VALUE),\
+                        PropertyValue("CharacterStyleName",0,"",DIRECT_VALUE)))
+                else:
+                    raise bibOOo_StyleError("Error in the style file: I can't understand a token like %r" %token.__repr__())
+            # the following two lines are a work around for bug #12504. See python-uno FAQ.
+            # since self.bib.LevelFormat.replaceByIndex(OO_BIBLIOGRAPHIC_TYPE[reftype]+1,tuple(tmp)) does not work
+            unoseq = uno.Any("[][]com.sun.star.beans.PropertyValue",tuple(tmp))
+            uno.invoke(self.bib.LevelFormat,"replaceByIndex",(BIBLIOGRAPHIC_TYPE[reftype]+1,unoseq))
+            # remark: +1 in the previous line since Index=1=ARTICLE, etc...
+
+# ------------------------ CharStyles ------------------------------
+    def __createBaseStyles(self):
+        """create base CharStyle for citations and index"""
+        charStyles = self.stylesList.getByName('CharacterStyles')
+        if not charStyles.hasByName(bibOOo_cit_baseCharStyleName):
+            self.createCharacterStyle(bibOOo_cit_baseCharStyleName,bibOOo_regular,bibOOo_normal,'')
+        if not charStyles.hasByName(bibOOo_index_baseCharStyleName):
+            self.createCharacterStyle(bibOOo_index_baseCharStyleName,bibOOo_regular,bibOOo_normal,'')
+
+    def __setStyleName(self,charstyle):
+        """create a charStyle corresponding to charStyle if needed
+        return the style name as:
+        bibOOo_base<''|i><''|b><''|u><''|s|c> where i=italic, b=bold, u=underline, s=smallcaps, c=caps"""
+        # calculating style name
+        italic,bold,underline,caps = '','','',''
+        if charstyle & bibOOo_italic: italic = 'i'
+        if charstyle & bibOOo_bold: bold = 'b'
+        if charstyle & bibOOo_underline: underline = 'u'
+        if charstyle & bibOOo_caps: caps = 'c'
+        elif charstyle & bibOOo_smallcaps: caps = 's'
+        stylename = ''.join( (bibOOo_index_baseCharStyleName,italic,bold,underline,caps) )    # bibOOo_index_base ; bibOOo_index_basei ; etc...
+        # creating style if needed based on bibus_base
+        charStyles = self.stylesList.getByName('CharacterStyles')
+        if not charStyles.hasByName(stylename):
+            self.createCharacterStyle(stylename,charstyle,bibOOo_normal,bibOOo_index_baseCharStyleName)
+        return stylename
+
+    def createCharacterStyle(self,charstylename,charstyle,position,parentstylename=''):
+        """
+        create an OOo CharacterStyle "com.sun.star.style.CharacterStyle" with the name charstylename if it does not exist
+        set its parent charstyle to parentstylename
+        set its value to style
+        where style is a combination of
+        from bibOOo_CONST import bibOOo_regular,bibOOo_italic,bibOOo_bold,bibOOo_caps,bibOOo_smallcaps,bibOOo_underline
+        from bibOOo_CONST import bibOOo_normal,bibOOo_exposant,bibOOo_indice
+        style = bibOOo_italic | bibOOo_bold =  italic + bold
+        position = bibOOo_normal (=0) OR bibOOo_exposant (=1) OR bibOOo_indice (= -1)
+        """
+        charStyles = self.stylesList.getByName('CharacterStyles')
+        if not charStyles.hasByName(charstylename):
+            tmp_style = self.model.createInstance('com.sun.star.style.CharacterStyle')    # create a char style
+            charStyles.insertByName(charstylename,tmp_style)    # insert the style in the document
+            if parentstylename: tmp_style.setParentStyle(parentstylename)    # set parent charstyle
+            # we save the default values default from newly created style
+            basePosture,baseWeight,baseUnderline,baseCaps = tmp_style.CharPosture, tmp_style.CharWeight, tmp_style.CharUnderline, tmp_style.CharCaseMap
+            # setting only the specific attributes
+            if charstyle & bibOOo_italic and basePosture != ITALIC: tmp_style.CharPosture = ITALIC
+            elif not charstyle & bibOOo_italic and basePosture == ITALIC: tmp_style.CharPosture = FontSlantNone
+            #
+            if charstyle & bibOOo_bold and baseWeight != BOLD: tmp_style.CharWeight = BOLD
+            elif not charstyle & bibOOo_bold and baseWeight == BOLD: tmp_style.CharWeight = NORMAL
+            #
+            if charstyle & bibOOo_underline and baseUnderline != SINGLE: tmp_style.CharUnderline = SINGLE
+            elif not charstyle & bibOOo_underline and baseUnderline == SINGLE: tmp_style.CharUnderline = FontUnderlineNone
+            #
+            if charstyle & bibOOo_caps and baseCaps != UPPERCASE: tmp_style.CharCaseMap = UPPERCASE
+            elif charstyle & bibOOo_smallcaps and baseCaps != SMALLCAPS: tmp_style.CharCaseMap = SMALLCAPS
+            elif not charstyle & bibOOo_caps and not charstyle & bibOOo_smallcaps and baseCaps!=CaseMapNone: tmp_style.CharCaseMap = CaseMapNone
+            # CharEscapement = 101 means automatique exposant ; -101 indice ; 0 normal
+            tmp_style.CharEscapement = 101 * position        # automatic
+            if tmp_style.CharEscapement:
+                tmp_style.CharEscapementHeight = 58                # value ok in French. Other languages ?
+            else:
+                tmp_style.CharEscapementHeight = 100
+
+    def updateCharacterStyle(self,charstylename,charstyle,position,parentstylename=''):
+        """Reset values of style charstylename"""
+        charStyles = self.stylesList.getByName('CharacterStyles')
+        if charStyles.hasByName(charstylename):
+            tmp_style = charStyles.getByName(charstylename)
+            # reset all properties to default. Property list must be on alphabetical order!!!!
+            tmp_style.setPropertiesToDefault( ('CharCaseMap','CharEscapement','CharEscapementHeight','CharPosture','CharUnderline','CharWeight') )
+            if parentstylename: tmp_style.setParentStyle(parentstylename)    # set parent charstyle
+            # we save the default values default from newly created style
+            basePosture,baseWeight,baseUnderline,baseCaps = tmp_style.CharPosture, tmp_style.CharWeight, tmp_style.CharUnderline, tmp_style.CharCaseMap
+            # setting only the specific attributes
+            if charstyle & bibOOo_italic and basePosture != ITALIC: tmp_style.CharPosture = ITALIC
+            elif not charstyle & bibOOo_italic and basePosture == ITALIC: tmp_style.CharPosture = FontSlantNone
+            #
+            if charstyle & bibOOo_bold and baseWeight != BOLD: tmp_style.CharWeight = BOLD
+            elif not charstyle & bibOOo_bold and baseWeight == BOLD: tmp_style.CharWeight = NORMAL
+            #
+            if charstyle & bibOOo_underline and baseUnderline != SINGLE: tmp_style.CharUnderline = SINGLE
+            elif not charstyle & bibOOo_underline and baseUnderline == SINGLE: tmp_style.CharUnderline = FontUnderlineNone
+            #
+            if charstyle & bibOOo_caps and baseCaps != UPPERCASE: tmp_style.CharCaseMap = UPPERCASE
+            elif charstyle & bibOOo_smallcaps and baseCaps != SMALLCAPS: tmp_style.CharCaseMap = SMALLCAPS
+            elif not charstyle & bibOOo_caps and not charstyle & bibOOo_smallcaps and baseCaps!=CaseMapNone: tmp_style.CharCaseMap = CaseMapNone
+            # CharEscapement = 101 means automatique exposant ; -101 indice ; 0 normal
+            tmp_style.CharEscapement = 101 * position        # automatic
+            if tmp_style.CharEscapement:
+                tmp_style.CharEscapementHeight = 58                # value ok in French. Other languages ?
+            else:
+                tmp_style.CharEscapementHeight = 100
+
+
+    def styleRef(self,ref,charstylename = bibOOo_cit_baseCharStyleName):
+        """Set the CharStyle of the bibOOo_Ref object to charstylename"""
+        c = ref.Anchor.Text.createTextCursorByRange(ref.Anchor)
+        c.CharStyleName = charstylename
+
+    def hilightCitations(self,hilight = True, citStyleName = bibOOo_cit_baseCharStyleName, background = 0x00FFFF00):
+        """
+        Set the background of charStyle bibOOo_cit_baseCharStyleName
+        to background (default = yellow)
+        if hilight = True
+        elif hilight = False => background = Default
+        """
+        charStyles = self.stylesList.getByName('CharacterStyles')
+        tmp_style = charStyles.getByName(bibOOo_cit_baseCharStyleName)
+        if hilight:
+            tmp_style.CharBackColor = background            # background (default = yellow)
+        else:
+            tmp_style.setPropertyToDefault('CharBackColor')    # normal background
+
+    def resetCitationStyle(self,charstylename = bibOOo_cit_baseCharStyleName):
+        """
+        Reset the style of all the citations to bibOOo_cit_baseCharStyleName
+        This is needed if some citations have been inserted by another means than
+        bibOOo, for instance when the user has used the classical OOo interface.
+        """
+        for ref in self:
+            c = ref.Anchor.Text.createTextCursorByRange(ref.Anchor)
+            c.CharStyleName = charstylename                # reset the style it case it has changed
+
+# ------------------------ Citations ------------------------------
+    def insertRef(self,ref,charstylename = bibOOo_cit_baseCharStyleName):
+        """bibOOo_Ref object => insert at the current cursor position
+        using CharStyle charstylename
+        """
+        if self.notInBibIndex(self.cursor):
+            c = self.cursor.Text.createTextCursorByRange(self.cursor)    # Add at cursor location (replace selection)
+            c.CharStyleName = charstylename
+            c.Text.insertTextContent(c,ref.OOoRef,True)
+            self.cursor.setPropertyToDefault('CharStyleName')            # reset cursor to default
+        else:
+            raise bibOOo_PositionError("Try to insert a reference in the Bibliographic index")
+
+    def createRef(self,ref=(),dbdict={}):
+        """
+        create a bibOOo_Ref object from
+        a tuple/list = (identifier,BibliographicType,....,ISBN)
+        return an empty ARTICLE if ref=()
+        """
+        return bibOOo_Ref(self,None,ref,dbdict)
+
+# ------------------------ Freezing ------------------------------
+    def __fuse_range(self,numbers,cit_rangesep='-'):
+        """numbers is a sorted list of integers.
+        We return a list of strings where 1,2,3 => '1(cit_rangesep)3' """
+        tmpranges,tmp = [],[]
+        tmp = [numbers[0]]
+        for i in range(1,len(numbers)):
+            if numbers[i] == numbers[i-1] + 1:
+                    tmp.append(numbers[i])
+                    continue
+            else:
+                if len(tmp) >=3:
+                    tmpranges.append("%s-%s"%(tmp[0],tmp[-1]))    # we fuse
+                else:
+                    tmpranges.extend([repr(x) for x in tmp])
+                tmp = [numbers[i]]
+        if len(tmp) >=3:
+            tmpranges.append("%s%s%s"%(tmp[0],cit_rangesep,tmp[-1]))    # we fuse
+        else:
+            tmpranges.extend([repr(x) for x in tmp])
+        return tmpranges
+
+    def __freezeNumberedCitations(self,messages = lambda i,x:sys.stdout.write('%s\n'%x),cit_sort=True,cit_fuse=True,cit_range=True,cit_separator='; ',cit_rangesep='-'):
+        """
+        format the in-text citations (sort,range,style, etc..)
+        for numbers:
+            depending on cit_sort,cit_fuse,cit_range we replace
+            [1] [3][2][5] => [1-3,5] etc...
+        """
+        messages(*(.7,msg7 ))
+        if not cit_fuse and not cit_sort:
+            for ref in self:                # we don't mind about the order
+                c = ref.Anchor.Text.createTextCursorByRange(ref.Anchor.End)
+                ref.Anchor.Text.insertString(c,ref.getPresentation(0),True)
+        else:
+            refranges = self.getCitations(order='group')
+            for refs in refranges:
+                c = refs[0].Anchor.Text.createTextCursorByRange(refs[0].Anchor.End)    # cursor at end
+                bb = self.tfm.BracketBefore
+                ba = self.tfm.BracketAfter
+                lbb = len(bb)
+                lba = -len(ba)
+                numbers = [ int(x.getPresentation(False)[lbb:len(x.getPresentation(False))+lba]) for x in refs ]
+                numbers.sort()
+                if cit_range:
+                    ranges = self.__fuse_range(numbers,cit_rangesep)                                # calculate ranges
+                elif cit_sort:
+                    ranges = [repr(x) for x in numbers]
+                else:
+                    print("What are we doing here. bibOOo line 492")
+                # we insert in the text
+                refs[0].Anchor.Text.insertString(c,"%s%s%s" %(bb,cit_separator.join(ranges),ba),True)
+
+    def __freezeIdentifierCitations(self,messages = lambda i,x:sys.stdout.write('%s\n'%x),cit_fuse=True,cit_separator='; '):
+        """
+        for identifiers:
+            we just copy/paste the identifiers with fusion if cit_fuse = True
+        """
+        messages(*(.7,msg7 ))
+        if not cit_fuse:
+            for ref in self:                # we don't mind about the order
+                c = ref.Anchor.Text.createTextCursorByRange(ref.Anchor.End)
+                ref.Anchor.Text.insertString(c,ref.getPresentation(0),True)
+        else:
+            refranges = self.getCitations(order='group')
+            for refs in refranges:
+                c = refs[0].Anchor.Text.createTextCursorByRange(refs[0].Anchor.End)    # cursor at end
+                bb = self.tfm.BracketBefore
+                ba = self.tfm.BracketAfter
+                lbb = len(bb)
+                lba = -len(ba)
+                identifiers = [x.getPresentation(False)[lbb:len(x.getPresentation(False))+lba] for x in refs]
+                # we insert in the text
+                refs[0].Anchor.Text.insertString(c,"%s%s%s" %(bb,cit_separator.join(identifiers),ba),True)
+
+    def freezeCitations(self,messages = lambda i,x:sys.stdout.write('%s\n'%x),cit_sort=True,cit_fuse=True,cit_range=True,cit_separator='; ',cit_rangesep='-'):
+        """
+        format the in-text citations (sort,range,style, etc..)
+        for numbers:
+            depending on cit_sort,cit_fuse,cit_range we replace
+            [1] [3][2][5] => [1-3,5] etc...
+        for identifiers:
+            we just copy/paste the identifiers with fusion if cit_fuse = True
+        """
+        # we first freeze the citations
+        if self.tfm.IsNumberEntries:
+            self.__freezeNumberedCitations(messages,cit_sort,cit_fuse,cit_range,cit_separator,cit_rangesep)
+        else:
+            self.__freezeIdentifierCitations(messages,cit_fuse,cit_separator)
+        self.freezeIndex()                            # we freeze the index
+        self.tfm.dispose()                            # we remove all the citations
+
+    def freezeIndex(self):
+        """
+        make a copy of the bibliographic index, then remove the index
+        Freeze the index by copying then pasting it.
+        """
+        #Cut = '.uno:Cut'        # 'slot:5710'    # slot values. May change in the future ?
+        Copy = '.uno:Copy'        # 'slot:5711'
+        Paste = '.uno:Paste'    # 'slot:5712'
+        self.cursor.gotoRange(self.bib.Anchor,False)    # select the bib
+        oUrl = URL()
+        oUrl.Complete = Copy    # copy the current selection
+        countOfUrls,parsedUrl = self.oTrans.parseSmart( oUrl, ".uno" )
+        oDisp = self.controller.queryDispatch( parsedUrl, "", 0 )
+        if oDisp != None:
+            oDisp.dispatch(parsedUrl,())
+            # Move The cursor After the index
+            self.cursor.collapseToEnd()
+            self.cursor.goRight(1,False)
+            # Then paste the index
+            oUrl.Complete = Paste    # paste the clipboard
+            countOfUrls,parsedUrl = self.oTrans.parseSmart( oUrl, ".uno" )
+            oDisp = self.controller.queryDispatch( parsedUrl, "", 0 )
+            if oDisp != None:
+                oDisp.dispatch(parsedUrl,())
+                self.text.insertControlCharacter(self.cursor,PARAGRAPH_BREAK,False)
+                # Dispose the index
+                self.bib.dispose()
+
+    def __newDoc(self):
+        """Save the current doc if needed, then create a new one = copy"""
+        if self.model.isModified():
+            raise bibOOo_IOError("You must first save the current document")
+        if self.model.hasLocation():
+            self.model.store()
+        else:
+            raise bibOOo_IOError("Impossible to save the current document")
+         # we store the old name
+        name = self.model.getURL()
+        oURL=URL()
+        oURL.Complete=name
+        countOfUrls,parsedUrl = self.oTrans.parseSmart( oURL, "http" )
+        if countOfUrls:
+            name = os.path.splitext(parsedUrl.Name)[0]
+        else:
+            name = 'text'
+        #try:
+        #    self.model.storeAsURL(self.model.getLocation(),())
+        #except IOException:
+        #    raise bibOOo_IOError,"Impossible to save the current document"
+        """We open a copy"""
+        fa = self.smgr.createInstance('com.sun.star.ucb.SimpleFileAccess')
+        inputstream = fa.openFileRead(self.model.getLocation())
+        pvDescriptor=(PropertyValue('InputStream',0,inputstream,DIRECT_VALUE),
+                      PropertyValue('Hidden',0,True,DIRECT_VALUE))
+        self.model = self.desktop.loadComponentFromURL('private:stream', "_default",0,pvDescriptor)    # reload the document from stream
+        self.controller = self.model.getCurrentController()
+        self.cursor = self.controller.getViewCursor()    # Current ViewCursor
+        self.text = self.model.Text
+        # look for the first bibliography index or create a new one at the end if no biblio index present
+        for i in range(self.model.getDocumentIndexes().getCount()):
+            self.bib = self.model.getDocumentIndexes().getByIndex(i)
+            if self.bib.getServiceName() == 'com.sun.star.text.Bibliography':
+                break
+        # we get the com.sun.star.text.FieldMaster.Bibliography after eventually creating it
+        try:
+            self.tfm = self.model.getTextFieldMasters().getByName('com.sun.star.text.FieldMaster.Bibliography')    # the biblio TextFieldMaster
+        except NoSuchElementException:
+            self.tfm = self.model.createInstance("com.sun.star.text.FieldMaster.Bibliography")
+        self.stylesList = self.model.getStyleFamilies()    # styles XIndexAccess (XStyleFamiliesSupplier interface)
+        # we define a name and we but it in the DocumentInfo Title => in the Windows title
+        self.model.Title='%s-formatted' %name
+        #
+        return True
+
+    def finalize(self,messages = lambda i,x:sys.stdout.write('%s\n'%x),**kwds):
+        """
+        finalize(self,cit_sort=True,cit_fuse=True,cit_range=True,cit_separator='; ')
+        make a copy of the current doc
+        make a copy of the bibliographic index, then remove the index
+        format the in-text citations (sort,range,style, etc..)
+        we print formatting messages in it
+        Default = None = stdout
+        """
+        messages(*(.1,msg1))
+        if not self.__newDoc():                                # we try to open a copy of the current doc.
+            raise bibOOo_IOError("Cannot save the current document")    # error if not possible
+        messages(*(.2,msg2))
+        self.__createBaseStyles()                            # create the citation base style if needed
+        messages(*(.3,msg3))
+        self.hilightCitations(False)            # we don't want to hilight for the final format
+        self.resetCitationStyle()                # reset the style for the citations
+        # needed to 'freeze' the Anchors because of a bug in OOo ?
+        #fixAnchors = [ref.Anchor for ref in self.getCitations(order=None)]    # bug OOo ?
+        #
+        # self.updateRef()                                    # make ref uptodate
+        messages(*(.4,msg4))
+        if not self.bib: self.createIndex()                    # we create the index if needed
+        self.updateIndex()                                    # update index
+        self.freezeCitations(messages = messages,**kwds)
+        messages(*(.9,msg5))
+        self.controller.Frame.ContainerWindow.setVisible(True)    # make the new frame visible
+        self.controller.Frame.ComponentWindow.setVisible(True)    # make the new doc visible
+        self.model.setModified(False)                        # disable the save button/toolbar icon
+        messages(*(1.0,msg6))
+
+# ------------------------ Divers ------------------------------
+    def saveDoc(self,url=None):
+        """
+        Store the current doc.
+        if url != None, we use it
+        Otherwise we save using the current location
+        """
+        if not url:
+            if self.model.hasLocation():
+                self.model.store()
+            else:
+                raise bibOOo_IOError("Impossible to save the current document")
+        else:
+            if url.endswith(".sxw"):
+                pd = (PropertyValue("FilterName",0,"StarOffice XML (Writer)",DIRECT_VALUE),)
+            elif url.endswith(".odt"):
+                pd = (PropertyValue("FilterName",0,"writer8",DIRECT_VALUE),)
+            else:    # default format
+                pd = ()
+            try:
+                self.model.storeAsURL(uno.systemPathToFileUrl(url),pd)
+            except IOException:
+                self.model.storeAsURL(uno.systemPathToFileUrl(url),()) # if it fails, we use default format
+
+    def activate(self):
+       """Give focus to the current OOo document"""
+       frame = self.desktop.getCurrentFrame().getContainerWindow()
+       frame.setFocus()
+
+    def notInBibIndex(self,cursor):
+        "Return True if the range does not intercept with the Bibliographic index"
+        if self.bib != None and cursor.Text == self.bib.Anchor.Text:            # must be in the same Text to be compared
+            curs = cursor.Text.createTextCursorByRange(cursor)
+            curs.goLeft(1,True)
+            b=cursor.Text.compareRegionStarts(curs.Start,self.bib.Anchor.End) != 1    # cursor after Bibliography index
+            curs.collapseToEnd()
+            curs.goRight(1,False)
+            a=cursor.Text.compareRegionEnds(curs.End,self.bib.Anchor.Start) != -1    # cursor before Bibliography index
+            return (a or b)
+        else:
+            return True                                            # it is not in the same Text and cannot be compared
+
+# the following code is a workaround to a python-uno bug that makes PropertyValue().Value=uno.Any('long',100) not possible.
+# many thanks to Joerg Budischewski for this code.
+# this is used to set "TabStopPosition" in the Bibliographic index
+class MagicTransformer:
+    def __init__( self , ctx ):
+        self.inv = ctx.ServiceManager.createInstanceWithContext(
+            "com.sun.star.script.Invocation", ctx )
+        self.insp =  ctx.ServiceManager.createInstanceWithContext(
+            "com.sun.star.beans.Introspection", ctx )
+    def transform( self, struct , propName, value ):
+        myinv = self.inv.createInstanceWithArguments( (struct,) )
+        access = self.insp.inspect( myinv )
+        method = access.getMethod( "setValue" , -1 )
+        uno.invoke( method, "invoke", ( myinv, ( propName , value ) ))
+        method = access.getMethod( "getMaterial" , -1 )
+        ret,dummy = method.invoke(myinv,() )
+        return ret
+

Modified: packages/bibus/trunk/debian/changelog
URL: http://svn.debian.org/wsvn/debian-science/packages/bibus/trunk/debian/changelog?rev=46251&op=diff
==============================================================================
--- packages/bibus/trunk/debian/changelog	(original)
+++ packages/bibus/trunk/debian/changelog	Sun Sep  8 19:28:54 2013
@@ -1,3 +1,10 @@
+bibus (1.5.2-3) unstable; urgency=low
+
+  * bibOOo/bibOOoBase.py
+    - install patched upstream version to support LibreOffice 4.1.1
+
+ -- Jan Beyer <jan at beathovn.de>  Sun, 08 Sep 2013 21:10:33 +0200
+
 bibus (1.5.2-2) unstable; urgency=low
 
   * Add a patch from upstream to enable finalizing with LibreOffice 4

Modified: packages/bibus/trunk/debian/rules
URL: http://svn.debian.org/wsvn/debian-science/packages/bibus/trunk/debian/rules?rev=46251&op=diff
==============================================================================
--- packages/bibus/trunk/debian/rules	(original)
+++ packages/bibus/trunk/debian/rules	Sun Sep  8 19:28:54 2013
@@ -34,6 +34,7 @@
 	rm -f $(BIBUSDESTDIR)/usr/share/man/man1/bibus.1
 	dh_install -pbibus debian/bibus.cfg usr/share/bibus/
 	dh_install -pbibus Pixmaps/bibus.xpm usr/share/pixmaps/
+	dh_install -pbibus debian/bibOOoBase.py usr/share/bibus/
 	
 	# installing bibus-doc-en
 	dh_installdirs -pbibus-doc-en usr/share/doc/bibus/html




More information about the debian-science-commits mailing list