New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

help command returns HTML in MEvaluate #29

Open
szhorvat opened this Issue Apr 11, 2013 · 12 comments

Comments

Projects
None yet
3 participants
@szhorvat
Collaborator

szhorvat commented Apr 11, 2013

Since changing MEvaluate to use evalc, the help command returns HTML.

Example:

In[15]:= MEvaluate["help pi"]

Out[15]= " <strong>pi</strong>     3.1415926535897....
    <strong>pi</strong> = 4*atan(1) = imag(log(-1)) = 3.1415926535897....

    Reference page in Help browser
       <a href=\"matlab:doc pi\">doc pi</a>

"

This can be reproduced in MATLAB by running it as matlab -nodesktop then comparing help pi with evalc('help pi')

@szhorvat

This comment has been minimized.

Show comment
Hide comment
@szhorvat

szhorvat Apr 11, 2013

Collaborator

We have two options here:

  • try to get MATLAB not to return HTML (my preference)
  • render the HTML

The MATLAB GUI does the latter:

Screen Shot 2013-04-11 at 11 00 29

Collaborator

szhorvat commented Apr 11, 2013

We have two options here:

  • try to get MATLAB not to return HTML (my preference)
  • render the HTML

The MATLAB GUI does the latter:

Screen Shot 2013-04-11 at 11 00 29

@rsmenon

This comment has been minimized.

Show comment
Hide comment
@rsmenon

rsmenon Apr 11, 2013

Owner

It's not just for help; HTML strings are returned for most errors that include the function name (with a link to the help docs or to the file itself, if it's a custom file). I've reverted MEvaluate, so this issue isn't there right now, but since the plan is to eventually use evalc for MEX, this needs to be figured out.

Owner

rsmenon commented Apr 11, 2013

It's not just for help; HTML strings are returned for most errors that include the function name (with a link to the help docs or to the file itself, if it's a custom file). I've reverted MEvaluate, so this issue isn't there right now, but since the plan is to eventually use evalc for MEX, this needs to be figured out.

@amroamroamro

This comment has been minimized.

Show comment
Hide comment
@amroamroamro

amroamroamro May 5, 2013

There is an undocumented way to explicitly turn off hyperlinks and other HTML goodies:

feature('hotlinks','off')

This value is queried internally by help to decide whether to add HTML tags to the output.

Note: I did not test the above..

There is an undocumented way to explicitly turn off hyperlinks and other HTML goodies:

feature('hotlinks','off')

This value is queried internally by help to decide whether to add HTML tags to the output.

Note: I did not test the above..

@szhorvat

This comment has been minimized.

Show comment
Hide comment
@szhorvat

szhorvat May 5, 2013

Collaborator

Wow, this is very useful information (which support did not give me). It does indeed work, but I need to use 1 and 0 instead of 'off'. However, it doesn't seem to be possible to easily turn it off for good inside evalc. It is possible to turn it off for a single evalc call only though. Here's a command line transcript showing the behaviour:

>> feature('hotlinks')

ans =

     0

>> evalc('feature(''hotlinks'')')

ans =


ans =

     1



>> evalc('feature(''hotlinks'',0)')

ans =

     ''


>> evalc('feature(''hotlinks'')')  

ans =


ans =

     1



>> evalc('feature(''hotlinks'',0); feature(''hotlinks'')')

ans =


ans =

     0



>> 

Since we're already wrapping everything MEvaluateed with some extra code to catch errors, we might as well add feature('hotlinks',0) at the beginning.

Collaborator

szhorvat commented May 5, 2013

Wow, this is very useful information (which support did not give me). It does indeed work, but I need to use 1 and 0 instead of 'off'. However, it doesn't seem to be possible to easily turn it off for good inside evalc. It is possible to turn it off for a single evalc call only though. Here's a command line transcript showing the behaviour:

>> feature('hotlinks')

ans =

     0

>> evalc('feature(''hotlinks'')')

ans =


ans =

     1



>> evalc('feature(''hotlinks'',0)')

ans =

     ''


>> evalc('feature(''hotlinks'')')  

ans =


ans =

     1



>> evalc('feature(''hotlinks'',0); feature(''hotlinks'')')

ans =


ans =

     0



>> 

Since we're already wrapping everything MEvaluateed with some extra code to catch errors, we might as well add feature('hotlinks',0) at the beginning.

@rsmenon

This comment has been minimized.

Show comment
Hide comment
@rsmenon

rsmenon May 5, 2013

