*索引 [#rb062d27] 索引はテキストコンテンツとして com.sun.star.text.DocumentIndex サービスを利用します。 #contents **索引の挿入 [#h421ea00] 索引は 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 **索引の更新 [#uadbe4a7] ''update'' メソッドを呼び出します。 **索引の取得 [#zda42aef] 既存の索引を取得するには 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 です。 **索引エントリマーク [#oaec445c] 索引のエントリマークは 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 しています。 **プロパティ一覧 [#q9f51000] |プロパティ|型|| |BackColor|long|背景色| |BackGraphicFilter|string|背景画像フィルタ| |BackGraphicLocation|.style.GraphicLocation|背景画像位置| |BackGraphicURL|string|背景画像URL| |BackTransparent|boolean|背景透過| |ContentSection|.text.XTextSection|コンテンツ部分セクション| |CreateFromChapter|boolean|章をエントリに| |DocumentIndexMarks|[].text.XDocumentIndexMark|インデックスマーク| |HeaderSection|.text.XTextSection|索引ヘッダ部分セクション| |IsCaseSensitive|boolean|大文字と小文字を区別| |IsCommaSeparated|boolean|コンマで区切る| |IsProtected|boolean|保護する| |IsRelativeTabstops|boolean|相対的なタブを利用| |LevelFormat|.container.XIndexReplace|レベルフォーマット| |Locale|.lang.Locale|地域と言語| |MainEntryCharacterStyleName|string|エントリ単語文字スタイル名| |Name|string|インデックス名| |ParaStyleHeading|string|ヘッダ部分段落スタイル| |ParaStyleLevel1|string|コンテンツ段落スタイル| |ParaStyleLevel2|string|| |ParaStyleLevel3|string|| |ParaStyleSeparator|string|区切り文字の段落スタイル| |ServiceName|string|サービス名| |SortAlgorithm|string|ソート時のアルゴリズム| |TextColumns|.text.XTextColumns|列利用時の列| |Title|string|タイトル| |UseAlphabeticalSeparators|boolean|アルファベットごとの区切り文字| |UseCombinedEntries|boolean|項目を統合する| |UseDash|boolean|統合時ダッシュを利用| |UseKeyAsEntry|boolean|キーをエントリに| |UsePP|boolean|Ppを利用する| |UseUpperCase|boolean|項目を大文字からはじめる| ** 索引項目のページ番号にリンクを [#k13df74b] 索引エントリにブックマークを挿入してページからブックマークへリンクします。完成したドキュメント用。 制限 - p でまとめるもの不可 - 項目とページ番号の間がタブのみのもの Python-UNO スクリプトから alpha_index_page_number_link を実行する。 #code(python){{ # -*- 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) }} |