2017-06-22 41 views
1

LibreOfficeライターを使用すると、テキスト内に注釈(注釈/コメント)を挿入できます。PythonマクロからLibreOfficeライターアノテーションの内容を読み取る方法

私の問題は、ライン特有の注釈の内容にアクセスする方法が見つからないということです。
次のPythonコードは、選択/強調表示されたテキストを探して、フォーマットされたタイムコード(例えば01:10:23または11:10)以外のすべてを取り除き、秒に変換します。
テキストが選択されていない場合、現在の行全体が選択され、タイムコードの検索が試みられます。ただし、タイムコードは注釈に含まれる可能性があります。

私はドキュメント内のすべての注釈のリストを取得できましたが、コードの先頭にコメントアウトされていますが、私にとっては役に立たないものです。

私は、現在の行が、その内容にアクセスする方法)注釈または
Bを持っているかどうかを

A)の占いの方法を発見することができませんでした。

誰でもこれを達成できれば、私はどんな指摘にも感謝します。

def fs2_GoToTimestamp(*args): 
#get the doc from the scripting context which is made available to all scripts 
    desktop = XSCRIPTCONTEXT.getDesktop() 
    model = desktop.getCurrentComponent() 
    oSelected = model.getCurrentSelection() 
#access annotations for the whole document 
# oEnum = model.getTextFields().createEnumeration() 
# cursor = desktop.getCurrentComponent().getCurrentController().getViewCursor() 
# while oEnum.hasMoreElements(): 
#  oField = oEnum.nextElement() 
#  cursor.gotoRange(oField,False) 
#  print (cursor.getPosition()) 
#  if oField.supportsService('com.sun.star.text.TextField.Annotation'): 
#   print (oField.Content) 
#   x = oField.getAnchor() 
#   print (dir(x)) 
    oText = "" 
    try: #Grab the text selected/highlighted 
     oSel = oSelected.getByIndex(0) 
     oText= oSel.getString() 
    except:pass 
    try: 
     if oText == "": # Nothing selected grab the whole line 
      cursor = desktop.getCurrentComponent().getCurrentController().getViewCursor() 
      cursor.gotoStartOfLine(False) #move cursor to start without selecting (False) 
      cursor.gotoEndOfLine(True) #now move cursor to end of line selecting all (True) 
      oSelected = model.getCurrentSelection() 
      oSel = oSelected.getByIndex(0) 
      oText= oSel.getString() 
      # Deselect line to avoid inadvertently deleting it on next keystroke 
      cursor.gotoStartOfLine(False) 
    except:pass 
    time = str(oText) 
    valid_chars=(':') 
    time = ''.join(char for char in time if char in valid_chars) 
    if time.count(":") == 1: 
     oM, oS = time.split(":") 
     oH = "00" 
    elif time.count(":") == 2: 
     oH,oM,oS = time.split(":") 
    else: 
     return None 
    if len(oS) != 2: 
     oS=oS[:2] 
    try: 
     secs = int(oS) 
     secs = secs + int(oM) * 60 
     secs = secs + int(oH) *3600 
    except: 
     return None 
    seek_instruction = 'seek'+str(secs)+'\n' 
    #Now do something with the seek instruction 
+0

