initial import
authorjocrau <jocrau@735d13b6-9817-0410-8766-e36946ffe9aa>
Mon, 14 May 2007 13:27:35 +0000 (13:27 +0000)
committerBastian Bringenberg <spam@bastian-bringenberg.de>
Thu, 4 Dec 2014 23:56:04 +0000 (00:56 +0100)
git-svn-id: https://svn.typo3.org/TYPO3v4/Extensions/contagged/trunk@5478 735d13b6-9817-0410-8766-e36946ffe9aa

18 files changed:
ChangeLog [new file with mode: 0644]
README.txt [new file with mode: 0644]
class.tx_contagged.php [new file with mode: 0644]
doc/manual.sxw [new file with mode: 0644]
doc/wizard_form.dat [new file with mode: 0644]
doc/wizard_form.html [new file with mode: 0644]
ext_conf_template.txt [new file with mode: 0644]
ext_emconf.php [new file with mode: 0644]
ext_icon.gif [new file with mode: 0644]
ext_localconf.php [new file with mode: 0644]
ext_tables.php [new file with mode: 0644]
ext_tables.sql [new file with mode: 0644]
icon_tx_contagged_terms.gif [new file with mode: 0644]
locallang_db.xml [new file with mode: 0644]
static/constants.txt [new file with mode: 0644]
static/css/setup.txt [new file with mode: 0644]
static/setup.txt [new file with mode: 0644]
tca.php [new file with mode: 0644]

diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..1b3dc33
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,5 @@
+(add new changes on top of this file)
+
+07-04-27 Jochen Rau  <j.rau@web.de>
+
+       * Initial release
diff --git a/README.txt b/README.txt
new file mode 100644 (file)
index 0000000..145c613
--- /dev/null
@@ -0,0 +1 @@
+This extension is a proof-of-concept. It enables searching, tagging and replacing terms in a content object.
\ No newline at end of file
diff --git a/class.tx_contagged.php b/class.tx_contagged.php
new file mode 100644 (file)
index 0000000..cdcaca3
--- /dev/null
@@ -0,0 +1,366 @@
+<?php
+/***************************************************************
+       *  Copyright notice
+       *
+       *  (c) 2007 Jochen Rau <j.rau@web.de>
+       *  All rights reserved
+       *
+       *  This script is part of the TYPO3 project. The TYPO3 project is
+       *  free software; you can redistribute it and/or modify
+       *  it under the terms of the GNU General Public License as published by
+       *  the Free Software Foundation; either version 2 of the License, or
+       *  (at your option) any later version.
+       *
+       *  The GNU General Public License can be found at
+       *  http://www.gnu.org/copyleft/gpl.html.
+       *
+       *  This script is distributed in the hope that it will be useful,
+       *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+       *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       *  GNU General Public License for more details.
+       *
+       *  This copyright notice MUST APPEAR in all copies of the script!
+       ***************************************************************/
+
+// TODO: change type of extension; use MVC-pattern
+// FIXIT: problem with nesting def_block elements
+// TODO: make text field of alternative terms (backend) multiline
+
+require_once (PATH_tslib . 'class.tslib_pibase.php');
+require_once (PATH_t3lib . 'class.t3lib_parsehtml.php');
+
+/**
+       * The main class to parse,tag and replace specific terms of the content.
+       * 
+       * $Id$
+       * 
+       * @author       Jochen Rau <j.rau@web.de>
+       * @package      TYPO3
+       * @subpackage   tx_contagged
+       */
+/**
+       * [CLASS/FUNCTION INDEX of SCRIPT]
+       */
+class tx_contagged extends tslib_pibase {
+       var $prefixId = 'tx_contagged'; // same as class name
+       var $scriptRelPath = 'pi1/class.tx_contagged.php'; // path to this script relative to the extension dir
+       var $extKey = 'contagged'; // the extension key
+       var $pi_checkCHash = true;
+       var $dataTable = 'tx_contagged_terms';
+       var $conf; // the TypoScript configuration array
+
+
+       /**
+               * The method for parsing, tagging and linking the terms in a cObj
+               *
+               * @param        string          $content: The content of the cObj
+               * @param        array           $conf: The configuration
+               * @return       The parsed and tagged content that is displayed on the website
+               */
+       function main($content, $conf) {
+               $this->conf = $GLOBALS['TSFE']->tmpl->setup['plugin.'][$this->prefixId.'.'];
+
+               // exit if the page should be skipped
+               if ($this->isPageToSkip()) {
+                       return $content;
+                       exit;
+               }
+
+               // get an array of all data rows in the table "tx_contagged_terms"
+               $this->termsArray = $this->getTermsArray();
+
+               // build a list of tags used in the type definitions
+               // these tags will be omitted while parsing the text
+               foreach ($this->conf['types.'] as $key => $type) {
+                       if (isset($type['tag']) && !in_array($type['tag'],$tagArray)) {
+                               $tagArray[] = $type['tag'];
+                       }
+                       $tagList = implode(',',$tagArray);
+               }
+
+               // iterate through all terms
+               foreach ($this->termsArray as $termArray) {
+
+                       unset($typeConfigArray);  // this should prevend a wrong configuration if no config is available 
+                       $typeConfigArray = $this->getTypeConfigArray($termArray);
+
+                       // build the tag enclosing the term
+                       if ( isset($typeConfigArray['tag']) ) {
+                               // get the attributes
+                               $langAttribute = $this->getLangAttribute($typeConfigArray,$termArray);
+                               $titleAttribute = $this->getTitleAttribute($typeConfigArray,$termArray);
+                               $cssClassAttribute = $this->getCssClassAttribute($typeConfigArray,$termArray);
+                               // concatenate the tag
+                               $before = '<' . $typeConfigArray['tag'] . $titleAttribute . $cssClassAttribute . $langAttribute . '>';
+                               $after = '</' . $typeConfigArray['tag'] . '>';
+                       }
+
+                       // Set the maximum amount of replaced terms to a standard
+                       // $maxOccur = $typeConfigArray['maxOccur'];
+                       $maxOccur ? $maxOccur : $maxOccur = 9999;
+                       // reset the occurancies of the actual term
+                       // $occuranciesOfTerm = 0;
+
+                       foreach ( $termArray['terms'] as $term ) {
+
+                               // $occuranciesOfTerm = $occuranciesOfTerm + $termsfound;
+                               // $termsFound = 0; // reset the amount of terms found in a cObj
+                               $parseObj = t3lib_div::makeInstance('t3lib_parsehtml');
+                               $content = $parseObj->splitIntoBlock($tagList,$content);
+                               foreach($content as $intKey => $HTMLvalue) {
+                                       if (!($intKey%2)) {
+                                               // the following code was inspired from the class.tslib_content.php, line 4265ff
+                                               $newstring = '';
+                                               do {
+                                                       // split the content in two pieces separated by the term, but don't do that if we are inside a tag to prevent nested tags
+                                                       // RegEx explained: (Match the term if it is NOT followed by a closing tag) OR, if no occurency was found
+                                                       // (Match the term that is followed by a closing tag with an opening tag inbetween). UFF!
+                                                       // TODO Unit testing for the Regex in preg_split; because this is the most critical operation
+                                                       // TODO modifier i: makes RegEx case insensitive; this should be configurable through TS
+                                                       $pieces = preg_split('#(?<=\W|\A)' . preg_quote($term) . '(?=\W|\Z)(?!.*</(' . $tagList . ')>)|(?<=\W|\A)' . preg_quote($term) . '(?=\W|\Z)(?=.*<(' . $tagList . ')(?=.*</\2))#Ui', $content[$intKey], 2);
+                                                       $newstring .= $pieces[0];
+
+                                                       // flag: $inTag=true if we are inside a tag < here we are >
+                                                       if ( strrpos($pieces[0],'<') > strrpos($pieces[0],'>') ) {
+                                                               $inTag = true;
+                                                       } else {
+                                                               $inTag = false;
+                                                       }
+
+                                                       // the  term is handled as $matchedTerm, so it doesn't conflict with case (in)sensitivity of the RegEx
+                                                       $matchLength = strlen($content[$intKey]) - (strlen($pieces[0]) + strlen($pieces[1]));
+                                                       $matchedTerm = substr($content[$intKey], strlen($pieces[0]), $matchLength);
+                                                       $GLOBALS['TSFE']->register['matchedTerm'] = $matchedTerm;
+                                                       if ( trim($matchedTerm) && ($inTag === false) && ($occuranciesOfTerm < $maxOccur) ) {
+                                                               $this->replaceMatchedTerm(&$matchedTerm,$typeConfigArray,$termArray);
+                                                               $this->linkMatchedTerm(&$matchedTerm,$typeConfigArray,$termArray);
+
+                                                               // call stdWrap to handle the matched term via TS
+                                                               // TODO: wrapping inside AND outside the a-tag should be enabled
+                                                               $matchedTerm = $this->cObj->stdWrap($matchedTerm,$typeConfigArray['stdWrap.']);
+
+                                                               $matchedTerm = $before . $matchedTerm . $after;
+
+                                                               // $termsFound++;
+
+                                                       }
+                                                       // concatenate the term again
+                                                       $newstring .= $matchedTerm;
+                                                       $content[$intKey] = $pieces[1];
+                                               } while ($pieces[1]);
+                                               $content[$intKey] = $newstring;
+                                       }
+                               }
+                               
+                       $content = implode('',$content);        
+                       
+                       }
+               }
+
+               return $content;
+
+       }
+
+       function getTypeConfigArray($termArray) {
+               // shortcut to the TS configuration array of the current type of term
+               $typeConfigArray = $this->conf['types.'][$termArray['term_type'] . '.'];
+
+               // load several fields into the register to be handled by the TS setup
+               $GLOBALS['TSFE']->register['uid'] = $termArray['uid'];
+               $GLOBALS['TSFE']->register['desc_short'] = $termArray['desc_short'];
+               $GLOBALS['TSFE']->register['desc_long'] = $termArray['desc_long'];
+               $GLOBALS['TSFE']->register['term_replace'] = $termArray['term_replace'];
+               $GLOBALS['TSFE']->register['link'] = $termArray['link'];
+
+               return $typeConfigArray;
+
+       }
+
+       function linkMatchedTerm(&$matchedTerm,$typeConfigArray,$termArray) {
+               // check conditions if the term should be linked to a list page
+               if ( isset($typeConfigArray['linkToListPage']) ) {
+                       $makeLink = ($typeConfigArray['linkToListPage'] > 0) ? true : false;
+               } else {
+                       $makeLink = ($this->conf['linkToListPage'] > 0) ? true : false;
+               }                                       
+               if ( ($termArray['desc_long'] == '') || ($termArray['exclude'] > 0) ) {
+                       $makeLink = false;
+               }
+
+               // link the matched term to the front-end list page
+               if ($makeLink) {
+                       unset($typolinkConf); // TODO Is it necessary to unset the $typoLinkConf?
+                       $listPage = ($typeConfigArray['listPage']?$typeConfigArray['listPage']:$this->conf['listPage']);
+                       $typolinkConf['parameter'] = (int) $listPage;
+                       $typolinkConf['useCacheHash'] = 1;
+                       $typolinkConf['additionalParams'] =
+                               '&' . $this->prefixId . '[back]=' . $GLOBALS['TSFE']->id .
+                               '&' . $this->prefixId . '[uid]=' . $termArray['uid'] .
+                               '&' . $this->prefixId . '[type]=' . $termArray['term_type'];
+                       $matchedTerm = $this->cObj->typolink($matchedTerm, $typolinkConf);
+               }
+       }
+
+       function replaceMatchedTerm(&$matchedTerm,$typeConfigArray,$termArray) {
+               // replace the term
+               // TODO improve upper/lower case handling (UTF8)
+               if ( $termArray['term_replace'] && $typeConfigArray['replaceTerm'] == 1 ) {
+                       // if the first letter of the matched term is upper case
+                       // make the first letter of the replacing term also upper case
+                       if ( preg_match('#[A-ZÄÖÜ]#', substr($matchedTerm,0,1) ) != 0 ) {
+                               $matchedTerm = ucfirst($termArray['term_replace']);
+                       } else {
+                               $matchedTerm = $termArray['term_replace'];
+                       }
+               }
+       }
+
+
+       /**
+               * If the language of the term is undefined, 
+               * or the page language is the same as language of the term,
+               * then the lang attribute will not be shown. 
+               * 
+               * If the terms language is defined and different from the page language, 
+               * then the language attribute is added.
+               */
+       function getLangAttribute($typeConfigArray,$termArray) {
+               // check if the global or local flag to add a language attribute is set
+               if ( isset($typeConfigArray['addLangAttribute']) ) {
+                       $addLangAttribute = ($typeConfigArray['addLangAttribute'] > 0) ? true : false;
+               } else {
+                       $addLangAttribute = ($this->conf['addLangAttribute'] > 0) ? true : false;
+               }
+               // get page language
+               if ($GLOBALS['TSFE']->config['config']['language']) {
+                       $pageLanguage = $GLOBALS['TSFE']->config['config']['language'];
+               } else {
+                       $pageLanguage = substr($GLOBALS['TSFE']->config['config']['htmlTag_langKey'],0,2);
+               }
+               // build language attribute if the page language is different from the terms language
+               if ( $addLangAttribute && !empty($termArray['term_lang']) && ( $pageLanguage!=$termArray['term_lang'] ) ) {
+                       $langAttribute = ' lang="' . $termArray['term_lang'] . '"';
+                       $langAttribute .= ' xml:lang="' . $termArray['term_lang'] . '"';
+               } else {
+                       $langAttribute = '';
+               }
+
+               return $langAttribute;
+       }
+
+       function getTitleAttribute($typeConfigArray,$termArray) {
+               if ( isset($typeConfigArray['addTitleAttribute']) ) {
+                       $addTitleAttribute = ($typeConfigArray['addTitleAttribute'] > 0) ? true : false;
+               } else {
+                       $addTitleAttribute = ($this->conf['addTitleAttribute'] > 0) ? true : false;
+               }                                       
+               if ($addTitleAttribute && isset($termArray['desc_short'])) {
+                       $titleAttribute = ' title="' . $termArray['desc_short'] . '"';
+               } else {
+                       $titleAttribute = '';
+               }
+
+               return $titleAttribute;
+       }
+
+       function getCssClassAttribute($typeConfigArray,$termArray) {
+               if ( isset($typeConfigArray['addCssClassAttribute']) ) {
+                       $addCssClassAttribute = ($typeConfigArray['addCssClassAttribute'] > 0) ? true : false;
+               } else {
+                       $addCssClassAttribute = ($this->conf['addCssClassAttribute'] > 0) ? true : false;
+               }                                       
+               if ($addCssClassAttribute) {
+                       if ( $typeConfigArray['cssClass'] ) {
+                               $cssClassAttribute = $this->pi_classParam($typeConfigArray['cssClass']);
+                       } else {
+                               $cssClassAttribute = $this->pi_classParam($termArray['term_type']);
+                       }
+               } else {
+                       $cssClassAttribute = '';
+               }
+
+               return $cssClassAttribute;
+       }
+
+       /**
+               * Test, if the current page should be skipped
+               *
+               * @return       True, if the page should be skipped
+               */
+       function isPageToSkip() {
+               $result = true; // true, if the page should be skipped
+               $currentPageUid = $GLOBALS['TSFE']->id;
+               // get rootline of the current page
+               $rootline = $GLOBALS['TSFE']->sys_page->getRootline($currentPageUid);
+               // build an array of uids of pages the rootline
+               for ($i = count($rootline) - 1; $i >= 0; $i--) {
+                       $pageUidsInRootline[] = $rootline["$i"]['uid'];
+               }
+               // check if the root page is in the rootline of the current page
+               $includeRootPagesUids = t3lib_div :: trimExplode(',', $this->conf['includeRootPages'], 1);
+               foreach ($includeRootPagesUids as $includeRootPageUid) {
+                       if (t3lib_div :: inArray($pageUidsInRootline, $includeRootPageUid))
+                               $result = false;
+               }
+               $excludeRootPagesUids = t3lib_div :: trimExplode(',', $this->conf['excludeRootPages'], 1);
+               foreach ($excludeRootPagesUids as $excludeRootPageUid) {
+                       if (t3lib_div :: inArray($pageUidsInRootline, $excludeRootPageUid))
+                               $result = true;
+               }
+               if (t3lib_div::inList($this->conf['includePages'], $currentPageUid)) {
+                       $result = false;
+               }
+               if (t3lib_div::inList($this->conf['excludePages'], $currentPageUid)) {
+                       $result = true;                 
+               }
+
+               return $result;
+       }
+
+       /**
+               * Build an array of the entries in the table "tx_contagged_terms"
+               *
+               * @return       An array with the data of the table "tx_contagged_terms"
+               */
+       function getTermsArray() {
+               // execute sql-query
+               $result = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('*', // SELECT ...
+               $this->dataTable, // FROM ...
+               '1=1' . tslib_cObj :: enableFields($this->dataTable) // WHERE...
+               );
+
+
+               // build an array of entries in the table "tx_contagged_terms"
+               $dataArray = array ();
+               $terms = array ();
+               foreach ($result as $row) {
+                       // build an array of alternative shortcurts (term_alt) and add the main term (term_main)
+                       $terms = t3lib_div :: trimExplode('|', htmlspecialchars($row['term_alt']), $onlyNonEmptyValues = 1);
+                       $terms[] = trim(htmlspecialchars($row['term_main']));
+                       $desc_long = $this->cObj->parseFunc($row['desc_long'],$conf='',$ref='< lib.parseFunc_RTE');
+                       // $desc_long = preg_replace('/(\015\012)|(\015)|(\012)/','<br />',$row['desc_long']);
+                       // $desc_long = trim(htmlspecialchars($desc_long));
+                       // put it all together
+                       $dataArray[] = array (
+                               'uid' => $row['uid'],
+                               'terms' => $terms,
+                               'term_type' => $row['term_type'],
+                               'term_lang' => $row['term_lang'],
+                               'term_replace' => trim(htmlspecialchars($row['term_replace'])),
+                               'desc_short' => trim(htmlspecialchars($row['desc_short'])),
+                               'desc_long' => $desc_long,
+                               'link' => $row['link'],
+                               'exclude' => $row['exclude']
+                               );
+               }
+
+               return $dataArray;
+
+       }
+
+}
+
+if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/contagged/class.tx_contagged.php']) {
+       include_once ($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/contagged/class.tx_contagged.php']);
+}
+?>
\ No newline at end of file
diff --git a/doc/manual.sxw b/doc/manual.sxw
new file mode 100644 (file)
index 0000000..b92afeb
Binary files /dev/null and b/doc/manual.sxw differ
diff --git a/doc/wizard_form.dat b/doc/wizard_form.dat
new file mode 100644 (file)
index 0000000..de0d234
--- /dev/null
@@ -0,0 +1 @@
+a:4:{s:4:"save";a:3:{s:13:"extension_key";s:9:"contagged";s:18:"print_wop_comments";s:1:"0";s:15:"overwrite_files";a:11:{s:9:"ChangeLog";s:1:"1";s:10:"README.txt";s:1:"1";s:12:"ext_icon.gif";s:1:"1";s:17:"ext_localconf.php";s:1:"1";s:14:"ext_tables.php";s:1:"1";s:14:"ext_tables.sql";s:1:"1";s:27:"icon_tx_contagged_terms.gif";s:1:"1";s:16:"locallang_db.xml";s:1:"1";s:7:"tca.php";s:1:"1";s:19:"doc/wizard_form.dat";s:1:"1";s:20:"doc/wizard_form.html";s:1:"1";}}s:6:"emconf";a:1:{i:1;a:7:{s:5:"title";s:14:"Content parser";s:11:"description";s:188:"This extension parses the text of a content element to tag, replace and link specific terms. It is useful to auto-generate a glossary - but not only. Because it is configurable through TS.";s:8:"category";s:2:"fe";s:5:"state";s:5:"alpha";s:12:"dependencies";s:0:"";s:6:"author";s:10:"Jochen Rau";s:12:"author_email";s:12:"j.rau@web.de";}}s:9:"languages";a:1:{i:1;a:45:{s:2:"ar";s:1:"0";s:2:"my";s:1:"0";s:2:"eu";s:1:"0";s:2:"ba";s:1:"0";s:2:"br";s:1:"0";s:2:"bg";s:1:"0";s:2:"ca";s:1:"0";s:2:"ch";s:1:"0";s:2:"hk";s:1:"0";s:2:"hr";s:1:"0";s:2:"cz";s:1:"0";s:2:"dk";s:1:"0";s:2:"nl";s:1:"0";s:2:"eo";s:1:"0";s:2:"et";s:1:"0";s:2:"fo";s:1:"0";s:2:"fi";s:1:"0";s:2:"fr";s:1:"0";s:2:"de";s:1:"1";s:2:"gr";s:1:"0";s:2:"gl";s:1:"0";s:2:"he";s:1:"0";s:2:"hi";s:1:"0";s:2:"hu";s:1:"0";s:2:"is";s:1:"0";s:2:"it";s:1:"0";s:2:"jp";s:1:"0";s:2:"kr";s:1:"0";s:2:"lv";s:1:"0";s:2:"lt";s:1:"0";s:2:"no";s:1:"0";s:2:"fa";s:1:"0";s:2:"pl";s:1:"0";s:2:"pt";s:1:"0";s:2:"ro";s:1:"0";s:2:"ru";s:1:"0";s:2:"sr";s:1:"0";s:2:"sk";s:1:"0";s:2:"si";s:1:"0";s:2:"es";s:1:"0";s:2:"se";s:1:"0";s:2:"th";s:1:"0";s:2:"tr";s:1:"0";s:2:"ua";s:1:"0";s:2:"vn";s:1:"0";}}s:6:"tables";a:1:{i:1;a:20:{s:9:"tablename";s:5:"terms";s:5:"title";s:5:"Terms";s:8:"title_de";s:10:"Ausdrücke";s:11:"add_deleted";s:1:"1";s:10:"add_hidden";s:1:"1";s:13:"add_starttime";s:1:"1";s:11:"add_endtime";s:1:"1";s:10:"add_access";s:1:"1";s:12:"localization";s:1:"1";s:10:"versioning";s:1:"1";s:7:"sorting";s:1:"1";s:13:"sorting_field";s:6:"crdate";s:12:"sorting_desc";s:1:"0";s:10:"type_field";s:1:"0";s:12:"header_field";s:1:"0";s:7:"defIcon";s:11:"default.gif";s:14:"allow_on_pages";s:1:"1";s:23:"allow_ce_insert_records";s:1:"1";s:12:"save_and_new";s:1:"1";s:6:"fields";a:0:{}}}}
\ No newline at end of file
diff --git a/doc/wizard_form.html b/doc/wizard_form.html
new file mode 100644 (file)
index 0000000..85ad87c
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+       <html>
+       <head>
+               <title>Untitled</title>
+       </head>
+
+       <body>
+
+               <table border="0" cellpadding="2" cellspacing="2"><tr bgcolor=""><td><strong><span style="font-family:verdana,arial,sans-serif; font-size:10px;">General info</span></strong></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Enter general information about the extension here: Title, description, category, author...</span></td></tr><tr><td></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Title:</strong><br /><a name="260dbfdff6"></a><input type="text" name="kickstarter[wizArray_upd][emconf][1][title]" value="Content parser" style="width:200px;" onchange="setFormAnchorPoint('260dbfdff6');" title="WOP: [emconf][1][title]"></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Description:</strong><br /><a name="e9cba6944a"></a><input type="text" name="kickstarter[wizArray_upd][emconf][1][description]" value="This extension parses the text of a content element to tag, replace and link specific terms. It is useful to auto-generate a glossary - but not only. Because it is configurable through TS." style="width:200px;" onchange="setFormAnchorPoint('e9cba6944a');" title="WOP: [emconf][1][description]"></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Category:</strong><br /><a name="b46008f89f"></a><select name="kickstarter[wizArray_upd][emconf][1][category]" onchange="setFormAnchorPoint('b46008f89f');" title="WOP: [emconf][1][category]"><option value=""></option><option value="fe" selected="selected">Frontend</option><option value="plugin">Frontend Plugins</option><option value="be">Backend</option><option value="module">Backend Modules</option><option value="services">Services</option><option value="example">Examples</option><option value="misc">Miscellaneous</option><option value="templates">Templates</option><option value="doc">Documentation</option></select></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>State</strong><br /><a name="dbd328a5a5"></a><select name="kickstarter[wizArray_upd][emconf][1][state]" onchange="setFormAnchorPoint('dbd328a5a5');" title="WOP: [emconf][1][state]"><option value="alpha" selected="selected">Alpha (Very initial development)</option><option value="beta">Beta (Under current development, should work partly)</option><option value="stable">Stable (Stable and used in production)</option><option value="experimental">Experimental (Nobody knows if this is going anywhere yet...)</option><option value="test">Test (Test extension, demonstrates concepts etc.)</option></select></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Dependencies (comma list of extkeys):</strong><br /><a name="ce30f2d5ba"></a><input type="text" name="kickstarter[wizArray_upd][emconf][1][dependencies]" value="" style="width:200px;" onchange="setFormAnchorPoint('ce30f2d5ba');" title="WOP: [emconf][1][dependencies]"></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Author Name:</strong><br /><a name="5317cdfcff"></a><input type="text" name="kickstarter[wizArray_upd][emconf][1][author]" value="Jochen Rau" style="width:200px;" onchange="setFormAnchorPoint('5317cdfcff');" title="WOP: [emconf][1][author]"></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Author email:</strong><br /><a name="58289f4384"></a><input type="text" name="kickstarter[wizArray_upd][emconf][1][author_email]" value="j.rau@web.de" style="width:200px;" onchange="setFormAnchorPoint('58289f4384');" title="WOP: [emconf][1][author_email]"></span></td></tr></table><hr /><table border="0" cellpadding="2" cellspacing="2"><tr bgcolor=""><td><strong><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Setup languages</span></strong></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Start here by entering the number of system languages you want to use in your extension.</span></td></tr><tr><td></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Enter which languages to setup:</strong><br /><blockquote><a name="7d533a7756"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ar]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ar]" value="1" onclick="setFormAnchorPoint('7d533a7756');" title="WOP: [languages][1][ar]">Arabic<br /><a name="78fbe4fcab"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][my]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][my]" value="1" onclick="setFormAnchorPoint('78fbe4fcab');" title="WOP: [languages][1][my]">Bahasa Malaysia<br /><a name="59bb5b03a9"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][eu]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][eu]" value="1" onclick="setFormAnchorPoint('59bb5b03a9');" title="WOP: [languages][1][eu]">Basque<br /><a name="82f6df3fe6"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ba]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ba]" value="1" onclick="setFormAnchorPoint('82f6df3fe6');" title="WOP: [languages][1][ba]">Bosnian<br /><a name="d5fc9e9f4d"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][br]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][br]" value="1" onclick="setFormAnchorPoint('d5fc9e9f4d');" title="WOP: [languages][1][br]">Brazilian Portuguese<br /><a name="9850ab5b73"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][bg]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][bg]" value="1" onclick="setFormAnchorPoint('9850ab5b73');" title="WOP: [languages][1][bg]">Bulgarian<br /><a name="022f262c2e"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ca]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ca]" value="1" onclick="setFormAnchorPoint('022f262c2e');" title="WOP: [languages][1][ca]">Catalan<br /><a name="0a86ea2302"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ch]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ch]" value="1" onclick="setFormAnchorPoint('0a86ea2302');" title="WOP: [languages][1][ch]">Chinese (Simpl)<br /><a name="4c39f3d408"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][hk]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][hk]" value="1" onclick="setFormAnchorPoint('4c39f3d408');" title="WOP: [languages][1][hk]">Chinese (Trad)<br /><a name="ba0c21b368"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][hr]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][hr]" value="1" onclick="setFormAnchorPoint('ba0c21b368');" title="WOP: [languages][1][hr]">Croatian<br /><a name="7fcce12c93"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][cz]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][cz]" value="1" onclick="setFormAnchorPoint('7fcce12c93');" title="WOP: [languages][1][cz]">Czech<br /><a name="b86f1028b2"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][dk]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][dk]" value="1" onclick="setFormAnchorPoint('b86f1028b2');" title="WOP: [languages][1][dk]">Danish<br /><a name="54b2a05e4d"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][nl]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][nl]" value="1" onclick="setFormAnchorPoint('54b2a05e4d');" title="WOP: [languages][1][nl]">Dutch<br /><a name="60d4c8e0f1"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][eo]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][eo]" value="1" onclick="setFormAnchorPoint('60d4c8e0f1');" title="WOP: [languages][1][eo]">Esperanto<br /><a name="d2aeaa8deb"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][et]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][et]" value="1" onclick="setFormAnchorPoint('d2aeaa8deb');" title="WOP: [languages][1][et]">Estonian<br /><a name="84b06abc79"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][fo]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][fo]" value="1" onclick="setFormAnchorPoint('84b06abc79');" title="WOP: [languages][1][fo]">Faroese<br /><a name="0bc4ee7821"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][fi]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][fi]" value="1" onclick="setFormAnchorPoint('0bc4ee7821');" title="WOP: [languages][1][fi]">Finnish<br /><a name="3dac7ddfab"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][fr]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][fr]" value="1" onclick="setFormAnchorPoint('3dac7ddfab');" title="WOP: [languages][1][fr]">French<br /><a name="827e867baf"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][de]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][de]" value="1" checked="checked" onclick="setFormAnchorPoint('827e867baf');" title="WOP: [languages][1][de]">German<br /><a name="47346a0a45"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][gr]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][gr]" value="1" onclick="setFormAnchorPoint('47346a0a45');" title="WOP: [languages][1][gr]">Greek<br /><a name="b62d68ce6c"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][gl]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][gl]" value="1" onclick="setFormAnchorPoint('b62d68ce6c');" title="WOP: [languages][1][gl]">Greenlandic<br /><a name="7083677049"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][he]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][he]" value="1" onclick="setFormAnchorPoint('7083677049');" title="WOP: [languages][1][he]">Hebrew<br /><a name="8821dba88e"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][hi]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][hi]" value="1" onclick="setFormAnchorPoint('8821dba88e');" title="WOP: [languages][1][hi]">Hindi<br /><a name="8293f23e10"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][hu]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][hu]" value="1" onclick="setFormAnchorPoint('8293f23e10');" title="WOP: [languages][1][hu]">Hungarian<br /><a name="1fbf3d59e1"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][is]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][is]" value="1" onclick="setFormAnchorPoint('1fbf3d59e1');" title="WOP: [languages][1][is]">Icelandic<br /><a name="73e154abd2"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][it]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][it]" value="1" onclick="setFormAnchorPoint('73e154abd2');" title="WOP: [languages][1][it]">Italian<br /><a name="4be98144d7"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][jp]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][jp]" value="1" onclick="setFormAnchorPoint('4be98144d7');" title="WOP: [languages][1][jp]">Japanese<br /><a name="72d3409fc7"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][kr]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][kr]" value="1" onclick="setFormAnchorPoint('72d3409fc7');" title="WOP: [languages][1][kr]">Korean<br /><a name="3aecc5e21e"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][lv]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][lv]" value="1" onclick="setFormAnchorPoint('3aecc5e21e');" title="WOP: [languages][1][lv]">Latvian<br /><a name="4f9b71ee82"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][lt]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][lt]" value="1" onclick="setFormAnchorPoint('4f9b71ee82');" title="WOP: [languages][1][lt]">Lithuanian<br /><a name="7f432802c6"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][no]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][no]" value="1" onclick="setFormAnchorPoint('7f432802c6');" title="WOP: [languages][1][no]">Norwegian<br /><a name="b6208f5c27"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][fa]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][fa]" value="1" onclick="setFormAnchorPoint('b6208f5c27');" title="WOP: [languages][1][fa]">Persian<br /><a name="4cd3612e78"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][pl]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][pl]" value="1" onclick="setFormAnchorPoint('4cd3612e78');" title="WOP: [languages][1][pl]">Polish<br /><a name="63d5243829"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][pt]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][pt]" value="1" onclick="setFormAnchorPoint('63d5243829');" title="WOP: [languages][1][pt]">Portuguese<br /><a name="ebc2430d26"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ro]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ro]" value="1" onclick="setFormAnchorPoint('ebc2430d26');" title="WOP: [languages][1][ro]">Romanian<br /><a name="a098cc1f91"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ru]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ru]" value="1" onclick="setFormAnchorPoint('a098cc1f91');" title="WOP: [languages][1][ru]">Russian<br /><a name="8519524025"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][sr]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][sr]" value="1" onclick="setFormAnchorPoint('8519524025');" title="WOP: [languages][1][sr]">Serbian<br /><a name="c8d205aed0"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][sk]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][sk]" value="1" onclick="setFormAnchorPoint('c8d205aed0');" title="WOP: [languages][1][sk]">Slovak<br /><a name="6404570bc0"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][si]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][si]" value="1" onclick="setFormAnchorPoint('6404570bc0');" title="WOP: [languages][1][si]">Slovenian<br /><a name="8be7af8e47"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][es]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][es]" value="1" onclick="setFormAnchorPoint('8be7af8e47');" title="WOP: [languages][1][es]">Spanish<br /><a name="db1a396ac5"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][se]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][se]" value="1" onclick="setFormAnchorPoint('db1a396ac5');" title="WOP: [languages][1][se]">Swedish<br /><a name="09b51bc212"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][th]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][th]" value="1" onclick="setFormAnchorPoint('09b51bc212');" title="WOP: [languages][1][th]">Thai<br /><a name="04887aadc6"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][tr]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][tr]" value="1" onclick="setFormAnchorPoint('04887aadc6');" title="WOP: [languages][1][tr]">Turkish<br /><a name="593a18ebf0"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][ua]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][ua]" value="1" onclick="setFormAnchorPoint('593a18ebf0');" title="WOP: [languages][1][ua]">Ukrainian<br /><a name="75226f1caf"></a><input type="hidden" name="kickstarter[wizArray_upd][languages][1][vn]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][languages][1][vn]" value="1" onclick="setFormAnchorPoint('75226f1caf');" title="WOP: [languages][1][vn]">Vietnamese<br /></blockquote></span></td></tr></table><hr /><table border=0 cellpadding=2 cellspacing=2><tr bgcolor=""><td><strong><span style="font-family:verdana,arial,sans-serif; font-size:10px;">New Database Tables</span></strong></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Add database tables which can be edited inside the backend. These tables will be added to the global TCA array in TYPO3.</span></td></tr><tr><td></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Tablename:</strong><BR>tx_contagged_<a name="eaea358363"></a><input type="text" name="kickstarter[wizArray_upd][tables][1][tablename]" value="terms" style="width:200px;" onchange="setFormAnchorPoint('eaea358363');" title="WOP: [tables][1][tablename]"><BR><strong>Notice:</strong> Use characters a-z0-9 only. Only lowercase, no spaces.<BR>
+               This becomes the table name in the database. </span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Title of the table:</strong><BR><a name="dc5d9257e8"></a><input type="text" name="kickstarter[wizArray_upd][tables][1][title]" value="Terms" style="width:200px;" onchange="setFormAnchorPoint('dc5d9257e8');" title="WOP: [tables][1][title]"> [English]<blockquote><a name="e303e60be8"></a><input type="text" name="kickstarter[wizArray_upd][tables][1][title_de]" value="Ausdrücke" style="width:200px;" onchange="setFormAnchorPoint('e303e60be8');" title="WOP: [tables][1][title_de]"> [German]</blockquote></span></td></tr><tr bgcolor=""><td><strong> Fields Overview </strong></td></tr><tr><td></td></tr><tr bgcolor=""><td><table><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><tr  bgcolor="">
+                       <td><strong>Name</strong></td>
+                       <td><strong>Title</strong></td>
+                       <td><strong>Type</strong></td>
+                       <td><strong>Exclude?</strong></td>
+                       <td><strong>Details</strong></td>
+               </tr></span></table></td></tr><tr bgcolor=""><td><strong> Edit Fields </strong></td></tr><tr><td></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><a name="9272a1fd29"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][add_deleted]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][add_deleted]" value="1" checked="checked" onclick="setFormAnchorPoint('9272a1fd29');" title="WOP: [tables][1][add_deleted]">Add "Deleted" field  <a href="#" title="Whole system: If a table has a deleted column, records are never really deleted, just &quot;marked deleted&quot; . Thus deleted records can actually be restored by clearing a deleted-flag later.\nNotice that all attached files are also not deleted from the server, so if you expect the table to hold some heavy size uploads, maybe you should not set this..." style="cursor:help" onclick="alert(String.fromCharCode(87,104,111,108,101,32,115,121,115,116,101,109,58,32,73,102,32,97,32,116,97,98,108,101,32,104,97,115,32,97,32,100,101,108,101,116,101,100,32,99,111,108,117,109,110,44,32,114,101,99,111,114,100,115,32,97,114,101,32,110,101,118,101,114,32,114,101,97,108,108,121,32,100,101,108,101,116,101,100,44,32,106,117,115,116,32,34,109,97,114,107,101,100,32,100,101,108,101,116,101,100,34,32,46,32,84,104,117,115,32,100,101,108,101,116,101,100,32,114,101,99,111,114,100,115,32,99,97,110,32,97,99,116,117,97,108,108,121,32,98,101,32,114,101,115,116,111,114,101,100,32,98,121,32,99,108,101,97,114,105,110,103,32,97,32,100,101,108,101,116,101,100,45,102,108,97,103,32,108,97,116,101,114,46,92,110,78,111,116,105,99,101,32,116,104,97,116,32,97,108,108,32,97,116,116,97,99,104,101,100,32,102,105,108,101,115,32,97,114,101,32,97,108,115,111,32,110,111,116,32,100,101,108,101,116,101,100,32,102,114,111,109,32,116,104,101,32,115,101,114,118,101,114,44,32,115,111,32,105,102,32,121,111,117,32,101,120,112,101,99,116,32,116,104,101,32,116,97,98,108,101,32,116,111,32,104,111,108,100,32,115,111,109,101,32,104,101,97,118,121,32,115,105,122,101,32,117,112,108,111,97,100,115,44,32,109,97,121,98,101,32,121,111,117,32,115,104,111,117,108,100,32,110,111,116,32,115,101,116,32,116,104,105,115,46,46,46));return false;">(What is this?)</a><BR><a name="0fe022d591"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][add_hidden]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][add_hidden]" value="1" checked="checked" onclick="setFormAnchorPoint('0fe022d591');" title="WOP: [tables][1][add_hidden]">Add "Hidden" flag  <a href="#" title="Frontend: The &quot;Hidden&quot; flag will prevent the record from being displayed on the frontend." style="cursor:help" onclick="alert(String.fromCharCode(70,114,111,110,116,101,110,100,58,32,84,104,101,32,34,72,105,100,100,101,110,34,32,102,108,97,103,32,119,105,108,108,32,112,114,101,118,101,110,116,32,116,104,101,32,114,101,99,111,114,100,32,102,114,111,109,32,98,101,105,110,103,32,100,105,115,112,108,97,121,101,100,32,111,110,32,116,104,101,32,102,114,111,110,116,101,110,100,46));return false;">(What is this?)</a><BR><img src="../../../../typo3/ext/kickstarter/res/t_flag_hidden.png" width="134" height="35" hspace=20 vspace="5" border="1" style="border:solid 1px;" /><BR><BR><a name="8624de0b56"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][add_starttime]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][add_starttime]" value="1" checked="checked" onclick="setFormAnchorPoint('8624de0b56');" title="WOP: [tables][1][add_starttime]">Add "Starttime"  <a href="#" title="Frontend: If a &quot;Starttime&quot; is set, the record will not be visible on the website, before that date arrives." style="cursor:help" onclick="alert(String.fromCharCode(70,114,111,110,116,101,110,100,58,32,73,102,32,97,32,34,83,116,97,114,116,116,105,109,101,34,32,105,115,32,115,101,116,44,32,116,104,101,32,114,101,99,111,114,100,32,119,105,108,108,32,110,111,116,32,98,101,32,118,105,115,105,98,108,101,32,111,110,32,116,104,101,32,119,101,98,115,105,116,101,44,32,98,101,102,111,114,101,32,116,104,97,116,32,100,97,116,101,32,97,114,114,105,118,101,115,46));return false;">(What is this?)</a><BR><img src="../../../../typo3/ext/kickstarter/res/t_flag_starttime.png" width="134" height="35" hspace=20 vspace="5" border="1" style="border:solid 1px;" /><BR><BR><a name="653fb46a0c"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][add_endtime]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][add_endtime]" value="1" checked="checked" onclick="setFormAnchorPoint('653fb46a0c');" title="WOP: [tables][1][add_endtime]">Add "Endtime"  <a href="#" title="Frontend: If a &quot;Endtime&quot; is set, the record will be hidden from that date and into the future." style="cursor:help" onclick="alert(String.fromCharCode(70,114,111,110,116,101,110,100,58,32,73,102,32,97,32,34,69,110,100,116,105,109,101,34,32,105,115,32,115,101,116,44,32,116,104,101,32,114,101,99,111,114,100,32,119,105,108,108,32,98,101,32,104,105,100,100,101,110,32,102,114,111,109,32,116,104,97,116,32,100,97,116,101,32,97,110,100,32,105,110,116,111,32,116,104,101,32,102,117,116,117,114,101,46));return false;">(What is this?)</a><BR><img src="../../../../typo3/ext/kickstarter/res/t_flag_endtime.png" width="134" height="35" hspace=20 vspace="5" border="1" style="border:solid 1px;" /><BR><BR><a name="f968a89b45"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][add_access]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][add_access]" value="1" checked="checked" onclick="setFormAnchorPoint('f968a89b45');" title="WOP: [tables][1][add_access]">Add "Access group"  <a href="#" title="Frontend: If a frontend user group is set for a record, only frontend users that are members of that group will be able to see the record." style="cursor:help" onclick="alert(String.fromCharCode(70,114,111,110,116,101,110,100,58,32,73,102,32,97,32,102,114,111,110,116,101,110,100,32,117,115,101,114,32,103,114,111,117,112,32,105,115,32,115,101,116,32,102,111,114,32,97,32,114,101,99,111,114,100,44,32,111,110,108,121,32,102,114,111,110,116,101,110,100,32,117,115,101,114,115,32,116,104,97,116,32,97,114,101,32,109,101,109,98,101,114,115,32,111,102,32,116,104,97,116,32,103,114,111,117,112,32,119,105,108,108,32,98,101,32,97,98,108,101,32,116,111,32,115,101,101,32,116,104,101,32,114,101,99,111,114,100,46));return false;">(What is this?)</a><BR><img src="../../../../typo3/ext/kickstarter/res/t_flag_access.png" width="134" height="35" hspace=20 vspace="5" border="1" style="border:solid 1px;" /><BR><BR></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><a name="2ee150e41d"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][localization]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][localization]" value="1" checked="checked" onclick="setFormAnchorPoint('2ee150e41d');" title="WOP: [tables][1][localization]">Enabled localization features <a href="#" title="If set, the records will have a selector box for language and a reference field which can point back to the original default translation for the record. These features are part of the internal framework for localization." style="cursor:help" onclick="alert(String.fromCharCode(73,102,32,115,101,116,44,32,116,104,101,32,114,101,99,111,114,100,115,32,119,105,108,108,32,104,97,118,101,32,97,32,115,101,108,101,99,116,111,114,32,98,111,120,32,102,111,114,32,108,97,110,103,117,97,103,101,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,105,101,108,100,32,119,104,105,99,104,32,99,97,110,32,112,111,105,110,116,32,98,97,99,107,32,116,111,32,116,104,101,32,111,114,105,103,105,110,97,108,32,100,101,102,97,117,108,116,32,116,114,97,110,115,108,97,116,105,111,110,32,102,111,114,32,116,104,101,32,114,101,99,111,114,100,46,32,84,104,101,115,101,32,102,101,97,116,117,114,101,115,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,105,110,116,101,114,110,97,108,32,102,114,97,109,101,119,111,114,107,32,102,111,114,32,108,111,99,97,108,105,122,97,116,105,111,110,46));return false;">(What is this?)</a><BR><a name="f8d2d91dbf"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][versioning]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][versioning]" value="1" checked="checked" onclick="setFormAnchorPoint('f8d2d91dbf');" title="WOP: [tables][1][versioning]">Enable versioning  <a href="#" title="If set, you will be able to versionize records from this table. Highly recommended if the records are passed around in a workflow." style="cursor:help" onclick="alert(String.fromCharCode(73,102,32,115,101,116,44,32,121,111,117,32,119,105,108,108,32,98,101,32,97,98,108,101,32,116,111,32,118,101,114,115,105,111,110,105,122,101,32,114,101,99,111,114,100,115,32,102,114,111,109,32,116,104,105,115,32,116,97,98,108,101,46,32,72,105,103,104,108,121,32,114,101,99,111,109,109,101,110,100,101,100,32,105,102,32,116,104,101,32,114,101,99,111,114,100,115,32,97,114,101,32,112,97,115,115,101,100,32,97,114,111,117,110,100,32,105,110,32,97,32,119,111,114,107,102,108,111,119,46));return false;">(What is this?)</a><BR><a name="3eb5780bca"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][sorting]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][sorting]" value="1" checked="checked" onclick="setFormAnchorPoint('3eb5780bca');" title="WOP: [tables][1][sorting]">Manual ordering of records  <a href="#" title="If set, the records can be moved up and down relative to each other in the backend. Just like Content Elements. Otherwise they are sorted automatically by any field you specify" style="cursor:help" onclick="alert(String.fromCharCode(73,102,32,115,101,116,44,32,116,104,101,32,114,101,99,111,114,100,115,32,99,97,110,32,98,101,32,109,111,118,101,100,32,117,112,32,97,110,100,32,100,111,119,110,32,114,101,108,97,116,105,118,101,32,116,111,32,101,97,99,104,32,111,116,104,101,114,32,105,110,32,116,104,101,32,98,97,99,107,101,110,100,46,32,74,117,115,116,32,108,105,107,101,32,67,111,110,116,101,110,116,32,69,108,101,109,101,110,116,115,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,121,32,97,114,101,32,115,111,114,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,98,121,32,97,110,121,32,102,105,101,108,100,32,121,111,117,32,115,112,101,99,105,102,121));return false;">(What is this?)</a><BR><blockquote>If "Manual ordering" is not set, order the table by this field:<BR><a name="79955aed7f"></a><select name="kickstarter[wizArray_upd][tables][1][sorting_field]" onchange="setFormAnchorPoint('79955aed7f');" title="WOP: [tables][1][sorting_field]"><option value="crdate" selected="selected">[crdate]</option><option value="cruser_id">[cruser_id]</option><option value="tstamp">[tstamp]</option></select><BR><a name="76ceb55890"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][sorting_desc]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][sorting_desc]" value="1" onclick="setFormAnchorPoint('76ceb55890');" title="WOP: [tables][1][sorting_desc]"> Descending</blockquote></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>"Type-field", if any:<BR></strong><a name="acd96759da"></a><select name="kickstarter[wizArray_upd][tables][1][type_field]" onchange="setFormAnchorPoint('acd96759da');" title="WOP: [tables][1][type_field]"><option value="0" selected="selected">[none]</option></select> <a href="#" title="A &quot;type-field&quot; is the field in the table which determines how the form is rendered in the backend, eg. which fields are shown under which circumstances.\nFor instance the Content Element table &quot;tt_content&quot; has a type-field, CType. The value of this field determines if the editing form shows the bodytext field as is the case when the type is &quot;Text&quot; or if also the image-field should be shown as when the type is &quot;Text w/Image&quot;" style="cursor:help" onclick="alert(String.fromCharCode(65,32,34,116,121,112,101,45,102,105,101,108,100,34,32,105,115,32,116,104,101,32,102,105,101,108,100,32,105,110,32,116,104,101,32,116,97,98,108,101,32,119,104,105,99,104,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32,102,111,114,109,32,105,115,32,114,101,110,100,101,114,101,100,32,105,110,32,116,104,101,32,98,97,99,107,101,110,100,44,32,101,103,46,32,119,104,105,99,104,32,102,105,101,108,100,115,32,97,114,101,32,115,104,111,119,110,32,117,110,100,101,114,32,119,104,105,99,104,32,99,105,114,99,117,109,115,116,97,110,99,101,115,46,92,110,70,111,114,32,105,110,115,116,97,110,99,101,32,116,104,101,32,67,111,110,116,101,110,116,32,69,108,101,109,101,110,116,32,116,97,98,108,101,32,34,116,116,95,99,111,110,116,101,110,116,34,32,104,97,115,32,97,32,116,121,112,101,45,102,105,101,108,100,44,32,67,84,121,112,101,46,32,84,104,101,32,118,97,108,117,101,32,111,102,32,116,104,105,115,32,102,105,101,108,100,32,100,101,116,101,114,109,105,110,101,115,32,105,102,32,116,104,101,32,101,100,105,116,105,110,103,32,102,111,114,109,32,115,104,111,119,115,32,116,104,101,32,98,111,100,121,116,101,120,116,32,102,105,101,108,100,32,97,115,32,105,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,116,121,112,101,32,105,115,32,34,84,101,120,116,34,32,111,114,32,105,102,32,97,108,115,111,32,116,104,101,32,105,109,97,103,101,45,102,105,101,108,100,32,115,104,111,117,108,100,32,98,101,32,115,104,111,119,110,32,97,115,32,119,104,101,110,32,116,104,101,32,116,121,112,101,32,105,115,32,34,84,101,120,116,32,119,47,73,109,97,103,101,34));return false;">(What is this?)</a></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Label-field:<BR></strong><a name="baa714a2a8"></a><select name="kickstarter[wizArray_upd][tables][1][header_field]" onchange="setFormAnchorPoint('baa714a2a8');" title="WOP: [tables][1][header_field]"><option value="0" selected="selected">[none]</option></select> <a href="#" title="A &quot;label-field&quot; is the field used as record title in the backend." style="cursor:help" onclick="alert(String.fromCharCode(65,32,34,108,97,98,101,108,45,102,105,101,108,100,34,32,105,115,32,116,104,101,32,102,105,101,108,100,32,117,115,101,100,32,97,115,32,114,101,99,111,114,100,32,116,105,116,108,101,32,105,110,32,116,104,101,32,98,97,99,107,101,110,100,46));return false;">(What is this?)</a></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><a name="137de2c3a6"></a><select name="kickstarter[wizArray_upd][tables][1][defIcon]" onchange="setFormAnchorPoint('137de2c3a6');" title="WOP: [tables][1][defIcon]"><option value="default.gif" selected="selected">Default (white)</option><option value="default_black.gif">Black</option><option value="default_gray4.gif">Gray</option><option value="default_blue.gif">Blue</option><option value="default_green.gif">Green</option><option value="default_red.gif">Red</option><option value="default_yellow.gif">Yellow</option><option value="default_purple.gif">Purple</option></select> Default icon  <a href="#" title="All tables have at least one associated icon. Select which default icon you wish. You can always substitute the file with another." style="cursor:help" onclick="alert(String.fromCharCode(65,108,108,32,116,97,98,108,101,115,32,104,97,118,101,32,97,116,32,108,101,97,115,116,32,111,110,101,32,97,115,115,111,99,105,97,116,101,100,32,105,99,111,110,46,32,83,101,108,101,99,116,32,119,104,105,99,104,32,100,101,102,97,117,108,116,32,105,99,111,110,32,121,111,117,32,119,105,115,104,46,32,89,111,117,32,99,97,110,32,97,108,119,97,121,115,32,115,117,98,115,116,105,116,117,116,101,32,116,104,101,32,102,105,108,101,32,119,105,116,104,32,97,110,111,116,104,101,114,46));return false;">(What is this?)</a></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Allowed on pages:<BR></strong><a name="3ab0de4e3a"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][allow_on_pages]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][allow_on_pages]" value="1" checked="checked" onclick="setFormAnchorPoint('3ab0de4e3a');" title="WOP: [tables][1][allow_on_pages]"> Allow records from this table to be created on regular pages.</span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Allowed in "Insert Records" field in content elements:<BR></strong><a name="55468e6cbd"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][allow_ce_insert_records]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][allow_ce_insert_records]" value="1" checked="checked" onclick="setFormAnchorPoint('55468e6cbd');" title="WOP: [tables][1][allow_ce_insert_records]"> Allow records from this table to be linked to by content elements.</span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Add "Save and new" button in forms:<BR></strong><a name="ea3495b007"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][save_and_new]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][save_and_new]" value="1" checked="checked" onclick="setFormAnchorPoint('ea3495b007');" title="WOP: [tables][1][save_and_new]"> Will add an additional save-button to forms by which you can save the item and instantly create the next.</span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>Notice on fieldnames:<BR></strong>Don't use fieldnames from this list of reserved names/words: <BR>
+               <blockquote><em>uid, pid, endtime, starttime, sorting, fe_group, hidden, deleted, cruser_id, crdate, tstamp, data, table, field, key, desc, all, and, asensitive, bigint, both, cascade, char, collate, connection, convert, current_date, current_user, databases, day_minute, decimal, delayed, describe, distinctrow, drop, else, escaped, explain, float, for, from, group, hour_microsecond, if, index, inout, int, int3, integer, is, leading, like, load, lock, longtext, match, mediumtext, minute_second, natural, null, optimize, or, outer, primary, raid0, real, release, replace, return, rlike, second_microsecond, separator, smallint, specific, sqlstate, sql_cal_found_rows, starting, terminated, tinyint, trailing, undo, unlock, usage, utc_date, values, varcharacter, where, write, year_month, call, condition, continue, cursor, declare, deterministic, each, elseif, exit, fetch, goto, insensitive, iterate, label, leave, loop, modifies, out, reads, repeat, schema, schemas, sensitive, sql, sqlexception, sqlwarning, trigger, upgrade, while</em></blockquote></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><strong>NEW FIELD:</strong></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><table border="0" cellpadding="0" cellspacing="0">
+       <tr><td valign="top"><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Field name:</span></td><td valign="top"><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><a name="43bdd40f96"></a><input type="text" name="kickstarter[wizArray_upd][tables][1][fields][1][fieldname]" value="" style="width:200px;" onchange="setFormAnchorPoint('43bdd40f96');" title="WOP: [tables][1][fields][1][fieldname]"></span></td></tr>
+       <tr><td valign="top"><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Field title:</span></td><td valign="top"><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><a name="84135628ec"></a><input type="text" name="kickstarter[wizArray_upd][tables][1][fields][1][title]" value="" style="width:200px;" onchange="setFormAnchorPoint('84135628ec');" title="WOP: [tables][1][fields][1][title]"> [English]<blockquote><a name="0265cff709"></a><input type="text" name="kickstarter[wizArray_upd][tables][1][fields][1][title_de]" value="" style="width:200px;" onchange="setFormAnchorPoint('0265cff709');" title="WOP: [tables][1][fields][1][title_de]"> [German]</blockquote></span></td></tr>
+       <tr><td valign="top"><span style="font-family:verdana,arial,sans-serif; font-size:10px;">Field type:</span></td><td valign="top"><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><a name="49d2551d6d"></a><select name="kickstarter[wizArray_upd][tables][1][fields][1][type]" onchange="setFormAnchorPoint('49d2551d6d');" title="WOP: [tables][1][fields][1][type]"><option value="" selected="selected"></option><option value="input">String input</option><option value="input+">String input, advanced</option><option value="textarea">Text area</option><option value="textarea_rte">Text area with RTE</option><option value="textarea_nowrap">Text area, No wrapping</option><option value="check">Checkbox, single</option><option value="check_4">Checkbox, 4 boxes in a row</option><option value="check_10">Checkbox, 10 boxes in two rows (max)</option><option value="link">Link</option><option value="date">Date</option><option value="datetime">Date and time</option><option value="integer">Integer, 10-1000</option><option value="select">Selectorbox</option><option value="radio">Radio buttons</option><option value="rel">Database relation</option><option value="files">Files</option><option value="none">Not editable, only displayed</option><option value="passthrough">[Passthrough]</option></select><a name="1c283ce973"></a><input type="hidden" name="kickstarter[wizArray_upd][tables][1][fields][1][excludeField]" value="0"><input type="checkbox" name="kickstarter[wizArray_upd][tables][1][fields][1][excludeField]" value="1" checked="checked" onclick="setFormAnchorPoint('1c283ce973');" title="WOP: [tables][1][fields][1][excludeField]"> Is Exclude-field  <a href="#" title="If a field is marked &quot;Exclude-field&quot;, users can edit it ONLY if the field is specifically listed in one of the backend user groups of the user.\nIn other words, if a field is marked &quot;Exclude-field&quot; you can control which users can edit it and which cannot." style="cursor:help" onclick="alert(String.fromCharCode(73,102,32,97,32,102,105,101,108,100,32,105,115,32,109,97,114,107,101,100,32,34,69,120,99,108,117,100,101,45,102,105,101,108,100,34,44,32,117,115,101,114,115,32,99,97,110,32,101,100,105,116,32,105,116,32,79,78,76,89,32,105,102,32,116,104,101,32,102,105,101,108,100,32,105,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,108,105,115,116,101,100,32,105,110,32,111,110,101,32,111,102,32,116,104,101,32,98,97,99,107,101,110,100,32,117,115,101,114,32,103,114,111,117,112,115,32,111,102,32,116,104,101,32,117,115,101,114,46,92,110,73,110,32,111,116,104,101,114,32,119,111,114,100,115,44,32,105,102,32,97,32,102,105,101,108,100,32,105,115,32,109,97,114,107,101,100,32,34,69,120,99,108,117,100,101,45,102,105,101,108,100,34,32,121,111,117,32,99,97,110,32,99,111,110,116,114,111,108,32,119,104,105,99,104,32,117,115,101,114,115,32,99,97,110,32,101,100,105,116,32,105,116,32,97,110,100,32,119,104,105,99,104,32,99,97,110,110,111,116,46));return false;">(What is this?)</a><br /></span></td></tr>
+</table></span></td></tr><tr bgcolor=""><td><span style="font-family:verdana,arial,sans-serif; font-size:10px;"><BR><BR>Load preset fields: <BR></span></td></tr></table>
+       </body>
+       </html>
\ No newline at end of file
diff --git a/ext_conf_template.txt b/ext_conf_template.txt
new file mode 100644 (file)
index 0000000..8b3aecd
--- /dev/null
@@ -0,0 +1,3 @@
+
+  # cat=basic//10; type=int; label= Page UID where the main configuration template is stored.
+mainConfigStorageUid = 0
diff --git a/ext_emconf.php b/ext_emconf.php
new file mode 100644 (file)
index 0000000..3e8a07b
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+########################################################################
+# Extension Manager/Repository config file for ext: "contagged"
+#
+# Auto generated 14-05-2007 12:46
+#
+# Manual updates:
+# Only the data in the array - anything else is removed by next write.
+# "version" and "dependencies" must not be touched!
+########################################################################
+
+$EM_CONF[$_EXTKEY] = array(
+       'title' => 'Content parser and tagger',
+       'description' => 'This extension parses the text of a content element to tag, replace and link specific terms. It is useful to auto-generate a glossary - but not only. Because it is configurable through TS.',
+       'category' => 'fe',
+       'author' => 'Jochen Rau',
+       'author_email' => 'j.rau@web.de',
+       'shy' => '',
+       'dependencies' => '',
+       'conflicts' => '',
+       'priority' => '',
+       'module' => '',
+       'state' => 'alpha',
+       'internal' => '',
+       'uploadfolder' => 1,
+       'createDirs' => 'uploads/tx_contagged/rte/',
+       'modify_tables' => '',
+       'clearCacheOnLoad' => 1,
+       'lockType' => '',
+       'author_company' => '',
+       'version' => '0.0.1',
+       'constraints' => array(
+               'depends' => array(
+               ),
+               'conflicts' => array(
+               ),
+               'suggests' => array(
+               ),
+       ),
+       '_md5_values_when_last_written' => 'a:17:{s:9:"ChangeLog";s:4:"8fe4";s:10:"README.txt";s:4:"9ef0";s:22:"class.tx_contagged.php";s:4:"1d3c";s:21:"ext_conf_template.txt";s:4:"98a6";s:12:"ext_icon.gif";s:4:"50a3";s:17:"ext_localconf.php";s:4:"9c47";s:14:"ext_tables.php";s:4:"ca26";s:14:"ext_tables.sql";s:4:"ae2b";s:27:"icon_tx_contagged_terms.gif";s:4:"50a3";s:16:"locallang_db.xml";s:4:"beb7";s:7:"tca.php";s:4:"53af";s:14:"doc/manual.sxw";s:4:"c9fc";s:19:"doc/wizard_form.dat";s:4:"8bf3";s:20:"doc/wizard_form.html";s:4:"c95f";s:20:"static/constants.txt";s:4:"2bbc";s:16:"static/setup.txt";s:4:"80b4";s:20:"static/css/setup.txt";s:4:"77f5";}',
+       'suggests' => array(
+       ),
+);
+
+?>
\ No newline at end of file
diff --git a/ext_icon.gif b/ext_icon.gif
new file mode 100644 (file)
index 0000000..87c8b61
Binary files /dev/null and b/ext_icon.gif differ
diff --git a/ext_localconf.php b/ext_localconf.php
new file mode 100644 (file)
index 0000000..72b88f2
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+if (!defined ('TYPO3_MODE'))   die ('Access denied.');
+
+t3lib_extMgm::addUserTSConfig('
+       options.saveDocNew.tx_contagged_terms=1
+');
+
+?>
\ No newline at end of file
diff --git a/ext_tables.php b/ext_tables.php
new file mode 100644 (file)
index 0000000..31ba72f
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+if (!defined ('TYPO3_MODE')) die ('Access denied.');
+
+t3lib_extMgm::allowTableOnStandardPages('tx_contagged_terms');
+t3lib_extMgm::addToInsertRecords('tx_contagged_terms');
+t3lib_extMgm::addPItoST43($_EXTKEY,'class.tx_contagged.php','','includeLib',1);
+
+// add contagged to the "insert plugin" content element
+t3lib_extMgm::addPlugin(Array('LLL:EXT:contagged/locallang_db.php:tx_contagged_terms.plugin','contagged'));
+
+// initialize static extension templates
+t3lib_extMgm::addStaticFile($_EXTKEY,'static/', 'Content parser');
+t3lib_extMgm::addStaticFile($_EXTKEY,'static/css/','default CSS-styles');
+
+$TCA["tx_contagged_terms"] = array (
+       "ctrl" => array (
+               'title'     => 'LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms',         
+               'label'     => 'term_main',
+               'label_alt' => 'term_type',
+               'label_alt_force' => TRUE,
+               'tstamp'    => 'tstamp',
+               'crdate'    => 'crdate',
+               'cruser_id' => 'cruser_id',
+               'versioningWS' => TRUE, 
+               'origUid' => 't3_origuid',
+               'languageField'            => 'sys_language_uid',       
+               'transOrigPointerField'    => 'l18n_parent',    
+               'transOrigDiffSourceField' => 'l18n_diffsource',        
+               'sortby' => 'sorting',  
+               'delete' => 'deleted',  
+               'enablecolumns' => array (              
+                       'disabled' => 'hidden', 
+                       'starttime' => 'starttime',     
+                       'endtime' => 'endtime', 
+                       'fe_group' => 'fe_group',
+               ),
+               'useColumnsForDefaultValues' => 'term_type',
+               'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY).'tca.php',
+               'iconfile'          => t3lib_extMgm::extRelPath($_EXTKEY).'icon_tx_contagged_terms.gif',
+       ),
+       "feInterface" => array (
+               "fe_admin_fieldList" => "sys_language_uid, l18n_parent, l18n_diffsource, hidden, starttime, endtime, fe_group, term_main, term_alt, term_type, term_lang, term_replace, desc_short, desc_long, link, exclude",
+       )
+);
+
+// Add a field  "exclude this page from parsing" to the table "pages"
+$tempColumns = Array (
+    "tx_contagged_dont_parse" => Array (
+        "exclude" => 1,
+        "label" => "LLL:EXT:contagged/locallang_db.xml:pages.tx_contagged_dont_parse",
+        "config" => Array (
+            "type" => "check",
+        )
+    ),
+);
+
+t3lib_div::loadTCA("pages");
+t3lib_extMgm::addTCAcolumns("pages",$tempColumns,1);
+t3lib_extMgm::addToAllTCAtypes("pages","tx_contagged_dont_parse;;;;1-1-1");
+
+?>
\ No newline at end of file
diff --git a/ext_tables.sql b/ext_tables.sql
new file mode 100644 (file)
index 0000000..b284911
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# Table structure for table 'tx_contagged_terms'
+#
+CREATE TABLE tx_contagged_terms (
+       uid int(11) NOT NULL auto_increment,
+       pid int(11) DEFAULT '0' NOT NULL,
+       tstamp int(11) DEFAULT '0' NOT NULL,
+       crdate int(11) DEFAULT '0' NOT NULL,
+       cruser_id int(11) DEFAULT '0' NOT NULL,
+       t3ver_oid int(11) DEFAULT '0' NOT NULL,
+       t3ver_id int(11) DEFAULT '0' NOT NULL,
+       t3ver_wsid int(11) DEFAULT '0' NOT NULL,
+       t3ver_label varchar(30) DEFAULT '' NOT NULL,
+       t3ver_state tinyint(4) DEFAULT '0' NOT NULL,
+       t3ver_stage tinyint(4) DEFAULT '0' NOT NULL,
+       t3ver_count int(11) DEFAULT '0' NOT NULL,
+       t3ver_tstamp int(11) DEFAULT '0' NOT NULL,
+       t3_origuid int(11) DEFAULT '0' NOT NULL,
+       sys_language_uid int(11) DEFAULT '0' NOT NULL,
+       l18n_parent int(11) DEFAULT '0' NOT NULL,
+       l18n_diffsource mediumblob NOT NULL,
+       sorting int(10) DEFAULT '0' NOT NULL,
+       deleted tinyint(4) DEFAULT '0' NOT NULL,
+       hidden tinyint(4) DEFAULT '0' NOT NULL,
+       starttime int(11) DEFAULT '0' NOT NULL,
+       endtime int(11) DEFAULT '0' NOT NULL,
+       fe_group int(11) DEFAULT '0' NOT NULL,
+       term_main tinytext NOT NULL,
+       term_alt tinytext NOT NULL,
+       term_type tinytext NOT NULL,
+       term_lang char(2) DEFAULT '' NOT NULL,
+       term_replace tinytext NOT NULL,
+       desc_short tinytext NOT NULL,
+       desc_long text NOT NULL,
+       link tinytext NOT NULL,
+       exclude tinyint(3) DEFAULT '0' NOT NULL,
+       
+       PRIMARY KEY (uid),
+       KEY parent (pid),
+       KEY t3ver_oid (t3ver_oid,t3ver_wsid)
+);
+
+
+#
+# Table structure for table 'pages'
+#
+CREATE TABLE pages (
+       tx_contagged_dont_parse tinyint(3) DEFAULT '0' NOT NULL
+);
diff --git a/icon_tx_contagged_terms.gif b/icon_tx_contagged_terms.gif
new file mode 100644 (file)
index 0000000..87c8b61
Binary files /dev/null and b/icon_tx_contagged_terms.gif differ
diff --git a/locallang_db.xml b/locallang_db.xml
new file mode 100644 (file)
index 0000000..dbe99b6
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<T3locallang>
+       <meta type="array">
+               <type>database</type>
+               <description>Language labels for database tables/fields belonging to extension 'contagged'</description>
+       </meta>
+       <data type="array">
+               <languageKey index="default" type="array">
+                       <label index="tx_contagged_terms">Terms</label>
+                       <label index="tx_contagged_terms.plugin">List (contagged)</label>
+                       <label index="tx_contagged_terms.term_main">Term</label>
+                       <label index="tx_contagged_terms.term_alt">Alternative terms</label>
+                       <label index="tx_contagged_terms.term_type">Type of term</label>
+                       <label index="tx_contagged_terms.term_lang.I.1">English</label>
+                       <label index="tx_contagged_terms.term_lang.I.2">French</label>
+                       <label index="tx_contagged_terms.term_lang.I.3">German</label>
+                       <label index="tx_contagged_terms.term_lang.I.4">Italian</label>
+                       <label index="tx_contagged_terms.term_lang.I.5">Spanish</label>
+                       <label index="tx_contagged_terms.term_lang">Language of term</label>
+                       <label index="tx_contagged_terms.term_replace">Replacement</label>
+                       <label index="tx_contagged_terms.desc_short">Short Description (e.g. Tool Tip Text)</label>
+                       <label index="tx_contagged_terms.desc_long">Long Description</label>
+                       <label index="tx_contagged_terms.link">Link</label>
+                       <label index="tx_contagged_terms.exclude">Exclude from front-end lists</label>
+                       <label index="pages.tx_contagged_dont_parse">Don't parse text</label>
+               </languageKey>
+               <languageKey index="de" type="array">
+                       <label index="tx_contagged_terms">Ausdrücke</label>
+                       <label index="tx_contagged_terms.plugin">Liste (contagged)</label>
+                       <label index="tx_contagged_terms.term_main">Ausdruck</label>
+                       <label index="tx_contagged_terms.term_alt">Alternative Ausdrücke</label>
+                       <label index="tx_contagged_terms.term_type">Art des Ausdrucks</label>
+                       <label index="tx_contagged_terms.term_lang.I.1">Englisch</label>
+                       <label index="tx_contagged_terms.term_lang.I.2">Französisch</label>
+                       <label index="tx_contagged_terms.term_lang.I.3">Deutsch</label>
+                       <label index="tx_contagged_terms.term_lang.I.4">Italienisch</label>
+                       <label index="tx_contagged_terms.term_lang.I.5">Spanisch</label>
+                       <label index="tx_contagged_terms.term_lang">Sprache des Ausdrucks</label>
+                       <label index="tx_contagged_terms.term_replace">Ausdruck, der anstelle des Begriffs eingesetzt wird</label>
+                       <label index="tx_contagged_terms.desc_short">Kurzbeschreibung (z. B. Tool-Tip-Text)</label>
+                       <label index="tx_contagged_terms.desc_long">Ausführliche Beschreibung</label>
+                       <label index="tx_contagged_terms.link">Verweis</label>
+                       <label index="tx_contagged_terms.exclude">Von Frontend-Listen ausschließen</label>
+                       <label index="pages.tx_contagged_dont_parse">Text der Seite nicht parsen</label>
+               </languageKey>
+       </data>
+</T3locallang>
diff --git a/static/constants.txt b/static/constants.txt
new file mode 100644 (file)
index 0000000..c2740b3
--- /dev/null
@@ -0,0 +1,39 @@
+contagged {
+       allWrap = <dl>|</dl>
+       termWrap = <dt>|</dt>
+       descriptionWrap = <dd>|</dd>
+       #<div style="clear:both;"></div>
+       back = zurück
+       backWrap = <p>|</p>
+       allTerms = Alle Begriffe
+       allTermsWrap = <p>|</p>
+       orderBy = term_main
+
+       # cat=plugin.contagged//10; type=int; label=[Link to list page]:Set this to 1 if all types of terms shold be linked to the list page specified by "listPage". This could be overwritten by the type configuration. you have to configure a list page globally (see below) or in the configuration of a type of term.
+       linkToListPage = 1
+
+       # cat=plugin.contagged//20; type=int; label=[Default List Page (PID)]:PID of the default list page if no special list page in the configuration of a type of term is selected. This could be overwritten by the type configuration.
+       listPage =
+
+       # cat=plugin.contagged//30; type=string; label=[Root Pages (List of PID) to be included]: A comma separated list of root pages of branches to be parsed. This could be overwritten by the type configuration.
+       includeRootPages = 0
+
+       # cat=plugin.contagged//40; type=string; label=[Root Pages (List of PID) to be excluded]: A comma separated list of root pages of branches to be excluded from parsing. Overwrites the settings of "includeRootPages".
+       excludeRootPages =
+
+       # cat=plugin.contagged//50; type=string; label=[Pages (List of PID) to be included]: A comma separated list of pages to be included. Overwrites the settings of "excludeRootPages".
+       includePages =
+
+       # cat=plugin.contagged//60; type=string; label=[Pages (List of PID) to be excluded]: A comma separated list of pages to be excluded from parsing. Overwrites the settings of "includePages" and "includeRootPages".
+       excludePages =
+
+       # cat=plugin.contagged//70; type=boolean; label=[Add title attribute]: Should the "title" attribute containing a short description of the term be added to the tag?
+       addTitleAttribute = 1
+
+       # cat=plugin.contagged//80; type=boolean; label=[Add language attribute]: Should a "lang" attribute be added to the tag?
+       addLangAttribute = 1
+
+       # cat=plugin.contagged//90; type=boolean; label=[Add css class]: Should a css class name be added to the tag? By default the class name is the name of the type of term (e.g. "dfn_inline") headed by the extension prefix.
+       addCssClassAttribute = 0
+
+}
\ No newline at end of file
diff --git a/static/css/setup.txt b/static/css/setup.txt
new file mode 100644 (file)
index 0000000..7271d72
--- /dev/null
@@ -0,0 +1,50 @@
+###
+# This are the default CSS Styles for the contagged extension
+##
+
+plugin.tx_contagged {
+       _CSS_DEFAULT_STYLE (
+
+               acronym, abbr, dfn {
+                       font-style: normal;
+                       border-bottom: 1px dotted #FF9900;
+                       cursor: help;
+                       position: relative;
+               }
+               /* position:relative is necessary for correct positioning of inline descriptions */
+               dfn.tx-contagged-dfn_block {
+                       position: relative;
+               }
+               /* z-index makes shure the block is the top most element */
+               dfn.tx-contagged-dfn_block>span {
+                       background: #FFF7CE;
+                       display: none;
+                       z-index: 9999;
+               }
+               dfn.tx-contagged-dfn_block:hover>span {
+                       display: block;
+                       position: absolute;
+                       top: -2px;
+                       left: -11px;
+                       width: 300px;
+                       margin-top: -1px;
+                       border: 1px #FFCC00 solid;
+                       padding: 0px 10px 10px 10px;
+               }
+               dfn.tx-contagged-dfn_block p {
+                       margin:0;
+                       padding:0;
+               }
+
+               dfn.tx-contagged-dfn_inline {
+               }
+               dfn.tx-contagged-dfn_inline>span {
+                       color: #009900;
+                       display: none;
+               }
+               dfn.tx-contagged-dfn_inline:active>span {
+                       position:relative;
+                       display:inline;
+               }
+       )
+}
\ No newline at end of file
diff --git a/static/setup.txt b/static/setup.txt
new file mode 100644 (file)
index 0000000..76c47a6
--- /dev/null
@@ -0,0 +1,131 @@
+# setup the content element by calling the user function 'main' of the class tx_contagged
+tt_content.text.20.parseFunc.userFunc = tx_contagged->main
+
+plugin.tx_contagged {
+       linkToListPage = {$contagged.linkToListPage}
+       listPage = {$contagged.listPage}
+       includeRootPages = {$contagged.includeRootPages}
+       excludeRootPages = {$contagged.excludeRootPages}
+       includePages = {$contagged.includePages}
+       excludePages = {$contagged.excludePages}
+       addTitleAttribute = {$contagged.addTitleAttribute}
+       addLangAttribute = {$contagged.addLangAttribute}
+       addCssClassAttribute = {$contagged.addCssClassAttribute}
+       types {
+
+               definition {
+                       label = Definition
+                       tag = dfn
+               }
+
+               dfn_block {
+                       label = Definition (block)
+                       tag = dfn
+                       addCssClassAttribute = 1
+                       stdWrap.innerWrap.cObject = COA
+                       stdWrap.innerWrap.cObject {
+                               10 = TEXT
+                               10.value = | <span><p>
+                               20 = TEXT
+                               20.data = register:matchedTerm
+                               30 = TEXT
+                               30.value = </p>
+                               40 = TEXT
+                               40.required = 1
+                               40.data = register:desc_long
+                               50 = TEXT
+                               50.value = </span>
+                       }
+               }
+
+               dfn_inline {
+                       label = Definition (inline)
+                       linkToList = 0
+                       addCssClassAttribute = 1
+                       stdWrap.innerWrap.cObject = COA
+                       stdWrap.innerWrap.cObject {
+                               10 = TEXT
+                               10.value = | <span>&nbsp;[
+                               20 = TEXT
+                               20.required = 1
+                               20.stripHtml = 1
+                               20.data = register:desc_long
+                               30 = TEXT
+                               30.value = ]&nbsp;</span>
+                       }
+               }
+
+               acronym {
+                       label = Kurzwort aus Anfangsbuchstaben (Beispiel: NATO)
+                       tag = acronym
+               }
+
+               abbrevation {
+                       label = Abk&uuml;rzung (Beispiel: u.s.w.)
+                       tag = abbr
+               }
+
+               location {
+                       label = Ortsbezeichnung
+                       tag = strong
+                       listPage = 111
+                       replaceTerm = 1
+               }
+       }
+}
+
+
+# configuration of the list display
+tx_contagged_terms = COA
+tx_contagged_terms {
+       10 = TEXT
+       10.if.isTrue.field = term_main
+       10.field = term_main
+       10.wrap = {$contagged.termWrap}
+       20 = TEXT
+       20.if.isTrue.field = desc_long
+       20.field = desc_long
+       20.parseFunc < lib.parseFunc_RTE
+       20.wrap = {$contagged.descriptionWrap}
+}
+
+# configuration of the list plugin
+tt_content.list.20.contagged = CONTENT
+tt_content.list.20.contagged {
+       table = tx_contagged_terms
+       stdWrap.wrap = {$contagged.allWrap}
+       stdWrap {
+               append = COA
+               append.stdWrap.if.isTrue.data = GPvar:tx_contagged|back
+               append.10 = TEXT
+               append.10.value = {$contagged.back}
+               append.10.wrap = {$contagged.backWrap}
+               append.10.typolink.parameter.data = GPvar:tx_contagged|back
+               append.10.typolink.useCacheHash = 1
+               append.20 = TEXT
+               append.20.value = {$contagged.allTerms}
+               append.20.wrap = {$contagged.allTermsWrap}
+               append.20.typolink.parameter.data = TSFE:id
+#              append.20.typolink.additionalParams.stdWrap.cObject = COA
+#              append.20.typolink.additionalParams.stdWrap.cObject {
+#                      10 = TEXT
+#                      10.data = GPvar:tx_contagged|uid
+#              }
+       }
+       select {
+               pidInList.field = pages
+               orderBy = {$contagged.orderBy}
+               where = exclude=0
+               andWhere.cObject = COA
+               andWhere.cObject {
+                       10 = TEXT
+                       10.required = 1
+                       10.data = GPvar:tx_contagged|uid
+                       10.wrap = uid=|
+#                      20 = TEXT
+#                      20.value = "location"
+#                      20.noTrimWrap = | AND term_type=| |
+               }
+               #term_lang = sys_language_uid
+       }
+}
\ No newline at end of file
diff --git a/tca.php b/tca.php
new file mode 100644 (file)
index 0000000..37c0aaf
--- /dev/null
+++ b/tca.php
@@ -0,0 +1,251 @@
+<?php
+if (!defined ('TYPO3_MODE'))   die ('Access denied.');
+
+
+$TCA["tx_contagged_terms"] = array (
+       "ctrl" => $TCA["tx_contagged_terms"]["ctrl"],
+       "interface" => array (
+               "showRecordFieldList" => "sys_language_uid,l18n_parent,l18n_diffsource,hidden,starttime,endtime,fe_group term_main, term_alt, term_type, term_lang, replacement, desc_short, desc_long, link, exclude"
+       ),
+       "feInterface" => $TCA["tx_contagged_terms"]["feInterface"],
+       "columns" => array (
+               't3ver_label' => array (                
+                       'label'  => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel',
+                       'config' => array (
+                               'type' => 'input',
+                               'size' => '30',
+                               'max'  => '30',
+                       )
+               ),
+               'sys_language_uid' => array (           
+                       'exclude' => 1,
+                       'label'  => 'LLL:EXT:lang/locallang_general.xml:LGL.language',
+                       'config' => array (
+                               'type'                => 'select',
+                               'foreign_table'       => 'sys_language',
+                               'foreign_table_where' => 'ORDER BY sys_language.title',
+                               'items' => array(
+                                       array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1),
+                                       array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0)
+                               )
+                       )
+               ),
+               'l18n_parent' => array (                
+                       'displayCond' => 'FIELD:sys_language_uid:>:0',
+                       'exclude'     => 1,
+                       'label'       => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent',
+                       'config'      => array (
+                               'type'  => 'select',
+                               'items' => array (
+                                       array('', 0),
+                               ),
+                               'foreign_table'       => 'tx_contagged_terms',
+                               'foreign_table_where' => 'AND tx_contagged_terms.pid=###CURRENT_PID### AND tx_contagged_terms.sys_language_uid IN (-1,0)',
+                       )
+               ),
+               'l18n_diffsource' => array (            
+                       'config' => array (
+                               'type' => 'passthrough'
+                       )
+               ),
+               'hidden' => array (             
+                       'exclude' => 1,
+                       'label'   => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden',
+                       'config'  => array (
+                               'type'    => 'check',
+                               'default' => '0'
+                       )
+               ),
+               'starttime' => array (          
+                       'exclude' => 1,
+                       'label'   => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime',
+                       'config'  => array (
+                               'type'     => 'input',
+                               'size'     => '8',
+                               'max'      => '20',
+                               'eval'     => 'date',
+                               'default'  => '0',
+                               'checkbox' => '0'
+                       )
+               ),
+               'endtime' => array (            
+                       'exclude' => 1,
+                       'label'   => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime',
+                       'config'  => array (
+                               'type'     => 'input',
+                               'size'     => '8',
+                               'max'      => '20',
+                               'eval'     => 'date',
+                               'checkbox' => '0',
+                               'default'  => '0',
+                               'range'    => array (
+                                       'upper' => mktime(0, 0, 0, 12, 31, 2020),
+                                       'lower' => mktime(0, 0, 0, date('m')-1, date('d'), date('Y'))
+                               )
+                       )
+               ),
+               'fe_group' => array (           
+                       'exclude' => 1,
+                       'label'   => 'LLL:EXT:lang/locallang_general.xml:LGL.fe_group',
+                       'config'  => array (
+                               'type'  => 'select',
+                               'items' => array (
+                                       array('', 0),
+                                       array('LLL:EXT:lang/locallang_general.xml:LGL.hide_at_login', -1),
+                                       array('LLL:EXT:lang/locallang_general.xml:LGL.any_login', -2),
+                                       array('LLL:EXT:lang/locallang_general.xml:LGL.usergroups', '--div--')
+                               ),
+                               'foreign_table' => 'fe_groups'
+                       )
+               ),
+                       "term_main" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_main",
+                               "config" => Array (
+                                       "type" => "input",
+                                       "size" => "30",
+                                       "eval" => "required",
+                               )
+                       ),
+                       "term_alt" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_alt",
+                               "config" => Array (
+                                       "type" => "input",
+                                       "size" => "30",
+                               )
+                       ),
+                       "term_type" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_type",
+                               "config" => Array (
+                                       "type" => "select",
+                                       "itemsProcFunc" => "user_addItemsToTCA",
+                                       "size" => 1,
+                                       "maxitems" => 1,
+                               )
+                       ),
+                       "term_lang" => Array (          
+                               "exclude" => 1,         
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang",           
+                               "config" => Array (
+                                       "type" => "select",
+                                       "items" => Array (
+                                               Array("LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang.I.0", ""),
+                                               Array("LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang.I.1", "en"),
+                                               Array("LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang.I.2", "fr"),
+                                               Array("LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang.I.3", "de"),
+                                               Array("LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang.I.4", "it"),
+                                               Array("LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_lang.I.5", "es"),
+                                       ),
+                                       "size" => 1,    
+                                       "maxitems" => 1,
+                               )
+                       ),
+                       "term_replace" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.term_replace",
+                               "config" => Array (
+                                       "type" => "input",
+                                       "size" => "30",
+                               )
+                       ),
+                       "desc_short" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.desc_short",
+                               "config" => Array (
+                                       "type" => "input",
+                                       "size" => "30",
+                               )
+                       ),
+                       "desc_long" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.desc_long",
+                               "config" => Array (
+                                       "type" => "text",
+                                       "cols" => "30",
+                                       "rows" => "5",
+                                       "wizards" => Array(
+                                               "_PADDING" => 2,
+                                               "RTE" => array(
+                                                       "notNewRecords" => 1,
+                                                       "RTEonly" => 1,
+                                                       "type" => "script",
+                                                       "title" => "Full screen Rich Text Editing|Formatteret redigering i hele vinduet",
+                                                       "icon" => "wizard_rte2.gif",
+                                                       "script" => "wizard_rte.php",
+                                               ),
+                                       ),
+                               )
+                       ),
+                       "link" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.link",
+                               "config" => Array (
+                                       "type"     => "input",
+                                       "size"     => "15",
+                                       "max"      => "255",
+                                       "checkbox" => "",
+                                       "eval"     => "trim",
+                                       "wizards"  => array(
+                                               "_PADDING" => 2,
+                                               "link"     => array(
+                                                       "type"         => "popup",
+                                                       "title"        => "Link",
+                                                       "icon"         => "link_popup.gif",
+                                                       "script"       => "browse_links.php?mode=wizard",
+                                                       "JSopenParams" => "height=300,width=500,status=0,menubar=0,scrollbars=1"
+                                               )
+                                       )
+                               )
+                       ),
+                       "exclude" => Array (
+                               "exclude" => 1,
+                               "label" => "LLL:EXT:contagged/locallang_db.xml:tx_contagged_terms.exclude",
+                               "config" => Array (
+                                       "type" => "check",
+                               )
+                       ),
+               ),
+               "types" => array (
+                       "0" => array("showitem" => "sys_language_uid;;;;1-1-1, l18n_parent, l18n_diffsource, hidden;;1, term_main, term_alt, term_type, term_lang, term_replace, desc_short, desc_long;;;richtext[*]:rte_transform[mode=ts_css|imgpath=uploads/tx_contagged/rte/], link, exclude")
+               ),
+               "palettes" => array (
+                       "1" => array("showitem" => "starttime, endtime, fe_group")
+               )
+       );
+       
+require_once (PATH_t3lib.'class.t3lib_page.php');
+require_once (PATH_t3lib.'class.t3lib_tstemplate.php');
+require_once (PATH_t3lib.'class.t3lib_tsparser_ext.php');
+
+function user_addItemsToTCA(&$params,&$pObj) {
+
+       // get extension configuration
+       $extConfArray = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['contagged']);
+       if ( intval($extConfArray['mainConfigStorageUid']) > 0 ) {
+               $mainConfigStorageUid = intval($extConfArray['mainConfigStorageUid']);
+       } else {
+               // TODO parse static setup
+       }
+
+               
+       $sysPageObj = t3lib_div::makeInstance('t3lib_pageSelect');
+       // FIXME: pageUid is static; make it configurable
+       $rootLine = $sysPageObj->getRootLine($mainConfigStorageUid);
+       $TSObj = t3lib_div::makeInstance('t3lib_tsparser_ext');
+       $TSObj->tt_track = 0;
+       $TSObj->init();
+       $TSObj->runThroughTemplates($rootLine);
+       $TSObj->generateConfig();
+       $conf = $TSObj->setup['plugin.']['tx_contagged.'];
+       
+       // 
+       if ($conf['types.']) {
+               foreach ($conf['types.'] as $typeName => $typeConfigArray ) {
+                       $params['items'][]= Array( $typeConfigArray['label'], substr($typeName,0,-1) );
+               }
+       }
+
+}
+?>
\ No newline at end of file