<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>Форум 'RSDN.Editor' на RSDN.RU</title>
    <link>http://www.rsdn.ru/Forum/prj.rsdn.editor/</link>
    <description>Проект RSDN.Editor</description>
    <category>prj</category>
    <category>rsdn</category>
    <category>editor</category>
    <language>ru-ru</language>
    <copyright>Copyright ©, RSDN.ru, 2001-2007</copyright>
    <webMaster>webmaster@rsdn.ru</webMaster>
    <generator>RSDN RSS Generator 1.3</generator>
    <image>
      <url>http://www.rsdn.ru/rsdn.gif</url>
      <title>RSDN.RU</title>
      <link>http://www.rsdn.ru</link>
    </image>
    <lastBuildDate>Mon, 21 May 2012 22:57:01 GMT</lastBuildDate>
    <ttl>5</ttl>
	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rsdn/prj/rsdn/editor" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rsdn/prj/rsdn/editor" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>А встроенные картинки в тексте поддерживаются? (-)</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/3296305.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/3296305.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/3296305.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=3296305</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/3296305.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=3296305</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 18 Feb 2009 08:10:28 GMT</pubDate>
		
			<author>Pavel_Agurov &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Статус проекта</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/2765657.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/2765657.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/2765657.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=2765657</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/2765657.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=2765657</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;А проект живой &amp;mdash; нет? Кто нибудь его использует в комм. продуктах &amp;mdash; можно или лучше не стоит?&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Thu, 13 Dec 2007 11:54:20 GMT</pubDate>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>inaccessibility</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/2739280.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/2739280.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/2739280.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=2739280</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/2739280.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=2739280</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Господа, хотел было скачать это чудо, но не удалось, шо делать? &lt;img border='0' width='15' height='22' src='http://www.rsdn.ru/Forum/images/confused.gif' /&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Thu, 22 Nov 2007 16:35:52 GMT</pubDate>
		
		
			<slash:comments>4</slash:comments>
		
	</item>

	<item>
		<title>Вставка предварительно отформатированного текста</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/2322426.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/2322426.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/2322426.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=2322426</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/2322426.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=2322426</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Как можно вставить предварительно отформатированный текст (например, слово, выделенное красным цветом) в конец текста?&lt;br /&gt;
В статье написано, что есть методы ExecuteCommand, Insert и InsertDirect, однако, в описании класса Document (чуть выше в статье) их нет. И в коде проекта тоже не нашел.&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Sat, 27 Jan 2007 15:15:08 GMT</pubDate>
		
			<author>vers &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>вопрос по поводу шрифта</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/2231630.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/2231630.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/2231630.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=2231630</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/2231630.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=2231630</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;здравствуйте.&lt;br /&gt;
слил сырцы, собрал, поставил контрол на форму.&lt;br /&gt;
однако в исходниках толком не ковырялся.&lt;br /&gt;
&lt;br /&gt;
главный вопрос &amp;mdash; как поменять шрифт ? без хитростей, без выделений, во всем тексте сразу.&lt;br /&gt;
глянул, как задается дефолтовый стайлер, написал так &amp;mdash; &lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
Rsdn.Editor.CompleteStyle style = &lt;span class='kw'&gt;new&lt;/span&gt; Rsdn.Editor.CompleteStyle(&lt;span class='str'&gt;"Default"&lt;/span&gt;,
            Rsdn.Editor.CompleteFont.CreateFont(&lt;span class='str'&gt;"Arial"&lt;/span&gt;, 6),
            KnownColor.Black, KnownColor.Red);
&lt;span class='kw'&gt;this&lt;/span&gt;.edit1.ActiveView.DefaultStyle = style;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
не работает ! ни цвет, ни размер шрифта не меняются. &lt;br /&gt;
однако, если заприсваивать ActiveView.DefaultStyle null, то эксцепшн я получу. &lt;br /&gt;
следовательно, я понял при отрисовке он все же используется, но тогда как менять его атрибуты ?&lt;br /&gt;
&lt;br /&gt;
да, был удивлен, когда при помещении котрола на форму, текст формы начинает отображать замеры времени. флаг препроцессора убрал, пересобрал.&lt;br /&gt;
и что такое &amp;mdash; Document.IsDirty ?&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Fri, 24 Nov 2006 08:11:54 GMT</pubDate>
		
			<author>_Dreamer &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Автозавершение есть?</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/2073615.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/2073615.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/2073615.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=2073615</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/2073615.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=2073615</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Автозавершение есть? Нажимал Ctrl+Space &amp;mdash; безрезультатно...&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 23 Aug 2006 16:33:24 GMT</pubDate>
		
			<author>adontz &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Что нужно для подключения стайлера</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1857040.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1857040.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1857040.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1857040</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1857040.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1857040</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Здравствуйте, VladD2, Вы писали:&lt;br /&gt;
