Top > OOoBasic > Writer > Index
*索引 [#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)
}}

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