/*   -*- coding: utf-8 -*-  */
/***********************************************************************
*
*               Module   : MediaWiki
*               Fichier  : MediaWikiText.c
*               Auteur   : Ducloy
*               Date     : Decembre 2013
*
************************************************************************
*
* Copyleft 2013 Jacques Ducloy 
* 
************************************************************************/

#include "MediaWiki.h"
#include "Except.h"

MediaWikiParser *NewMediaWikiParser()
{
  MediaWikiParser *parser;
  parser=(MediaWikiParser *)malloc(sizeof(MediaWikiParser));
  MediaWikiSetListSeparator(parser, ';');
  parser->bufListTag=BufferFromString("list");
  parser->bufItemTag=BufferFromString("i");
  parser->bufTerm=NewBuffer();
  return parser;
}

char *MediaWikiTextFindSemiColon(char *str)
{
  char *posSC;
  char *posAnd;
  if (str[0]==0) return NULL;
  posSC=strchr(str, ';');
  if (!posSC) return NULL;
  posAnd=strchr(str, '&');
  if (!posAnd) return posSC;
  if (posAnd > posSC) return posSC;
  return MediaWikiTextFindSemiColon(posSC+1);
}

SxmlNode *MediaWikiAppendTextNodeFromList(MediaWikiParser *parser, SxmlNode *colNode, char *str)
{
  char *str1;
  char *posSep;
  int lenCopy;
  int codeSep;

  str1=str;
  if (!str1)return NULL;
  while (*str1==' ')str1++;
  codeSep=MediaWikiListSeparator(parser);
  if (codeSep==';')
    {
      posSep=MediaWikiTextFindSemiColon(str1);
    }
  else posSep=strchr(str1, codeSep);
  /* if ((posSep=strchr(str1,  MediaWikiListSeparator(parser)))) lenCopy=posSep-str1; */
  if (posSep) lenCopy=posSep-str1;
  else lenCopy=strlen(str1);
  while (lenCopy>0&&(str1[lenCopy-1]==' '))lenCopy--;
  BufferStrncpy(parser->bufTerm, str1, lenCopy);
  SxmlAppendChild(colNode,SxmlLeafCreate(MediaWikiItemTag(parser),BufferString(parser->bufTerm)));
  if (posSep)MediaWikiAppendTextNodeFromList(parser, colNode, posSep+1);
  return colNode; 
}

SxmlNode *MediaWikiSxmlFromListText(MediaWikiParser *parser, SxmlNode *colNode)
{
  SxmlNode *xmlList;
  SxmlNode *lineNode;
  xmlList=SxmlElementCreate(MediaWikiListTag(parser));
  SxmlReset(colNode);
  while ((lineNode=SxmlNextNode(colNode)))
    {
      MediaWikiAppendTextNodeFromList(parser, xmlList, SxmlLeafText(lineNode));
    }
  return xmlList;
}

SxmlNode *MediaWikiSxmlListFromStr(MediaWikiParser *parser, char *str)
{
  SxmlNode *xmlList;
  xmlList=SxmlElementCreate(MediaWikiListTag(parser));
  MediaWikiAppendTextNodeFromList(parser, xmlList, str);
  return xmlList;
}

char *MediaWikiFindEscape(char *begin)
{
  char *posBeginTag;
  char *posBeginLink;
  posBeginTag=strstr(begin,"&lt;");
  posBeginLink=strstr(begin,"[[");
  if(posBeginTag)
    {
      if(posBeginLink)
	{
	  if (posBeginLink<posBeginTag)return posBeginLink;
	  else return posBeginTag;
	}
      else return posBeginTag;
    }
  return posBeginLink;
}