&lt;span class='lineQuote'&gt;&lt;br /&gt;
VD&amp;gt;Что нужно для подключения твоего стайлера?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
_rsdnEdit.Document.Formatter = &lt;span class='kw'&gt;new&lt;/span&gt; как_то_там;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span class='lineQuote'&gt;           &lt;br /&gt;
&lt;br /&gt;
VD&amp;gt;И что нужно чтобы добавить новые языки?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Для подключения языков нужно написать описание грамматики в XML. Есть пример такой грамматики для си-шарпа. Затем лексер нужно зарегистрировать:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
LexerManager.Instance.RegisterLexer(lexer, &lt;span class='str'&gt;"LEXER_CODE"&lt;/span&gt;);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
 &lt;br /&gt;
LEXER_CODE &amp;mdash; это уникальный код лексера по к-му на него можно ссылаться. Например, при создании вложенных лексеров. Выглядит это примерно так:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Block Key="Key1" LexerCode="LEXER_CODE"/&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Такой блок будет уже обрабатываться внешним лексером. Есть также возможность двойного прохода &amp;mdash; сначала другим лексером, затем основным. В таком случае нужно будет прописать грамматику внутри блока. И выглядеть это будет так:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Block Key="Key1" LexerCode="LEXER_CODE" ReparseRule="OwnGrammar|ParentGrammar"&amp;gt;
    &amp;lt;!- grammar --&amp;gt;
&amp;lt;/Block&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
При значение OwnGrammar при повторном проходе блока будет использоваться грамматика самого блока, при значении ParentGrammar &amp;mdash; родительского.&lt;br /&gt;
&lt;br /&gt;
Начало каждого блока можно записывать двумя путями &amp;mdash; как "простой" набор символов:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Start Type="Literal"&amp;gt;///&amp;lt;/Start&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Как последовательность кейвордов:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Start Type="KeywordSet"&amp;gt;script language javascript&amp;lt;/Start&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Кейворды должны быть заранее зарегистрированы внутри каких-либо блоков и могут принадлежать любому блоку. Например, script &amp;mdash; это кейворд распознаваемый только вначале блока "&amp;lt;" "&amp;gt;", javascript &amp;mdash; только внутри кавычек и пр. У одно блока может быть произвольное количество "начал".&lt;br /&gt;
&lt;br /&gt;
Также у каждого бока есть свой "сканер". Сканер на примитивном уровне отвечает за токенизацию. Если сканер явно не указан, то используется встроенный &amp;mdash; простой и шустрый &amp;mdash; сканер. Например, для строк к-е также представляют из себя отдельный блок другого и не нужно. Но для блоков с более сложной грамматикой нужно писать свой сканер. Делается это так:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Scanners&amp;gt;
            &amp;lt;Scanner Key="CSharpScanner"&amp;gt;
                    &amp;lt;Pattern Type="Operator" Value="{'&amp;amp;lt;&amp;amp;gt;/[]|&amp;amp;amp;!=-+*^%.:'}" /&amp;gt;
                    &amp;lt;Pattern Type="Numeric" Value="&amp;amp;lt;N&amp;amp;gt;['LDF.']['x']&amp;amp;lt;N'ABCDEF+'&amp;amp;gt;" /&amp;gt;
                    &amp;lt;Pattern Type="Identifier" Value="(A'_'){X'_'}" /&amp;gt;
            &amp;lt;/Scanner&amp;gt;
&amp;lt;/Scanners&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
затем референсится из блока:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Block ... Scanner="CSharpScanner"/&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
При написании паттернов используются простенькие вилдкарды:&lt;br /&gt;
символы &amp;mdash; &lt;br /&gt;
A &amp;mdash; альфа&lt;br /&gt;
N &amp;mdash; нумбер&lt;br /&gt;
X &amp;mdash; альфанумер&lt;br /&gt;
B &amp;mdash; одинарные кавычки&lt;br /&gt;
блоки &amp;mdash;&lt;br /&gt;
() &amp;mdash; группа элементов (объединяемых через "ИЛИ")&lt;br /&gt;
'' &amp;mdash; литерал&lt;br /&gt;
[] &amp;mdash; опциональная группа&lt;br /&gt;
{} &amp;mdash; повторяющаяся группа&lt;br /&gt;
&amp;lt;&amp;gt; &amp;mdash; опциональная повторяющаяся группа&lt;br /&gt;
&lt;br /&gt;
Например, идентификатор в шарпе:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
(A'_'){X'_'}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Первая группа указывает с каких символов он может начинаться &amp;mdash; это или альфа или подчеркивание. Но внутри идентификатора могут быть альфанумер и подчеркивание. Т.е.:&lt;br /&gt;
&lt;br /&gt;
1str &amp;mdash; неправильный идент&lt;br /&gt;
str1 &amp;mdash; правильный&lt;br /&gt;
&lt;br /&gt;
Стили описываются отдельно внутри тега Stylesheet. Любой блок может иметь по три стиля &amp;mdash; начало, конец блока и сам блок. Также стили можно назначать группам кейвордов и пр. Кол-во групп кейвордов внутри блока не ограничено. Да. У блоков обычно бывают родители. Родитель задается через тег Parent. Родителей у одно блока может быть несколько. Если родителей нет &amp;mdash; то блок восрпинимается как корневой.&lt;br /&gt;
&lt;br /&gt;
Вкратце все. В проекте есть схема, если ее подключить то при написании новых грамматик будет автокомплит.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class='mod'&gt;26.05.06 16:14: Ветка выделена из темы &lt;a href="http://www.rsdn.ru/forum/?mid=1668185" title="Версия 0.3" class=" tips m" rel="#m1668185" target="_blank"&gt;Версия 0.3&lt;div class="tooltip" id="m1668185"&gt;Автор: Воронков Василий&lt;br /&gt;Дата: 08.02.06&lt;/div&gt;&lt;/a&gt; &amp;mdash; VladD2&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 19 Apr 2006 16:53:45 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Глюк отрисовки</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1764090.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1764090.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1764090.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1764090</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1764090.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1764090</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;При жирном шрифте конец последней буквы слова обкоцывается.&lt;br /&gt;
&lt;img border='0' src='http://rsdn.ru/File/5161/REBoldBug.png' /&gt;&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.2.0 alpha rev. 644 on Windows XP 5.1.2600.131072&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 08 Mar 2006 16:55:59 GMT</pubDate>
		
			<author>AndrewVK &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Реализовал поддержку множественных представлений</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1688064.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1688064.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1688064.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1688064</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1688064.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1688064</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Реализовал поддержку множественных представлений. Просба потестировать.&lt;br /&gt;
&lt;br /&gt;
Теперь в правом верхнем углу контрола имется "хвататель" нажав на него представление разделятся на 2. Размеры представлений при этом можно изменять спритерами.&lt;br /&gt;
&lt;br /&gt;
Механика самого разделения и слияния представлений еще не доделана, но это мелочи.&lt;br /&gt;
&lt;br /&gt;
При доработке даннй возможности обнаружил логическую ошибку в работе с выделением. Ранее при изменении выделения я к каждой строке документа которая выделена в ее список стилей добавлял стиль выделения. Это конечно же было глупо, так как каждое представление имеет свое выделение. Я убрал добавление стилей к строкам документов и теперь добавляю стили динамически при отрисовке конкретной строки. За одно должна увеличиться скорость при работе с выделением большого объема. Ранее там была халтура, а теперь код содержащий халтуру стал вовсе не нужным.&lt;br /&gt;
&lt;br /&gt;
Кстати, забавный факт. В процессе работы над мнжественными представлениями я удалил массу ненужного кода. Так что после доработки объем кода даже уменшился. Вот такие плодотворные дни бывают. &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt;&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.2.0 alpha rev. 637&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Sun, 19 Feb 2006 16:46:02 GMT</pubDate>
		
			<author>VladD2 &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Теперь точно баг</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1668435.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1668435.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1668435.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1668435</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1668435.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1668435</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Если курсор мышки подвести к концу строки, то он принимает вид обычного указателя (а значка такого для редактирования текста) и пропадает возможность выделить строку. Т.е. проще говоря нельзя выделить строку с конца.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 08 Feb 2006 22:12:07 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Версия 0.3</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1668185.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1668185.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1668185.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1668185</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1668185.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1668185</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;&lt;a href="http://www.rsdn.ru:80/File/16070/Rsdn.Editor.zip" class="m" target="_blank"&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Сделал подсветку HTML &amp;mdash; вся хитрость в том, что в нее для целей тестинга вложена подсветка CSharp &amp;mdash; для этого нужно набрать блок:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script language="csharp"&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поправил подсветку препроцессора. Для тестовых целей сделал подсветку препроцессора в стиле С (с поддержкой переноса директивы на новую строку).&lt;br /&gt;
Версия пока очень тестовая и все такое.&lt;br /&gt;
&lt;br /&gt;
Да, и хотелось бы какие-то комментарии касательно способов реализации встраиваемых лексеров. Для этого ведь так или иначе потребуется поддержка со стороны форматтера.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 08 Feb 2006 17:27:55 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>109</slash:comments>
		
	</item>

	<item>
		<title>Бага</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1663263.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1663263.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1663263.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1663263</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1663263.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1663263</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Блочное форматирование не работает &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/frown.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
