Top > OOoBasic > Writer > Index

*索引 [#rb062d27]

索引はテキストコンテンツとして サービスを利用します。


**索引の挿入 [#h421ea00]

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

 Sub index_1
   oDoc = ThisComponent
   oText = oDoc.getText()
   oEnd = oText.getEnd()
   oIndex = oDoc.createInstance("")
 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 = "" Then
      End If
   Next i
 End Sub

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

**索引エントリマーク [#oaec445c]

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

 Sub index_5
   oDoc = ThisComponent
   oText = oDoc.getText()
   oSelection = oDoc.getCurrentSelection()
   If oSelection.Count = 1 Then
     oRange = oSelection.getByIndex(0)
     oEntry = oDoc.createInstance("")
     'oEntry.PrimaryKey = oRange.getString()
   End If
   oIndexes = oDoc.getDocumentIndexes()
   For i = 0 To oIndexes.getCount() -1
      oIndex = oIndexes.getByIndex(i)
      If oIndex.ServiceName = "" Then
      End If
   Next i
 End Sub

エントリマークを挿入後、索引を update しています。
**プロパティ一覧 [#q9f51000]


** 索引項目のページ番号にリンクを [#k13df74b]

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

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

# -*- 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 = page
	def __eq__(self, other):
		return self.anchor == other
	def set_page(self, page): = page

class Entry(object):
	"""individual entry"""
	def __init__(self, name): = name
		self.count = 0
		self.anchors = []
	def set_page(self, anchor, page):
		i = self.anchors.index(anchor) = page
	def add_anchor(self, anchor, prefix):
		self.count += 1
		bk_name = ''.join((prefix,, '_', 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 == page:
				ret = anchor
		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(''): 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):

def alpha_index_page_number_link():
	"""assign link to page numbers of alphabetical index"""
	doc = XSCRIPTCONTEXT.getDocument()
	if not doc.supportsService(''): 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() == '':
			index = indexes.getByIndex(i)
	if not index: return
	if index.UsePP: return
	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('')
		bk_mark.Name = entry.add_anchor(anchor, bk_prefix)
		text.insertTextContent(anchor, bk_mark, False)
	# get page for mutiple entries
	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)
	view_cursor.gotoRange(cursor_start, False)
	# 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])
			pages = parts[1].split(',')
			if len(pages) == 1:
				anchor = entry.get_anchor(int(pages[0]))
				if anchor:
					cursor = text.createTextCursorByRange(text_range)
					cursor.goLeft(len(pages[0]), True)
					cursor.HyperLinkURL = '#%s' % anchor.bk_mark_name
				cursor = text.createTextCursorByRange(text_range)
				cursor.goRight(len(parts[0]) + 1, False)
				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.goRight(2, False)

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