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