First LynxWiki Release
The LynxWiki Project has reached the first release (2012-03-07)
LynxWiki is a full-featured wiki with all the capabilities of much larger and more well-known applications. Most of those capabilities are available in this applications initial release, while those that are missing will be added by end-March 2013. But LynxWiki has even more to offer than those other applications in that it also has an embedded scripting language, IronPython, that allows wiki authors, not just application programmers, to create executable scripts that run when a page is rendered.
LynxWiki supports read/write authentication and authorization. Indeed this page is only writable by the local wiki administrator. Individuals who would like to see changes, or comment on the topic's content can do so on the topic's discussion page, which is not restricted.
The amazing thing about LynxWiki is that the application has been brought to this point with just 20 programmer-days of effort. There will be an addition 4 days of effort in providing documentation to support the initial release. LynxWiki has drawn a lot from a similar .Net-based wiki, FlexWiki. LynxWiki has a different code-base and architecture, but re-uses much of the wiki syntax.
LynxWiki is an MVC 4 application using Entity Framework 5, LINQ, XDocument and numerous other newer .Net 4.5 technologies. LynxWiki uses Lucene.Net for text searching. The current file store uses the Windows file directory structure. The wiki document is stored as an structured XML file, with the raw wiki text, an intermediate representation based on a Wiki Object Model (WOM), and numerous other properties. Wiki integrity is assured by storing a separate version file for each new version. Responsiveness is achieved by also storing a separate current version. The processing of user input to visible web page has 3 distinct phases:
- Wiki text - raw user input in the wiki editor;
- Wiki Object Model - a pack rat driven parser converts Wiki text to XML;
- Transformation from WOM to HTML in 2 steps:
- Resolve dynamic elements at request time to WOM;
- XSLT transform to HTML5 output for display.
The pack rat parser uses rules read from configuration files. These rules can be added to or revised to support different wiki syntax or additional wiki elements. The various wiki text input formats supported are detailed in the links found at FormattingRules.
LynxWiki supports uploading of files, including images and documents. Images can easily be displayed in a topic and hosted in the same web server as the wiki. Documents can also be attached to topics and could also be hosted on the wiki web server. Executables are excluded from upload, and uploads are limited to 4 MB at this time. These capabilities need to be tweaked in the next month so that the exact specification is managed through web.config settings.
The IronPython based scripting is based on a DSL that provides wiki related capability and access to the data store repositories. Security is enforced by excluding the 'import' key word and restricting that to web.config settings so that the server owner has control of IronPython plugin extensions. The current version has only enough capability to verify the architecture, but it is easy to expose repository functionality already programmed, making it available for scripting.
- Packrat parser for generating WikiObjectModel (WOM) output from wiki text input (functional - needs cleanup)
- Application must run in 32-bit rather than 64-bit due to performance issues with complex Regex in 64-bit
- Xml Transform to create HTML output from WOM input (done)
- Wiki text input and WOM output stored in topic version file (done)
- Current topic version and history version created simultaneously (done)
- Topic Discussion as a related wiki text to the main Topic (done)
- support for minor edit where only current version and latest version file are updated (done)
- Topic version data stored as xml data (done)
- directory data stored as xml data (done)
- multiple directory support from wiki root (functional)
- plan for permission model for directories and topics - use Windows auth in Intranet or ASP.Net Membership in Internet environment (need to add membership admin functions for Internet)
- upload directory for images and file attachments (not done)
- dynamic topic content through embedded scripts (barely functional - need to expand DSL and test)
- IronPython based scripting engine with DSL called IronWiki, with DSL extensible via plugins (basic functionality - need to add plugin configuration)
- MVC 4 application (done)
- repository based access to data store (done)
- customizable wiki look through _Layout.cshtml integration (done - builtin to mvc4)
- ability to delete a topic while retaining all history of that topic (via deletion of the current version of the topic) (done)
- a directory deletion does not remove the topics and topic histories contained (though those topics are no longer accessible through the wiki without re-creating the directory in the wiki) (not done)
- code highlighting from SyntaxHighlighter (done)
- topic tagging and tag cloud (not done)
- topic search capability via Lucene.Net (not done)
- print support via css (done)
- function to provide list of links to a page (done)
- add left hand admin functions (partly done)
- scaled images when oversize
Scripting Capability Demo
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.