注釈を列挙して[getAnchorを()](https://www.openoffice.org/api/docs/common/ref/com/sun/star/text/XTextContent.html#getAnchor)を使用しそれぞれがどこに位置しているかを調べる。 https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Editing_Text#Text_Contents_Other_Than_Stringsを参照してください。 –

+0

返事をありがとう。おそらくそれは私ですが、oFieldまたはoField.getAnchor()から返されたメソッドを見つけることができません。oEnumを列挙すると、文書内の注釈の位置がわかります。カーソルを作成して 'gotoRange(oField、False) 'しようとすると、そのようなインタフェースがないと主張します。私はあなたの目に見えないエラーを見いだすことができるように、私の意図的でない試みを質問に追加しました。私はAPIドキュメントに苦労することを認めます、それは宝石で泳ぐようなものです –

答えて

1

annotationsを列挙し、getAnchor()を使用して、それぞれの位置を特定します。この回答はhttps://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Editing_Text#Text_Contents_Other_Than_Stringsに基づいています。

コードは動作しています。

while oEnum.hasMoreElements(): 
    oField = oEnum.nextElement() 
    if oField.supportsService('com.sun.star.text.TextField.Annotation'): 
     xTextRange = oField.getAnchor() 
     cursor.gotoRange(xTextRange, False) 

代わりのprint (dir(x))、このようXrayToolやMRIなどのイントロスペクション・ツールは、より良い情報を提供します。 APIドキュメントを簡単に把握できます。

+0

ミリメートル離れていることは最終的にはマイル離れていることと同じです。正しい方向への感謝をお寄せいただきありがとうございます。私は、このようなことをしている人のために自己回答に(最終版)を投稿しました。 - –

0

多くの助けを借りてからJim K自己回答が以下に掲載されています。私はそれが最も助けになると私がどこにコメントした。

#!/usr/bin/python 
from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK 
from com.sun.star.awt.MessageBoxType import INFOBOX 
def fs2_GoToTimestamp(*args): 
    desktop = XSCRIPTCONTEXT.getDesktop() 
    model = desktop.getCurrentComponent() 
    oSelected = model.getCurrentSelection() 
    doc = XSCRIPTCONTEXT.getDocument() 
    parentwindow = doc.CurrentController.Frame.ContainerWindow 
    cursor = desktop.getCurrentComponent().getCurrentController().getViewCursor() 
    try: 
     CursorPos = cursor.getText().createTextCursorByRange(cursor)#Store original cursor position 
    except:# The cursor has been placed in the annotation not the text 
     mess = "Position cursor in the text\nNot the comment box" 
     heading = "Positioning Error" 
     MessageBox(parentwindow, mess, heading, INFOBOX, BUTTONS_OK) 
     return None 
    oText = "" 
    try: #Grab the text selected/highlighted 
     oSel = oSelected.getByIndex(0) 
     oText= oSel.getString() 
    except:pass 
    try: 
     if oText == "": # Nothing selected grab the whole line 
      store_position = 0 
      cursor.gotoStartOfLine(False) #move cursor to start without selecting (False) 
      cursor.gotoEndOfLine(True) #now move cursor to end of line selecting all (True) 
      oSelected = model.getCurrentSelection() 
      oSel = oSelected.getByIndex(0) 
      oText= oSel.getString() 
      y = cursor.getPosition() 
      store_position = y.value.Y 
      # Deselect line to avoid inadvertently deleting it on next user keystroke 
      cursor.gotoStartOfLine(False) 

      if oText.count(":") == 0: 
      # Still nothing found check for an annotation at this location 
      #enumerate through annotations for the whole document 
       oEnum = model.getTextFields().createEnumeration() 
       while oEnum.hasMoreElements(): 
        oField = oEnum.nextElement() 
        if oField.supportsService('com.sun.star.text.TextField.Annotation'): 
         anno_at = oField.getAnchor() 
         cursor.gotoRange(anno_at,False) 
         pos = cursor.getPosition() 
         if pos.value.Y == store_position: # Found an annotation at this location 
          oText = oField.Content 
          break 
       # Re-set cursor to original position after enumeration & deselect 
       cursor.gotoRange(CursorPos,False) 
    except:pass 

    time = str(oText) 
    valid_chars=(':') 
    time = ''.join(char for char in time if char in valid_chars) #Strip out all invalid characters 
    if time.count(":") == 1: # time 00:00 
     oM, oS = time.split(":") 
     oH = "00" 
    elif time.count(":") == 2: # time 00:00:00 
     oH,oM,oS = time.split(":") 
    else: 
     return None 
    if len(oS) != 2: # in case time includes tenths 00:00.0 reduce to whole seconds 
     oS=oS[:2] 
    try: 
     secs = int(oS) 
     secs = secs + int(oM) * 60 
     secs = secs + int(oH) *3600 
    except: 
     return None 
    seek_instruction = 'seek'+str(secs)+'\n' 
    print("Seconds",str(secs)) 
    # Do something with seek_instruction 

def MessageBox(ParentWindow, MsgText, MsgTitle, MsgType, MsgButtons): 
    ctx = XSCRIPTCONTEXT.getComponentContext() 
    sm = ctx.ServiceManager 
    si = sm.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx) 
    mBox = si.createMessageBox(ParentWindow, MsgType, MsgButtons, MsgTitle, MsgText) 
    mBox.execute() 
関連する問題