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 <[email protected]>:
> 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: [email protected]
> 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: [email protected]
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