All page names need to be in English.
en da  de  fr  it  ja  km  nl  ru  zh


From TYPO3Wiki
Jump to: navigation, search

<< Back to Extension manuals page


Author: Jochen Rau
Extension key: contagged
Last revision: 1.7.0 (2012-07-31)
Prerequisites: PHP >5.3.0

notice - Open Content License

This document is published under the Open Content License

The content is related to TYPO3 - a GNU/GPL CMS/Framework available from

The extension was featured in one of the Typo3 podcasts. Check out the video at to see the extension in action.

What does it do?

  • auto-parsing, tagging and replacing of terms in a text
  • scenarios of usage:
    • auto-link to a glossary page
    • auto-link to a bibliography page
    • auto-replace a product number with the actual price
    • auto tag a persons name to show the corresponding address in a tool-tip an link to a list of addresses
    • replace text to hold typographic conventions (eg. replace ``foo´´ with ,,foo´´ or remove double typed spaces)
  • the term can be treatet as regular expression (see type "Regular Expression")
  • any database table can be used as a data source
    • fully configurable via TS (table name, mapping of fields)
    • default database table (term, alternative terms, replacement, short description, long description, language of the term, link, pronunciation, media)
    • full support of stdWrap to do complex mapping of fields
  • Synonyms and morphologies are supported (alternative terms)
  • Mini list of terms found on a single page -- sponsored by Paul Vetch (qedStudio)
  • Search box (pi_base) -- sponsored by Paul Vetch (qedStudio)
  • Page browser (pi_base) -- sponsored by Paul Vetch (qedStudio)
  • Crosslinking between terms (see also ...) -- sponsored by Paul Vetch (qedStudio)
  • Add images to your term definitions -- sponsored by Paul Vetch (qedStudio)
  • DAM as a source of images -- sponsored by Paul Vetch (qedStudio)
  • A maximum of tagged/replaced terms within a content element or within a page (which are then constantly spread over a content object)
  • definition of new types via typoscript (definition, acronym, person, keyword, cities, replacements ...)
  • inclusion and exclusion of branches, individual pages and individual content objects (cObj)
  • content elements to be tagged are selected by using tt_content.text.20.parseFunc.userFunc = tx_contagged->main
  • custom link (mail,http,pid) for each term
  • auto-parser takes joined words (with a dash) into account
  • single and list view
    • template based
    • alphabetical index (or any other index like ZIP-Codes, names etc.; configurable via locallang.xml)
    • links only index-chars for which a database entry exists
    • index-chars missing can be added automatically
    • link "back to last page" in single view for easy navigation
  • multi language support
    • translated content
    • localized sorting (not UTF8-safe by now)
    • localized index (FE-Plugin)
    • adds a "lang"-attribute, if the page language is not the same as the language of the term
  • stdWrap for the term to be searched ("termStdWrap"; usefull to search for already tagged text like <person>Steve Jobs</person>)
  • Example configuration for RealURL is included


  1. Import and Install tx_contagged with the extension manager. Be sure getting the latest version.
  2. Include the static templates Content parser (contagged) and default CSS-styles (contagged)in your main template. You have to select Click here to edit whole template record in the Template-module. There is a third Template "Experimental types (contagged)" with - ehrm - experimental types.
  3. Add a new page ("list page") where you can insert the FE-plugin (contagged (list))
  4. Add a SysFolder you can store your terms in (can be any page including the list page, too).
  5. Configure the extension via the Constant editor in the Template-module or in your TS Setup.
  6. If you want to parse the content of tt_news add also the last line.
