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!
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: