6.4.6.2.6. Identifier Cross references

This is a bit hacky. When a tangler calls 'set_fc_anchor' with a file name and line number, an anchor with the name
  original_file_name + ':' + str(original_lineno)
is generated. Tanglers which call this function supply the original source file name and line number (not the file and line being written to).

Tanglers generate an entry for the identifier occurence which contains both the original source file and line number, and the output code file and line number.

The cross reference table the html weaver generates displays the output code file and line number (not the orginal file and line number), but it generates a reference of the form

  '#' + original_file_name + ':' + str(original_lineno)
using the original file name and line number.

The stacking weaver must trap calls to 'identifier_reference' because the hyperlinks the child weaver charged with generating this table would fail to refer to the specific html file containing the anchor. Instead, the stacking weaver must build the table.

To do that, the stacking weaver must know in which html child document the reference was generated so it can generate a hyperlink of the form:

  childname + '#' + original_file_name + ':' + str(original_lineno)
Unfortunately, the ids dictionary in the global frame currently being used to hold identifier cross references on a document wide basis, does not have this information available. It wouldn't make sense either, the information in that table is generated by tanglers, and has nothing to do with the weaver.

Therefore, the stacking weaver must _also_ intercept calls to 'set_fc_anchor', and create an entry in a dictionary keyed by the original filename and original line number, which tells in which html file the anchor was set: the stacking weaver knows that!