SxmlNode *MediaWikiAppendTextFromWikiLine(MediaWikiParser *parser)
{
  SxmlNode *xmlText;
  char * posEscape;
  posEscape=MediaWikiFindEscape(parser->nextItem);
  if (posEscape)
    {
      BufferStrncpy(parser->bufTerm, parser->nextItem, posEscape-parser->nextItem);
      xmlText=SxmlLeafCreate("text", BufferString(parser->bufTerm));
      parser->nextItem=posEscape;
      return xmlText;
    }
  xmlText=SxmlLeafCreate("text", parser->nextItem);
  parser->nextItem=NULL;
  return xmlText;
}

SxmlNode *MediaWikiAppendTagFromWikiLine(MediaWikiParser *parser)
{
  SxmlNode *xmlTag;
  char *endTag;
  char *startTag;
  startTag=parser->nextItem+4;
  endTag=strstr(startTag,"&gt;");
  if (!endTag)
    {
      ExceptSetError("MediaWikiText" , "SY", "end tag missing for: "   ,parser->nextItem,NULL,1);
      exit(1);
    }
  BufferStrncpy(parser->bufTerm, startTag, endTag - startTag);   
  xmlTag=SxmlLeafCreate("tag", BufferString(parser->bufTerm));
  parser->nextItem=endTag+4;
  if (parser->nextItem[0]=='\0') parser->nextItem=NULL;
  return xmlTag;
}

SxmlNode *MediaWikiAppendLinkFromWikiLine(MediaWikiParser *parser)
{
  SxmlNode *xmlLink;
  char *endLink;
  char *startLink;
  startLink=parser->nextItem+2;
  endLink=strstr(startLink,"]]");
  if (!endLink)
    {
      xmlLink=SxmlLeafCreate("text","[[");
      parser->nextItem=startLink;
      return xmlLink;
    }
  BufferStrncpy(parser->bufTerm, startLink, endLink - startLink);   
  xmlLink=SxmlLeafCreate("link", BufferString(parser->bufTerm));
  parser->nextItem=endLink+2;
  if (parser->nextItem[0]=='\0') parser->nextItem=NULL;
  return xmlLink;
}

SxmlNode *MediaWikiAppendFromWikiLine(MediaWikiParser *parser, SxmlNode *xmlWiki, char *line)
{
  parser->nextItem=line;
  while(parser->nextItem)
    {
      switch(parser->nextItem[0])
	{
	case '&':
	  if (strncmp(parser->nextItem, "&lt;", 4)==0)
	    {
	      SxmlAppendChild(xmlWiki, MediaWikiAppendTagFromWikiLine(parser));
	    }
	  break;
	case '[':
	  if (strncmp(parser->nextItem, "[[", 2)==0)
	    {
	      SxmlAppendChild(xmlWiki, MediaWikiAppendLinkFromWikiLine(parser));
	    }
	  break;
	default:
	  SxmlAppendChild(xmlWiki, MediaWikiAppendTextFromWikiLine(parser));
	}
    }
  return xmlWiki;
}

SxmlNode *MediaWikiSxmlFromWicriCell(MediaWikiParser *parser, SxmlNode *colNode)
{
  SxmlNode *sxmlWiki;
  SxmlNode *lineNode;
  sxmlWiki=SxmlElementCreate("wiki");
  SxmlReset(colNode);
  while ((lineNode=SxmlNextNode(colNode)))
    {
      MediaWikiAppendFromWikiLine(parser, sxmlWiki, SxmlLeafText(lineNode));
      if (SxmlNextSibling(lineNode))SxmlAppendChild(sxmlWiki, SxmlTextCreate("&#x0a;"));
    }
  return sxmlWiki;
}

char *MediaWikiNameToUrlLink(char *name)
{
  char *posSpace;
  static Buffer *bufUrl=NULL;
  posSpace=strchr(name, ' ');
  if (!posSpace) return name;
  if (!bufUrl) bufUrl=NewBuffer();
  BufferStrcpy(bufUrl,name);
  while ((posSpace=strchr(BufferString(bufUrl), ' ')))
    {
      posSpace[0]='+';
    }
  return BufferString(bufUrl);
}