Owner

@amroamroamro Thanks a lot! That's very useful and saves us the trouble of having to strip HTML tags from the output (which is always messy).

Owner

rsmenon commented May 5, 2013

@amroamroamro Thanks a lot! That's very useful and saves us the trouble of having to strip HTML tags from the output (which is always messy).

@amroamroamro

This comment has been minimized.

Show comment
Hide comment
@amroamroamro

amroamroamro May 5, 2013

@szhorvat:
hmm you are right, for some reason the value seems to be reset inside evalc... Fortunately this only affect help output, error messages do not contain "jump to line" links, even when using evalc.

Try replacing help with the lower level builtin function helpfunc

@rsmenon: come to think of it, stripping tags might not be so bad here. I know one should never parse HTML using regexp, but the set of HTML that is outputted is fairly simple of the form:

<tag attrib="val">text</tag>

Should be easy to strip HTML and extract the text.

@szhorvat:
hmm you are right, for some reason the value seems to be reset inside evalc... Fortunately this only affect help output, error messages do not contain "jump to line" links, even when using evalc.

Try replacing help with the lower level builtin function helpfunc

@rsmenon: come to think of it, stripping tags might not be so bad here. I know one should never parse HTML using regexp, but the set of HTML that is outputted is fairly simple of the form:

<tag attrib="val">text</tag>

Should be easy to strip HTML and extract the text.

@amroamroamro

This comment has been minimized.

Show comment
Hide comment
@amroamroamro

amroamroamro May 5, 2013

Not exactly related to the issue, but you mentioned wrapping evaluated strings in extra code to catch errors.

Now I haven't looked at the source code yet, but let me share another less-known trick; eval and evalc take a second input that is executed only when the evaluation errors in the first:

isError = false;
evalc('nonexistent', 'isError = true;')

maybe this pattern could be used in your code..

Not exactly related to the issue, but you mentioned wrapping evaluated strings in extra code to catch errors.

Now I haven't looked at the source code yet, but let me share another less-known trick; eval and evalc take a second input that is executed only when the evaluation errors in the first:

isError = false;
evalc('nonexistent', 'isError = true;')

maybe this pattern could be used in your code..

@szhorvat

This comment has been minimized.

Show comment
Hide comment
@szhorvat

szhorvat May 5, 2013

Collaborator

@amroamroamro Thanks! This does look very useful indeed. This will all become very relevant when we switch to the MEX interface (instead of the Engine interface). Perhaps we could have a chat sometime about how we're planning to do this. I'd love to listen to your opinion! (freenode or SO chat or something else)

Collaborator

szhorvat commented May 5, 2013

@amroamroamro Thanks! This does look very useful indeed. This will all become very relevant when we switch to the MEX interface (instead of the Engine interface). Perhaps we could have a chat sometime about how we're planning to do this. I'd love to listen to your opinion! (freenode or SO chat or something else)

@amroamroamro

This comment has been minimized.

Show comment
Hide comment
@amroamroamro

amroamroamro May 5, 2013

@szhorvat sure i just joined ##matlab on freenode. you'll find me on the top the list :)

@szhorvat sure i just joined ##matlab on freenode. you'll find me on the top the list :)

@szhorvat

This comment has been minimized.

Show comment
Hide comment
@szhorvat

szhorvat Jun 12, 2014

Collaborator

With work having started on the MEX version, this issue is now more serious. It's most annoying in error messages.

Observation:

Right now we use getReport() to extract the message string. If MATLAB is run as matlab -nodesktop, it getReport() won't return any HTML in the message string.

However, help still does.

Collaborator

szhorvat commented Jun 12, 2014

With work having started on the MEX version, this issue is now more serious. It's most annoying in error messages.

Observation:

Right now we use getReport() to extract the message string. If MATLAB is run as matlab -nodesktop, it getReport() won't return any HTML in the message string.

However, help still does.

@amroamroamro

This comment has been minimized.

Show comment
Hide comment
@amroamroamro

amroamroamro Jun 13, 2014

getReport() has an explicit option to turn off hyperlinks, regardless of how MATLAB was started:

try
    %...
catch ME
    errmsg = getReport(ME, 'extended', 'hyperlinks','off');
    disp(errmsg)
end

getReport() has an explicit option to turn off hyperlinks, regardless of how MATLAB was started:

try
    %...
catch ME
    errmsg = getReport(ME, 'extended', 'hyperlinks','off');
    disp(errmsg)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment