Top > OOoBasic > Writer > Index

索引 Edit

索引はテキストコンテンツとして com.sun.star.text.DocumentIndex サービスを利用します。

索引の挿入 Edit

索引は com.sun.star.text.DocumentIndex サービスをインスタンス化して挿入します。挿入後に update する必要があります。

Sub index_1
  oDoc = ThisComponent
  oText = oDoc.getText()
  oEnd = oText.getEnd()
  
  oIndex = oDoc.createInstance("com.sun.star.text.DocumentIndex")
  oText.insertTextContent(oEnd,oIndex,False)
  oIndex.update()
End Sub

索引の更新 Edit

update メソッドを呼び出します。

索引の取得 Edit

既存の索引を取得するには DocumentIndexes プロパティからコンテナを取得し、そこから目的の索引のオブジェクトを探します。

Sub index_4
  oDoc = ThisComponent
  oIndexes = oDoc.DocumentIndexes
  
  oIndexes = oDoc.getDocumentIndexes()
  For i = 0 To oIndexes.getCount()
     oIndex = oIndexes.getByIndex(i)
     If oIndex.ServiceName = "com.sun.star.text.DocumentIndex" Then
       '...
     End If
  Next i
End Sub

目次などのインデックスも含まれているため、取得したいタイプや名前で判断する必要があります。索引のサービス名は com.sun.star.text.DocumentIndex です。

索引エントリマーク Edit

索引のエントリマークは com.sun.star.text.DocumentIndexMark サービスをテキストコンテンツとして挿入します。

Sub index_5
  oDoc = ThisComponent
  oText = oDoc.getText()
  oSelection = oDoc.getCurrentSelection()
  If oSelection.Count = 1 Then
    oRange = oSelection.getByIndex(0)
    oEntry = oDoc.createInstance("com.sun.star.text.DocumentIndexMark")
    'oEntry.PrimaryKey = oRange.getString()

    oText.insertTextContent(oRange,oEntry,True)
  End If
  
  oIndexes = oDoc.getDocumentIndexes()
  For i = 0 To oIndexes.getCount() -1
     oIndex = oIndexes.getByIndex(i)
     If oIndex.ServiceName = "com.sun.star.text.DocumentIndex" Then
       oIndex.update()
     End If
  Next i
End Sub

エントリマークを挿入後、索引を update しています。

プロパティ一覧 Edit

プロパティ
BackColorlong背景色
BackGraphicFilterstring背景画像フィルタ
BackGraphicLocation.style.GraphicLocation背景画像位置
BackGraphicURLstring背景画像URL
BackTransparentboolean背景透過
ContentSection.text.XTextSectionコンテンツ部分セクション
CreateFromChapterboolean章をエントリに
DocumentIndexMarks[].text.XDocumentIndexMarkインデックスマーク
HeaderSection.text.XTextSection索引ヘッダ部分セクション
IsCaseSensitiveboolean大文字と小文字を区別
IsCommaSeparatedbooleanコンマで区切る
IsProtectedboolean保護する
IsRelativeTabstopsboolean相対的なタブを利用
LevelFormat.container.XIndexReplaceレベルフォーマット
Locale.lang.Locale地域と言語
MainEntryCharacterStyleNamestringエントリ単語文字スタイル名
Namestringインデックス名
ParaStyleHeadingstringヘッダ部分段落スタイル
ParaStyleLevel1stringコンテンツ段落スタイル
ParaStyleLevel2string
ParaStyleLevel3string
ParaStyleSeparatorstring区切り文字の段落スタイル
ServiceNamestringサービス名
SortAlgorithmstringソート時のアルゴリズム
TextColumns.text.XTextColumns列利用時の列
Titlestringタイトル
UseAlphabeticalSeparatorsbooleanアルファベットごとの区切り文字
UseCombinedEntriesboolean項目を統合する
UseDashboolean統合時ダッシュを利用
UseKeyAsEntrybooleanキーをエントリに
UsePPbooleanPpを利用する
UseUpperCaseboolean項目を大文字からはじめる

索引項目のページ番号にリンクを Edit

索引エントリにブックマークを挿入してページからブックマークへリンクします。完成したドキュメント用。

制限

  • p でまとめるもの不可
  • 項目とページ番号の間がタブのみのもの

Python-UNO スクリプトから alpha_index_page_number_link を実行する。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# -*- coding: utf-8 -*-
 
 
class Anchor(object):
    def __init__(self, anchor, bk_mark_name, page=0):
        self.anchor = anchor
        self.bk_mark_name = bk_mark_name
        self.page = page
    
    def __eq__(self, other):
        return self.anchor == other
    
    def set_page(self, page):
        self.page = page
 
 
class Entry(object):
    """individual entry"""
    def __init__(self, name):
        self.name = name
        self.count = 0
        self.anchors = []
    
    def set_page(self, anchor, page):
        i = self.anchors.index(anchor)
        i.page = page
    
    def add_anchor(self, anchor, prefix):
        self.count += 1
        bk_name = ''.join((prefix, self.name, '_', str(self.count)))
        self.anchors.append(Anchor(anchor, bk_name))
        return bk_name
    
    def get_anchor(self, page):
        if len(self.anchors) == 1: return self.anchors[0]
        ret = None
        for anchor in self.anchors:
            if anchor.page == page:
                ret = anchor
                break
        return ret
 
 
class Entries(object):
    """entries of index"""
    def __init__(self):
        self.entries = {}
    
    def get_entry(self, name):
        """find entry and create new entry if not found"""
        ret = self.entries.get(name, None)
        if ret is None:
            ret = Entry(name)
            self.entries[name] = ret
        return ret
    
    def itervalues(self):
        return self.entries.itervalues()
 
bookmark_prefix = '_AlphabeticalIndex_'
 
def remove_special_bookmarks():
    """remove special bookmarks for links"""
    doc = XSCRIPTCONTEXT.getDocument()
    if not doc.supportsService('com.sun.star.text.TextDocument'): return
    
    bk_prefix = bookmark_prefix
    # remove special bookmarks
    bk_marks = doc.getBookmarks()
    if bk_marks.hasElements():
        names = bk_marks.getElementNames()
        for i in names:
            if i.startswith(bk_prefix):
                text.removeTextContent(bk_marks.getByName(i))
 
 
def alpha_index_page_number_link():
    """assign link to page numbers of alphabetical index"""
    doc = XSCRIPTCONTEXT.getDocument()
    if not doc.supportsService('com.sun.star.text.TextDocument'): return
    
    bk_prefix = bookmark_prefix
    
    view_cursor = doc.getCurrentController().getViewCursor()
    text = doc.getText()
    
    index = None
    indexes = doc.getDocumentIndexes()
    for i in range(indexes.getCount()):
        if indexes.getByIndex(i).getServiceName() == 'com.sun.star.text.DocumentIndex':
            index = indexes.getByIndex(i)
            break
    if not index: return
    
    if index.UsePP: return
    
    remove_special_bookmarks()
    entries = Entries()
    
    # parse index marks and insert bookmarks to each mark
    marks = index.DocumentIndexMarks
    for mark in marks:
        entry_text = mark.AlternativeText
        anchor = mark.getAnchor()
        if entry_text == '':
            entry_text = anchor.getString()
        
        entry = entries.get_entry(entry_text)
        
        bk_mark = doc.createInstance('com.sun.star.text.Bookmark')
        bk_mark.Name = entry.add_anchor(anchor, bk_prefix)
        text.insertTextContent(anchor, bk_mark, False)
    
    # get page for mutiple entries
    doc.lockControllers()
    cursor_start = view_cursor.getStart()
    for v in entries.itervalues():
        if v.count > 1:
            for anchor in v.anchors:
                view_cursor.gotoRange(anchor.anchor, False)
                anchor.set_page(view_cursor.Page)
    
    view_cursor.gotoRange(cursor_start, False)
    #doc.unlockControllers()
    
    # set link to each page number
    enume = index.getAnchor().createEnumeration()
    while enume.hasMoreElements():
        text_range = enume.nextElement()
        
        parts = text_range.getString().split("\t")
        if len(parts) > 1:
            entry = entries.get_entry(parts[0])
            #print(entry.name)
            pages = parts[1].split(',')
            
            if len(pages) == 1:
                anchor = entry.get_anchor(int(pages[0]))
                if anchor:
                    cursor = text.createTextCursorByRange(text_range)
                    cursor.collapseToEnd()
                    cursor.goLeft(len(pages[0]), True)
                    cursor.HyperLinkURL = '#%s' % anchor.bk_mark_name
            else:
                cursor = text.createTextCursorByRange(text_range)
                cursor.collapseToStart()
                cursor.goRight(len(parts[0]) + 1, False)
                cursor.collapseToEnd()
                for page in pages:
                    anchor = entry.get_anchor(int(page))
                    if anchor:
                        cursor.goRight(len(page), True)
                        cursor.HyperLinkURL = '#%s' % anchor.bk_mark_name
                        cursor.collapseToEnd()
                        cursor.goRight(2, False)
    
    doc.unlockControllers()
 
 
g_exportedScripts = (remove_special_bookmarks, alpha_index_page_number_link)

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes