Yay, that's actually cool! I added to my function also a maximum
level. With level 5 it produces ≈23Mb output which is a miserable
267604 lines, vimdiff works fine with that.

def printUNO(parent, listChecked, maxLevel):
    try:
        for propName in dir(parent):
            if str(propName)[0].islower(): #function, skip
                continue
            try:
                property = getattr(parent, propName)
            except Exception: #inspect.UnknownPropertyException: wtf,
that doesn't work
                continue
            if str(property).startswith('pyuno'):
                if ( not any(propName == s for s in listChecked)
                     and len(listChecked) < maxLevel):
                    l = list(listChecked)
                    l.append(propName)
                    printUNO(property, l, maxLevel)
                continue
            print(propName + ': ' + str(property) + '\n')
    except Exception: #in this awful API we can't even catch exception by name
        return

Although I still couldn't find where defined a global OutLineNumbering
of Writer, I think that code should work for most of tasks.

2015-08-22 21:54 GMT+03:00 X Roemer <x-roe...@web.de>:
> Hi,
> I wrote some code some time ago. The code also checks the differences
> between two states of an object.
> The first part is similar to yours, it's also a recursive function, but it
> creates a dict and you can use a level to stop searching, so you won't get
> an infinite cycle.
>
>
> The second part - I think, I used some code from stackoverflow - compares
> two nested dicts with each other and prints out the results.
>
> It works best inside of an extension, where you can keep objects alive.
>
> so it would be:
> level = 2
> self.res1 = get_attribs(object,level )
>
> #do something
> # and start the function again with:
>
> self.res2 = get_attribs(object,level )
> findDiff(self.res1, self.res2)
>
> Regards,
> Xaver
>
>
> Here's the code:
>
>
>
> ctx = uno.getComponentContext()
> smgr = ctx.ServiceManager
> desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
> doc = desktop.getCurrentComponent()
> current_Contr = doc.CurrentController
> viewcursor = current_Contr.ViewCursor
>
> object = doc
> max_lvl = 3
>
> def get_attribs(obj,lvl):
>     results = {}
>     for key in dir(obj):
>
>         try:
>             value = getattr(obj, key)
>             if 'callable' in str(type(value)):
>                 continue
>         except :
>             #print(key)
>             continue
>
>         if key not in results:
>             if type(value) in (
>                                type(None),
>                                type(True),
>                                type(1),
>                                type(.1),
>                                type('string'),
>                                type(()),
>                                type([]),
>                                type(b''),
>                                type(r''),
>                                type(u'')
>                                ):
>                 results.update({key: value})
>
>             elif lvl < max_lvl:
>                 try:
>                     results.update({key: get_attribs(value,lvl+1)})
>                 except:
>                     pass
>
>     return results
>
>
> diff = []
>
> def findDiff(d1, d2, path=""):
>     for k in d1.keys():
>         if not d2.has_key(k):
>             print path, ":"
>             print k + " as key not in d2", "\n"
>         else:
>             if type(d1[k]) is dict:
>                 if path == "":
>                     path = k
>                 else:
>                     path = path + "->" + k
>                 findDiff(d1[k],d2[k], path)
>             else:
>                 if d1[k] != d2[k]:
>                     diff.append((path,k,d1[k],d2[k]))
>                     path = ''
>
>
> res1 = get_attribs(object,1)
>
> viewcursor.gotoEnd(False)
> viewcursor.setString('Test ')
>
> res2 = get_attribs(object,1)
>
> findDiff(res1, res2)
>
> for d in diff:
>     print(d)
>     time.sleep(.4)
>
>
>
>
>
>
>
> Am 22.08.2015 um 20:24 schrieb Piet van Oostrum:
>>
>> Hi-Angel wrote:
>>
>>   > Okay, I wrote a python code that explores every property, and doesn't
>>   > fall into an infinite cycle. It is
>>   > [...]
>>   > However it produces too much output, e.g. from a test document it
>>   > produced 1gb of output. I think the problem is that most elements
>>   > still appears in output many times — the check that in backtrace
>>   > wasn't the current element is ensures only that it wouldn't fall in an
>>   > infinite cycle.
>>
>> You can get an infinite cycle at any level, so only checking at the top
>> level is not good enough. You will have to check at each node.
>
>
>
> --
> To unsubscribe e-mail to: users+unsubscr...@global.libreoffice.org
> Problems?
> http://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
> Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
> List archive: http://listarchives.libreoffice.org/global/users/
> All messages sent to this list will be publicly archived and cannot be
> deleted

-- 
To unsubscribe e-mail to: users+unsubscr...@global.libreoffice.org
Problems? http://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/global/users/
All messages sent to this list will be publicly archived and cannot be deleted

Reply via email to