Start python section to interscript/weavers/web.py[8 /8 ] Prev
   504: #line 658 "web_weaver.ipk"
   505:   def mk_identref(self,filename,target):
   506:     sink = named_file_sink(
   507:       self.pass_frame,
   508:       self.basedir+filename,
   509:       self.master.weaver_prefix,
   510:       eol=self.eol)
   511:     self.mk_head(sink)
   512:     w = sink.writeline
   513:     w( '<BODY>')
   514: 
   515:     ids = self.master.ids
   516:     if len(ids) == 0:
   517:       ids = self.pass_frame.ids
   518:     w('<H1>Index of Identifiers</H1>')
   519:     self.print_table(ids,sink)
   520: 
   521:     w('</BODY>')
   522:     w('</HTML>')
   523: 
   524:   def mk_sectionref(self,filename,target):
   525:     sink = named_file_sink(
   526:       self.pass_frame,
   527:       self.basedir+filename,
   528:       self.master.weaver_prefix,
   529:       eol=self.eol)
   530:     self.mk_head(sink)
   531:     w = sink.writeline
   532:     w( '<BODY>')
   533: 
   534:     dict = self.pass_frame.section_index
   535:     w('<H1>Index of Sections</H1>')
   536:     keys = dict.keys()
   537:     keys.sort()
   538:     w = sink.writeline
   539:     w('<TABLE COLS="1" BORDER="1" CELLPADDING="2">')
   540:     for k in keys:
   541:       w('<TR><TD VALIGN="Top"><CODE> '+k+' </CODE>: ')
   542:       nsections = len(dict[k])
   543:       for i in range(nsections):
   544:         name = k + '['+str(i+1)+']'
   545:         anchor = '<A HREF="'+self.get_anchor(name)+\
   546:           '" TARGET="'+target+'">'+str(i+1)+'</A>'
   547:         w(anchor+' ')
   548:       w('</TD></TR>')
   549:     w('</TABLE>')
   550:     w('</BODY>')
   551:     w('</HTML>')
   552: 
   553:   def mk_classref(self,filename,target):
   554:     sink = named_file_sink(
   555:       self.pass_frame,
   556:       self.basedir+filename,
   557:       self.master.weaver_prefix,
   558:       eol=self.eol)
   559:     w = sink.writeline
   560:     self.mk_head(sink)
   561:     w( '<BODY>')
   562: 
   563:     ids = self.master.classes
   564:     if len(ids) == 0:
   565:       ids = self.pass_frame.classes
   566:     w('<H1>Index of Classes</H1>')
   567:     self.print_table(ids,sink)
   568:     w('</BODY>')
   569:     w('</HTML>')
   570: 
   571:   def mk_funcref(self,filename,target):
   572:     sink = named_file_sink(
   573:       self.pass_frame,
   574:       self.basedir+filename,
   575:       self.master.weaver_prefix,
   576:       eol=self.eol)
   577:     w = sink.writeline
   578:     self.mk_head(sink)
   579:     w( '<BODY>')
   580: 
   581:     ids = self.master.functions
   582:     if len(ids) == 0:
   583:       ids = self.pass_frame.functions
   584:     w('<H1>Index of Functions</H1>')
   585:     self.print_table(ids,sink)
   586: 
   587:     w('</BODY>')
   588:     w('</HTML>')
   589: 
   590:   def mk_sourceref(self,filename,target):
   591:     sink = named_file_sink(
   592:       self.pass_frame,
   593:       self.basedir+filename,
   594:       self.master.weaver_prefix,
   595:       eol=self.eol)
   596:     w = sink.writeline
   597:     self.mk_head(sink)
   598:     w( '<BODY>')
   599: 
   600:     w('<H1>Source tree</H1>')
   601:     data = self.master.include_files
   602:     if not data:
   603:       data = self.pass_frame.include_files
   604: 
   605:     for level, type, name in data:
   606:       w(' '*(level*3)+' '+type+': '+name+ '<BR>')
   607: 
   608:     w('</BODY>')
   609:     w('</HTML>')
   610: 
   611:   def mk_testref(self,filename,target):
   612:     sink = named_file_sink(
   613:       self.pass_frame,
   614:       self.basedir+filename,
   615:       self.master.weaver_prefix,
   616:       eol=self.eol)
   617:     w = sink.writeline
   618:     self.mk_head(sink)
   619:     w( '<BODY>')
   620: 
   621:     ids = self.master.tests
   622:     if len(ids) == 0:
   623:       ids = self.pass_frame.tests
   624:     w('<H1>Index of Tests</H1>')
   625:     w('<TABLE CLASS="TEST_SUMMARY_TABLE" COLS="4" BORDER="1">')
   626:     w('<TR><TH>No</TH><TH>Description</TH><TH>Kind</TH><TH>Result</TH><TR>')
   627:     keys = ids.keys()
   628:     keys.sort()
   629:     for key in keys:
   630:       descr, label, kind, result = ids[key]
   631:       href = self.get_anchor(label)
   632:       w('<TR><TD>'+str(key)+'</TD><TD><A TARGET="'+target+'" HREF="'+href+'">'+descr+'</A></TD><TD>'+kind+'</TD><TD>'+result+'</TD></TR>')
   633:     w('</TABLE>')
   634:     w('</BODY>')
   635:     w('</HTML>')
   636: 
   637:   def mk_filestatus(self,filename):
   638:     print 'Creating file status file:',filename
   639:     filestatus_output = simple_named_file_sink(
   640:       self.pass_frame,self.basedir+filename, self.master.weaver_prefix,eol='\r\n')
   641:     filestatus_weaver = html_weaver(
   642:       self.pass_frame,
   643:       filestatus_output,title='File Status')
   644:     filestatus_weaver.print_file_status(hlevel=1)
   645: 
   646:   def set_fc_anchor(self,file,count):
   647:     filename = self.base[0].sink.basename
   648:     self.anchor_file[(file,count)]=filename
   649:     for weaver in self.base:
   650:       weaver.set_fc_anchor(file,count)
   651: 
   652:   def heading_reference(self, *args, **kwds): pass # always generated
   653:   def identifier_reference(self, *args, **kwds): pass # always generated
   654:   def class_reference(self, *args, **kwds): pass # always generated
   655:   def function_reference(self, *args, **kwds): pass # always generated
   656:   def test_reference(self, *args, **kwds): pass # always generated
   657: 
   658: 
End python section to interscript/weavers/web.py[8]