Generating Mind Maps from OU/OpenLearn Structured Authoring XML Documents

One of the really useful things about publishing documents in a structured way is that we can treat the document as a database, or generate an outline view of it automatically.

Whilst looking through the OU Structured Authoring XML docs looking for things I could reliably extract from them in order to configure a course custom search engine (Notes on Custom Course Search Engines Derived from OU Structured Authoring Documents), I put together a quick script to generate a course mind map based around the course structure.

It struck me that as structured document/XML views of OpenLearn material is available, I could do the same for OpenLearn docs. So here’s an example. If you visit the OpenLearn site, you should be able to find several modules derived from the old OU course T175. Going to the first page proper for each of the derived modules (URLs have the form http://openlearn.open.ac.uk/mod/oucontent/view.php?id=398868&direct=1), it is possible to grab a copy of the source XML document for the unit by rewriting the URL to include the setting&content=1: for example, http://openlearn.open.ac.uk/mod/oucontent/view.php?id=398868&content=1 UPDATE: the switch is now &content=scxml

OpenLearn source XML

Downloading the XML files for each of the T175 derived modules on OpenLearn into a single folder, I put together a quick script to mine the structure of the document and pull out the learning objectives for each unit, as well as the headings of each section and subsection. The resulting mindmap provides an outline of the course as a whole, something that can be used to provide a macroscopic view over the whole course, as well as providing a document that could be made available to people following the unit as a resource they could use to organise their notes or annotations around the unit.

T175 on Openlearn mindmap

Download a copy of the T175 on OpenLearn Outline Freemind/.mm mindmap

If we could find a way of getting the OpenLearn page URLs for each section, we could add them in as links within the mindmap, thus allowing it to be used as a navigation surface. (See also MindMap Navigation for Online Courses in this regard.)

Here’s a copy of the Python script I ran over the folder to generate the Freemind mindmap definition file (filetype .mm) based on the section and subsection elements used to structure the document.

# DEPENDENCIES
## We're going to load files in from a course related directory
import os
## Quick hack approach - use lxml parser to parse SA XML files
from lxml import etree
# We may find it handy to generate timestamps...
import time


# CONFIGURATION

## The directory the course XML files are in (separate directory for each course for now) 
SA_XMLfiledir='data'
## We can get copies of the XML versions of Structured Authoring documents
## that are rendered in the VLE by adding &content=1 to the end of the URL
## [via Colin Chambers]
## eg http://learn.open.ac.uk/mod/oucontent/view.php?id=526433&content=1


# UTILITIES

#lxml flatten routine - grab text from across subelements
#via http://stackoverflow.com/questions/5757201/help-or-advice-me-get-started-with-lxml/5899005#5899005
def flatten(el):           
    result = [ (el.text or "") ]
    for sel in el:
        result.append(flatten(sel))
        result.append(sel.tail or "")
    return "".join(result)

#Quick and dirty handler for saving XML trees as files
def xmlFileSave(fn,xml):
	# Output
	txt = etree.tostring(xml, pretty_print=True)
	#print txt
	fout=open(fn,'wb+')
	#fout.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
	fout.write(txt)
	fout.close()


#GENERATE A FREEMIND MINDMAP FROM A SINGLE T151 SA DOCUMENT
## The structure of the T151 course lends itself to a mindmap/tree style visualisation
## Essentially what we are doing here is recreating an outline view of the course that was originally used in the course design phase
def freemindRoot(page):
	tree = etree.parse('/'.join([SA_XMLfiledir,page]))
	courseRoot = tree.getroot()
	mm=etree.Element("map")
	mm.set("version", "0.9.0")
	root=etree.SubElement(mm,"node")
	root.set("CREATED",str(int(time.time())))
	root.set("STYLE","fork")
	#We probably need to bear in mind escaping the text strings?
	#courseRoot: The course title is not represented consistently in the T151 SA docs, so we need to flatten it
	title=flatten(courseRoot.find('CourseTitle'))
	root.set("TEXT",title)
	
	## Grab a listing of the SA files in the target directory
	listing = os.listdir(SA_XMLfiledir)

	#For each SA doc, we need to handle it separately
	for page in listing:
		print 'Page',page
		#Week 0 and Week 10 are special cases and don't follow the standard teaching week layout
		if page!='week0.xml' and page!='week10.xml':
			tree = etree.parse('/'.join([SA_XMLfiledir,page]))
			courseRoot = tree.getroot()
			parsePage(courseRoot,root)
	return mm

def learningOutcomes(courseRoot,root):
	mmlos=etree.SubElement(root,"node")
	mmlos.set("TEXT","Learning Outcomes")
	mmlos.set("FOLDED","true")
	
	los=courseRoot.findall('.//FrontMatter/LearningOutcomes/LearningOutcome')
	for lo in los:
		mmsession=etree.SubElement(mmlos,"node")
		mmsession.set("TEXT",flatten(lo))

def parsePage(courseRoot,root):
	unitTitle=courseRoot.find('.//Unit/UnitTitle')

	mmweek=etree.SubElement(root,"node")
	mmweek.set("TEXT",flatten(unitTitle))
	mmweek.set("FOLDED","true")

	learningOutcomes(courseRoot,mmweek)
	
	sessions=courseRoot.findall('.//Unit/Session')
	for session in sessions:
		title=flatten(session.find('.//Title'))
		mmsession=etree.SubElement(mmweek,"node")
		mmsession.set("TEXT",title)
		mmsession.set("FOLDED","true")
		subsessions=session.findall('.//Section')
		for subsession in subsessions:
			heading=subsession.find('.//Title')
			if heading !=None:
				title=flatten(heading)
				mmsubsession=etree.SubElement(mmsession,"node")
				mmsubsession.set("TEXT",title)
				mmsubsession.set("FOLDED","true")


mm=freemindRoot('t175_1.xml')
print etree.tostring(mm, pretty_print=True)
xmlFileSave('reports/test_t175_full.mm',mm)

If you try to run it over other OpenLearn materials, you may need to tweak the parser slightly. For example, some documents may make use of InnerSection elements, or Header rather than Title elements.

If youdo try using the above script to generate mindmaps/outlines of other OpenLearn courses, please let me know how you got on in the comments below (eg whether you needed to tweak the script, or whether you found other structural elements that could be pulled into the mindmap.)

Educative Media?

Another interesting looking job ad from the OU, this time for a Web Assistant Producer with Open Learn (Explore) in the OBU (Open Broadcasting Unit).

Here’s how it reads:

Earlier this year the OU launched an updated public facing, topical news and media driven site. The site bridges the gap between BBC TV viewing and OU services and functions as the new ‘front door’ to Open Learn and all of the Open University’s open, public content. We are looking for a Web Assistant Producer with web production/editing skills.

You will work closely with a Producer, 2 Web Assistant Producers, the Head of Online Commissioning and many others in the Open University, as well as the BBC.

You need to demonstrate a real interest in finding and building links between popular media/news stories, OU curriculum content, research and more. You must have experience of producing online educational material including: Researching online content, writing articles; sourcing images or other assets and/or placing and managing content text, FLASH and video/audio content within a Content Management System.

(I have to say, I’m quite tempted by the idea of this role…)

One of the things I wonder about is the extent to which “news” editorial guidelines will apply? When the OU ran the Open2.net website (now replaced by the revamped OpenLearn) content was nominally managed under BBC editorial guidelines, though I have to say I never read them… Nor did I realise how comprehensive they appear to be: BBC Editorial Guidelines. (Does the OU have an equivalent for teaching materials, I wonder?!)

As a publisher of informal, academic educational content, to what extent might editorial guidelines originating from a news and public service broadcaster be appropriate, and in what ways, if any, might they be inappropriate? (I think I need to try out a mapping from the BBC guidelines into an educational/educative context, if one hasn’t been done already…?)

Anyway, for a long time I’ve thought that we could be trying to make increased mileage of news stories in terms of providing deeper analysis and wider contextualisation/explanation that the news media can offer. (In this respect, I just spotted something – now a couple of days old: oops! – in my mailbox along exactly these lines. I’m working towards inbox zero and a shift to a new email client in the new year, so fingers crossed visiting my email inbox won’t be so offputting in future!) So it’s great to see that the new OpenLearn appears to be developing along exactly those lines.

A complementary thing (at least in the secondary sense of OpenLearn as open courseware and open educational resources) is to find a way of accrediting folk who have participated in open online courses and who want to be accredited against that participation in some way … and it just so happens that’s something I’m working on at the moment and hoping to pitch within the OU in the new year…

PS in passing, as the HE funding debate and demos rage on, anyone else think the OU should be license fee funded as a public service educator?!;-)

