<?xml version="1.0" encoding="ISO-8859-1"?><opml version="1.1">	<head>		<title>radioScan.opml</title>		<dateCreated>Sat, 06 Apr 2002 17:26:49 GMT</dateCreated>		<dateModified>Sun, 28 Apr 2002 00:10:23 GMT</dateModified>		<ownerName>Marc Barrot</ownerName>		<ownerEmail>mbarrot@dig.fr</ownerEmail>		<expansionState>4, 8, 10, 15, 17, 19, 23, 24, 27, 28, 29, 30, 34, 36, 37, 38, 44, 48, 50, 51, 59, 60, 62, 66, 70, 71, 75, 78, 83</expansionState>		<vertScrollState>1</vertScrollState>		<windowTop>127</windowTop>		<windowLeft>369</windowLeft>		<windowBottom>721</windowBottom>		<windowRight>1031</windowRight>		</head>	<body>		<outline text="#title &quot;radioScan&quot;"/>		<outline text="#opmlStory &quot;http://radio.weblogs.com/0104487/gems/opml/radioScan.opml&quot;"/>		<outline text="#renderOutlineWith &quot;activeRenderer&quot;"/>		<outline text="What is radioScan ?">			<outline text="radioScan is a widget that pops up a window on top of your weblog page and lists the titles of all your log's posts, most recent first."/>			<outline text="A small form at the top of the window lets you narrow the list by posting date, category, or title keyword."/>			<outline text="Clicking on a title in the list displays the full post in your browser's main window."/>			</outline>		<outline text="Why such a widget ?">			<outline text="To get an overall idea of what a weblog is about."/>			<outline text="To quickly locate the relevant information.">				<outline text="When I started considering a weblog tool, then specifically Radio Userland, as a way to create a knowledge base for reliable practices in system administration, I soon realised I was missing something to quickly browse thru all the material published by my fellow bloggers."/>				<outline text="Blogging is in essence time driven, pieces of knowledge are added one at a time, among a background of noise, the definition of which is different from reader to reader. "/>				<outline text="When reading a blog for the first time, it's difficult to locate the meaningful parts: a full text search, when available, lets you focus on the keyword(s) you've entered, but you may be missing other relevant information. And browsing thru all the blog pages in HTML, going backward day after day, is time consuming."/>				</outline>			<outline text="Imo, radioScan is a natural component of a K-log, as defined by &lt;a href=&quot;http://groups.yahoo.com/group/klogs/message/211&quot;&gt;John Robb&lt;/a&gt;."/>			</outline>		<outline text="How does it work ?">			<outline text="Well, it's not for the faint hearted, at least for now :-) So here goes..."/>			<outline text="1. radioScan relies on a special table of contents blog page.">				<outline text="This page is a Radio story, aptly named table of contents, which holds a single macro &amp;lt;% storyList () %&amp;gt;."/>				<outline text="This macro, initiated by &lt;a href=&quot;http://radio.weblogs.com/0100887/2002/03/16.html#a146&quot;&gt;Jon Udell&lt;/a&gt;, outputs an inverted chronological list of links to all the log's posts, with each post's title, date and categories.">					<outline text="Every link in the table of contents has a special class attribute, 'toc', that can be used with CSS when rendering the story in HTML, and also serves as an identifier for later use by radioScan's javascript code."/>					<outline text="The storyList usertalk code is available &lt;a href=&quot;http://radio.weblogs.com/0104487/gems/radioScan/storyList.txt&quot;&gt;here&lt;/a&gt;, just save a copy of the storyList.txt file in your Radio Macros folder."/>					</outline>				<outline text="&lt;b&gt;s l a m&lt;/b&gt; 's &lt;a href=&quot;http://radio.weblogs.com/0104487/stories/2002/03/22/test.html&quot;&gt;contents page&lt;/a&gt; is an HTML with CSS rendition of this table of contents story."/>				<outline text="Now the trick is to have this page upstreamed automatically every time you publish a new post.">					<outline text="Radio has a friendly callbacks table to help you with this task, all you need is to enter some code there that touches up the table of contents story; Radio will upstream the HTML rendered version in the next 10 seconds.">						<outline text="Open the Radio.root table and expand all headlines to user.radio.callbacks.publishItems."/>						<outline text="Double-click the item #1 headline, rename it to updateStoryList, of type script, then click zoom."/>						<outline text="Enter the following script:">							<outline text="on updateStoryList ( adrPost )">								<outline text="on touch ( path )">									<outline text="try">										<outline text="file.touchPath ( path );"/>										</outline>									</outline>								<outline text="file.visitFolder ( user.radio.prefs.wwwfolder + &quot;stories:2002:03:22&quot;, infinity, @touch );"/>								</outline>							</outline>						</outline>					<outline text="On a Windows system, replace the ':' directory delimiter with '\\'."/>					</outline>				</outline>			<outline text="2. radioScan is called from a modified #homeTemplate.txt.">				<outline text="The modified template needs some javacript code to pop up the widget window when you click on the radioScan link."/>				<outline text="I first created a function to pop a window up, and placed it somewhere near the top of the &amp;lt;body&amp;gt; part :">					<outline text="&amp;lt;script language=&quot;JavaScript&quot;&amp;gt;&amp;lt;!--">						<outline text="function newWindow(file,window) {">							<outline text="msgWindow=open(file,window,'width=330, height=480, location=0, resizable=1, scrollbars=1, status=0, toolbar=0, directories=0');"/>							<outline text="if (msgWindow.opener == null) msgWindow.opener = self;"/>							</outline>						<outline text="}"/>						</outline>					<outline text="//--&amp;gt;&amp;lt;/script&amp;gt;"/>					<outline text="The '.opener' part of the script is important, since it's the way radioScan knows in which window to display the post's actual content when you click a title in the list. Some backward browsers do not support the opener property, hence this line."/>					</outline>				<outline text="Then I placed a link to radioScan in the navigation sidebar part of the home page template, with an onclick attribute to start things rolling:">					<outline text="onclick=&quot;newWindow(this.href, 'Scan'); return false&quot;."/>					<outline text="the href attribute of the link points to the radioScan main page."/>					</outline>				<outline text="The best way to check this out is to take a look at the HTML source for any of s l a m's pages."/>				</outline>			<outline text="3. At this point, you'd better download the whole &lt;a href=&quot;http://radio.weblogs.com/0104487/gems/radioScan.zip&quot;&gt;radioScan folder&lt;/a&gt;, and place it in your weblog's gems folder.">				<outline text="First unncompress the zip format archive of course."/>				</outline>			<outline text="4. The main radioScan page is radioScan.html.">				<outline text="It's  a frame set with 3 parts.">					<outline text="A query form at the top, points to 'crit.html'."/>					<outline text="A hidden frame to load the table of contents special page in the middle."/>					<outline text="And a result list frame at the bottom, points to 'toc.html'."/>					</outline>				<outline text="The hidden middle frame in the version you've downloaded points to &lt;b&gt;s l a m&lt;/b&gt; 's table of contents, modify it to link to your site's table of contents story."/>				<outline text="The header of the page has a link to all the javascript functions, laid out in the &lt;a href=&quot;http://radio.weblogs.com/0104487/gems/radioScan/radioScan.txt&quot;&gt;radioScan.txt&lt;/a&gt; file."/>				<outline text="the &amp;lt;frameset&amp;gt; tag has an onload attribute, that creates a 'toc' table of contents object, and sets the default scan criterias."/>				<outline text="Creating the table of contents in an onload statement makes sure the table of contents special page is fully loaded in the hidden frame before initializing the object."/>				</outline>			<outline text="5. The rest of radioScan is pure javascript. That's where it gets ugly :-)">				<outline text="The constructor for the table of contents object is the Toc() function.">					<outline text="A Toc class object is mainly an array of Lines class objects."/>					<outline text="Lines objects have several attributes">						<outline text="A text string to store the post's title"/>						<outline text="A date string to store the post's publication date"/>						<outline text="A cats string to store the post's categories, if any."/>						</outline>					<outline text="The function parses the storyList document in the hidden frame.">						<outline text="It retrieves all anchor tags,"/>						<outline text="filters out non table of contents ('toc' class) links,"/>						<outline text="populates both the lines and cats arrays."/>						</outline>					</outline>				<outline text="A table of contents object has 2 methods: reset and write.">					<outline text="Toc.reset initializes the scan criterias to their default values in the crit.html frame.">						<outline text="The track/category select popup is initialized with the values in the Toc.cats array."/>						<outline text="The 'latest' input field is initialized with the first element of the Toc.lines array, the 'oldest' input field with the  last element of Toc.lines."/>						<outline text="The bottom frame is loaded with the toc.html file, which displays user instructions."/>						</outline>					<outline text="Toc.write lists the titles matching the criterias in the toc.html frame.">						<outline text="Toc.write makes use of javascript RegExp objects to filter the rendering of lines."/>						<outline text="It creates a W3C DOM level 1 tree with the filtered lines, then replaces the top 'placeholder' node in the result frame with the new formed tree."/>						</outline>					</outline>				</outline>			</outline>		<outline text="&lt;a name=&quot;ouch&quot;&gt;Browser compatibility issues&lt;/a&gt;">			<outline text="So far, I've tested radioScan with all later versions of Internet Explorer on Windows 98, NT4, MacOS 9, and MacOS X, with Mozilla 1.0rc1 on MacOS X and Linux RedHat 7.2, and with Netscape 6 on MacOS 9 and MacOS X."/>			<outline text="radioScan should work fine with all modern Gecko based browsers."/>			<outline text="On MacOS X, current versions of OmniWeb and Opera are out for lack of decent Javascript support, among other annoying bugs."/>			<outline text="I haven't tested radioScan with Opera on Linux or Windows."/>			</outline>		<outline text="It gets worse: radioScan as a collaboration tool">			<outline text="There is no reason to limit the scope of radioScan to the table of contents of one single blog."/>			<outline text="If you know of other Radio blogs that run a table of contents with the storyList macro, you can include additional copies of the radioScan widget in a page to enable your readers to scan through those sites from your page."/>			<outline text="How cool is that ?"/>			</outline>		</body>	</opml>