Если выделить несколько строк текста и нажать tab, то строчки сотрутся.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Mon, 06 Feb 2006 20:50:39 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Лексер. Версия 0.2</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1658801.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1658801.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1658801.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1658801</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1658801.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1658801</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Собственно &lt;a href="http://www.rsdn.ru:80/File/16070/Rsdn.Editor.zip" class="m" target="_blank"&gt;здесь&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Из изменений:&lt;br /&gt;
&lt;ol type='1' start='1' style='margin-top:0; margin-bottom:0;'&gt;&lt;li /&gt;Исправил несколько багов, в том числе и с подсветкой многострочных блоков.&lt;br /&gt;
&lt;li /&gt;Поменял подсветку для препроцессора&lt;br /&gt;
&lt;li /&gt;Ну и основное &amp;mdash; добавил первоначальный вариант распознавания числовых токенов и операторов. Тестировалось пока мало, так что последствия могут непредсказуемыми &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt;&lt;br /&gt;
&lt;li /&gt;Ну и по мелочи&lt;/ol&gt;
&lt;br /&gt;
Подсветку ошибок пока не добавлял, хотя "почва" есть. По поводу этого кстати возникает вопрос/предложение. Может, имеет смысл сделать посдветку ошибок в сцинтилле? Таким фигурным подчеркиванием, которое будет комбинироваться с любым стилей.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Fri, 03 Feb 2006 15:33:05 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>10</slash:comments>
		
	</item>

	<item>
		<title>Char &amp;&amp; Dictionary&lt;Char,...&gt;</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1656779.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1656779.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1656779.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1656779</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1656779.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1656779</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Собственно, субж. Уж больно медленно идет поиск чаров в хэш-таблице &amp;mdash; скорость практически такая же, что и у String.IndexOf (в 2.0), что странно. Можно было бы конечно поменять хэш-функцию, но как? И вообще какой здесь workaround может быть? (Другой контейнер, например, и пр.)&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Thu, 02 Feb 2006 17:39:21 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>8</slash:comments>
		
	</item>

	<item>
		<title>Лексер. Версия 0.1</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1653663.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1653663.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1653663.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1653663</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1653663.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1653663</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Собственно, выкладываю первую версию. Код &lt;a href="http://www.rsdn.ru:80/File/16070/Lexer.zip" class="m" target="_blank"&gt;здесь&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Все пока очень предварительно, не слишком сильно тестировалось и выглядит малость грязновато. Собственно весь код лексера, все классы к нему относящиеся находятся в одном файле Lexer.cs (да, и комментариев тоже нет &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt; ). Также в архиве есть файл ConfigurableStyler.cs &amp;mdash; реализация стайлера, использующего этого лексер.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Как прикрутить&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