OpenLearn Website Refresh, and the Re-emergence of SocialLearn…

It’s seems like today has been a busy day for a couple of the OU’s web teams…

First up, and with a beta launch today, the new OpenLearn site makes an appearance, including integration of content from the Open2.net site. As I understand it, the new OpenLearn website amounts to something akin to the “public service educator” presence of the OU, (complemented by OU Platform, the OU’s (open to all) social community site, and presumably SocialLearn, about which, more later…)

OpenLearn Relaunched

openlearn - www.open.ac.uk/openlearn

As well as providing the access point to the OU’s openly licensed (and free to use) educational material that was hosted on the original OpenLearn LearningSpace site, and content that is published to iTunesU and Youtube, OpenLearn (http://www.open.ac.uk/openlearn) will also support the OU’s “broadcast” strategy. This will include support for OU co-produced programming with the BBC, taking over this role from open2.net (apparently: “Open2.net will stay live for a while so we can tell our existing users about the changes and manage any current broadcast related activity on the site. We will then close the open2.net and anyone following links to open2.net will be redirected to the new site.”), as well as providing opportunities for publishing materials in order to support major news events, perhaps along the lines of The COP15 University Expert Press Room; (I’m not sure if OpenLearn will also act as a channel for teaching and research related news, as well, cf. Social Media Releases and the University Press Office?).

Course materials are organised by topic, as well as resource type (in a way that reminds me of the OpenLearn content promotion that (used to? or still does?) appear on Sky’s Skylearning website):

OpenLearn beta

We can also search by media type:

OpenLearn - - media resources

(One thing that might be handy would be the ability to subscribe to a podcast feed from a search on a particular topic area?)

Note that the search function may be a little ropey today, as the site is still being indexed…

The What’s On area of the site seems to have links to recent OU broadcast content, though I’m not sure whether it will also start to promote academic presentations and webcast events of general interest e.g. from the OU’s Berrill Stadium?

OpenLearn - what's on

I didn’t spot an RSS feed though…:-(

(Hmmm, which reminds me – I wonder if my Recent OU Programmes on the BBC, via iPlayer hack, or the mobile/iPhone or Boxee versions still work?!;-)

All the OpenLearn content appears commentable, although I think an OU registration/login is required? I seem to remember logins being provided to all comers for the Platform site, so maybe anyone can just register?

In fact, registration opportunities provide a good link to the announcement of a private beta for SocialLearn that opened up today…

(Re)Introducing SocialLearn

Long time readers of this blog may remember an OU project called “SocialLearn” that was initiated to explore the opportunities for a web scale social learning platform to straddle formal and informal learning. After various fits, starts, and consumption of budget, SocialLearn is back at http://sociallearn.org/ in a new widgetised form, appearing to offer (in the early stages a least) a Netvibes like dashboard that can host custom created widgets or (I think?) iGoogle gadgets that can be used to support your learning… (whatever that means!;-)

A couple of nice features that struck me: firstly, as a social platform, you can use credentials from the most popular social networking services to log in/create your account, and you can also import personal details from those networks. (I’m not sure how this works in practice – I don’t have an invite yet…) Secondly, a SocailLearn toolbar can be raised on any page from a bookmarklet (rather than a browser extension?), and then used to display individual widgets from different widget sets as overlays on the current page (I assume widget sets are like tabs on Netvibes, or Pageflakes?)

The best way to demo this is by a video… err.. Hmm… Being a web platform, site features are described using a video tour; and being a social platform, the video player has viral sharing/embedding features… errr…. probably… maybe… errr.. well if there is, I can’t spot them, at least, not in my browser…and being a WordPress hosted blog, I’m limited as to what I can embed anyway…

Ho hum…

This new, lighter weight view of SocialLearn harkens back to some of the original ideas that were mooted at the early stages of the first iteration of SocialLearn, but since then we’ve had the Facebook effect and a shift in terms of attention to that platform and the Facebook way of interacting, as well as the explosion in availability of smartphones and the app economy. Maybe the time is now right for portable toolbars that carry your applications with you to separate websites? Will the widget base of SocialLearn allow widgets to act as a standalone apps on a mobile device, or work nicely together in a combined app? Who knows…? It’ll be interesting to see…

(It’s also interesting to wonder whether the SocialLearn gadget approach is being developed with an eye on the Google Apps for Edu, which a little bird told me will start to roll out to OU students over the summer… (can anyone confirm that? And more specifically confirm what will be rolling out to whom?)

PS as far as user behaviour and UI aesthetics go, I wonder if the Max Expose inspired Firefox Tab Candy means we’ll start to see more of this style of interaction too?

OpenLearn WordPress Plugins

Just before the summer break, I managed to Patrick McAndrew to use some of his OpenLearn cash to get a WordPress-MU plugin built that would allow anyone to republish OpenLearn materials across a set of WordPress Multi-User blogs. A second WordPress plugin was commissioned that would allow any learners happening by the blogs would subscribe to those courses using “Daily feeds”, that would deliver course material to them on a daily basis.

The plugins were coded by Greg Gaughan at Isotoma, and tested by Jim and D’Arcy, among others… (I haven’t acted on your feedback yet – sorry, guys…:-( For all manner of reasons, I didn’t post the plugins (partly because I wanted to do another pass on usability/pick up on feedback, but mainly because I wanted set up a demo site first… but I still haven’t done that… so here’s a link to the plugins anyway in case anyone fancies having a play over the next few weeks: OpenLearn WordPress Plugins.

I’ll keep coming back to this post – and the download page – to add in documentation and some of the thoughts and discussions we had about how to evolve the WPMU plugin workflow/UI etc, as well as the daily feeds widget functionality.

In the meantime, here’s the minimal info I gave the original testers:

The story is:
– one ‘openlearn republisher’ plugin, that will take the URL of an RSS feed describing OpenLearn courses (e.g. on the Modern Languages page, the RSS: Modern Languages feed)) , and suck those courses into WPMU, one WPMU blog per course, via the full content RSS feed for each course.

– one “daily feeds” widget; this can be added to any WP blog and should provide a ‘daily’ feed of the content from that blog, that sends e.g. one item per day to the subscriber from the day they subscribe. The idea here is if a WP blog is used as a content publishing sys for ‘static’, unchanging content (e.g. a course, or a book, where each chapter is a post, or a fixed length podcast series), users can still get it delivered in a paced/one-per-day fashion. This widget should work okay…

Here’s another link the page where you can find the downloads: OpenLearn WordPress Plugins. Enjoy – all comments welcome. Please post a link back here if you set up any blogs using either of these two plugins.