plugin.tx_contagged {
	listPages = 123,56
	storagePids = 123,456
	includeRootPages = 2
plugin.tt_news.general_stdWrap.postUserFunc = tx_contagged->main
  • listPage: a comma separated list of pids list pages you have inserted the FE-Plugin "List (contagged)" on; only the first page will be linked, but the term appears on every list page you have configured (glossary, list of persons)
  • storagePids: a comma-separated list of pids you have stored your terms
  • includeRootPages: a comma-separated list of pids of the root pages whose branches you want to be parsed (can be the overall root page of your site)

Please have a look at section "Questions and Wishes" if you have any Problems installing the extension. And please remember: It's still alpha.

Known problems

  • sorting of the terms and index chars is not UTF8-safe (depending on locales; will be solved in PHP 6.0)
  • (fixed) switching the FE-language is not recognized by the FE-plugin
  • (fixed) multi byte index chars (UTF-8) are not linked correctly in the index of the FE-plugin
  • (fixed) keywords are only generated from the last cObj of a page
  • (fixed) bad performance of the FE-plugin

To-Do list

  • (done) CSS tooltips to display the description
  • (done) parsing the content of other extensions (e.g. tt_news);
  • custom tags (e.g. to mark ambiguities or to exclude single words)
  • full support of regex via typoscript
  • tagging a larger scope than only the matched term (via RegEx)
  • backlinks
  • frontend editing
  • handling of ambiguities (e.g. "Bus" = "large motor vehicle" AND "set of conductors carring data")
  • BE-module
    • statistics
    • markup with custom tags (" ... lorem ipsum bus dolor sit amet ... [select tag \/]"
  • enable the administrator to decide how the parser is initiated

Questions and Wishes

Feel free to add some new questions,ideas, suggestions and whishes.

  1. Parsing content from other extensions is my favourite wish. Is there a reason why you only parse tt_content? Other taggers (like a21glossary) parse the complete parsed page before it gets outputted to the browser. Is that an idea? --Daniel
  1. There are several places (eg. tt_content.text) and several ways (postUserFunc, parseFunc.userFunc,contentPostProc-all) to initiate parsing. All of them have their advantages and disadvantages. I began to program contagged as I was unsatisfied by the accuracy of matches found by a21glossary. And I found out that it's really difficult to parse the body of a HTML-page by RegEx (preg_replace) if you want avoid unwanted matches. And if you hook in "contentPostProc-all" you can not cache the output. So every time you deliver a large page you have to parse it. On the other hand, you don't have problems to parse the output of any extension. For this reason I startet some tests with the hook 'contentPostProc-all' in 'tslib/class.tslib_fe.php'. I plan to enable the administrator to select which parsing method he prefers. --Jochen
  1. Would be nice to extend some functionality by modules. For example something like "contagged__drwiki" and "contagged__statisticview" can be created when one or more hooks exist. So it's easy to handle special wiki-features or see a statistic-chart. --Daniel
  1. That would be great. It's planned to create a backend module to tag terms manually and to view some statistical data. Furthermore I will add several hooks and the extension will be refactured to the MVC-pattern. By now the extension is highly configurable via TS. Please tell me, if you have special needs. --Jochen
  1. I could really use a "DAU" (for the stupid) Tutorial. Some more examples how to use it - maybe as video - would be great! --Georg
  1. You are right. But I am very busy with Extbase at the moment (August 2009). So, would you like to contribute?
  1. Is it possible to parse text that is inside a table content element? I can only see the ability for text that is in a text content element to be parsed. I added
    tt_content.table.20.postUserFunc = tx_contagged->main
    to the TS setup file, but this does not seem to do it. Any advice welcome. Thanks! --Nikki
  1. You have to add
    tt_content.table.20.stdWrap.postUserFunc = tx_contagged->main
    as the table is rendered by a cObject of type USER which has no stWrap property by default. This feature will be included in a future release of contagged.
  1. Why dosen't Contagged respect the alphabet order entered at the end of lang file? Or appropriate locale? It sorts the names in western way (ascii letters first, diacritical last).
  1. Is it possible to get alternate Templates for the List-Template to get two (or more) different boxes? Such as tt_news or ab_linklist? It would be great. Thanks, Michael .
  1. How can I establish case sensitive selection concerning the parsing? For example contagged should be set a link to the respective glossary content at the term "MIT" but not at the German word "mit". Thanks, Torsten.
  1. Why doesn't the extension respect the starting point? Maybe it is more flexible this way, but it requires editors to have access to template editing. Could you make this a choice in upcoming versions?


Basic TS-Setup

This is the TypoScript Setup of tx_contagged:

# include class tx_contagged as library 
includeLibs.tx_contagged = EXT:contagged/class.tx_contagged.php

# invoke the parser
lib.stdheader.stdWrap.postUserFunc = tx_contagged->main
tt_content {
	text.20.postUserFunc = tx_contagged->main
	bullets.20.postUserFunc = tx_contagged->main
	table.20.stdWrap.postUserFunc = tx_contagged->main
	uploads.20.itemRendering.20.2.postUserFunc = tx_contagged->main
	image.20.caption.1.postUserFunc = tx_contagged->main
	html.postUserFunc = tx_contagged->main

plugin.tx_contagged {
	templateFile = {$contagged.templateFile}
	linkToListPage = {$contagged.linkToListPage}
	listPages = {$contagged.listPages}
	storagePids = {$contagged.storagePids}
	includeRootPages = {$contagged.includeRootPages}
	excludeRootPages = {$contagged.excludeRootPages}
	includePages = {$contagged.includePages}
	excludePages = {$contagged.excludePages}
	excludeTags = {$contagged.excludeTags}
	autoExcludeTags = {$contagged.autoExcludeTags}
	fetchRelatedTerms = {$contagged.fetchRelatedTerms}
	checkPreAndPostMatches = {$contagged.checkPreAndPostMatches}
	respectCase = {$contagged.respectCase}
	addTitleAttribute = {$contagged.addTitleAttribute}
	addLangAttribute = {$contagged.addLangAttribute}
	addCssClassAttribute = {$contagged.addCssClassAttribute}
	replaceTerm = {$contagged.replaceTerm}
	maxRecurrences = {$contagged.maxRecurrences}
	maxRecurrencesPerPage = {$contagged.maxRecurrencesPerPage}
	updateKeywords = {$contagged.updateKeywords}
	labelWrap1 = {$contagged.labelWrap1}
	labelWrap2 = {$contagged.labelWrap2}
	modifier = {$contagged.modifier}
	sortField = {$contagged.sortField}
	fieldsToMap = {$contagged.fieldsToMap}
	fieldsToParse = {$contagged.fieldsToParse}
	autoExcludeTerms = {$contagged.autoExcludeTerms}
	addBackLink = {$contagged.addBackLink}
	addBackLinkDescription = {$contagged.addBackLinkDescription}

	images {
		stdWrap.wrap = <div class="tx-contagged-images">|</div>
		caption.stdWrap.wrap = <div class="tx-contagged-imagecaption"> | </div>
	    caption.stdWrap.trim = 1
		single.image {
			file.maxW = {$contagged.singleMaxW}
			file.maxH = {$contagged.singleMaxH}
			stdWrap.wrap = <div class="tx-contagged-singleimage">|</div>
			imageLinkWrap = 1
			imageLinkWrap {
				enable = 1
				bodyTag = <body bgColor="#ffffff">
				wrap = <a href="javascript:close();"> | </a>
				width = 500m
				height = 500
				JSwindow = 1
				JSwindow.newWindow = 1
				JSwindow.expand = 17,20
	related {
		stdWrap.wrap = <div class="tx-contagged-related">|</div>
		single.stdWrap.wrap = <div>|</div>
	index {
		enable = {$contagged.enableIndex}
		showOnlyMatchedIndexChars = {$contagged.showOnlyMatchedIndexChars}
		autoAddIndexChars = {$contagged.autoAddIndexChars}
	pagebrowser {
		enable = {$contagged.enablePageBrowser}
		results_at_a_time = {$contagged.results_at_a_time}
		maxPages = {$contagged.maxPages}
		dontLinkActivePage = {$contagged.dontLinkActivePage}
		pagefloat = {$contagged.pagefloat}
		showFirstLast = {$contagged.showFirstLast}
		alwaysPrev = {$contagged.alwaysPrev}
		showResultCount = {$contagged.showResultCount}
		showRange = {$contagged.showRange}
		tableParams = {$contagged.tableParams}
		pointerName = {$contagged.pointerName}
		enableHtmlspecialchars = {$contagged.enableHtmlspecialchars}
		wraps {
			browseBoxWrap = <div class="browseBoxWrap">|</div>
			showResultsWrap = <div class="showResultsWrap">|</div>
			browseLinksWrap = <div class="browseLinksWrap">|</div>
			showResultsNumbersWrap = <span class="showResultsNumbersWrap">|</span>
			disabledLinkWrap = <span class="disabledLinkWrap">|</span>
			inactiveLinkWrap = <span class="inactiveLinkWrap">|</span>
			activeLinkWrap = <span class="activeLinkWrap">|</span>
	searchbox {
		enable = {$contagged.enableSearchBox}
		fieldsToSearch = {$contagged.fieldsToSearch}
	types {

		definition {
			label = Definition = Definition
			tag = dfn
		tooltip {
			label = Definition (tool-tip) = Definition (Tool-Tip)
			tag = span
			addCssClassAttribute = 1
			cssClass = tooltip
			stripBlockTags = 1
			stdWrap.innerWrap.cObject = COA
			stdWrap.innerWrap.cObject {
				10 = TEXT
				10.value = | <span class="tx-contagged-tooltip-content"><a href="{register:contagged_link_url}">{register:contagged_matchedTerm}</a><br />
				10.insertData = 1
				20 = TEXT = register:contagged_desc_short_inline = register:contagged_desc_long_inline
				30 = TEXT
				30.value = </span>

		acronym {
			label = Acronym = Kurzwort aus Anfangsbuchstaben (Beispiel: NATO)
			tag = acronym

		abbrevation {
			label = Abbrevation = Abkürzung (Beispiel: u.s.w.)			
			tag = abbr

	dataSources {
		default {
			sourceName = tx_contagged_terms
			hasSysLanguageUid = 1
			storagePids = 
			fieldsToEdit = term_main,term_alt,term_type,term_lang,term_replace,desc_short,desc_long,link,exclude
			mapping {
				uid.field = uid
				pid.field = pid
				term_main.field = term_main
				term_alt.field = term_alt
				term_type.field = term_type
				term_replace.field = term_replace
				term_lang.field = term_lang
				desc_short.field = desc_short
				desc_long.field = desc_long
				image.field = image
				imagecaption.field = imagecaption
				imagealt.field = imagealt
				imagetitle.field = imagetitle
				related.field = related
				link.field = link
				exclude.field = exclude

Change Log

v1.7.0 2012-07-27 Jochen Rau <>

	[+BUGFIX] Improved sorting of terms with multibyte charsets (by length descending before replacement). Thanks to Francois Suter. Resolves #38148.
	[+BUGFIX] LIKE statement on fe_group works with mssql now. Thanks to Dimitri Koenig. Resolves #26124.
	[+FEATURE] You can now specify, whether related terms should be fetched or not by setting fetchRelatedTerms. Thanks to Dimitri Koenig. Resolves #26145.
	[TASK] Bumped version number to 1.7.0 and deployed to TER.
	[+FEATURE] Reimplemented stdWrap for term (use termStdWrap in type defintion).

v1.6.5 2010-12-15 Jochen Rau <>

	[+BUGFIX] Parse template in TCA works now with rootpage on level > 0. Thanks to Christopher Hlubek. Resolves #11454.
	[+FEATURE] You can now specify the maximum number of recurrences per page by maxRecurrencesPerPage option. It can be combined with the maxRecurrences (per cObj) option. Thanks to Felix Oertel. Resolves #10973.
	[+FEATURE] Implemented reference, pronounciation, and media property. The reference property is a textual representation of the term source. The media property can store a reference to video and sound files. See the cObj MULTIMEDIA for documentation.

v1.6.4 2010-10-06 Jochen Rau <>

	[+BUGFIX] Reverted a change that led to a non-functional control flow. Thanks to Fatoux Sébastien. Resolves #6743.
	[+BUGFIX] Removed an obsolete line causing PHP warnings. Thanks to Armin Guenther.

v1.6.3 2010-04-24 Jochen Rau <>

	[+BUGFIX] Parsed fields in a single view are no longer htmlspecialchared by lib.parseFunc_RTE.
	[+BUGFIX] Fixed a problem with the additionalParams introduced in 1.6.1.
	[+BUGFIX] Index chars are now linked correctly in a single view.
	[+FEATURE] Added new option autoExcludeTerms. Set this to avoid parsed terms linking to themselves in a single view (defaults to 1).
	[~TASK] Changed default templates. An index is now shown on a single view page, too.

v1.6.2 2010-03-09 Jochen Rau <>

	[+BUGFIX] Re-enabled support for non non-UTF-8 sites in main RegEx.
	[+BUGFIX] Fixed a bug where the short terms are in favour to be replaced compared to longer terms with the same beginning.

v1.6.1 2010-03-09 Jochen Rau <>

	[+FEATURE] It is now possible to add additionalParams to the link via mapping. The additionalParams are processed by stdWrap again. (link.value = 164 [CR] link.additionalParams.stdWrap.dataWrap = &tx_myext_pi1[id]={register:contagged_theid})
	[+BUGFIX] Fixed a problem where spaces and invisible characters are tagged for an empty term.
	[+BUGFIX] Added missing initialization of an array before foreach is invoked.

v1.6.0 2010-02-06 Jochen Rau <>

	[~TASK] Deployed version 1.6.0 to TER. Tagged version 1.6.0.

v1.5.2 2010-02-05 Jochen Rau <>

	[+FEATURE] Implemented CSS based tooltip. New term type "Definition (tooltip)".
	[-CONFIGURATION] The default CSS has moved to the static template. The default CSS for abbr, dfn, and acronym was dropped.
	[~CONFIGURATION] Improved setup for tooltip. desc_short is now default. desc_long overrides it if empty.
v1.5.1 2010-01-26 Jochen Rau <>

	[+TASK] Performance optimization and refactorings after an extensive profiling session.
	[!!!][-CONFIGURATION] Removed option 'secureFields'. You can apply this in the mapping: "desc_short.htmlSpecialChars = 1".
	[!!!][+CONFIGURATION] Added option 'fieldsToParse' (comma separated list of fields to be parsed by contagged again in list view).
	[!!!][~CONFIGURATION] The TS name of the datasource is taken as GET parameter value for 'source' (was the table name). Instead of 'tx_contagged[source]=tx-contagged_terms' there is now 'tx_contagged[source]=default'. The registered key and internal referrer (register:contagged_key) is now 'default_123' instead of 'tx_contagged_term_123'.

v1.5.0 2010-01-09 Jochen Rau <>

	[~TASK] Deployed version 1.5.0 to TER. Tagged version 1.5.0.

v1.4.3 2010-01-08 Jochen Rau <>

	[+FEATURE] Added config option "respectCase". You can now choose whether contagged should try to set the replacement in the same case as the original term (default respectCase = 1).
	[+BUGFIX] Replaced deprecated mysql_list_tables().

v1.4.2 2009-12-08 Jochen Rau <>

	[~CONFIGURATION] You do not have to specify the root template page id in the extension configuration anymore.

v1.4.1 2009-11-16 Jochen Rau <>

	[-FEATURE] Removed experimental RTE integration.
	[+BUGFIX] Added missing option "showRange" to pagebrowser.
	[+FEATURE] You can now pass additional table tag params (pagebrowser.tableParams= class="foo"). This is only active if you don't overwrite the wraps.
	[+FEATURE] You can now specify, if the "prev." link should always be shown (pagebrowser.alwaysPrev = 1).
v1.4.0 2009-10-01 Jochen Rau <>

	[~TASK] Deployed version 1.4.0 to TER. Tagged version 1.4.0.

v1.3.2 2009-10-01 Jochen Rau <>

	[!!!][+FEATURE] Added configuration option plugin.tx_contagged.pagebrowser.wraps to define wraps for the pagebrowser (passed to piBase). Switched from tables to divs. Please check the styling of your output!
	[+BUGFIX] Added Icon for hidden terms. Thanks to Matthias Koch.
v1.3.1 2009-09-22 Jochen Rau <>

	[!!!][+FEATURE] Content of tables, uploads, captions, and html-cObj are now parsed, too. Please check, if this is the expected behaviour for your site. Comment out the appropriate lines in the setup if necessary.
	[!!!][+FEATURE] Contagged is now self-aware. The long description of a term is now parsed by contagged again. This enables auto-cross-referencing. Don't forget to include the glossary page (or exclude it, if you don't want the description to be parsed).
	[+BUGFIX] Set type of maxRecurrences now to integer to make it editable in the Constants Editor.
	[+BUGFIX] Fixed a problem with empty SELECT results.

v1.3.0 2009-09-16 Jochen Rau <>

	[+BUGFIX] Fixed non-translated page titles in backlink (Thanks to Oliver Berg for reporting). Resolves #4478.
	[+BUGFIX] Fixed an issue with the parser (appended terms to cObj in some rare cases).

v1.2.1 2009-08-31 Jochen Rau <>

	[+BUGFIX] Fixed link in documentation (thanks to Klemens Zleptnik).

v1.2.0 2009-08-26 Jochen Rau <>

	[+BUGFIX] Removed dependency to TYPO3 4.3 (t3lib_div::makeInstance()) which caused a Fatal error: Uncaught exception 'RuntimeException' with message 'No 
configuration. Please include the static template.'

v1.1.0 2009-08-14 Jochen Rau <>

	[~TASK] Deployed contagged to TER.

v1.0.5 2009-08-14 Jochen Rau <>

	* FIX If two different terms with the same beginning are defined (like  "foo" and "foo bar"), the term "foo bar" now will have precedence. Otherwise it will not be found. Resolves #4249.

v1.0.4 2009-07-10 Jochen Rau <>

	* FIX Alternative terms (term_alt) were not searched

v1.0.3 2009-05-28 Jochen Rau <>

	* FIX Page browser is not localised. Resolves #3017. 
	* IMP Cache handling (useCacheHash = 1 default for all links)

v1.0.2 2009-05-28 Jochen Rau <>

	* FIX plugin.tx_contagged.index.showOnlyMatchedIndexChars() = 1 had no effect (plugin.tx_contagged.showOnlyMatchedIndexChars() = 1 was evaluated)
	* ADD contagged uses now a unique identifyer (table name and uid) to link the terms (enables SEO friendly RealURL configuration). Resolves #2968.
	* ADD Added configuration option "addBackLink" (defaults to 0)
	* CHG Set default of addBackLinkDescription to 0
	* CHG Adapted RealURL example (not yet optimal solution)

v1.0.1 2009-03-31 Jochen Rau <>

	* FIX Links in list view support cache again (removed = _blank from default TS settings). Resolves #3010.
	* CHG Enabled edit icons for the upcoming fe_edit of v4.3 (3rd parameter of editIcons() must be an array)
	FYI: From now on the patch level version number (0.0.x) will only be used for revisions in the svn repository. The sub versions (0.x.0) and main versions (x.0.0) will be deployed to TER.

v1.0.0 2009-03-20 Jochen Rau <>

	* CHG Status is now STABLE (thanks for the feed-back)
	* ADD Default configuration of typolinks (e.g. " = _top" or " = _top"); types configuration will overwrite global configuration
	* ADD Added a CoolUrl example configuration to "doc" folder -- thanks to Carine who provided the code
	* FIX $dataSourceConfigArray['mapping.']['uid.']['field'] was never used as an unique identifier -- thanks to Carine
	* FIX Labels could not be overwritten by _LOCAL_LANG ($this->conf was set after $this->pi_loadLL() was invoked)
	* FIX Unititialized $wrappedSubpartArray in contagged_pi1
v0.2.2 2009-03-10 Jochen Rau <>

	* FIX Labels could not be overwritten by _LOCAL_LANG ($this->conf was set after $this->pi_loadLL() was invoked)
	* FIX Uninitialized variables (arrays) if $tableArray is NULL
	* FIX Handling of UTF-8 (if you have UTF-8 enabled, please add "u" to "contagged.modifier = Uisu" in your TS constants)
v0.2.1 2009-03-10 Jochen Rau <>

	* FIX Uninitialized variables (arrays) if result from fetchRelatedTerms() and fetchIndex() is NULL (drops a warning)
	* FIX Uninitialized variables (arrays) if $tableArray is NULL
	* FIX Handling of UTF-8 (if you have UTF-8 enabled, please add "u" to "contagged.modifier = Uisu" in your TS constants)
v0.2.0 2008-11-30 Jochen Rau <>

	* CHG Restructured TS Setup for FE-List (please adapt your local TS Setup!)
	* ADD Mini list of terms found on a single page (CODE: "MINILIST") -- sponsored by Paul Vetch (qedStudio)
	* ADD Search box (pi_base) -- sponsored by Paul Vetch (qedStudio)
	* ADD Page browser (pi_base) -- sponsored by Paul Vetch (qedStudio)
	* ADD Crosslinking between terms -- sponsored by Paul Vetch (qedStudio)
	* ADD You can add images to your term definitions -- sponsored by Paul Vetch (qedStudio)
	* ADD Integrated DAM as a source of images -- sponsored by Paul Vetch (qedStudio)
	* IMP You can disable the index, the search box and the page browser by TS Setup
	* IMP Constants editor
	* IMP Some code clean-up and refactorings
	* CHG Labels in list module are now term_replace, term_main, term_alt
	* CHG CSS-margins for index chars set to 0px
v0.1.5 2008-09-24 Jochen Rau <>

	* IMP The parser is now invoked also for bullet lists and headers (if <h[1-6]> is not an excluded tag)
	* IMP If maxRecurrences is set, the matches are now spread over the cObj constantly
	* FIX It's not necessary anymore to set maxRecurrences to invoke the parser
v0.1.4 2008-09-23 Jochen Rau <>

	* FIX Fixed typo in TS Setup

v0.1.3 2008-09-22 Jochen Rau <>

	* ADD The maximum number of recurrences of a term (for a cObj) can be set by maxRecurrences in the TS Setup

v0.1.2 2008-09-09 Jochen Rau <>

	* FIX In some cases no term was found; the use of the modifier "u" didn't work if the content is not UTF-8; now support for UTF-8 must be activated manually by changing the RegEx-modifier "Uis" to "Uuis"; fixes bug #1483

v0.1.1 2008-09-01 Jochen Rau <>

	* ADD Added a RealUrl example configuration to "doc" folder
	* IMP Non filled markers (###TITLE###) are now removed

v0.1.0 2008-08-31 Jochen Rau <>

	* CHG Set status to beta

v0.0.18 and v0.0.19 2008-08-31 Jochen Rau <>

	* ADD fieldsToEdit
	* ADD New data source "references" added to experimental types
	* CHG Cleaned up template file
	* ADD Phrases can now be added by selecting them (experimental)
	* ADD Terms can now be edited in the FE-list and in the content elements (you have to enable Admin Panel Editing)
	* CHG Activated keywords option
	* CHG Changed the way to generate links

v0.0.17 2008-02-14 Jochen Rau <>

	* CHG Major revision of the parser; refactured code
	* ADD Support for tt_news (be sure to add the static template of contagged after the static template of tt_news)
	* FIX Link "More Details" showed list instead of extended single view if $termKey was "0"
	* CHG Set autoExcludeTags = 1 to avoid nested parsing
	* ADD Documentation (
	* ADD Added index for numbers "0-9"
	* FIX Keywords stored in "contagged_keywords" (table "pages") are now taken from the whole page and not only from the last cObj that has been parsed
	* FIX Uppercase handling of replaced term
	* FIX Fixed inifinite loop caused by incorrect mapping (only PHP >5.2.2)
	* CHG Secured fields are now term_main,term_alt,desc_short in the standard configuration
	* RMV special exclude tag "exparse" was removed
	* CHG listPage changed to listPages; more than one list page per type can be defined (comma separated); the first list page will be linked (if you want)
	* FIX List pages show only those types of terms that are pointing to them (listPages)
	* CHG If there are alternative terms: the longest takes precedence while parsing
	* CHG Fields are not htmlspecialchared by default anymore
	* CHG Experimental type definitions are now stored in a separate static template (to be included as usual)

v0.0.16 2007-12-05 Jochen Rau <>

	* FIX Small bugfix to avoid inaccurate parsing inside a tag

v0.0.15 2007-10-19 Jochen Rau <>

	* FIX Localization of the labels (BE) now depends on the BE-user settings
	* RMV Removed obsolete parameter "backendLanguage" from TS Setup
	* CHG Encoding of the file EXT:static/setup.txt is now iso-8859-1
	* CHG The term is linked even if there is no long description (desc_long)
	* FIX Part of a joined word is no longer disappearing, if the term is replaced
	* ADD Support for tx_categories; you have to define the proper storage pid of the hidden sysFolder (tx_categories is an experimental extension maintained by Mads Brunn; not in TER; see TYP3_ect on
	* FIX Keys of $termsArray are no longer overwritten, if more than one data source is configured

v0.0.14 2007-10-09 Jochen Rau <>

	* IMP Better support for multibyte character sets (using t3lib_cs instead of native strlen() and substr())
	* FIX Link "back to page ..." in FE-Plugin
	* CHG Sorting of terms (not improved yet)

v0.0.13 2007-10-06 Jochen Rau <>

	* IMP Better support for joined words (with a dash)
	* IMP Quoting of the term in the RegEx
	* FIX Selection of a custom template file is now working
	* FIX Handling of ambiguities (like the two meanings of the word "bus")
	* CHG Added <dt> as a default excludeTag
	* CHG Names of some template markers (esp. Links)
	* IMP Enhanced performance of the FE-plugin (refactored code)

v0.0.12 2007-09-28 Jochen Rau <>

	* IMP Check if the table configured as a data source exists in the database (avoids an error message)

v0.0.11 2007-09-26 Jochen Rau <>

	* CHG You have to define one or more storagePids! This can be done globally (plugin.tx_contagged.storagePids), for each type ( or for each data source (
	* IMP "fieldsToMap" and "secureFields" now made available via constants editor
	* CHG Moved "fieldsToMap" and "secureFields" to the root of the TS Setup (plugin.tx_contagged.)
	* ADD Every type of term can be excluded from beeing listed (new parameter "dontListTerms")
	* ADD Every type of term can be hidden in the BE (new Parameter "hideSelection")
	* IMP Next step towards MVC-Pattern (splitted tx_contagged_model into tx_contagged_model_terms and tx_contagged_model_mapper)

v0.0.10 2007-09-22 Jochen Rau <>

	* ADD type "Regular Expression" (every term is treated as RegEx and matches can be replaced)

v0.0.9 2007-09-21 Jochen Rau <>

	* IMP Any database table can now be configured as a data source for every single type of term (very powerful!)
	* IMP Example configuration for tt_address
	* ADD Keywords are now registered {register:contagged_keywords} to be inserted as "<meta>-keywords" of the page header (plugin "metatags" required)
	* FIX Exclude individual cObjects (BE-field in tt_content)
	* CHG Restructured code (half way to MVC-Pattern)

v0.0.8 2007-09-18 Jochen Rau <>

	* ADD Added experimental support for foreign tables like tt_address (configurable through TS Setup: table name, field mapping); comment out line 378 in class.tx_contagged.php to activate

v0.0.7 2007-09-17 Jochen Rau <>

	* ADD More than one char can be used as an index "char" (eg. names, ZIP-codes, cities)
	* FIX Closing bracket in TS Setup
	* FIX UTF-8-characters are now linked properly (auto generated index in FE-Plugin)
	* IMP Cleaned up main RegEx
	* IMP ALL database fields ar now registered in $GLOBALS['TSFE']->register['contagged_XXX'] to be used in TS Setup (for future hooks)

v0.0.6 2007-09-13 Jochen Rau <>

	* FIX Term is now displayed as <dt>TERM</dt> again (FE-Plugin)
	* ADD stdWrap for the term to be searched ("termStdWrap"; usefull to search for already tagged text like <person>Steve Jobs</person>)
	* FIX Title-attribute will not be displayed, if the short description (desc_short) is empty
	* IMP UTF-8 handling of function to prevent attributes from beeing parsed (eg. <def title="don't parse this text">)
	* CHG Definition of types "dfn_block" and "dfn_inline" (work in progress!)

v0.0.5 2007-09-06 Jochen Rau <>

	* CHG The types "dfn_block" and "dfn_inline" for pure css tool-tips are valid but still not running in IE6
	  (new parameter "stripBlockTags" for replacing <p>...</p> with <br/> in long description;
	  thanks to Markus Timtner)
	* CHG Changed stdWrap in TS configuration to preStdWrap and added postStdWrap to make a outerWrap possible
	* ADD Maximum amount of occurancies to be tagged can be configured for each type of term (e.g. "plugin.tx_contagged.types.dfn_block.maxOccur = 1")
	* ADD Support for joined words (with a dash); new parameter "checkPreAndPostMatches"
	* FIX bug in SQL-Statement (thanks to Tristan Knapp)

v0.0.4 2007-08-29 Jochen Rau <>

	* IMP Better support for multibyte characters (UTF8).

v0.0.3 2007-08-28 Jochen Rau <>

	* ADD New template based FE-list-plugin with index configurable through locallang.xml.
	* FIX Fixed call of "userFunc".
	* RMV The types "dfn_block" and "dfn_inline" are commented out bit still there as an example (it seems that a pure css tool-tip is not bullet proof)
	* ADD Exclude individual cObjects (BE-field in tt_content)

v0.0.2 2007-05-20 Jochen Rau <>

	* ADD Tags can be selected to be excluded from parsing.
	* ADD New special tag <exparse></exparse> to exclude content from parsing.

v0.0.1 2007-05-16 Jochen Rau <>

	* CHG Changed from tt_content.text.20.parseFunc.userFunc to .postUserFunc
	* CHG Changed the separator of alternative terms from '|' (Pipe) to chr(10) (CR); the backend field is now multiline
	* ADD Added a prefix 'contagged_' to the registered values in $GLOBALS['TSFE'] to prevent name conflicts
	* FIX Some bugfixes in the type configuration and the css-class of dfn_inline
	* ADD Added option 'updateKeywords': It is now possible to auto-update page keywords based on the terms found on a page

v0.0.0 2007-05-14 Jochen Rau <>

	* Initial release