void SciDoc::MatchBrace() { int mode=SettingsBase::instance()->BraceMatch; long CurrPos=sendMessage(SCI_GETCURRENTPOS,0,0); if ((CurrPos>0)&&(mode==BRACEMATCH_EITHER)) { char ThisChar=sendMessage(SCI_GETCHARAT,CurrPos,0); if (IsCloser(ThisChar)||IsOpener(ThisChar)) { long PrevPos=sendMessage(SCI_POSITIONBEFORE,CurrPos,0); char PrevChar=sendMessage(SCI_GETCHARAT,PrevPos,0); if (IsCloser(PrevChar)||IsOpener(PrevChar)) { CurrPos=PrevPos; } } } if (IsBrace(CurrPos,mode)) { int ThatBrace=sendMessage(SCI_BRACEMATCH,CurrPos,0); if ((ThatBrace>=0)&&(StyleAt(ThatBrace)!=StyleAt(CurrPos))) { sendMessage(SCI_COLOURISE,0,-1); ThatBrace=sendMessage(SCI_BRACEMATCH,CurrPos,0); } if (ThatBrace>=0) { sendMessage(SCI_BRACEHIGHLIGHT,CurrPos,ThatBrace); } else { sendMessage(SCI_BRACEBADLIGHT,CurrPos,0); } } else { sendMessage(SCI_BRACEHIGHLIGHT,INVALID_RANGE,INVALID_RANGE); } }
void HTMLExporter::InternalExport(int start, int end) { CString strFontFace(_T("Courier New")); int fontSize = 10; bool useTabs = false; int tabSize = SendEditor(SCI_GETTABWIDTH, 0, 0); if (tabSize == 0) tabSize = 4; if (!strFontFace.GetLength()) strFontFace = HTML_FONTFACE; // Define a class name lookup table. CStringA cssClassNames[STYLE_MAX + 1]; // Write the HTML header... //@todo: add a way to select the DOCTYPE m_out->puts(HTML_XHTML11STRICT); m_out->puts(HTML_STARTXHTML); m_out->puts(HTML_HEADOPEN); m_out->puts(HTML_TITLEOPEN); //@todo: add title m_out->puts(HTML_TITLECLOSE); m_out->puts(HTML_CSSOPEN); CStringA strTemp; // Dump the styles into CSS classes //@todo: add support for CSS files StyleDetails* pDefStyle = GetStyle(STYLE_DEFAULT); if(pDefStyle) { // Apply Default style to the pre block (class name: pn2code) strTemp.Format("pre.%scode\n", m_pSchemeName); cssClassNames[STYLE_DEFAULT] = strTemp; m_out->puts(cssClassNames[STYLE_DEFAULT]); m_out->puts(HTML_CSSCLASSOPEN HTML_CSSBKGNDCOLOR); strTemp.Format("#%02X%02X%02X", GetRValue(pDefStyle->BackColor), GetGValue(pDefStyle->BackColor), GetBValue(pDefStyle->BackColor)); m_out->puts(strTemp); m_out->puts(HTML_CSSPROPERTYEND); m_out->puts(HTML_CSSFORECOLOR); strTemp.Format("#%02X%02X%02X;", GetRValue(pDefStyle->ForeColor), GetGValue(pDefStyle->ForeColor), GetBValue(pDefStyle->ForeColor)); m_out->puts(strTemp); m_out->puts(HTML_CSSPROPERTYEND); // SF Bug #107412 points to http://www.w3.org/TR/REC-CSS2/fonts.html#font-shorthand // defining the (simplified) use of font shorthand as: // style weight size font-family m_out->puts(HTML_CSSFONTSHORT); if(pDefStyle->Italic) m_out->puts("italic "); if(pDefStyle->Bold) m_out->puts("bold "); strTemp.Format("%dpt ", pDefStyle->FontSize ? pDefStyle->FontSize : fontSize); m_out->puts(strTemp); m_out->putc('"'); if(pDefStyle->FontName.length()) { strTemp = pDefStyle->FontName.c_str(); m_out->puts(strTemp); } else m_out->puts(HTML_FONTFACE); m_out->putc('"'); m_out->puts(HTML_CSSPROPERTYEND); if(pDefStyle->Underline) m_out->puts(HTML_CSSUNDERLINE); m_out->puts(HTML_CSSCLASSCLOSE); } for(int istyle = 0; istyle < STYLE_MAX; istyle++) { StyleDetails* pStyle = GetStyle(istyle); if(pStyle) { // Use the styles classname as CSS class name (if any), or create a // generic one if(pStyle->classname.length()) strTemp = pStyle->classname.c_str(); else strTemp.Format("%s%02d", m_pSchemeName, istyle); cssClassNames[istyle] = strTemp; m_out->putc('.'); m_out->puts(cssClassNames[istyle]); m_out->puts(HTML_CSSCLASSOPEN); // Add properties if they differ from the default style only if(!pDefStyle || pStyle->BackColor != pDefStyle->BackColor) { m_out->puts(HTML_CSSBKGNDCOLOR); strTemp.Format("#%02X%02X%02X", GetRValue(pStyle->BackColor), GetGValue(pStyle->BackColor), GetBValue(pStyle->BackColor)); m_out->puts(strTemp); m_out->puts(HTML_CSSPROPERTYEND); } if(!pDefStyle || pStyle->ForeColor != pDefStyle->ForeColor) { m_out->puts(HTML_CSSFORECOLOR); strTemp.Format("#%02X%02X%02X", GetRValue(pStyle->ForeColor), GetGValue(pStyle->ForeColor), GetBValue(pStyle->ForeColor)); m_out->puts(strTemp); m_out->puts(HTML_CSSPROPERTYEND); } //CString strFont; if(pStyle->FontName.length() && (!pDefStyle || pStyle->FontName != pDefStyle->FontName)) { m_out->puts(HTML_CSSFONT); strTemp = pStyle->FontName.c_str(); m_out->puts(strTemp); m_out->puts(HTML_CSSENDFONT); } if(pStyle->FontSize > 0 && (!pDefStyle || pDefStyle->FontSize != pStyle->FontSize)) { m_out->puts(HTML_CSSFONTSIZE); strTemp.Format("%dpt", pStyle->FontSize); m_out->puts(strTemp); m_out->puts(HTML_CSSPROPERTYEND); } if(pStyle->Bold && (!pDefStyle || pDefStyle->Bold != pStyle->Bold)) { m_out->puts(HTML_CSSFONTBOLD); } if(pStyle->Italic && (!pDefStyle || pDefStyle->Italic != pStyle->Italic)) { m_out->puts(HTML_CSSFONTITALIC); } if(pStyle->Underline && (!pDefStyle || pDefStyle->Underline != pStyle->Underline)) m_out->puts(HTML_CSSUNDERLINE); m_out->puts(HTML_CSSCLASSCLOSE); } } m_out->puts(HTML_CSSCLOSE); m_out->puts(HTML_HEADCLOSE); m_out->puts(HTML_BODYOPEN); strTemp.Format(HTML_PREOPEN, m_pSchemeName); m_out->puts((LPCSTR)strTemp); int styleCurrent = -1; bool closePrevious = false; for(int i = start; i < end; i++) { char ch = CharAt(i); int style = StyleAt(i); if(style > STYLE_DEFAULT) style = 0; if(style != styleCurrent && style != STYLE_DEFAULT) { //@todo: check for empty/white space tags if(closePrevious == true) m_out->puts("</span>"); if(cssClassNames[style].GetLength() > 0) { strTemp.Format("<span class='%s'>", cssClassNames[style]); m_out->puts(strTemp); closePrevious = true; /* // inline styles; not recommend m_out->puts("<span"); StyleDetails* pNext = GetStyle(style); if(pNext == NULL) pNext = pDefStyle; GetStyleChange(pCurrent, pNext, NULL); pCurrent = pNext; m_out->puts(">");*/ } else closePrevious = false; styleCurrent = style; } // Deal with special characters: if(ch == '&') m_out->puts("&"); else if(ch == '"') m_out->puts("""); else if(ch == '<') m_out->puts("<"); else if(ch == '>') m_out->puts(">"); else if(ch == '\t') { if(useTabs) m_out->putc(ch); else for(int itab = 0; itab < tabSize; itab++) m_out->putc(' '); } else if(ch == '\r') ; else if(ch == '\n') m_out->putc(ch); else m_out->putc(ch); } if(closePrevious == true) m_out->puts("</span>"); m_out->puts(HTML_PRECLOSE HTML_BODYCLOSE HTML_END); }