1. Вводим интерфейс IStyler:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;public interface&lt;/span&gt; IStyler
{
        &lt;span class='kw'&gt;void&lt;/span&gt; StartParse(DocumentRowCollection rows, &lt;span class='kw'&gt;int&lt;/span&gt; currentState);
        &lt;span class='kw'&gt;void&lt;/span&gt; GetStyles(&lt;span class='kw'&gt;int&lt;/span&gt; rowIndex);
        &lt;span class='kw'&gt;int&lt;/span&gt; CurrentState { &lt;span class='kw'&gt;get&lt;/span&gt;; }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Он уже есть в файле ConfigurableStyler.cs, так что нужно просто отнаследовать от него старый стайлер.&lt;br /&gt;
&lt;br /&gt;
2. Меняем DefaultFormatter.&lt;br /&gt;
Его нужно сделать генериком. Для удобства я в своей версии переименовал DefaultFormatter в BaseFormatter и сделал его генериком вида:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;public class&lt;/span&gt; BaseFormatter&amp;lt;T&amp;gt; : IFormatter &lt;span class='kw'&gt;where&lt;/span&gt; T : IStyler, &lt;span class='kw'&gt;new&lt;/span&gt;()&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Также создал новый класс DefaultFormatter вида:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;public class&lt;/span&gt; DefaultFormatter : BaseFormatter&amp;lt;Styler&amp;gt; { }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Вот собственно и все. Осталось только явно указать, что нужно использовать не Styler, а ConfigurableStyler. Да, и для компиляции надо разрешить unsafe &amp;mdash; это временно, unsafe я потом уберу.&lt;br /&gt;
Как видишь, существующий код затрагивается по минимуму.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Особенности текущей реализации&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
1. Проверки типа IsIdentifier выделенные в отдельный класс сканер пока написаны очень предварительно&lt;br /&gt;
2. Загрузки грамматики из XML-а пока нет, внутри лексера, в регионе Temp, грамматика задана вручную &amp;mdash; для тестинга заданы ключевые слова си-шарпа и два вложенных комментария /* */. &lt;br /&gt;
3. Информация о грамматике хранится в классах типа Block. Так вот сейчас там куча непродуманностей и в том, как эти классы конфигурить вообще без бутылки не разберешься. Это я разумеется поменяю/усовершествую.&lt;br /&gt;
4. Внешний "интерфейс" класса Lexer получился тяжеловатым, скорее всего он тоже изменится.&lt;br /&gt;
5. Наверняка есть куча багов &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt;&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 01 Feb 2006 15:37:18 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>44</slash:comments>
		
	</item>

	<item>
		<title>Styler</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1648581.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1648581.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1648581.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1648581</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1648581.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1648581</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Не очень понимаю как работает StartStylerState и IsContinueStylingOnNextLine. Причем, что самое интересное, умудрился добиться работоспособности этого дела, но как и почему работает &amp;mdash; не понимаю &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt; В общем, как в анекдоте &amp;mdash; практическое программирование.&lt;br /&gt;
&lt;br /&gt;
Непонятно вот что:&lt;br /&gt;
1. При начале парсинга (StartStyling) стайлеру передается currentState. currentState записывается в одноименное свойство.&lt;br /&gt;
2. В GetStyles передается уже индекс строки, которая будет непосредственно парситься. Но &amp;mdash; назначение StartStylerState просходит еще до парсинга из свойства currentState. &lt;br /&gt;
3. Во время парсинга currentState устанавливается в тот, который вычисляется во время парсинга.&lt;br /&gt;
4. См. пункт первый.&lt;br /&gt;
&lt;br /&gt;
В общем как это работает? &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt; Если устанавливаеть StartStylerState после парсинга &amp;mdash; работать не будет. Оно и понятно &amp;mdash; в строке вида &amp;lt;bla-bla-bla /* bla-bla-bla&amp;gt; будет currentState многосторочного комментария, тогда как на самом деле это не так и она будет некорректно распарсена используя грамматику только комментария. Но при существующей схеме возникает ощущение что вычисляемый во время парсинга currentState просто-напросто каждый раз перезаписывается. &lt;br /&gt;
Или я чего-то недоглядел?&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Mon, 30 Jan 2006 21:03:51 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>17</slash:comments>
		
	</item>

	<item>
		<title>Кстати...</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1645063.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1645063.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1645063.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1645063</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1645063.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1645063</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Доступ в SVN бы не помешал &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/biggrin.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
Желательно на vorov2#bp.com&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Sat, 28 Jan 2006 00:21:09 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Re: Шустрик: ДКА vs. хэш-таблица</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1624024.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1624024.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1624024.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1624024</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1624024.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1624024</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Что-то где-то глуючит, так что в старую ветку добавить ничго не могу. &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/frown.gif' /&gt;&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.2.0 alpha rev. 631&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Thu, 26 Jan 2006 14:17:50 GMT</pubDate>
		
			<author>VladD2 &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>39</slash:comments>
		
	</item>

	<item>
		<title>Шустрик: ДКА vs. хэш-таблица</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1613375.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1613375.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1613375.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1613375</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1613375.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1613375</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Здравствуйте, VladD2, Вы писали:&lt;br /&gt;
&lt;span class='lineQuote'&gt;&lt;br /&gt;
VD&amp;gt;С чего бы это ошибкой стало? Если стартовый символ равен или больше длинны строки, то мы уже за ее пределами. Стало быть строка не распознана.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Влад, у тебя было start &amp;gt; text.Length. Это означаете, если text.Length == 4, то выхода не произойдет и при попытке извлечения символа по индексу text[4] Dfa естественно свалится. Кстати, я замечал что извлечение чаров через индексер строки не слишком шустрая операция.&lt;br /&gt;
&lt;span class='lineQuote'&gt;&lt;br /&gt;
ВВ&amp;gt;&amp;gt;Обычная хэш-таблица в 2.5-3 раза быстрее &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/frown.gif' /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class='lineQuote'&gt;VD&amp;gt;Это на каком объеме и на каких строках? Можно поглядеть тест?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;private const int&lt;/span&gt; ITER = 100000;

&lt;span class='kw'&gt;static void&lt;/span&gt; Main()
{
     &lt;span class='kw'&gt;string&lt;/span&gt; _strs = 
        &lt;span class='str'&gt;"using assembly event field method param property return "&lt;/span&gt;
        + &lt;span class='str'&gt;"type typevar namespace void where class struct new partial "&lt;/span&gt;
        + &lt;span class='str'&gt;"interface enum delegate base this ref out __arglist params "&lt;/span&gt;
        + &lt;span class='str'&gt;"public protected internal private unsafe abstract sealed "&lt;/span&gt;
        + &lt;span class='str'&gt;"static object string sbyte byte short ushort int uint "&lt;/span&gt;
        + &lt;span class='str'&gt;"long ulong char extern override readonly virtual volatile const "&lt;/span&gt;
        + &lt;span class='str'&gt;"implicit explicit operator add remove float double decimal "&lt;/span&gt;
        + &lt;span class='str'&gt;"bool get set true false is as stackalloc checked unchecked "&lt;/span&gt;
        + &lt;span class='str'&gt;"if else switch while do for foreach in break continue yield "&lt;/span&gt;
        + &lt;span class='str'&gt;"throw lock fixed case default null typeof sizeof try finally "&lt;/span&gt;
        + &lt;span class='str'&gt;"catch goto"&lt;/span&gt;;
    
    Hashtable hash = &lt;span class='kw'&gt;new&lt;/span&gt; Hashtable();
    &lt;span class='kw'&gt;string&lt;/span&gt;[] arr = _strs.Split(&lt;span class='kw'&gt;new char&lt;/span&gt;[] { &lt;span class='str'&gt;' '&lt;/span&gt; }, StringSplitOptions.RemoveEmptyEntries);
    &lt;span class='com'&gt;//Debugger.Break();&lt;/span&gt;
    
    &lt;span class='kw'&gt;foreach&lt;/span&gt; (&lt;span class='kw'&gt;string&lt;/span&gt; s &lt;span class='kw'&gt;in&lt;/span&gt; arr)
            hash.Add(s, s);
            
    
    DateTime start = DateTime.Now;
    &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; i = 0; i &amp;lt; ITER; i++)
        &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; j = 0; j &amp;lt; arr.Length; j++)
            hash.ContainsKey(arr[j]);
            
    Console.WriteLine(&lt;span class='str'&gt;"Hashtable: {0}"&lt;/span&gt;, (DateTime.Now - start).TotalMilliseconds);
    
    start = DateTime.Now;
    &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; i = 0; i &amp;lt; ITER; i++) {        
        &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; j = 0; j &amp;lt; arr.Length; j++)
            Dfa.CheckStr(arr[j], 0);
    }
    Console.WriteLine(&lt;span class='str'&gt;"Dfa: {0}"&lt;/span&gt;, (DateTime.Now - start).TotalMilliseconds);
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span class='lineQuote'&gt;&lt;br /&gt;
ВВ&amp;gt;&amp;gt;Свой вариант тоже померил (в оптимизированной версии без энумераторов и пр.). На коротких идентификаторах раза в 2 быстрее хэш-таблицы, на длинных типа "interface" почти в два раза медленее. &lt;/span&gt;&lt;br /&gt;
&lt;span class='lineQuote'&gt;VD&amp;gt;Темболее хорошо бы поглядеть на тесты.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; Program
{
    &lt;span class='kw'&gt;private const int&lt;/span&gt; ITER = 1000000;
    &lt;span class='kw'&gt;private const string&lt;/span&gt; SS = &lt;span class='str'&gt;"for"&lt;/span&gt;;

    &lt;span class='kw'&gt;static void&lt;/span&gt; Main()
    {
    
        &lt;span class='kw'&gt;string&lt;/span&gt; _strs = 
            &lt;span class='str'&gt;"using assembly event field method param property return "&lt;/span&gt;
            + &lt;span class='str'&gt;"type typevar namespace void where class struct new partial "&lt;/span&gt;
            + &lt;span class='str'&gt;"interface enum delegate base this ref out __arglist params "&lt;/span&gt;
            + &lt;span class='str'&gt;"public protected internal private unsafe abstract sealed "&lt;/span&gt;
            + &lt;span class='str'&gt;"static object string sbyte byte short ushort int uint "&lt;/span&gt;
            + &lt;span class='str'&gt;"long ulong char extern override readonly virtual volatile const "&lt;/span&gt;
            + &lt;span class='str'&gt;"implicit explicit operator add remove float double decimal "&lt;/span&gt;
            + &lt;span class='str'&gt;"bool get set true false is as stackalloc checked unchecked "&lt;/span&gt;
            + &lt;span class='str'&gt;"if else switch while do for foreach in break continue yield "&lt;/span&gt;
            + &lt;span class='str'&gt;"throw lock fixed case default null typeof sizeof try finally "&lt;/span&gt;
            + &lt;span class='str'&gt;"catch goto"&lt;/span&gt;;
        
        &lt;span class='kw'&gt;string&lt;/span&gt;[] keyArr = _strs.Split(&lt;span class='kw'&gt;new char&lt;/span&gt;[] { &lt;span class='str'&gt;' '&lt;/span&gt; }, StringSplitOptions.RemoveEmptyEntries);
        
        
        StringTable table = &lt;span class='kw'&gt;new&lt;/span&gt; StringTable();
        &lt;span class='kw'&gt;foreach&lt;/span&gt; (&lt;span class='kw'&gt;string&lt;/span&gt; s &lt;span class='kw'&gt;in&lt;/span&gt; keyArr)
            table.Add(s);
    
        &lt;span class='kw'&gt;object&lt;/span&gt; obj = &lt;span class='kw'&gt;new object&lt;/span&gt;();
        Hashtable hash = &lt;span class='kw'&gt;new&lt;/span&gt; Hashtable();
        &lt;span class='kw'&gt;foreach&lt;/span&gt; (&lt;span class='kw'&gt;string&lt;/span&gt; s &lt;span class='kw'&gt;in&lt;/span&gt; keyArr)
            hash.Add(s, obj);
        
        &lt;span class='com'&gt;//char[] arr = { 'i', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e' };&lt;/span&gt;
        &lt;span class='kw'&gt;char&lt;/span&gt;[] arr = { &lt;span class='str'&gt;'a'&lt;/span&gt;, &lt;span class='str'&gt;'s'&lt;/span&gt; };
        
        DateTime start = DateTime.Now;
        &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; i = 0; i &amp;lt; ITER; i++)
        {
            String s = &lt;span class='kw'&gt;new&lt;/span&gt; String(arr, 0, arr.Length);
            &lt;span class='kw'&gt;if&lt;/span&gt; (hash.ContainsKey(s)) { }
        }
                
        Console.WriteLine(&lt;span class='str'&gt;"Hashtable: {0}"&lt;/span&gt;, (DateTime.Now - start).TotalMilliseconds);
        
    
        start = DateTime.Now;
        &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; i = 0; i &amp;lt; ITER; i++)
        {
            &lt;span class='com'&gt;//Debugger.Break();&lt;/span&gt;
            
            &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; j = 0; j &amp;lt; arr.Length; j++)
                &lt;span class='kw'&gt;if&lt;/span&gt; (!table.FindSegment(arr[j])) 
                    &lt;span class='kw'&gt;break&lt;/span&gt;;
                
            table.ResetSearch();
        }
        Console.WriteLine(&lt;span class='str'&gt;"StringTable: {0}"&lt;/span&gt;, (DateTime.Now - start).TotalMilliseconds);
        
        &lt;span class='com'&gt;//Debugger.Break();&lt;/span&gt;
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Собственно оптимизированный вариант таблицы (надеюсь, простор для оптимизации еще остался):&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; StringTable
{
    &lt;span class='kw'&gt;private const int&lt;/span&gt; BUCKET_SIZE = 3;
    &lt;span class='kw'&gt;private readonly&lt;/span&gt; List&amp;lt;Bucket&amp;gt; Buckets = &lt;span class='kw'&gt;new&lt;/span&gt; List&amp;lt;Bucket&amp;gt;();
    &lt;span class='kw'&gt;private&lt;/span&gt; Bucket lastBucket;
    &lt;span class='kw'&gt;private int&lt;/span&gt; lastOffset = -1;
    &lt;span class='kw'&gt;bool&lt;/span&gt; lastRetval = &lt;span class='kw'&gt;true&lt;/span&gt;;
    
    &lt;span class='kw'&gt;public&lt;/span&gt; StringTable()
    {
        
    }

    &lt;span class='kw'&gt;public void&lt;/span&gt; Add(&lt;span class='kw'&gt;string value&lt;/span&gt;)
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (&lt;span class='kw'&gt;value&lt;/span&gt; == &lt;span class='kw'&gt;null&lt;/span&gt; || &lt;span class='kw'&gt;value&lt;/span&gt;.Length == 0)
            &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentException();
            
        InternalAdd(&lt;span class='kw'&gt;value&lt;/span&gt;, 0, Buckets);
    }
    
    
    &lt;span class='kw'&gt;private void&lt;/span&gt; InternalAdd(&lt;span class='kw'&gt;string value&lt;/span&gt;, &lt;span class='kw'&gt;int&lt;/span&gt; offset, List&amp;lt;Bucket&amp;gt; buckets)
    {
        &lt;span class='kw'&gt;char&lt;/span&gt; c = &lt;span class='kw'&gt;value&lt;/span&gt;[offset];
        
        &lt;span class='kw'&gt;foreach&lt;/span&gt; (Bucket b &lt;span class='kw'&gt;in&lt;/span&gt; buckets)
            &lt;span class='kw'&gt;if&lt;/span&gt; (b.Char == c)
            { 
                &lt;span class='kw'&gt;if&lt;/span&gt; (offset == BUCKET_SIZE - 1 || &lt;span class='kw'&gt;value&lt;/span&gt;.Length == offset + 1)
                    b.Strings.Add(&lt;span class='kw'&gt;value&lt;/span&gt;.ToCharArray());
                &lt;span class='kw'&gt;else&lt;/span&gt;
                    InternalAdd(&lt;span class='kw'&gt;value&lt;/span&gt;, ++offset, b.Buckets);    
                
                &lt;span class='kw'&gt;return&lt;/span&gt;;
            }
        
        Bucket newBuck = &lt;span class='kw'&gt;new&lt;/span&gt; Bucket(c);
        buckets.Add(newBuck);
        
        &lt;span class='kw'&gt;if&lt;/span&gt; (offset == BUCKET_SIZE - 1 || &lt;span class='kw'&gt;value&lt;/span&gt;.Length == offset + 1)
            newBuck.Strings.Add(&lt;span class='kw'&gt;value&lt;/span&gt;.ToCharArray());
        &lt;span class='kw'&gt;else&lt;/span&gt;
            InternalAdd(&lt;span class='kw'&gt;value&lt;/span&gt;, ++offset, newBuck.Buckets);
    }
    
    &lt;span class='kw'&gt;public bool&lt;/span&gt; FindSegment(&lt;span class='kw'&gt;char&lt;/span&gt; c)
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; !lastRetval ? lastRetval : InternalFindSegment(c);
    }
    
    
    &lt;span class='kw'&gt;private bool&lt;/span&gt; InternalFindSegment(&lt;span class='kw'&gt;char&lt;/span&gt; c)
    {    
        &lt;span class='kw'&gt;if&lt;/span&gt; (++lastOffset &amp;lt; BUCKET_SIZE)
        {
            List&amp;lt;Bucket&amp;gt; bList = lastOffset == 0 ? Buckets : lastBucket.Buckets;
        
            &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; i = 0; i &amp;lt; bList.Count; i++)
            {
                Bucket b = bList[i];
            
                &lt;span class='kw'&gt;if&lt;/span&gt; (b.Char - c == 0)
                {
                    lastBucket = b;
                    &lt;span class='kw'&gt;return true&lt;/span&gt;;
                }
            }
        }
        &lt;span class='kw'&gt;else
            for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; i = 0; i &amp;lt; lastBucket.Strings.Count; i++)
            {
                &lt;span class='kw'&gt;char&lt;/span&gt;[] cz = lastBucket.Strings[i];
                &lt;span class='kw'&gt;if&lt;/span&gt; (cz.Length &amp;gt;= lastOffset + 1 &amp;amp;&amp;amp; cz[lastOffset] - c == 0)
                    &lt;span class='kw'&gt;return true&lt;/span&gt;;
            }
    
        lastRetval = &lt;span class='kw'&gt;false&lt;/span&gt;;
        &lt;span class='kw'&gt;return&lt;/span&gt; lastRetval;
    }
    
    &lt;span class='kw'&gt;public void&lt;/span&gt; ResetSearch()
    {
        lastOffset = -1;
        lastRetval = &lt;span class='kw'&gt;true&lt;/span&gt;;
    }
}


&lt;span class='kw'&gt;class&lt;/span&gt; Bucket
{
    &lt;span class='kw'&gt;public readonly char&lt;/span&gt; Char;
    &lt;span class='kw'&gt;public readonly&lt;/span&gt; List&amp;lt;Bucket&amp;gt; Buckets = &lt;span class='kw'&gt;new&lt;/span&gt; List&amp;lt;Bucket&amp;gt;();
    &lt;span class='kw'&gt;public readonly&lt;/span&gt; List&amp;lt;&lt;span class='kw'&gt;char&lt;/span&gt;[]&amp;gt; Strings = &lt;span class='kw'&gt;new&lt;/span&gt; List&amp;lt;&lt;span class='kw'&gt;char&lt;/span&gt;[]&amp;gt;();
    
    &lt;span class='kw'&gt;public&lt;/span&gt; Bucket(&lt;span class='kw'&gt;char&lt;/span&gt; c)
    {
        Char = c;
    }    
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span class='lineQuote'&gt;&lt;br /&gt;
ВВ&amp;gt;&amp;gt;Кстати, я не очень понял как поможет этот Dfa при по-символьном разборе текста. Он же хочет, чтобы ему строку передавали.&lt;/span&gt;&lt;br /&gt;
&lt;span class='lineQuote'&gt;VD&amp;gt;ДКА просто сканирует строку символ за символом. Если мы попадаем в току где символ распознан, то можем остановиться вернув состояние и информацию о том, что мы распознали. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ну т.е. это как бы не совсем аналог хэш-таблицы все-таки?&lt;br /&gt;
&lt;span class='lineQuote'&gt;&lt;br /&gt;
VD&amp;gt;Алгоритмически по фигу как получается следующий символ. text[++start] можно заменить на любой вариант функции возвращающей следующий символ.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
ОК&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class='mod'&gt;26.01.06 02:30: Ветка выделена из темы &lt;a href="http://www.rsdn.ru/forum/?mid=1267366" title="Rsdn.Editor" class=" tips m" rel="#m1267366" target="_blank"&gt;Rsdn.Editor&lt;div class="tooltip" id="m1267366"&gt;Автор: Чистяков Влад aka VladD2&lt;br /&gt;Дата: 12.07.05&lt;/div&gt;&lt;/a&gt; &amp;mdash; VladD2&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Wed, 25 Jan 2006 19:46:00 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>21</slash:comments>
		
	</item>

	<item>
		<title>Styling</title>
		<link>http://www.rsdn.ru/Forum/prj.rsdn.editor/1604711.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/prj.rsdn.editor/1604711.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/prj.rsdn.editor/1604711.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=1604711</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/1604711.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=1604711</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;А почему можно "красить" только текст в пределах одной строки и нельзя указать диапазон, который можно "покрасить"? Типа начиная с символа А строки Б, кончая символом В строки Г. Так как сделано сейчас и не очень удобно и на производительность не лучшим образом влияет.&lt;div class='tagline'&gt;... &amp;lt;&amp;lt; RSDN@Home 1.1.4 stable SR1 rev. 568&amp;gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;
				
		</description>
		
		<category>prj</category><category>rsdn</category><category>editor</category>
		<pubDate>Fri, 20 Jan 2006 17:43:32 GMT</pubDate>
		
			<author>Воронков Василий &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>
</channel>
</rss>

