Open main menu

Biolecture.org β

Changes

Cprintf

38,690 bytes added, 21:48, 3 December 2018
Created page with "<p>% For displaying string to red color using "cprintf"</p> <p>% Reference: https://kr.mathworks.com/matlabcentral/fileexchange/24093-cprintf-display-formatted-colored..."
<p>% For displaying string to red color using &quot;cprintf&quot;</p>

<p>% Reference: https://kr.mathworks.com/matlabcentral/fileexchange/24093-cprintf-display-formatted-colored-text-in-the-command-window</p>

<p>function count = cprintf(style,format,varargin)<br />
% CPRINTF displays styled formatted text in the Command Window<br />
%<br />
% Syntax:<br />
% &nbsp; &nbsp;count = cprintf(style,format,...)<br />
%<br />
% Description:<br />
% &nbsp; &nbsp;CPRINTF processes the specified text using the exact same FORMAT<br />
% &nbsp; &nbsp;arguments accepted by the built-in SPRINTF and FPRINTF functions.<br />
%<br />
% &nbsp; &nbsp;CPRINTF then displays the text in the Command Window using the<br />
% &nbsp; &nbsp;specified STYLE argument. The accepted styles are those used for<br />
% &nbsp; &nbsp;Matlab&#39;s syntax highlighting (see: File / Preferences / Colors /&nbsp;<br />
% &nbsp; &nbsp;M-file Syntax Highlighting Colors), and also user-defined colors.<br />
%<br />
% &nbsp; &nbsp;The possible pre-defined STYLE names are:<br />
%<br />
% &nbsp; &nbsp; &nbsp; &#39;Text&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - default: black<br />
% &nbsp; &nbsp; &nbsp; &#39;Keywords&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - default: blue<br />
% &nbsp; &nbsp; &nbsp; &#39;Comments&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - default: green<br />
% &nbsp; &nbsp; &nbsp; &#39;Strings&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- default: purple<br />
% &nbsp; &nbsp; &nbsp; &#39;UnterminatedStrings&#39; &nbsp;- default: dark red<br />
% &nbsp; &nbsp; &nbsp; &#39;SystemCommands&#39; &nbsp; &nbsp; &nbsp; - default: orange<br />
% &nbsp; &nbsp; &nbsp; &#39;Errors&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - default: light red<br />
% &nbsp; &nbsp; &nbsp; &#39;Hyperlinks&#39; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - default: underlined blue<br />
%<br />
% &nbsp; &nbsp; &nbsp; &#39;Black&#39;,&#39;Cyan&#39;,&#39;Magenta&#39;,&#39;Blue&#39;,&#39;Green&#39;,&#39;Red&#39;,&#39;Yellow&#39;,&#39;White&#39;<br />
%<br />
% &nbsp; &nbsp;STYLE beginning with &#39;-&#39; or &#39;_&#39; will be underlined. For example:<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;-Blue&#39; is underlined blue, like &#39;Hyperlinks&#39;;<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;_Comments&#39; is underlined green etc.<br />
%<br />
% &nbsp; &nbsp;STYLE beginning with &#39;*&#39; will be bold (R2011b+ only). For example:<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;*Blue&#39; is bold blue;<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;*Comments&#39; is bold green etc.<br />
% &nbsp; &nbsp;Note: Matlab does not currently support both bold and underline,<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;only one of them can be used in a single cprintf command. But of<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;course bold and underline can be mixed by using separate commands.<br />
%<br />
% &nbsp; &nbsp;STYLE also accepts a regular Matlab RGB vector, that can be underlined<br />
% &nbsp; &nbsp;and bolded: -[0,1,1] means underlined cyan, &#39;*[1,0,0]&#39; is bold red.<br />
%<br />
% &nbsp; &nbsp;STYLE is case-insensitive and accepts unique partial strings just<br />
% &nbsp; &nbsp;like handle property names.<br />
%<br />
% &nbsp; &nbsp;CPRINTF by itself, without any input parameters, displays a demo<br />
%<br />
% Example:<br />
% &nbsp; &nbsp;cprintf; &nbsp; % displays the demo<br />
% &nbsp; &nbsp;cprintf(&#39;text&#39;, &nbsp; &#39;regular black text&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;hyper&#39;, &nbsp;&#39;followed %s&#39;,&#39;by&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;key&#39;, &nbsp; &nbsp;&#39;%d colored&#39;, 4);<br />
% &nbsp; &nbsp;cprintf(&#39;-comment&#39;,&#39;&amp; underlined&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;err&#39;, &nbsp; &nbsp;&#39;elements\n&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;cyan&#39;, &nbsp; &#39;cyan&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;_green&#39;, &#39;underlined green&#39;);<br />
% &nbsp; &nbsp;cprintf(-[1,0,1], &#39;underlined magenta&#39;);<br />
% &nbsp; &nbsp;cprintf([1,0.5,0],&#39;and multi-\nline orange\n&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;*blue&#39;, &nbsp;&#39;and *bold* (R2011b+ only)\n&#39;);<br />
% &nbsp; &nbsp;cprintf(&#39;string&#39;); &nbsp;% same as fprintf(&#39;string&#39;) and cprintf(&#39;text&#39;,&#39;string&#39;)<br />
%<br />
% Bugs and suggestions:<br />
% &nbsp; &nbsp;Please send to Yair Altman (altmany at gmail dot com)<br />
%<br />
% Warning:<br />
% &nbsp; &nbsp;This code heavily relies on undocumented and unsupported Matlab<br />
% &nbsp; &nbsp;functionality. It works on Matlab 7+, but use at your own risk!<br />
%<br />
% &nbsp; &nbsp;A technical description of the implementation can be found at:<br />
% &nbsp; &nbsp;&lt;a href=&quot;http://undocumentedmatlab.com/blog/cprintf/&quot;&gt;http://UndocumentedMatlab.com/blog/cprintf/&lt;/a&gt;<br />
%<br />
% Limitations:<br />
% &nbsp; &nbsp;1. In R2011a and earlier, a single space char is inserted at the<br />
% &nbsp; &nbsp; &nbsp; beginning of each CPRINTF text segment (this is ok in R2011b+).<br />
%<br />
% &nbsp; &nbsp;2. In R2011a and earlier, consecutive differently-colored multi-line<br />
% &nbsp; &nbsp; &nbsp; CPRINTFs sometimes display incorrectly on the bottom line.<br />
% &nbsp; &nbsp; &nbsp; As far as I could tell this is due to a Matlab bug. Examples:<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &gt;&gt; cprintf(&#39;-str&#39;,&#39;under\nline&#39;); cprintf(&#39;err&#39;,&#39;red\n&#39;); % hidden &#39;red&#39;, unhidden &#39;_&#39;<br />
% &nbsp; &nbsp; &nbsp; &nbsp; &gt;&gt; cprintf(&#39;str&#39;,&#39;regu\nlar&#39;); cprintf(&#39;err&#39;,&#39;red\n&#39;); % underline red (not purple) &#39;lar&#39;<br />
%<br />
% &nbsp; &nbsp;3. Sometimes, non newline (&#39;\n&#39;)-terminated segments display unstyled<br />
% &nbsp; &nbsp; &nbsp; (black) when the command prompt chevron (&#39;&gt;&gt;&#39;) regains focus on the<br />
% &nbsp; &nbsp; &nbsp; continuation of that line (I can&#39;t pinpoint when this happens).&nbsp;<br />
% &nbsp; &nbsp; &nbsp; To fix this, simply newline-terminate all command-prompt messages.<br />
%<br />
% &nbsp; &nbsp;4. In R2011b and later, the above errors appear to be fixed. However,<br />
% &nbsp; &nbsp; &nbsp; the last character of an underlined segment is not underlined for<br />
% &nbsp; &nbsp; &nbsp; some unknown reason (add an extra space character to make it look better)<br />
%<br />
% &nbsp; &nbsp;5. In old Matlab versions (e.g., Matlab 7.1 R14), multi-line styles<br />
% &nbsp; &nbsp; &nbsp; only affect the first line. Single-line styles work as expected.<br />
% &nbsp; &nbsp; &nbsp; R14 also appends a single space after underlined segments.<br />
%<br />
% &nbsp; &nbsp;6. Bold style is only supported on R2011b+, and cannot also be underlined.<br />
%<br />
% Change log:<br />
% &nbsp; &nbsp;2015-06-24: Fixed a few discoloration issues (some other issues still remain)<br />
% &nbsp; &nbsp;2015-03-20: Fix: if command window isn&#39;t defined yet (startup) use standard fprintf as suggested by John Marozas<br />
% &nbsp; &nbsp;2012-08-09: Graceful degradation support for deployed (compiled) and non-desktop applications; minor bug fixes<br />
% &nbsp; &nbsp;2012-08-06: Fixes for R2012b; added bold style; accept RGB string (non-numeric) style<br />
% &nbsp; &nbsp;2011-11-27: Fixes for R2011b<br />
% &nbsp; &nbsp;2011-08-29: Fix by Danilo (FEX comment) for non-default text colors<br />
% &nbsp; &nbsp;2011-03-04: Performance improvement<br />
% &nbsp; &nbsp;2010-06-27: Fix for R2010a/b; fixed edge case reported by Sharron; CPRINTF with no args runs the demo<br />
% &nbsp; &nbsp;2009-09-28: Fixed edge-case problem reported by Swagat K<br />
% &nbsp; &nbsp;2009-05-28: corrected nargout behavior suggested by Andreas G?b<br />
% &nbsp; &nbsp;2009-05-13: First version posted on &lt;a href=&quot;http://www.mathworks.com/matlabcentral/fileexchange/authors/27420&quot;&gt;MathWorks File Exchange&lt;/a&gt;<br />
%<br />
% See also:<br />
% &nbsp; &nbsp;sprintf, fprintf<br />
% License to use and modify this code is granted freely to all interested, as long as the original author is<br />
% referenced and attributed as such. The original author maintains the right to be solely associated with this work.<br />
% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com<br />
% $Revision: 1.10 $ &nbsp;$Date: 2015/06/24 01:29:18 $<br />
&nbsp; persistent majorVersion minorVersion<br />
&nbsp; if isempty(majorVersion)<br />
&nbsp; &nbsp; &nbsp; %v = version; if str2double(v(1:3)) &lt;= 7.1<br />
&nbsp; &nbsp; &nbsp; %majorVersion = str2double(regexprep(version,&#39;^(\d+).*&#39;,&#39;$1&#39;));<br />
&nbsp; &nbsp; &nbsp; %minorVersion = str2double(regexprep(version,&#39;^\d+\.(\d+).*&#39;,&#39;$1&#39;));<br />
&nbsp; &nbsp; &nbsp; %[a,b,c,d,versionIdStrs]=regexp(version,&#39;^(\d+)\.(\d+).*&#39;); &nbsp;%#ok unused<br />
&nbsp; &nbsp; &nbsp; v = sscanf(version, &#39;%d.&#39;, 2);<br />
&nbsp; &nbsp; &nbsp; majorVersion = v(1); %str2double(versionIdStrs{1}{1});<br />
&nbsp; &nbsp; &nbsp; minorVersion = v(2); %str2double(versionIdStrs{1}{2});<br />
&nbsp; end<br />
&nbsp; % The following is for debug use only:<br />
&nbsp; %global docElement txt el<br />
&nbsp; if ~exist(&#39;el&#39;,&#39;var&#39;) || isempty(el), &nbsp;el=handle([]); &nbsp;end &nbsp;%#ok mlint short-circuit error (&quot;used before defined&quot;)<br />
&nbsp; if nargin&lt;1, showDemo(majorVersion,minorVersion); return; &nbsp;end<br />
&nbsp; if isempty(style), &nbsp;return; &nbsp;end<br />
&nbsp; if all(ishandle(style)) &amp;&amp; length(style)~=3<br />
&nbsp; &nbsp; &nbsp; dumpElement(style);<br />
&nbsp; &nbsp; &nbsp; return;<br />
&nbsp; end<br />
&nbsp; % Process the text string<br />
&nbsp; if nargin&lt;2, format = style; style=&#39;text&#39;; &nbsp;end<br />
&nbsp; %error(nargchk(2, inf, nargin, &#39;struct&#39;));<br />
&nbsp; %str = sprintf(format,varargin{:});<br />
&nbsp; % In compiled mode<br />
&nbsp; try useDesktop = usejava(&#39;desktop&#39;); catch, useDesktop = false; end<br />
&nbsp; if isdeployed | ~useDesktop %#ok&lt;OR2&gt; - for Matlab 6 compatibility<br />
&nbsp; &nbsp; &nbsp; % do not display any formatting - use simple fprintf()<br />
&nbsp; &nbsp; &nbsp; % See: http://undocumentedmatlab.com/blog/bold-color-text-in-the-command-window/#comment-103035<br />
&nbsp; &nbsp; &nbsp; % Also see: https://mail.google.com/mail/u/0/?ui=2&amp;shva=1#all/1390a26e7ef4aa4d<br />
&nbsp; &nbsp; &nbsp; % Also see: https://mail.google.com/mail/u/0/?ui=2&amp;shva=1#all/13a6ed3223333b21<br />
&nbsp; &nbsp; &nbsp; count1 = fprintf(format,varargin{:});<br />
&nbsp; else<br />
&nbsp; &nbsp; &nbsp; % Else (Matlab desktop mode)<br />
&nbsp; &nbsp; &nbsp; % Get the normalized style name and underlining flag<br />
&nbsp; &nbsp; &nbsp; [underlineFlag, boldFlag, style, debugFlag] = processStyleInfo(style);<br />
&nbsp; &nbsp; &nbsp; % Set hyperlinking, if so requested<br />
&nbsp; &nbsp; &nbsp; if underlineFlag<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; format = [&#39;&lt;a href=&quot;&quot;&gt;&#39; format &#39;&lt;/a&gt;&#39;];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Matlab 7.1 R14 (possibly a few newer versions as well?)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % have a bug in rendering consecutive hyperlinks<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % This is fixed by appending a single non-linked space<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if majorVersion &lt; 7 || (majorVersion==7 &amp;&amp; minorVersion &lt;= 1)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; format(end+1) = &#39; &#39;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; % Set bold, if requested and supported (R2011b+)<br />
&nbsp; &nbsp; &nbsp; if boldFlag<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (majorVersion &gt; 7 || minorVersion &gt;= 13)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; format = [&#39;&lt;strong&gt;&#39; format &#39;&lt;/strong&gt;&#39;];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boldFlag = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; % Get the current CW position<br />
&nbsp; &nbsp; &nbsp; cmdWinDoc = com.mathworks.mde.cmdwin.CmdWinDocument.getInstance;<br />
&nbsp; &nbsp; &nbsp; lastPos = cmdWinDoc.getLength;<br />
&nbsp; &nbsp; &nbsp; % If not beginning of line<br />
&nbsp; &nbsp; &nbsp; bolFlag = 0; &nbsp;%#ok<br />
&nbsp; &nbsp; &nbsp; %if docElement.getEndOffset - docElement.getStartOffset &gt; 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Display a hyperlink element in order to force element separation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % (otherwise adjacent elements on the same line will be merged)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if majorVersion&lt;7 || (majorVersion==7 &amp;&amp; minorVersion&lt;13)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ~underlineFlag<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf(&#39;&lt;a href=&quot;&quot;&gt; &lt;/a&gt;&#39;); &nbsp;%fprintf(&#39;&lt;a href=&quot;&quot;&gt; &lt;/a&gt;\b&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif format(end)~=10 &nbsp;% if no newline at end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fprintf(&#39; &#39;); &nbsp;%fprintf(&#39; \b&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %drawnow;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bolFlag = 1;<br />
&nbsp; &nbsp; &nbsp; %end<br />
&nbsp; &nbsp; &nbsp; % Get a handle to the Command Window component<br />
&nbsp; &nbsp; &nbsp; mde = com.mathworks.mde.desk.MLDesktop.getInstance;<br />
&nbsp; &nbsp; &nbsp; cw = mde.getClient(&#39;Command Window&#39;);<br />
&nbsp; &nbsp; &nbsp; % Fix: if command window isn&#39;t defined yet (startup), use standard fprintf()<br />
&nbsp; &nbsp; &nbsp; if (isempty(cw))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;count1 = fprintf(format,varargin{:});<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if nargout<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;count = count1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp; &nbsp; xCmdWndView = cw.getComponent(0).getViewport.getComponent(0);<br />
&nbsp; &nbsp; &nbsp; % Store the CW background color as a special color pref<br />
&nbsp; &nbsp; &nbsp; % This way, if the CW bg color changes (via File/Preferences),&nbsp;<br />
&nbsp; &nbsp; &nbsp; % it will also affect existing rendered strs<br />
&nbsp; &nbsp; &nbsp; com.mathworks.services.Prefs.setColorPref(&#39;CW_BG_Color&#39;,xCmdWndView.getBackground);<br />
&nbsp; &nbsp; &nbsp; % Display the text in the Command Window<br />
&nbsp; &nbsp; &nbsp; % Note: fprintf(2,...) is required in order to add formatting tokens, which<br />
&nbsp; &nbsp; &nbsp; % ^^^^ &nbsp;can then be updated below (no such tokens when outputting to stdout)<br />
&nbsp; &nbsp; &nbsp; count1 = fprintf(2,format,varargin{:});<br />
&nbsp; &nbsp; &nbsp; % Repaint the command window<br />
&nbsp; &nbsp; &nbsp; %awtinvoke(cmdWinDoc,&#39;remove&#39;,lastPos,1); &nbsp; % TODO: find out how to remove the extra &#39;_&#39;<br />
&nbsp; &nbsp; &nbsp; drawnow; &nbsp;% this is necessary for the following to work properly (refer to Evgeny Pr in FEX comment 16/1/2011)<br />
&nbsp; &nbsp; &nbsp; xCmdWndView.repaint;<br />
&nbsp; &nbsp; &nbsp; %hListeners = cmdWinDoc.getDocumentListeners; for idx=1:numel(hListeners), try hListeners(idx).repaint; catch, end, end<br />
&nbsp; &nbsp; &nbsp; docElement = cmdWinDoc.getParagraphElement(lastPos+1);<br />
&nbsp; &nbsp; &nbsp; if majorVersion&lt;7 || (majorVersion==7 &amp;&amp; minorVersion&lt;13)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if bolFlag &amp;&amp; ~underlineFlag<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Set the leading hyperlink space character (&#39;_&#39;) to the bg color, effectively hiding it<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Note: old Matlab versions have a bug in hyperlinks that need to be accounted for...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %disp(&#39; &#39;); dumpElement(docElement)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setElementStyle(docElement,&#39;CW_BG_Color&#39;,1+underlineFlag,majorVersion,minorVersion); %+getUrlsFix(docElement));<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %disp(&#39; &#39;); dumpElement(docElement)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el(end+1) = handle(docElement); &nbsp;% #ok used in debug only<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Fix a problem with some hidden hyperlinks becoming unhidden...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fixHyperlink(docElement);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %dumpElement(docElement);<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; % Get the Document Element(s) corresponding to the latest fprintf operation<br />
&nbsp; &nbsp; &nbsp; while docElement.getStartOffset &lt; cmdWinDoc.getLength<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Set the element style according to the current style<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if debugFlag, dumpElement(docElement); end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; specialFlag = underlineFlag | boldFlag;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setElementStyle(docElement,style,specialFlag,majorVersion,minorVersion);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if debugFlag, dumpElement(docElement); end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docElement2 = cmdWinDoc.getParagraphElement(docElement.getEndOffset+1);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if isequal(docElement,docElement2), &nbsp;break; &nbsp;end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docElement = docElement2;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; if debugFlag, dumpElement(docElement); end<br />
&nbsp; &nbsp; &nbsp; % Force a Command-Window repaint<br />
&nbsp; &nbsp; &nbsp; % Note: this is important in case the rendered str was not &#39;\n&#39;-terminated<br />
&nbsp; &nbsp; &nbsp; xCmdWndView.repaint;<br />
&nbsp; &nbsp; &nbsp; % The following is for debug use only:<br />
&nbsp; &nbsp; &nbsp; el(end+1) = handle(docElement); &nbsp;%#ok used in debug only<br />
&nbsp; &nbsp; &nbsp; %elementStart &nbsp;= docElement.getStartOffset;<br />
&nbsp; &nbsp; &nbsp; %elementLength = docElement.getEndOffset - elementStart;<br />
&nbsp; &nbsp; &nbsp; %txt = cmdWinDoc.getText(elementStart,elementLength);<br />
&nbsp; end<br />
&nbsp; if nargout<br />
&nbsp; &nbsp; &nbsp; count = count1;<br />
&nbsp; end<br />
&nbsp; return; &nbsp;% debug breakpoint<br />
% Process the requested style information<br />
function [underlineFlag,boldFlag,style,debugFlag] = processStyleInfo(style)<br />
&nbsp; underlineFlag = 0;<br />
&nbsp; boldFlag = 0;<br />
&nbsp; debugFlag = 0;<br />
&nbsp; % First, strip out the underline/bold markers<br />
&nbsp; if ischar(style)<br />
&nbsp; &nbsp; &nbsp; % Styles containing &#39;-&#39; or &#39;_&#39; should be underlined (using a no-target hyperlink hack)<br />
&nbsp; &nbsp; &nbsp; %if style(1)==&#39;-&#39;<br />
&nbsp; &nbsp; &nbsp; underlineIdx = (style==&#39;-&#39;) | (style==&#39;_&#39;);<br />
&nbsp; &nbsp; &nbsp; if any(underlineIdx)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; underlineFlag = 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %style = style(2:end);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = style(~underlineIdx);<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; % Check for bold style (only if not underlined)<br />
&nbsp; &nbsp; &nbsp; boldIdx = (style==&#39;*&#39;);<br />
&nbsp; &nbsp; &nbsp; if any(boldIdx)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boldFlag = 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = style(~boldIdx);<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; if underlineFlag &amp;&amp; boldFlag<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; warning(&#39;YMA:cprintf:BoldUnderline&#39;,&#39;Matlab does not support both bold &amp; underline&#39;)<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; % Check for debug mode (style contains &#39;!&#39;)<br />
&nbsp; &nbsp; &nbsp; debugIdx = (style==&#39;!&#39;);<br />
&nbsp; &nbsp; &nbsp; if any(debugIdx)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; debugFlag = 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = style(~debugIdx);<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; % Check if the remaining style sting is a numeric vector<br />
&nbsp; &nbsp; &nbsp; %styleNum = str2num(style); %#ok&lt;ST2NM&gt; &nbsp;% not good because style=&#39;text&#39; is evaled!<br />
&nbsp; &nbsp; &nbsp; %if ~isempty(styleNum)<br />
&nbsp; &nbsp; &nbsp; if any(style==&#39; &#39; | style==&#39;,&#39; | style==&#39;;&#39;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = str2num(style); %#ok&lt;ST2NM&gt;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; end<br />
&nbsp; % Style = valid matlab RGB vector<br />
&nbsp; if isnumeric(style) &amp;&amp; length(style)==3 &amp;&amp; all(style&lt;=1) &amp;&amp; all(abs(style)&gt;=0)<br />
&nbsp; &nbsp; &nbsp; if any(style&lt;0)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; underlineFlag = 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = abs(style);<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; style = getColorStyle(style);<br />
&nbsp; elseif ~ischar(style)<br />
&nbsp; &nbsp; &nbsp; error(&#39;YMA:cprintf:InvalidStyle&#39;,&#39;Invalid style - see help section for a list of valid style values&#39;)<br />
&nbsp; % Style name<br />
&nbsp; else<br />
&nbsp; &nbsp; &nbsp; % Try case-insensitive partial/full match with the accepted style names<br />
&nbsp; &nbsp; &nbsp; matlabStyles = {&#39;Text&#39;,&#39;Keywords&#39;,&#39;Comments&#39;,&#39;Strings&#39;,&#39;UnterminatedStrings&#39;,&#39;SystemCommands&#39;,&#39;Errors&#39;};<br />
&nbsp; &nbsp; &nbsp; validStyles &nbsp;= [matlabStyles, ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;Black&#39;,&#39;Cyan&#39;,&#39;Magenta&#39;,&#39;Blue&#39;,&#39;Green&#39;,&#39;Red&#39;,&#39;Yellow&#39;,&#39;White&#39;, ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#39;Hyperlinks&#39;];<br />
&nbsp; &nbsp; &nbsp; matches = find(strncmpi(style,validStyles,length(style)));<br />
&nbsp; &nbsp; &nbsp; % No match - error<br />
&nbsp; &nbsp; &nbsp; if isempty(matches)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error(&#39;YMA:cprintf:InvalidStyle&#39;,&#39;Invalid style - see help section for a list of valid style values&#39;)<br />
&nbsp; &nbsp; &nbsp; % Too many matches (ambiguous) - error<br />
&nbsp; &nbsp; &nbsp; elseif length(matches) &gt; 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error(&#39;YMA:cprintf:AmbigStyle&#39;,&#39;Ambiguous style name - supply extra characters for uniqueness&#39;)<br />
&nbsp; &nbsp; &nbsp; % Regular text<br />
&nbsp; &nbsp; &nbsp; elseif matches == 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = &#39;ColorsText&#39;; &nbsp;% fixed by Danilo, 29/8/2011<br />
&nbsp; &nbsp; &nbsp; % Highlight preference style name<br />
&nbsp; &nbsp; &nbsp; elseif matches &lt;= length(matlabStyles)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = [&#39;Colors_M_&#39; validStyles{matches}];<br />
&nbsp; &nbsp; &nbsp; % Color name<br />
&nbsp; &nbsp; &nbsp; elseif matches &lt; length(validStyles)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; colors = [0,0,0; 0,1,1; 1,0,1; 0,0,1; 0,1,0; 1,0,0; 1,1,0; 1,1,1];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; requestedColor = colors(matches-length(matlabStyles),:);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = getColorStyle(requestedColor);<br />
&nbsp; &nbsp; &nbsp; % Hyperlink<br />
&nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; style = &#39;Colors_HTML_HTMLLinks&#39;; &nbsp;% CWLink<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; underlineFlag = 1;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; end<br />
% Convert a Matlab RGB vector into a known style name (e.g., &#39;[255,37,0]&#39;)<br />
function styleName = getColorStyle(rgb)<br />
&nbsp; intColor = int32(rgb*255);<br />
&nbsp; javaColor = java.awt.Color(intColor(1), intColor(2), intColor(3));<br />
&nbsp; styleName = sprintf(&#39;[%d,%d,%d]&#39;,intColor);<br />
&nbsp; com.mathworks.services.Prefs.setColorPref(styleName,javaColor);<br />
% Fix a bug in some Matlab versions, where the number of URL segments<br />
% is larger than the number of style segments in a doc element<br />
function delta = getUrlsFix(docElement) &nbsp;%#ok currently unused<br />
&nbsp; tokens = docElement.getAttribute(&#39;SyntaxTokens&#39;);<br />
&nbsp; links &nbsp;= docElement.getAttribute(&#39;LinkStartTokens&#39;);<br />
&nbsp; if length(links) &gt; length(tokens(1))<br />
&nbsp; &nbsp; &nbsp; delta = length(links) &gt; length(tokens(1));<br />
&nbsp; else<br />
&nbsp; &nbsp; &nbsp; delta = 0;<br />
&nbsp; end<br />
% fprintf(2,str) causes all previous &#39;_&#39;s in the line to become red - fix this<br />
function fixHyperlink(docElement)<br />
&nbsp; try<br />
&nbsp; &nbsp; &nbsp; tokens = docElement.getAttribute(&#39;SyntaxTokens&#39;);<br />
&nbsp; &nbsp; &nbsp; urls &nbsp; = docElement.getAttribute(&#39;HtmlLink&#39;);<br />
&nbsp; &nbsp; &nbsp; urls &nbsp; = urls(2);<br />
&nbsp; &nbsp; &nbsp; links &nbsp;= docElement.getAttribute(&#39;LinkStartTokens&#39;);<br />
&nbsp; &nbsp; &nbsp; offsets = tokens(1);<br />
&nbsp; &nbsp; &nbsp; styles &nbsp;= tokens(2);<br />
&nbsp; &nbsp; &nbsp; doc = docElement.getDocument;<br />
&nbsp; &nbsp; &nbsp; % Loop over all segments in this docElement<br />
&nbsp; &nbsp; &nbsp; for idx = 1 : length(offsets)-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % If this is a hyperlink with no URL target and starts with &#39; &#39; and is collored as an error (red)...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if strcmp(styles(idx).char,&#39;Colors_M_Errors&#39;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; character = char(doc.getText(offsets(idx)+docElement.getStartOffset,1));<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if strcmp(character,&#39; &#39;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if isempty(urls(idx)) &amp;&amp; links(idx)==0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Revert the style color to the CW background color (i.e., hide it!)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; styles(idx) = java.lang.String(&#39;CW_BG_Color&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; catch<br />
&nbsp; &nbsp; &nbsp; % never mind...<br />
&nbsp; end<br />
% Set an element to a particular style (color)<br />
function setElementStyle(docElement,style,specialFlag, majorVersion,minorVersion)<br />
&nbsp; %global tokens links urls urlTargets &nbsp;% for debug only<br />
&nbsp; global oldStyles<br />
&nbsp; if nargin&lt;3, &nbsp;specialFlag=0; &nbsp;end<br />
&nbsp; % Set the last Element token to the requested style:<br />
&nbsp; % Colors:<br />
&nbsp; tokens = docElement.getAttribute(&#39;SyntaxTokens&#39;);<br />
&nbsp; try<br />
&nbsp; &nbsp; &nbsp; styles = tokens(2);<br />
&nbsp; &nbsp; &nbsp; oldStyles{end+1} = cell(styles);<br />
&nbsp; &nbsp; &nbsp; % Correct edge case problem<br />
&nbsp; &nbsp; &nbsp; extraInd = double(majorVersion&gt;7 || (majorVersion==7 &amp;&amp; minorVersion&gt;=13)); &nbsp;% =0 for R2011a-, =1 for R2011b+<br />
&nbsp; &nbsp; &nbsp; %{<br />
&nbsp; &nbsp; &nbsp; if ~strcmp(&#39;CWLink&#39;,char(styles(end-hyperlinkFlag))) &amp;&amp; ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strcmp(&#39;CWLink&#39;,char(styles(end-hyperlinkFlag-1)))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;extraInd = 0;%1;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; hyperlinkFlag = ~isempty(strmatch(&#39;CWLink&#39;,tokens(2)));<br />
&nbsp; &nbsp; &nbsp; hyperlinkFlag = 0 + any(cellfun(@(c)(~isempty(c)&amp;&amp;strcmp(c,&#39;CWLink&#39;)),cell(tokens(2))));<br />
&nbsp; &nbsp; &nbsp; %}<br />
&nbsp; &nbsp; &nbsp; jStyle = java.lang.String(style);<br />
&nbsp; &nbsp; &nbsp; if numel(styles)==4 &amp;&amp; isempty(char(styles(2)))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Attempt to fix discoloration issues - NOT SURE THAT THIS IS OK! - 24/6/2015<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; styles(1) = jStyle;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; styles(end-extraInd) = java.lang.String(&#39;&#39;);<br />
&nbsp; &nbsp; &nbsp; styles(end-extraInd-specialFlag) = jStyle; &nbsp;% #ok apparently unused but in reality used by Java<br />
&nbsp; &nbsp; &nbsp; if extraInd<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; styles(end-specialFlag) = jStyle;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; oldStyles{end} = [oldStyles{end} cell(styles)];<br />
&nbsp; catch<br />
&nbsp; &nbsp; &nbsp; % never mind for now<br />
&nbsp; end<br />
&nbsp;&nbsp;<br />
&nbsp; % Underlines (hyperlinks):<br />
&nbsp; %{<br />
&nbsp; links = docElement.getAttribute(&#39;LinkStartTokens&#39;);<br />
&nbsp; if isempty(links)<br />
&nbsp; &nbsp; &nbsp; %docElement.addAttribute(&#39;LinkStartTokens&#39;,repmat(int32(-1),length(tokens(2)),1));<br />
&nbsp; else<br />
&nbsp; &nbsp; &nbsp; %TODO: remove hyperlink by setting the value to -1<br />
&nbsp; end<br />
&nbsp; %}<br />
&nbsp; % Correct empty URLs to be un-hyperlinkable (only underlined)<br />
&nbsp; urls = docElement.getAttribute(&#39;HtmlLink&#39;);<br />
&nbsp; if ~isempty(urls)<br />
&nbsp; &nbsp; &nbsp; urlTargets = urls(2);<br />
&nbsp; &nbsp; &nbsp; for urlIdx = 1 : length(urlTargets)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if urlTargets(urlIdx).length &lt; 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; urlTargets(urlIdx) = []; &nbsp;% &#39;&#39; =&gt; []<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % never mind...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a=1; &nbsp;%#ok used for debug breakpoint...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; end<br />
&nbsp;&nbsp;<br />
&nbsp; % Bold: (currently unused because we cannot modify this immutable int32 numeric array)<br />
&nbsp; %{<br />
&nbsp; try<br />
&nbsp; &nbsp; &nbsp; %hasBold = docElement.isDefined(&#39;BoldStartTokens&#39;);<br />
&nbsp; &nbsp; &nbsp; bolds = docElement.getAttribute(&#39;BoldStartTokens&#39;);<br />
&nbsp; &nbsp; &nbsp; if ~isempty(bolds)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; %docElement.addAttribute(&#39;BoldStartTokens&#39;,repmat(int32(1),length(bolds),1));<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; catch<br />
&nbsp; &nbsp; &nbsp; % never mind - ignore...<br />
&nbsp; &nbsp; &nbsp; a=1; &nbsp;%#ok used for debug breakpoint...<br />
&nbsp; end<br />
&nbsp; %}<br />
&nbsp;&nbsp;<br />
&nbsp; return; &nbsp;% debug breakpoint<br />
% Display information about element(s)<br />
function dumpElement(docElements)<br />
&nbsp; %return;<br />
&nbsp; disp(&#39; &#39;);<br />
&nbsp; numElements = length(docElements);<br />
&nbsp; cmdWinDoc = docElements(1).getDocument;<br />
&nbsp; for elementIdx = 1 : numElements<br />
&nbsp; &nbsp; &nbsp; if numElements &gt; 1, &nbsp;fprintf(&#39;Element #%d:\n&#39;,elementIdx); &nbsp;end<br />
&nbsp; &nbsp; &nbsp; docElement = docElements(elementIdx);<br />
&nbsp; &nbsp; &nbsp; if ~isjava(docElement), &nbsp;docElement = docElement.java; &nbsp;end<br />
&nbsp; &nbsp; &nbsp; %docElement.dump(java.lang.System.out,1)<br />
&nbsp; &nbsp; &nbsp; disp(docElement)<br />
&nbsp; &nbsp; &nbsp; tokens = docElement.getAttribute(&#39;SyntaxTokens&#39;);<br />
&nbsp; &nbsp; &nbsp; if isempty(tokens), &nbsp;continue; &nbsp;end<br />
&nbsp; &nbsp; &nbsp; links = docElement.getAttribute(&#39;LinkStartTokens&#39;);<br />
&nbsp; &nbsp; &nbsp; urls &nbsp;= docElement.getAttribute(&#39;HtmlLink&#39;);<br />
&nbsp; &nbsp; &nbsp; try bolds = docElement.getAttribute(&#39;BoldStartTokens&#39;); catch, bolds = []; end<br />
&nbsp; &nbsp; &nbsp; txt = {};<br />
&nbsp; &nbsp; &nbsp; tokenLengths = tokens(1);<br />
&nbsp; &nbsp; &nbsp; for tokenIdx = 1 : length(tokenLengths)-1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tokenLength = diff(tokenLengths(tokenIdx+[0,1]));<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (tokenLength &lt; 0)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tokenLength = docElement.getEndOffset - docElement.getStartOffset - tokenLengths(tokenIdx);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; txt{tokenIdx} = cmdWinDoc.getText(docElement.getStartOffset+tokenLengths(tokenIdx),tokenLength).char; &nbsp;%#ok<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; lastTokenStartOffset = docElement.getStartOffset + tokenLengths(end);<br />
&nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; txt{end+1} = cmdWinDoc.getText(lastTokenStartOffset, docElement.getEndOffset-lastTokenStartOffset).char; %#ok<br />
&nbsp; &nbsp; &nbsp; catch<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; txt{end+1} = &#39;&#39;; %#ok&lt;AGROW&gt;<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; %cmdWinDoc.uiinspect<br />
&nbsp; &nbsp; &nbsp; %docElement.uiinspect<br />
&nbsp; &nbsp; &nbsp; txt = strrep(txt&#39;,sprintf(&#39;\n&#39;),&#39;\n&#39;);<br />
&nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = [cell(tokens(2)) m2c(tokens(1)) m2c(links) m2c(urls(1)) cell(urls(2)) m2c(bolds) txt];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if elementIdx==1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; disp(&#39; &nbsp; &nbsp;SyntaxTokens(2,1) - LinkStartTokens - HtmlLink(1,2) - BoldStartTokens - txt&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; disp(&#39; &nbsp; &nbsp;==============================================================================&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; catch<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = [cell(tokens(2)) m2c(tokens(1)) m2c(links) txt];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; disp([cell(tokens(2)) m2c(tokens(1)) txt]);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = [m2c(links) m2c(urls(1)) cell(urls(2))];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % Mtlab 7.1 only has urls(1)...<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = [m2c(links) cell(urls)];<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; disp(data)<br />
&nbsp; end<br />
% Utility function to convert matrix =&gt; cell<br />
function cells = m2c(data)<br />
&nbsp; %datasize = size(data); &nbsp;cells = mat2cell(data,ones(1,datasize(1)),ones(1,datasize(2)));<br />
&nbsp; cells = num2cell(data);<br />
% Display the help and demo<br />
function showDemo(majorVersion,minorVersion)<br />
&nbsp; fprintf(&#39;cprintf displays formatted text in the Command Window.\n\n&#39;);<br />
&nbsp; fprintf(&#39;Syntax: count = cprintf(style,format,...); &nbsp;click &lt;a href=&quot;matlab:help cprintf&quot;&gt;here&lt;/a&gt; for details.\n\n&#39;);<br />
&nbsp; url = &#39;http://UndocumentedMatlab.com/blog/cprintf/&#39;;<br />
&nbsp; fprintf([&#39;Technical description: &lt;a href=&quot;&#39; url &#39;&quot;&gt;&#39; url &#39;&lt;/a&gt;\n\n&#39;]);<br />
&nbsp; fprintf(&#39;Demo:\n\n&#39;);<br />
&nbsp; boldFlag = majorVersion&gt;7 || (majorVersion==7 &amp;&amp; minorVersion&gt;=13);<br />
&nbsp; s = [&#39;cprintf(&#39;&#39;text&#39;&#39;, &nbsp; &nbsp;&#39;&#39;regular black text&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(&#39;&#39;hyper&#39;&#39;, &nbsp; &#39;&#39;followed %s&#39;&#39;,&#39;&#39;by&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(&#39;&#39;key&#39;&#39;, &nbsp; &nbsp; &#39;&#39;%d colored&#39;&#39;,&#39; num2str(4+boldFlag) &#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(&#39;&#39;-comment&#39;&#39;,&#39;&#39;&amp; underlined&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(&#39;&#39;err&#39;&#39;, &nbsp; &nbsp; &#39;&#39;elements:\n&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(&#39;&#39;cyan&#39;&#39;, &nbsp; &nbsp;&#39;&#39;cyan&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(&#39;&#39;_green&#39;&#39;, &nbsp;&#39;&#39;underlined green&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf(-[1,0,1], &nbsp;&#39;&#39;underlined magenta&#39;&#39;);&#39; 10 ...<br />
&nbsp; &nbsp; &nbsp; &nbsp;&#39;cprintf([1,0.5,0], &#39;&#39;and multi-\nline orange\n&#39;&#39;);&#39; 10];<br />
&nbsp; &nbsp;if boldFlag<br />
&nbsp; &nbsp; &nbsp; &nbsp;% In R2011b+ the internal bug that causes the need for an extra space<br />
&nbsp; &nbsp; &nbsp; &nbsp;% is apparently fixed, so we must insert the sparator spaces manually...<br />
&nbsp; &nbsp; &nbsp; &nbsp;% On the other hand, 2011b enables *bold* format<br />
&nbsp; &nbsp; &nbsp; &nbsp;s = [s &#39;cprintf(&#39;&#39;*blue&#39;&#39;, &nbsp; &#39;&#39;and *bold* (R2011b+ only)\n&#39;&#39;);&#39; 10];<br />
&nbsp; &nbsp; &nbsp; &nbsp;s = strrep(s, &#39;&#39;&#39;)&#39;,&#39; &#39;&#39;)&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp;s = strrep(s, &#39;&#39;&#39;,5)&#39;,&#39; &#39;&#39;,5)&#39;);<br />
&nbsp; &nbsp; &nbsp; &nbsp;s = strrep(s, &#39;\n &#39;,&#39;\n&#39;);<br />
&nbsp; &nbsp;end<br />
&nbsp; &nbsp;disp(s);<br />
&nbsp; &nbsp;eval(s);<br />
%%%%%%%%%%%%%%%%%%%%%%%%%% TODO %%%%%%%%%%%%%%%%%%%%%%%%%<br />
% - Fix: Remove leading space char (hidden underline &#39;_&#39;)<br />
% - Fix: Find workaround for multi-line quirks/limitations<br />
% - Fix: Non-\n-terminated segments are displayed as black<br />
% - Fix: Check whether the hyperlink fix for 7.1 is also needed on 7.2 etc.<br />
% - Enh: Add font support</p>