Core Feature

A feature defined in the Core. Although Core Features are programmed in plug-ins too (since they need to make use of the signal mechanism,) they are mandatory and cannot be deselected.

Each row in the content table is considered an object. All objects are composites meaning that different plugins handle different fields of the object. We do not have a function that load the whole object. Although it could be practical in some cases, we instead let each plugin handles their own data as required. For example, if the robots.txt plugin needs to know whether a page is indexable then it reads the corresponding link. In most other cases, however, that link is ignored because it is not important; i.e. boxes on the side also have that link, but robots.txt does not use it because ...


This is not exactly a feature by itself (it is part of the Filter feature [core]), but I felt like there was a need for a specific page to talk about this feature.

The token replacement feature is a way to speak of the capability for the system to provide a set of variables that can be used as replacement of tokens found in pages.

There is one main reason for making this feature part of core: we want ONE scheme that works for all the plugins in a seamless manner.


The syntax is as follow:

token ::= '[' name ( '(' parameters? [,]? ')' )? ...


This is certainly an extension of the layout.

The idea is pretty simple: support different extensions for the same page and depending on the extension return the content in that specific format (i.e. .html would be considered the default, then you could use .pdf to retrive the page as a PDF file, .prt to get a printer friendly version, .eml to get an email friendly version, etc.)

Using a Book like feature, we can create a whole tree and thus the PDF file can include all the pages of the book.

Default Format

It should be possible for a page to indicate the format in ...


The Website Status represents the current status (main behavior) of the website. This is quite different from the Status Report feature [core] which attempts to help the user with things he still has to do on his website.


The following are the different statuses that a website can enter depending on various signals such as wether the person just sent us spam or whether the owner of the site changed the current status.

  • On-line -- this is the standard state, everything shows up as expected
  • Minimal -- the site works, but any form is marked as read-only or is ...

The system offers a taxonomy content type. That one content type includes content pages which define a tag1.

The top tags (parent most) can be considered vocabularies or categories.

Children of those vocabularies are tags or terms. Each gain the full benefit of being a content object with definitions, links, next/previous, parent/child, ...

  • 1. Should we allow one content type per category? In other words, we'd have one content type for permissions and one content type for the categorization (grouping) of the permissions -- I think that our implementation is pretty much like that already.

Links Management

The URLs found in a page are added to the links table (a specific content type) so we can manage all the links.

  • With this table the computer can test to find out whether a link breaks (i.e. you cannot follow the link to an existing website anymore.)
    • Note that links on pages that are not currently published should either not be checked, or checked just once. Unpublished means not visible by regular people (i.e. it could be marked as spam rather than just unpublished.)
    • Find out whether we can know when a YouTube video (and others) get removed, ...


We heavily use AJAX to allow immediate editing of all the page content. Pages do not require JavaScript to be read, but any work on a page requires full JavaScript functionality. The code sends POST and at times GET messages to the server to maintain the page as expected and keep the server synchronized.

For example, you are able to log in a page using AJAX so the page doesn't need to be fully refreshed. Similarly, editing the title of a page just requires a click on that title.

We have to think about several side effects of using AJAX:

  • All AJAX code should ...

Email feature [core]

Main features to support with emails

  • Multi-part emails, with text, HTML, attachments
  • Theming for the HTML section
  • Emails include a priority
  • Bouncing emails must be managed in some ways
  • Email body must support all the usual tokens
    • The body content (and subject) must be tweak to only include absolute URLs
  • Cumulative emails (i.e. notices that are piled up in a SINGLE email!)
    • Delayed signal emails should be viewed as Cumulative but only the last email should be sent (i.e. I make 3 changes to page X, editing/saving each time, ...

C++ plugins [core]

Under Linux, we can use dlopen() to load a .so file. We will be using that function to load our plugins.

The function takes care of executing the C++ initialization as required (and corresponding destructions on dlclose() calls.)

This means we can create a plugin simply by creating a listener that will receive signals from the other plugins and Snap! core. The listener is created as a global variable which the dlopen() function automatically initializes (and if necessary, the dlclose() will turn it off.)

The dlopen() gives you a choice in loading everything in LAZY mode and making all the ...

Editor feature [core]

At first we may want to go with an editor that's simpler than CKeditor although CK has the great advantage of managing links better than pretty much all the other editors out there. (i.e. you can click in the link, then click the link icon and the editor automatically selects the whole link for you. Other editors simply assume that your selection ability is perfect!)

The editor must have at least the following to be considered complete enough:

  • Capability to save a draft automatically (auto-save)
  • Basic formatting (bold, italic, underline, strike, sub/sup, lists, indent, ...

Snap! Websites
An Open Source CMS System in C++

Contact Us Directly