On Nov 5, 2015, at 9:42 , Nobumi Iyanaga <[log in to unmask]> wrote:

2. The second macro would be much more complicated. Here is the situation. I have files for several chapters (one file for each chapter), which are being written and will be finished successively. As the deadline is very soon, I began to work to create indices for each file, beginning with chapter one. These indices being done, I have to create indices for the next files (and finally join all the files, to make big a big file and big indices). To make coherent indices, I have to use those for the first chapter, that is take the same topics, and find the same words, and make indices of the subsequent chapter files with them -- and after that, add other words under other topics for these files...

So the macro should take a list of topics (which would be the selected text), and make a list of all the topics, and all the words, etc. associated with each of these topics in a file. Ideally, the result should be a file with a table of two columns, that would look like the following:

words, etc. topics
_____________________________________________________
 word1|word2|chunk_of_string3 topic
etc. etc.

When such a file would be created, I would be able to examine each entry, and make a list of words and topics, so that I would be able to index these words in the new chapter file, at once, with the macro "Index Using Word List (PowerfindPro)" that Philip created for me...

Would it be possible to write such a macro?


Sure.

# Macro Make Word Lists from Index Topics
# v.1.0  2015/11/5
#

$doc = Document.active

# Prepare a hash for all the indexes
$indexes = Hash.new

# Check all the index styles
$indexNames = Text Index Names
foreach $indexName in $indexNames

# Prepare a hash for all the topic for a given index
$indexTopics = Hash.new

# Go through all the texts of the document and look for indexed items
foreach $text in $doc.allTexts
$loc = 0
while $loc < $text.length
$range = $text.rangeOfAttributesAtIndex $loc
$topics = $text.attributesAtIndex($loc).textIndexTopicsForStyleName($indexName)

# when we find an indexed item
if $topics

# save the selection of the indexed topic in the hash
foreach $topic in $topics
$sel = TextSelection.new($text,$range)
if $indexTopics.definesKey($topic)
if $indexTopics{$topic}.lastValue.bound == $sel.location
$prev = $indexTopics{$topic}.pop
$sel = $prev.unionKissingSelection $sel
end
$indexTopics{$topic}.push $sel
else
$indexTopics{$topic} = Array.new $sel
end
end

end
$loc = $range.bound
end
end

# save the selection hash for the given index
$indexes{$indexName} = $indexTopics
end

# generate output word list tables
# one for each index
foreach $indexName in $indexNames
$list = Array.new
foreach $topic in $indexes{$indexName}.keys
foreach $sel in $indexes{$indexName}{$topic}
if $topic.count
$indexAs = Cast to String $topic
$indexAs.replaceAll '", "', ':'
$indexAs.replaceAll '^\("', '', 'E'
$indexAs.replaceAll '"\)$', '', 'E'
else
$indexAs = '—'
# $indexAs = $sel.substring
end
$list.push $sel.substring & "\t" & $indexAs
end
end
$list.sort
$listDoc = Document.newWithText $list.join("\n") & "\n"
$listDoc.text.replaceAll '^(.+\n)\1+', '\1', 'E'
Select All
Convert to Table
end

Philip Spaelti