diff -r 000000000000 -r bde4ae8d615e os/textandloc/textrendering/texthandling/spml/T_PMLPAR.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/textandloc/textrendering/texthandling/spml/T_PMLPAR.CPP Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,1933 @@ +/* +* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "../incp/T_PMLPAR.H" + +#define UNUSED_VAR(a) a = a + +#define UNUSED_VAR(a) a = a + +//////////////////////////////////////////// +// CParser +//////////////////////////////////////////// + +CParser* CParser::NewL() + { + CParser* self=new(ELeave) CParser; + CleanupStack::PushL(self); + self->ConstructApplicationL(); + CleanupStack::Pop(); + return self; + } + + +CParser::CParser() + { + // init variables + iErrorLevel = ENoError; + iParagraphIsOpen = EFalse; + iLineNo = 1; + iReadPos = 0; + iDocInsertPos = 0; + iDocParaLength = 0; + iDocPhraseLength = 0; + iBorderUsed = EFalse; + iBulletUsed = EFalse; + } + + +void CParser::ConstructApplicationL() + { + // Construct Rich Text Doc + // Make the global format layers and associated formats and masks + iGlobalParaFormatLayer=CParaFormatLayer::NewL(); + iGlobalCharFormatLayer=CCharFormatLayer::NewL(); + iGlobalParaFormat=CParaFormat::NewL(); // initialised with factory settings + iGlobalParaFormatMask.SetAll(); + iGlobalCharFormatMask.SetAll(); + + // Set the global layers + iGlobalParaFormatLayer->SetL(iGlobalParaFormat,iGlobalParaFormatMask); + iGlobalCharFormatLayer->SetL(iGlobalCharFormat, iGlobalCharFormatMask); + + // Create the rich text document + iRichTextDoc=CRichText::NewL(iGlobalParaFormatLayer,iGlobalCharFormatLayer); + + // Initialise the paragraph and character layers + iParaFormatLayer = CParaFormatLayer::NewL(); + iCharFormatLayer = CCharFormatLayer::NewL(); + iParaFormat = CParaFormat::NewL(); + + // Create temp alias' for compound attributes + iBorder = new TParaBorder; + User::LeaveIfNull(iBorder); + iBullet = new (ELeave) TBullet; + } + + +CParser::~CParser() + { + // destroy Rich Text Document +// delete iRichTextDoc; +// delete iGlobalParaFormatLayer; +// delete iGlobalCharFormatLayer; + delete iGlobalParaFormat; + delete iParaFormatLayer; + delete iCharFormatLayer; + delete iParaFormat; + if (!iBorderUsed) + delete(iBorder); + if (!iBulletUsed) + delete(iBullet); + } + + +CRichText* CParser::ParseL(CConsoleBase* aConsole) +// version for parsing with console output and interactive file dialog +// primarily for debugging purposes (you can see what's going on!) + { + // set console + iConsoleExists = ETrue; + iConsole = aConsole; + + // Construct a CFileApp & load a file + CFileApp* myFileApp=NULL; + TRAPD(ret, myFileApp = CFileApp::NewL()); + UNUSED_VAR(ret); + iTextBuf = myFileApp->LoadFileL(iConsole); + iFileName = myFileApp->ReturnFileName(); + + ParseTextBufL(); // parse the buffer + delete myFileApp; // destroy file app + + // Pause before returning + WriteNewLine(); + WriteNewLine(); + OutputToScreen(_L("Press Space to continue\n")); + TKeyCode keystroke = EKeyNull; + while (keystroke != EKeySpace) + keystroke = iConsole->Getch(); + return iRichTextDoc; + } + +CRichText* CParser::ParseL(const TFileName &aFileName) +// silent version of the parser + { + iConsoleExists = EFalse; + // Construct a CFileApp & load a file + CFileApp* myFileApp=NULL; + TRAPD(ret, myFileApp = CFileApp::NewL()); + UNUSED_VAR(ret); + iTextBuf = myFileApp->LoadFileL(aFileName); + iFileName = myFileApp->ReturnFileName(); + + ParseTextBufL(); // parse the buffer + delete myFileApp; // destroy file app + + return iRichTextDoc; + } + + +void CParser::EmitErrorMessage() + { + TBuf<80> errorMessage; + switch (iErrorLevel) + { + case EUnknownTagType: + errorMessage.Format(_L(" Unknown tag type: Line %d"),iLineNo); + break; + case EUnparagraphedText: + errorMessage.Format(_L(" Text not contained by paragraph: Line %d"),iLineNo); + break; + case EUnknownAttrib: + errorMessage.Format(_L(" Unknown tag attribute: Line %d"),iLineNo); + break; + case ENoAttribValue: + errorMessage.Format(_L(" Unknown attribute or no attribute value supplied: Line %d"),iLineNo); + break; + case EIllegalAttribValue: + errorMessage.Format(_L(" Illegal attribute value: Line %d"),iLineNo); + break; + default: + errorMessage.Format(_L(" Error: Line %d"),iLineNo); + break; + } + OutputToScreen(_L("")); + OutputToScreen(_L("*** Error!!\n")); + OutputToScreen(errorMessage); + } + + +void CParser::OutputToScreen(const TDesC& aMessageBuffer) + { + if (iConsoleExists) + iConsole->Write(aMessageBuffer); // output line to screen + } + + +TBool CParser::Validate() +// Check that document starts with tag - serves as file validation +// - Read in characters sequentially +// - if the first alphanumeric characters encountered are not "Size(); + if (Validate()) + { + while ((iReadPos < textBufSize)&&(iErrorLevel == ENoError)) + { + charToTest = ReadChar(); + if (charToTest == '<') + ProcessTagL(); + else + ProcessTextL(charToTest); + iReadPos+=KCharLength; + } + if ((iReadPos == textBufSize)&&(iReadPos>0)&&(iErrorLevel == ENoError)) + { + // at end of document apply any outstanding formatting (if there is text to apply it to) + if (iDocParaLength > 0) + { + iParaFormatLayer->SetL(iParaFormat, iParaFormatMask); + iRichTextDoc->ApplyParaFormatL( iParaFormat,iParaFormatMask,iDocInsertPos-iDocParaLength,iDocParaLength); + } + if (iDocPhraseLength > 0) + { + iCharFormatLayer->SetL(iCharFormat, iCharFormatMask); + iRichTextDoc->ApplyCharFormatL(iCharFormat,iCharFormatMask,iDocInsertPos-iDocPhraseLength,iDocPhraseLength); + } + } + if (iErrorLevel != ENoError) + EmitErrorMessage(); + } + } + + +TChar CParser::ReadChar() +// Reads the next character from the text buffer + { +// TChar charToTest; + TText charToTest; + iTextBuf->Read(iReadPos,&charToTest,KCharLength); + if (charToTest == (TText)KLineFeed) + iLineNo++; // Info used only by error messages + return charToTest; + } + + +void CParser::ProcessTextL(TChar aChar) +// 1) Check text is in a paragraph +// 2) Check for escape characters +// 3) Check for tabs +// 4) Add to paragraph + { + if (!iParagraphIsOpen) + { + if (!(aChar.IsControl())) + iErrorLevel = EUnparagraphedText; // Text not contained by a paragraph - error!! + } + else + { + if (aChar == '/') // Escape character for < + { + TChar tempChar; + iTextBuf->Read(iReadPos+KCharLength,&tempChar,1); // doesn't increment line counter + if (tempChar == '<') + { + AddCharToParaL(tempChar); + iReadPos+=2*KCharLength; // Skip escape character + } + else + AddCharToParaL(aChar); + } + else if (aChar == KTabChar) + AddCharToParaL(aChar); + else if (!(aChar.IsControl())) // if it's not a control char add it + AddCharToParaL(aChar); // (this includes spaces) + } + } + + +void CParser::AddCharToParaL(TChar aChar) + { + // Add char to RichText doc... + iRichTextDoc->InsertL(iDocInsertPos, aChar); + iDocInsertPos++; + iDocParaLength++; + if (iPhraseOpen) + iDocPhraseLength++; + // and also write it to screen + TBuf<4> screenBuf; // Buffer for text to be written to console + screenBuf.Append(aChar); + OutputToScreen(screenBuf); + } + + +void CParser::ProcessTagL() + { + TChar tagChar; + iReadPos+=KCharLength; + tagChar = ReadTagChar(); // Read in tag type + ClassifyTagL(tagChar); + if (iTagType == EError) + iErrorLevel = EUnknownTagType; + else + { + ClassifyArgumentsL(); + } + } + + +TChar CParser::ReadTagChar() + { // Returns tag character capitalised - therefore case-insensitive + TChar charToTest; + charToTest = ReadChar(); + charToTest.UpperCase(); + return charToTest; + } + + +void CParser::ClassifyArgumentsL() +// reads tag one argument at a time, dealing with each arg as it is read +// If and argument is followed by a value (ie a=4) it is processed in two passes. + { + TChar tagChar(0); + iArgStored = EFalse; + iArgValueExpected = EFalse; // Initialise + iCancelArg = EFalse; + while ((tagChar != '>')&&(iErrorLevel == ENoError)) // ">" is end of tag + { + iReadPos+=KCharLength; + tagChar = ReadTagChar(); // Read in next bit of tag + if (iTagType != EComment) // text of comments is ignored + { + if (tagChar.IsSpace()) // spaces separate args + ProcessArgBufL(); + if (tagChar == '=') + { + iArgValueExpected = ETrue; + ProcessArgBufL(); + } + if (tagChar == '!') + { + iCancelArg = ETrue; + OutputToScreen(_L("!")); + } + if (tagChar == ',') + AppendToArgBuf(tagChar); + if (tagChar.IsAlphaDigit()) + { + AppendToArgBuf(tagChar); + } + } + } + if (tagChar == '>') // Is it end of tag? + { + if (iTagType != EComment) + { + ProcessArgBufL(); + if ((iTagType == EControl)||(iTagType == EGlobal)) // Control & global style formatting is applied "on the spot" + SetFormatLayerL(); // While char & paragraph are applied retrospectively + } + } + } + + +void CParser::AppendToArgBuf(TChar aTagChar) + { + iArgType.Append(aTagChar); // assume it'll fit + } + + +void CParser::ProcessArgBufL() + { + if (iArgValueExpected) + { + if (iArgStored) + { + TBuf<32> tempArgBuf; // Swap the buffers back as an arg and its value have been stored + tempArgBuf = iArgType; + EmptyBuffer(iArgType); + iArgType = iArgValue; + EmptyBuffer(iArgValue); + iArgValue = tempArgBuf; + TranslateTagArgL(); // Translate the tag argument + iArgStored = EFalse; // Reset the flags and buffers + iArgValueExpected = EFalse; + EmptyBuffer(iArgType); + EmptyBuffer(iArgValue); + } + else + { + iArgValue = iArgType; // Swap the buffers ready to store the value of the arg + EmptyBuffer(iArgType); // Empty buffer + iArgStored = ETrue; + } + } + else + { + TranslateTagArgL(); // match to list + EmptyBuffer(iArgType); + EmptyBuffer(iArgValue); + } + } + + +void CParser::EmptyBuffer(TDes &aBuf) + { + aBuf.SetLength(0); + } + + +void CParser::ClassifyTagL(TChar aTagChar) + { + switch (aTagChar) + { + case 'G': + iTagType = EGlobal; + break; + case 'P': + { + iTagType = EParagraph; + if (iParagraphIsOpen) + { + iRichTextDoc->InsertL(iDocInsertPos,CEditableText::EParagraphDelimiter); // insert para delimiter + WriteNewLine(); // Write new line to console + iDocInsertPos++; // Paragraph delimiters occupy 1 character space + iDocParaLength++; + if (iPhraseOpen) + iDocPhraseLength++; + SetFormatLayerL(); // apply formatting to old para before starting to fill new one + } + else + iParagraphIsOpen = ETrue; + break; + } + case 'C': + { + iTagType = ECharacter; + if (iPhraseOpen) + SetFormatLayerL(); // apply formatting to old phrase retrospectively + else + iPhraseOpen = ETrue; + break; + } + case 'X': + iTagType = EControl; + break; + case '!': + iTagType = EComment; + break; + default: + iTagType = EError; + break; + } + } + + +void CParser::SetFormatLayerL() +// Apply format & mask that have been set in the tag to a Layer +// Apply the layer to the RichText doc + { + if (iTagType == EGlobal) + { + iGlobalParaFormatLayer->SetL(iGlobalParaFormat, iGlobalParaFormatMask); + iGlobalCharFormatLayer->SetL(iGlobalCharFormat, iGlobalCharFormatMask); + iRichTextDoc->SetGlobalParaFormat(iGlobalParaFormatLayer); + iRichTextDoc->SetGlobalCharFormat(iGlobalCharFormatLayer); + WriteNewLine(); + } + if (iTagType == EParagraph) + { + iParaFormatLayer->SetL(iParaFormat, iParaFormatMask); + iRichTextDoc->ApplyParaFormatL(iParaFormat,iParaFormatMask,iDocInsertPos-iDocParaLength,iDocParaLength); + iCharFormatLayer->SetL(iCharFormat, iCharFormatMask); + if (iDocPhraseLength > 0) + iRichTextDoc->ApplyCharFormatL(iCharFormat,iCharFormatMask,iDocInsertPos-iDocPhraseLength,iDocPhraseLength); + iDocParaLength = 0; // reset ready for new paragraph + iDocPhraseLength = 0; + } + if (iTagType == ECharacter) + { + iCharFormatLayer->SetL(iCharFormat, iCharFormatMask); + if (iDocPhraseLength > 0) + iRichTextDoc->ApplyCharFormatL(iCharFormat,iCharFormatMask,iDocInsertPos-iDocPhraseLength,iDocPhraseLength); + iDocPhraseLength = 0; + } + } + + +TInt CParser::GetArgValue() +// converts numerals in iArgValue to a TInt, +// first checking that the buffer is totally numeric in content + { + TInt value = 0; + if (BufIsNumeric(iArgValue)) + { + TLex tmpLex(iArgValue); + tmpLex.Val(value); + } + else iErrorLevel = EIllegalAttribValue; + return value; + } + + +TInt CParser::GetArgValue(const TDes &aBuf) +// converts numerals in aBuf to a TInt as above + { + TInt value = 0; + if (BufIsNumeric(aBuf)) + { + TLex tmpLex(aBuf); + tmpLex.Val(value); + } + else iErrorLevel = EIllegalAttribValue; + return value; + } + + +TBool CParser::BufIsNumeric(const TDes &aBuffer) +// checks that aBuffer is totally numeric in content. +// checks all characters sequentially + { + TBool isNumeric = ETrue; + TChar testChar; + TUint bufLength = aBuffer.Length(); + for (TUint pos=0; ((pos")); + } + + +void CParser::TransParaArgLeftMargin() + { + TInt32 margin = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iLeftMarginInTwips = margin; + iParaFormatMask.SetAttrib(EAttLeftMargin); + break; + case EGlobal: + iGlobalParaFormat->iLeftMarginInTwips = margin; + iGlobalParaFormatMask.SetAttrib(EAttLeftMargin); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),margin); + OutputToScreen(outputBuf); + } + +void CParser::TransParaArgRightMargin() + { + TInt32 margin = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iRightMarginInTwips = margin; + iParaFormatMask.SetAttrib(EAttRightMargin); + break; + case EGlobal: + iGlobalParaFormat->iRightMarginInTwips = margin; + iGlobalParaFormatMask.SetAttrib(EAttRightMargin); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),margin); + OutputToScreen(outputBuf); + } + +void CParser::TransParaArgIndent() + { + TInt32 indent = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iIndentInTwips = indent; + iParaFormatMask.SetAttrib(EAttIndent); + break; + case EGlobal: + iGlobalParaFormat->iIndentInTwips = indent; + iGlobalParaFormatMask.SetAttrib(EAttIndent); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),indent); + OutputToScreen(outputBuf); + } + +void CParser::TransParaLineSpacing() + { + TInt32 lineSpacing = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iLineSpacingInTwips = lineSpacing; + iParaFormatMask.SetAttrib(EAttLineSpacing); + break; + case EGlobal: + iGlobalParaFormat->iLineSpacingInTwips = lineSpacing; + iGlobalParaFormatMask.SetAttrib(EAttLineSpacing); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),lineSpacing); + OutputToScreen(outputBuf); + } + +void CParser::TransParaArgLineSpacingControl() + { + if (iArgValue == _L("ATLEAST")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->iLineSpacingControl = CParaFormat::ELineSpacingAtLeastInTwips; + iParaFormatMask.SetAttrib(EAttLineSpacingControl); + break; + case EGlobal: + iGlobalParaFormat->iLineSpacingControl = CParaFormat::ELineSpacingAtLeastInTwips; + iGlobalParaFormatMask.SetAttrib(EAttLineSpacingControl); + break; + } + OutputToScreen(_L("")); + } + else if (iArgValue == _L("EXACTLY")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->iLineSpacingControl = CParaFormat::ELineSpacingExactlyInTwips; + iParaFormatMask.SetAttrib(EAttLineSpacingControl); + break; + case EGlobal: + iGlobalParaFormat->iLineSpacingControl = CParaFormat::ELineSpacingExactlyInTwips; + iGlobalParaFormatMask.SetAttrib(EAttLineSpacingControl); + break; + } + OutputToScreen(_L("")); + } + else + iErrorLevel = EIllegalAttribValue; + } + +void CParser::TransParaSpaceBefore() + { + TInt32 spaceBefore = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iSpaceBeforeInTwips = spaceBefore; + iParaFormatMask.SetAttrib(EAttSpaceBefore); + break; + case EGlobal: + iGlobalParaFormat->iSpaceBeforeInTwips = spaceBefore; + iGlobalParaFormatMask.SetAttrib(EAttSpaceBefore); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),spaceBefore); + OutputToScreen(outputBuf); + } + +void CParser::TransParaSpaceAfter() + { + TInt32 spaceAfter = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iSpaceAfterInTwips = spaceAfter; + iParaFormatMask.SetAttrib(EAttSpaceAfter); + break; + case EGlobal: + iGlobalParaFormat->iSpaceAfterInTwips = spaceAfter; + iGlobalParaFormatMask.SetAttrib(EAttSpaceAfter); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),spaceAfter); + OutputToScreen(outputBuf); + } + +void CParser::TransParaBorderMargin() + { + TInt32 borderMargin = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iBorderMarginInTwips = borderMargin; + iParaFormatMask.SetAttrib(EAttBorderMargin); + break; + case EGlobal: + iGlobalParaFormat->iBorderMarginInTwips = borderMargin; + iGlobalParaFormatMask.SetAttrib(EAttBorderMargin); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),borderMargin); + OutputToScreen(outputBuf); + } + +void CParser::TransParaKeepTogether() + { + switch (iTagType) + { + case EParagraph: + if (iCancelArg) + iParaFormat->iKeepTogether = EFalse; + else + iParaFormat->iKeepTogether = ETrue; + iParaFormatMask.SetAttrib(EAttKeepTogether); + break; + case EGlobal: + if (iCancelArg) + iGlobalParaFormat->iKeepTogether = EFalse; + else + iGlobalParaFormat->iKeepTogether = ETrue; + iGlobalParaFormatMask.SetAttrib(EAttKeepTogether); + break; + } + // screen output + OutputToScreen(_L("")); + } + +void CParser::TransParaKeepWithNext() + { + switch (iTagType) + { + case EParagraph: + if (iCancelArg) + iParaFormat->iKeepWithNext = EFalse; + else + iParaFormat->iKeepWithNext = ETrue; + iParaFormatMask.SetAttrib(EAttKeepWithNext); + break; + case EGlobal: + if (iCancelArg) + iGlobalParaFormat->iKeepWithNext = EFalse; + else + iGlobalParaFormat->iKeepWithNext = ETrue; + iGlobalParaFormatMask.SetAttrib(EAttKeepWithNext); + break; + } + // screen output + OutputToScreen(_L("")); + } + +void CParser::TransParaStartNewPage() + { + switch (iTagType) + { + case EParagraph: + if (iCancelArg) + iParaFormat->iStartNewPage = EFalse; + else + iParaFormat->iStartNewPage = ETrue; + iParaFormatMask.SetAttrib(EAttStartNewPage); + break; + case EGlobal: + if (iCancelArg) + iGlobalParaFormat->iStartNewPage = EFalse; + else + iGlobalParaFormat->iStartNewPage = ETrue; + iGlobalParaFormatMask.SetAttrib(EAttStartNewPage); + break; + } + // screen output + OutputToScreen(_L("")); + } + +void CParser::TransParaWidowOrphan() + { + switch (iTagType) + { + case EParagraph: + if (iCancelArg) + iParaFormat->iWidowOrphan = EFalse; + else + iParaFormat->iWidowOrphan = ETrue; + iParaFormatMask.SetAttrib(EAttWidowOrphan); + break; + case EGlobal: + if (iCancelArg) + iGlobalParaFormat->iWidowOrphan = EFalse; + else + iGlobalParaFormat->iWidowOrphan = ETrue; + iGlobalParaFormatMask.SetAttrib(EAttWidowOrphan); + break; + } + // screen output + OutputToScreen(_L("")); + } + +void CParser::TransParaArgAlignment() + { + // parse argValue + if (iArgValue == _L("LEFT")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->iHorizontalAlignment = CParaFormat::ELeftAlign; + iParaFormatMask.SetAttrib(EAttAlignment); + break; + case EGlobal: + iGlobalParaFormat->iHorizontalAlignment = CParaFormat::ELeftAlign; + iGlobalParaFormatMask.SetAttrib(EAttAlignment); + break; + } + OutputToScreen(_L("")); + } + else if (iArgValue == _L("RIGHT")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->iHorizontalAlignment = CParaFormat::ERightAlign; + iParaFormatMask.SetAttrib(EAttAlignment); + break; + case EGlobal: + iGlobalParaFormat->iHorizontalAlignment = CParaFormat::ERightAlign; + iGlobalParaFormatMask.SetAttrib(EAttAlignment); + break; + } + OutputToScreen(_L("")); + } + else if (iArgValue == _L("CENTER")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->iHorizontalAlignment = CParaFormat::ECenterAlign; + iParaFormatMask.SetAttrib(EAttAlignment); + break; + case EGlobal: + iGlobalParaFormat->iHorizontalAlignment = CParaFormat::ECenterAlign; + iGlobalParaFormatMask.SetAttrib(EAttAlignment); + break; + } + OutputToScreen(_L("")); + } + else if (iArgValue == _L("JUSTIFIED")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->iHorizontalAlignment = CParaFormat::EJustifiedAlign; + iParaFormatMask.SetAttrib(EAttAlignment); + break; + case EGlobal: + iGlobalParaFormat->iHorizontalAlignment = CParaFormat::EJustifiedAlign; + iGlobalParaFormatMask.SetAttrib(EAttAlignment); + break; + } + OutputToScreen(_L("")); + } + else + iErrorLevel = EIllegalAttribValue; + } + + +void CParser::TransParaBullet() + { + TInt characterCode = 0x2022; + TUint32 heightInTwips=0; + TUint32 flags=0; + TBuf name; + TBuf<128> component; + + // set first component (character code) + TInt commaPos = iArgValue.Locate(KComma); // find pos of first comma + component = iArgValue.Left(commaPos); + if (component != _L("")) // only third arg remains + { + if (BufIsNumeric(component)) + { + TLex tmpLex(component); + // TUint value; + tmpLex.Val(characterCode); + } + else + iErrorLevel = EIllegalAttribValue; + } + else + iErrorLevel = EIllegalAttribValue; + + // set second component (bullet height) + iArgValue.Delete(0,commaPos+1); // delete previous component & trailing comma + commaPos = iArgValue.Locate(KComma); // find pos of first comma + component = iArgValue.Left(commaPos); + if (component != _L("")) // only third arg remains + { + if (BufIsNumeric(component)) + { + TLex tmpLex(component); + TUint value; + tmpLex.Val(value); + heightInTwips = value; + } + else + iErrorLevel = EIllegalAttribValue; + } + else + iErrorLevel = EIllegalAttribValue; + + // set third component (typeface flags) + iArgValue.Delete(0,commaPos+1); // delete previous component & trailing comma + commaPos = iArgValue.Locate(KComma); // find pos of first comma + component = iArgValue.Left(commaPos); + if (component != _L("")) // only third arg remains + { + flags = GetArgValue(component); + if (flags>2) + iErrorLevel=EIllegalAttribValue; // only values 0,1,2 valid for flag + } + else + iErrorLevel = EIllegalAttribValue; + + // set fourth component (typeface name) + iArgValue.Delete(0,commaPos+1); // delete previous component & trailing comma + if (iArgValue != _L("")) // only third arg remains + { + name.Copy(iArgValue); +// name = SquashBuf(iArgValue); + } + else + iErrorLevel = EIllegalAttribValue; + + // apply + if (iErrorLevel == ENoError) + { + iBulletUsed = ETrue; + iBullet->iCharacterCode = (TText)characterCode; + iBullet->iHeightInTwips = heightInTwips; + if (flags>=1) + iBullet->iTypeface.SetIsProportional(ETrue); + if (flags>=3) + iBullet->iTypeface.SetIsSerif(ETrue); + iBullet->iTypeface.iName = name; + switch (iTagType) + { + case EParagraph: + iParaFormat->iBullet = iBullet; + iParaFormatMask.SetAttrib(EAttBullet); + break; + case EGlobal: + iGlobalParaFormat->iBullet = iBullet; + iGlobalParaFormatMask.SetAttrib(EAttBullet); + break; + } + OutputToScreen(_L("")); + } + } + +TBuf8<512> CParser::SquashBuf(TDes aBuffer) + // + // Input 8/16 bit buffer to be returned as an 8-bit version + // Used for unicode compatability + // + { + TText16 textPointer; + + TBuf8<512> returnBuf; + + for ( TInt pos=0 ; pos component; + + // set first component + TInt commaPos = iArgValue.Locate(KComma); // find pos of first comma + component = iArgValue.Left(commaPos); + if (component != _L("")) + { + if (component == _L("NULL")) + lineStyle = TParaBorder::ENullLineStyle; + else if (component == _L("SOLID")) + lineStyle = TParaBorder::ESolid; + else if (component == _L("DOUBLE")) + lineStyle = TParaBorder::EDouble; + else if (component == _L("DOTTED")) + lineStyle = TParaBorder::EDotted; + else if (component == _L("DASHED")) + lineStyle = TParaBorder::EDashed; + else if (component == _L("DOTDASH")) + lineStyle = TParaBorder::EDotDash; + else if (component == _L("DOTDOTDASH")) + lineStyle = TParaBorder::EDotDotDash; + else + iErrorLevel = EIllegalAttribValue; + } + else + iErrorLevel = EIllegalAttribValue; + + // set second component + iArgValue.Delete(0,commaPos+1); // delete first component & trailing comma + commaPos = iArgValue.Locate(KComma); // find pos of first comma + component = iArgValue.Left(commaPos); + if (component != _L("")) + { + if (component == _L("ON")) + autoColor = ETrue; + else if (component == _L("OFF")) + autoColor = EFalse; + else + iErrorLevel = EIllegalAttribValue; + } + else + iErrorLevel = EIllegalAttribValue; + + // set third component + iArgValue.Delete(0,commaPos+1); // delete second component & trailing comma + if (component != _L("")) // only third arg remains + { + if (BufIsNumeric(iArgValue)) + { + TLex tmpLex(iArgValue); + TUint value; + tmpLex.Val(value); + color=TRgb((TUint32)value); + } + else + iErrorLevel = EIllegalAttribValue; + } + + // apply + if (iErrorLevel == ENoError) + { + iBorderUsed = ETrue; + iBorder->iLineStyle = lineStyle; + iBorder->iAutoColor = autoColor; + iBorder->iColor = color; + if (iArgType == _L("TOPBORDER")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->SetParaBorderL(CParaFormat::EParaBorderTop,*iBorder); + iParaFormatMask.SetAttrib(EAttTopBorder); + break; + case EGlobal: + iGlobalParaFormat->SetParaBorderL(CParaFormat::EParaBorderTop,*iBorder); + iGlobalParaFormatMask.SetAttrib(EAttTopBorder); + break; + } + } + if (iArgType == _L("BOTTOMBORDER")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->SetParaBorderL(CParaFormat::EParaBorderBottom,*iBorder); + iParaFormatMask.SetAttrib(EAttBottomBorder); + break; + case EGlobal: + iGlobalParaFormat->SetParaBorderL(CParaFormat::EParaBorderBottom,*iBorder); + iGlobalParaFormatMask.SetAttrib(EAttBottomBorder); + break; + } + } + if (iArgType == _L("LEFTBORDER")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->SetParaBorderL(CParaFormat::EParaBorderLeft,*iBorder); + iParaFormatMask.SetAttrib(EAttLeftBorder); + break; + case EGlobal: + iGlobalParaFormat->SetParaBorderL(CParaFormat::EParaBorderLeft,*iBorder); + iGlobalParaFormatMask.SetAttrib(EAttLeftBorder); + break; + } + } + if (iArgType == _L("RIGHTBORDER")) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->SetParaBorderL(CParaFormat::EParaBorderRight,*iBorder); + iParaFormatMask.SetAttrib(EAttRightBorder); + break; + case EGlobal: + iGlobalParaFormat->SetParaBorderL(CParaFormat::EParaBorderRight,*iBorder); + iGlobalParaFormatMask.SetAttrib(EAttRightBorder); + break; + } + } + OutputToScreen(_L("")); + } + } + +void CParser::TransParaTabWidth() + { + TInt32 tabWidth = GetArgValue(); + switch (iTagType) + { + case EParagraph: + iParaFormat->iDefaultTabWidthInTwips = tabWidth; + iParaFormatMask.SetAttrib(EAttDefaultTabWidth); + break; + case EGlobal: + iGlobalParaFormat->iDefaultTabWidthInTwips = tabWidth; + iGlobalParaFormatMask.SetAttrib(EAttDefaultTabWidth); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),tabWidth); + OutputToScreen(outputBuf); + } + + +void CParser::TransParaTabStopL() +// This arg has a compound value of the form Tabstop=value,type +// It also accepts !Tabstop=value to delete an existing tabstop + { + TTabStop tabStop; + TBuf<128> component; + TBuf<6> outputBuf; + + // get first component (tab type) + TInt commaPos = iArgValue.Locate(KComma); // find pos of first comma (returns -1 if no comma) + if (commaPos > 0) // comma & first component exist + { + component = iArgValue.Left(commaPos); // take part to the left of the comma + if (component != _L("")) + tabStop.iTwipsPosition = GetArgValue(component); + else + iErrorLevel = EIllegalAttribValue; + } + else if ((iCancelArg)&&(commaPos == -1)) // no comma but only one component required (position) + { + if (iArgValue != _L("")) + tabStop.iTwipsPosition = GetArgValue(iArgValue); + else + iErrorLevel = EIllegalAttribValue; + } + + if (iErrorLevel == ENoError) + { + if (iCancelArg) + // insert a null tab + { + if ((iParaFormat->LocateTab(tabStop.iTwipsPosition) != KTabNotFound) + ||(iGlobalParaFormat->LocateTab(tabStop.iTwipsPosition) != KTabNotFound)) + { + tabStop.iType = TTabStop::ENullTab; // null tab "deletes" existing tab + outputBuf = _L(""); + } + else + iErrorLevel = EIllegalAttribValue; + } + else + { + // set second component (tab position in twips) + iArgValue.Delete(0,commaPos+1); // delete previous component & trailing comma + if (iArgValue != _L("")) + { + outputBuf = _L(""); + if (iArgValue == _L("NULL")) + tabStop.iType = TTabStop::ENullTab; + else if (iArgValue == _L("LEFT")) + tabStop.iType = TTabStop::ELeftTab; + else if (iArgValue == _L("CENTERED")) + tabStop.iType = TTabStop::ECenteredTab; + else if (iArgValue == _L("RIGHT")) + tabStop.iType = TTabStop::ERightTab; + else + iErrorLevel = EIllegalAttribValue; + } + else + iErrorLevel = EIllegalAttribValue; + } + } + + // Insert the tab + if (iErrorLevel == ENoError) + { + switch (iTagType) + { + case EParagraph: + iParaFormat->StoreTabL(tabStop); + iParaFormatMask.SetAttrib(EAttTabStop); + break; + case EGlobal: + iGlobalParaFormat->StoreTabL(tabStop); + iGlobalParaFormatMask.SetAttrib(EAttTabStop); + break; + } + // output to screen + OutputToScreen(outputBuf); + } + } + + +void CParser::TransCharArg() + { + if (iArgType != _L("")) // Is there an argument? + { + if (iArgType == _L("DEFAULT")) + TransCharDefault(); + else if (iArgType == _L("ITALIC")) + TransCharPosture(); + else if (iArgType == _L("BOLD")) + TransCharStrokeWeight(); + else if (iArgType == _L("UNDERLINE")) + TransCharUnderline(); + else if (iArgType == _L("STRIKETHROUGH")) + TransCharStrikethrough(); + else if (!iArgValueExpected) // No argument value supplied when one is required for the + iErrorLevel = ENoAttribValue; // remaining options or an unknown argument supplied + else if (iArgType == _L("FONTHEIGHT")) + TransCharFontHeight(); + else if (iArgType == _L("PRINTPOS")) + TransCharPrintPos(); + else if (iArgType == _L("TYPEFACENAME")) + TransCharTypefaceName(); + else if (iArgType == _L("TYPEFACEFLAGS")) + TransCharTypefaceFlags(); + else if (iArgType == _L("COLOR")) + TransCharColor(); + else if (iArgType == _L("LANGUAGE")) + TransCharLanguage(); + else + iErrorLevel = EUnknownAttrib; + } + } + + +void CParser::TransCharDefault() +// turns off all applied Char formatting - reverts to global + { + iCharFormatMask.ClearAll(); + OutputToScreen(_L("")); + } + + +void CParser::TransCharPosture() + { + switch (iTagType) + { + case ECharacter: + if (iCancelArg) + iCharFormat.iFontSpec.iFontStyle.SetPosture(EPostureUpright); + else + iCharFormat.iFontSpec.iFontStyle.SetPosture(EPostureItalic); + iCharFormatMask.SetAttrib(EAttFontPosture); + break; + case EGlobal: + if (iCancelArg) + iGlobalCharFormat.iFontSpec.iFontStyle.SetPosture(EPostureUpright); + else + iGlobalCharFormat.iFontSpec.iFontStyle.SetPosture(EPostureItalic); + iGlobalCharFormatMask.SetAttrib(EAttFontPosture); + break; + } + // screen output + OutputToScreen(_L("")); + } + + +void CParser::TransCharStrokeWeight() + { + switch (iTagType) + { + case ECharacter: + if (iCancelArg) + iCharFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal); + else + iCharFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); + iCharFormatMask.SetAttrib(EAttFontStrokeWeight); + break; + case EGlobal: + if (iCancelArg) + iGlobalCharFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal); + else + iGlobalCharFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold); + iGlobalCharFormatMask.SetAttrib(EAttFontStrokeWeight); + break; + } + // screen output + OutputToScreen(_L("")); + } + + +void CParser::TransCharUnderline() + { + switch (iTagType) + { + case ECharacter: + if (iCancelArg) + iCharFormat.iFontPresentation.iUnderline = EUnderlineOff; + else + iCharFormat.iFontPresentation.iUnderline = EUnderlineOn; + iCharFormatMask.SetAttrib(EAttFontUnderline); + break; + case EGlobal: + if (iCancelArg) + iGlobalCharFormat.iFontPresentation.iUnderline = EUnderlineOff; + else + iGlobalCharFormat.iFontPresentation.iUnderline = EUnderlineOn; + iGlobalCharFormatMask.SetAttrib(EAttFontUnderline); + break; + } + // screen output + OutputToScreen(_L("")); + } + + +void CParser::TransCharStrikethrough() + { + switch (iTagType) + { + case ECharacter: + if (iCancelArg) + iCharFormat.iFontPresentation.iStrikethrough = EStrikethroughOff; + else + iCharFormat.iFontPresentation.iStrikethrough = EStrikethroughOn; + iCharFormatMask.SetAttrib(EAttFontStrikethrough); + break; + case EGlobal: + if (iCancelArg) + iGlobalCharFormat.iFontPresentation.iStrikethrough = EStrikethroughOff; + else + iGlobalCharFormat.iFontPresentation.iStrikethrough = EStrikethroughOn; + iGlobalCharFormatMask.SetAttrib(EAttFontStrikethrough); + break; + } + // screen output + OutputToScreen(_L("")); + } + + +void CParser::TransCharFontHeight() + { + TInt32 fontHeight = GetArgValue(); + switch (iTagType) + { + case ECharacter: + iCharFormat.iFontSpec.iHeight = fontHeight; + iCharFormatMask.SetAttrib(EAttFontHeight); + break; + case EGlobal: + iGlobalCharFormat.iFontSpec.iHeight = fontHeight; + iGlobalCharFormatMask.SetAttrib(EAttFontHeight); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),fontHeight); + OutputToScreen(outputBuf); + } + +void CParser::TransCharPrintPos() + { + if (iArgValue == _L("NORMAL")) + { + switch (iTagType) + { + case ECharacter: + iCharFormat.iFontSpec.iFontStyle.SetPrintPosition(EPrintPosNormal); + iCharFormatMask.SetAttrib(EAttFontPrintPos); + break; + case EGlobal: + iGlobalCharFormat.iFontSpec.iFontStyle.SetPrintPosition(EPrintPosNormal); + iGlobalCharFormatMask.SetAttrib(EAttFontPrintPos); + break; + } + OutputToScreen(_L("")); + } + else if (iArgValue == _L("SUPERSCRIPT")) + { + switch (iTagType) + { + case ECharacter: + iCharFormat.iFontSpec.iFontStyle.SetPrintPosition(EPrintPosSuperscript); + iCharFormatMask.SetAttrib(EAttFontPrintPos); + break; + case EGlobal: + iGlobalCharFormat.iFontSpec.iFontStyle.SetPrintPosition(EPrintPosSuperscript); + iGlobalCharFormatMask.SetAttrib(EAttFontPrintPos); + break; + } + OutputToScreen(_L("")); + } + else if (iArgValue == _L("SUBSCRIPT")) + { + switch (iTagType) + { + case ECharacter: + iCharFormat.iFontSpec.iFontStyle.SetPrintPosition(EPrintPosSubscript); + iCharFormatMask.SetAttrib(EAttFontPrintPos); + break; + case EGlobal: + iGlobalCharFormat.iFontSpec.iFontStyle.SetPrintPosition(EPrintPosSubscript); + iGlobalCharFormatMask.SetAttrib(EAttFontPrintPos); + break; + } + OutputToScreen(_L("")); + } + else + iErrorLevel = EIllegalAttribValue; + } + + +void CParser::TransCharTypefaceFlags() + { + TUint flags = GetArgValue(); + if (flags>2) + iErrorLevel=EIllegalAttribValue; // only values 0,1,2 valid for flag + if (iErrorLevel==ENoError) + { + switch (iTagType) + { + case ECharacter: + if (flags>=1) + iCharFormat.iFontSpec.iTypeface.SetIsProportional(ETrue); + if (flags>=3) + iCharFormat.iFontSpec.iTypeface.SetIsSerif(ETrue); + iCharFormatMask.SetAttrib(EAttFontTypeface); + break; + case EGlobal: + if (flags>=1) + iGlobalCharFormat.iFontSpec.iTypeface.SetIsProportional(ETrue); + if (flags>=3) + iGlobalCharFormat.iFontSpec.iTypeface.SetIsSerif(ETrue); + iGlobalCharFormatMask.SetAttrib(EAttFontTypeface); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),flags); + OutputToScreen(outputBuf); + } + } + + +void CParser::TransCharTypefaceName() + { + switch (iTagType) + { + case ECharacter: + iCharFormat.iFontSpec.iTypeface.iName=iArgValue; + iCharFormatMask.SetAttrib(EAttFontTypeface); + break; + case EGlobal: + iGlobalCharFormat.iFontSpec.iTypeface.iName=iArgValue; + iGlobalCharFormatMask.SetAttrib(EAttFontTypeface); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),&iArgValue); + OutputToScreen(outputBuf); + } + + +void CParser::TransCharColor() + { + TUint value = GetArgValue(); + if (iErrorLevel==ENoError) + { + TRgb color; + color=TRgb((TUint32)value); + switch (iTagType) + { + case ECharacter: + iCharFormat.iFontPresentation.iTextColor = color; + iCharFormatMask.SetAttrib(EAttColor); + break; + case EGlobal: + iGlobalCharFormat.iFontPresentation.iTextColor = color; + iGlobalCharFormatMask.SetAttrib(EAttColor); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),value); + OutputToScreen(outputBuf); + } + } + + +void CParser::TransCharLanguage() +// Assumes languages are integer coded - will have to change in time + { + TUint value = GetArgValue(); + if (iErrorLevel==ENoError) + { + switch (iTagType) + { + case ECharacter: + iCharFormat.iLanguage = value; + iCharFormatMask.SetAttrib(EAttCharLanguage); + break; + case EGlobal: + iGlobalCharFormat.iLanguage = value; + iGlobalCharFormatMask.SetAttrib(EAttCharLanguage); + break; + } + // screen output + TBuf<80> outputBuf; + outputBuf.Format(_L(""),value); + OutputToScreen(outputBuf); + } + } + + + +//////////////////////////////// +// CFileApp +//////////////////////////////// + + +CFileApp* CFileApp::NewL() + { + CFileApp* self=new(ELeave) CFileApp; + CleanupStack::PushL(self); + self->ConstructApplicationL(); + CleanupStack::Pop(); + return self; + } + + +CFileApp::CFileApp() + { + // init variables + iConsoleExists = EFalse; + iFilePos = 0; + } + + +void CFileApp::ConstructApplicationL() + { + iTextBuf = CBufSeg::NewL(64); // Granularity of 64 bytes + } + + +CFileApp::~CFileApp() + { + delete iTextBuf; + } + + +CBufSeg* CFileApp::LoadFileL(CConsoleBase* aConsoleWin) +// Asks for file name, then loads file into text buffer. + { + iConsoleExists = ETrue; + iConsole = aConsoleWin; // grab console handle + GetFileName(); + FileHandlingL(); // load file & store it + return iTextBuf; + } + +CBufSeg* CFileApp::LoadFileL(const TFileName &aFileName) +// uses supplied FileName to load file into CBufSeg + { + iFileName = aFileName; + FileHandlingL(); // load file & store it + return iTextBuf; + } + + +void CFileApp::OutputToScreen(const TDesC& aMessageBuffer) + { + if (iConsoleExists) + iConsole->Write(aMessageBuffer); // output line to screen + } + + +TInt CFileApp::SaveFile(CBufSeg* aTextBuf, TFileName aFileName) +// saves supplied buffer to disc, making the new filename a varient of the PML source filename supplied + { + // set filename to be saved as + TInt length = aFileName.Length(); + aFileName.Delete(length-1,1); + aFileName.Append(_L("G")); // generated filenames end in G + + // create fileserver client and save. + RFs fsClient; + RFile theFile; + TInt err = fsClient.Connect(); + if (err == 0) + err = theFile.Replace(fsClient, aFileName, EFileStream|EFileRead|EFileWrite); + if (err == 0) + { + TInt readWritePos = 0; + TBuf8<80> insertBuf; + TInt readLength=0; + FOREVER + { + // read from TextBuf into insertBuf + readLength=Min(aTextBuf->Size()-readWritePos,insertBuf.MaxLength()); + insertBuf.SetLength(0); // empty buffer + aTextBuf->Read(readWritePos,insertBuf,readLength); + // insert buf into file + theFile.Write(readWritePos, insertBuf); + readWritePos += insertBuf.Length(); + if (readWritePos >= aTextBuf->Size()) + break; + } + theFile.Close(); + } + return err; + } + +void CFileApp::GetFileName() +// read FileName synchronously from console + { + TKeyCode keystroke = EKeyNull; + iFileName.SetLength(0); + + //Debuging cheat to hardwire filename + //iFileName=_L("d:\\etext\\incp\\dunk.pml"); + //return; + + OutputToScreen(_L("Enter file to be parsed: ")); + keystroke = iConsole->Getch(); + while (keystroke != EKeyEnter) + { + TBuf<1> uniBuf; // used to ease unicode build + uniBuf.Append(keystroke); + + iConsole->Write(uniBuf); + iFileName.Append(uniBuf); + keystroke = iConsole->Getch(); + } + WriteNewLine(); + } + +void CFileApp::FileHandlingL() +// Open a file, read contents into buffer, then close file again + { + // open file + RFile textFile; + RFs fsClient; + TInt err = 1; + while (err) + { + err = fsClient.Connect(); + if (!err) + err = textFile.Open(fsClient,iFileName,EFileStream|EFileRead|EFileShareReadersOnly); + if (err) + return; +/******GA + { + OutputToScreen(_L("Error in file open\n\n")); + GetFileName(); + } +******/ + } + + OutputToScreen(_L("Parsing ")); + OutputToScreen(iFileName); + WriteNewLine(); + WriteNewLine(); + + // Read file into segmented buffer + TUint insertPos = 0; + + TInt max = sizeof(TText) * KFileBufSize; + + FOREVER + { + iFileBuf.SetLength(0); + ReadChunkOfFileContents(textFile); + iTextBuf->/*Do*/InsertL(insertPos,iFileBuf.Ptr(),iFileBuf.Size()); + insertPos += iFileBuf.Size(); // in bytes + if (iFileBuf.Size() < max) + break; + } + + // finish up + textFile.Close(); + iFilePos = 0; // reset + } + +void CFileApp::ReadChunkOfFileContents(RFile &aFile) + { + TBuf8 readBuf; + aFile.Read(iFilePos,readBuf); + // read into iFileBuf (8/16 bit); + TText textPointer; + for ( TInt pos=0 ; pos buf(_L("\n")); + OutputToScreen(buf); + } +