Hyperlinks in JSQMessagesViewController messages - jsqmessagesviewcontroller

I'm using the JSQMessages framework which is super awesome but I'm trying to enable hyperlinks in both the sent and received text messages - essentially i want to apply a find and replace system where certain words are replaced with pre determined hyperlinks, for example the word "stackoverflow" would turn into a hyperlink to stackoverflow when the user presses the send message button. The message receiver would then receive the hyperlink.
I have the find and replace system working fine however I'm struggling with the hyperlinks. As far as I can tell there doesn't seem to be any way to add hyperlinks to the messages as the "text" message element used to pass execute the message is an NSString and therefore cannot have a url attributed to it. However I hope I'm wrong, are hyperlinks, i.e. a word that links/executes a url when it's tapped, in text messages possible? If so what would be the recommended approach?
Thanks,
Matt

And for Swift 2.0 :
let attributes: [String:AnyObject] = [NSForegroundColorAttributeName:UIColor.redColor(), NSUnderlineStyleAttributeName: 1]
cell.textView!.linkTextAttributes = attributes

Please use following code in collectionView cellForItemAtIndexPath
Activate the data indicator as well..
cell.textView.dataDetectorTypes=UIDataDetectorTypeAll;
cell.textView.linkTextAttributes = #{ NSForegroundColorAttributeName : [UIColor jsq_messageBubbleBlueColor],
NSUnderlineStyleAttributeName : #(NSUnderlineStyleNone | NSUnderlineStyleNone) };

Related

Issues trying to use/apply event handler on specific html element

I would like some advice on how to specify the element for certain event handler. I'm trying to change the color on a paragraph when I click on it but it change the color regardless of where I click on the browser.
function onmouseA(){
document.getElementById("test").style.color = "#C5D9FF";
}
document.onmousedown = onmouseA;
I actually did specify the with the id="test", but it doesn't work properly, need some advice, thanks.

Xamarin.Forms Accessibilty VoiceReader

Quick question.
When it comes to Xamarin Forms, I noticed that if there is an alert called from the ViewModel
e.g:
DisplayAlertAsync("Title","Message", "Ok");
That the voice assistant only auto reads the first parameter of DisplayAlertAsync ("title") and does not auto-advance to the following parameters.
So, a temporary solution I did was concatenate the 1st and 2nd parameters into the 2nd parameter, so that VoiceReader auto reads both the title and message for accessibility users.
e.g:
DisplayAlertAsync("" ,"Title"+ "\n"+ Message", "Ok");
Is there a way to keep the traditional DisplayAlertAsync("Title","Message", "Ok"); parameter assignment, and have VoiceReader auto advance to the following parameters?
What you are looking at is expected behavior. Since Xamarin Forms uses Native APIs, so the alert dialog in the native platforms also does the same thing- Whenever you open a new page/alert, it should read the Title of that view.
For the most part, what you want to keep an eye out for is images & icons, you have to override the description of those items.
Q. Is there a way to keep the traditional DisplayAlertAsync("Title","Message", "Ok"); parameter assignment, and have VoiceOver/TalkBack auto advance to the following parameters?
A. No there isn't, you would have to create your own custom renderer if you want the reader to read everything.

macOS Apple Help Authoring - Anchors

I'm trying to make an Apple Help book for my macOS app that I'm ready to release. However, I am trying to make anchors work in my HTML. By Apple's definition:
"Anchors allow you to uniquely identify topics in your help book. When
a user follows a link to an anchor, Help Viewer loads the page
containing the anchor. ... You can also use anchors to load an
anchored page from within your application by calling the the
NSHelpManager method openHelpAnchor:inBook: ..."
Example from Apple: <a name="ArrivalTimesUsingStopID"></a>
In my Apple, I have an NSAlert which has the following code to display the help button so that when you click on it, it opens the specified anchor string.
alert.showsHelp = true
alert.helpAnchor = NSHelpManager.AnchorName(stringLiteral: "ArrivalTimesUsingStopID")
Running the code does display the help button and Mac Help does open, but to an error saying that the specified content cannot be found. Not sure why the anchors aren't working because I can access the Help Book if I go to the Help menu and open it from there.
Furthermore, Apple's document states:
The NSAlert, SFChooseIdentityPanel, SFCertificatePanel classes provide
help buttons for dialogs. To display such a help button and link it to
an anchor in your help book, use the methods setShowsHelp: and
setHelpAnchor: in those classes.
and the documentation for these properties in NSAlert state:
-setShowsHelp:YES adds a help button to the alert panel. When the help button is pressed, the delegate is first consulted. If the delegate
does not implement alertShowHelp: or returns NO, then -[NSHelpManager
openHelpAnchor:inBook:] is called with a nil book and the anchor
specified by -setHelpAnchor:, if any. An exception will be raised if
the delegate returns NO and there is no help anchor set.
...so I know that I am using these two properly.
I also understand that I need to create a .helpindex file every time I update my Apple Help book HTML documents. I'm using "Help Indexer.app" which is in the Additional Xcode Tools on developer.apple.com. I make sure that:
I have the option set to index all anchors.
Any HTML page with an anchor has <meta name="ROBOTS" content="ANCHORS"> in the header so anchors are indexed.
My Apple Help book plist file correctly points to the .helpindex file created by "Help Indexer.app".
But even with all of this, I cannot get it to open the Apple Help book to the correct anchor or even the Title page of my Apple Help book.
I've read
https://developer.apple.com/library/archive/documentation/Carbon/Conceptual/ProvidingUserAssitAppleHelp/user_help_intro/user_assistance_intro.html#//apple_ref/doc/uid/TP30000903-CH204-CHDIDJFE
from cover to cover multiple times and I cannot find a solution or anywhere online.
I've also tried opening it manually, but it just opens to the same error saying the specified content couldn't be found with the following code:
let bookName = Bundle.main.object(forInfoDictionaryKey: "CFBundleHelpBookName") as! String
NSHelpManager.shared.openHelpAnchor("ArrivalTimesUsingStopID", inBook: bookName)
Using nil for the inBook parameter doesn't work either:
NSHelpManager.shared.openHelpAnchor("ArrivalTimesUsingStopID", inBook: nil)
Any ideas?
I'm not sure if this is the answer at this point, but it is an answer and one that seems to do the trick. I wasn't able to get the helpAnchor in the Alert to work, but using the help delegate, the method outlined below works.
I started out my day trying to open the Help Book to a simple anchor. I'm sure this used to work using the NSHelpManager in the past, but it does not appear to in recent versions of the OS.
Watching the console while opening my under-development App's help book resulted in the following:
Opening URL help:openbook=%22com.ClueTrust.Cartographica.help*1.5.2d1%22 with application <FSNode 0x6000006a1b40> { isDir = y, path = '/System/Library/CoreServices/HelpViewer.app' }
Opening to my anchor using NSHelpManager resulted in:
Opening URL help:anchor=SpatialJoinOperation%20bookID=%22com.ClueTrust.Cartographica.help%22%20appID=%22com.ClueTrust.Cartographica%22 with application <FSNode 0x6000006a8260> { isDir = y, path = '/System/Library/CoreServices/HelpViewer.app' }
And, it didn't result in opening to my anchor.
I tried appending the *<version> to my URL:
Opening URL help:anchor=SpatialJoinOperation%20bookID=%22com.ClueTrust.Cartographica.help*1.5.2d1%22%20appID=%22com.ClueTrust.Cartographica%22 with application <FSNode 0x600000682c20> { isDir = y, path = '/System/Library/CoreServices/HelpViewer.app'
Looking deeper into the Console, though, I noticed that this is definitely triggering a network request and there's an unsupported URL coming back.
It's not clear to me if help:anchor=... does not function any longer, but I did find a relatively easy, but annoying way around the problem.
Anchors within help will definitely be opened when using a help: URL that is formatted like a file: URL and contains an anchor; and they will open to the correct anchor location.
This requires locating the specific help book and HTML file so that you can specify precisely where to open.
NSURL *helpBookURL = [NSBundle.mainBundle URLForResource:#"Cartographica" withExtension:#"help"];
NSBundle *helpBundle = [NSBundle bundleWithURL:helpBookURL];
NSURL *helpPageURL = [helpBundle URLForResource:#"Spatial_Join" withExtension:#"html"];
NSURLComponents *urlParts = [NSURLComponents componentsWithURL:helpPageURL resolvingAgainstBaseURL:NO];
urlParts.scheme=#"help";
urlParts.fragment=#"SpatialJoinOperation";
NSURL *finalHelpURL = urlParts.URL;
[NSWorkspace.sharedWorkspace openURL:finalHelpURL];
Basically:
Get the URL for the help book (need to do this in a way that gets it from the resource path, hence we're using NSBundle)
Locate the page containing the reference based on prior knowledge (in this case Spatial_Join.html is our filename, so we have the bundle look for it by name and extension.
Use the NSURLComponents interface to mutate the NSURL by changing the scheme from file to help and adding our achor in the fragment.
Finally, open the newly-created URL
It's not pretty, but it does appear to be effective and safe, at least in a non-sandboxed macOS App under 10.15.
Note that I could make some assumptions here about the help book name, but for illustration purposes this seems more clear, and because of the way resources work, it's not clear that those assumptions about the names would be appropriate in all situations.
My final result was this helper method:
- (void)openHelpPage:(NSString*)pageName anchor:(NSString * _Nullable)anchor bookName:(NSString * _Nullable)bookName
{
NSURL *helpBookURL = [NSBundle.mainBundle URLForResource:bookName withExtension:#"help"];
NSBundle *helpBundle = [NSBundle bundleWithURL:helpBookURL];
NSURL *helpPageURL = [helpBundle URLForResource:pageName withExtension:#"html"];
NSURLComponents *urlParts = [NSURLComponents componentsWithURL:helpPageURL resolvingAgainstBaseURL:NO];
urlParts.scheme=#"help";
if (anchor)
urlParts.fragment=anchor;
NSURL *finalHelpURL = urlParts.URL;
[NSWorkspace.sharedWorkspace openURL:finalHelpURL];
}
Call site syntax is:
// to specific anchor on a page
[self openHelpPage: #"Spatial_Join" anchor: #"SpatialJoinOperation" helpBook: nil];
// to specific page
[self openHelpPage: #"Spatial_Join" anchor: nil helpBook: nil];
I tried getting the help bundle with [NSBundle bundleWithIdentifier:] using the help bundle ID, but that returned nil. However, [NSBundle URLForResource:withExtension] will take a nil argument for the resourceName and get the first item that matches the extension. In my case (and I believe many) there is only one help resource, so this allows for a method that doesn't require knowledge of the Application's help book name.
I was finally able to get this working in a sandboxed application.
If you're using a Help button directly, you can use something like:
#IBAction func helpButtonAction(_ sender: Any)
{
if let bookName = Bundle.main.object(forInfoDictionaryKey: "CFBundleHelpBookName") as? String {
NSHelpManager.shared.openHelpAnchor("MY_ANCHOR_HERE", inBook: bookName)
}
}
If you're using an NSAlert(), you can use its help button with an anchor this way:
let alert = NSAlert()
...
alert.showsHelp = true
alert.helpAnchor = NSHelpManager.AnchorName("MY_ANCHOR_HERE")
A few things I learned the hard way:
Make sure your HTML page for your Help Book has a the proper setup for an anchor with:
<meta name="robots" content="anchors"> in the <head> section as well as a proper header tag in the fashion of:
<a name="MY_ANCHOR_HERE"></a> in your <body> section.
Make sure you use "Help Indexer.app" to index your Help Book. I found that it will not work unless you index your Help Book using this app. This app can be downloaded from developer.apple.com under More Downloads. They usually release a new version with every Xcode update. You want to look for "Additional Tools" and the specific indexer app will be located in
Additional Tools > Utilities > Help Indexer.app
Additionally, macOS does not like when you have multiple Help Books. This means, multiple copies of your Application on your Mac no matter where they reside. This could be in your Debug folder and your Application folder as your most common places. I found that deleting the copy in my Applications folder usually helps macOS not get confused when opening a Help Book. I have also found it to open up older versions of the Help Book so it's best to make sure you only have once copy of your app on your Mac when debugging help books.
But other than that, they should open just fine with simply an Anchor string and a few lines of code depending on how you display your Help button!

How to open and handle richtext editor in javascript in sitecore 6.5?

I've been working on a custom field, which contains a list.
I have to be able to edit the selected item on the list in a richtext editor. (this is the only missing part).
I've read the topic on opening from c# code Opening Rich Text Editor in custom field of Sitecore Content Editor .
This works nice for the "add" button, since i have to open the RTE empty(with default text...), but not for the Edit button.
My aproaches are:
Somehow in the Edit button's message field list:edit(id=$Target) pass the selected index (like list:edit(id=$Target,index=$SelectedIndex), but i don't know how to populate $SelectedIndex
Somehow in the overridden HandleMessage method get the list's selected index. I'm able to get the selected value Sitecore.Context.ClientPage.ClientRequest.Form[ID of list], but thats alone not much of a help, since i won't be able to decide which one to edit if two listitem equals.
Do the richtext editor opening and handling fully in javascript. As i saw at some script in content editor, i tried to do that, but i can't understand it clearly:
richtext editor url:
var page = "/sitecore/shell/Controls/Rich Text Editor/EditorPage.aspx";
some params :
var params = "?da=core&id&ed=" + id + "&vs=1&la=en&fld=" + id + "&so&di=0&hdl=H14074466&us=sitecore%5cadmin&mo";
and the part where i'm not sure:
var result = scForm.browser.showModalDialog(page + params, new Array(window), "dialogHeight:650px; dialogWidth:900px;");
This way the RTE opens as expected (i guess i could get the selected index from javascript and pass it as a parameter later). However when i click ok, i get exception from EditorPage.js saveRichText function: Cannot read property 'ownerDocument' of null. Am i missing some parameter?
Either of the three aproaches is fine for me(also i'm open for new better ones) as soon as i'm able to do it.
Thanks in advance!
Tamas
I was able to enter some javascript into the message:
list:Edit(id=$Target,index='+document.getElementById(ID of the select using $Target ).selectedIndex+')
this way i got the index in HandleMessage.
I'm waiting for better solutions now.

Prefill email content with NSButton hyperlink

I was wondering how I could, or if it's even possible to, prefill an email message's content when you click an NSButton, so far I open up the default email client but I want to prefill the body of the email and was wondering how I'd do that. Below is the current code:
-(IBAction)openEmail:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:#"mailto:domain#domain.com"]];
}
The "mailto" URI scheme supports this: http://en.wikipedia.org/wiki/Mailto
Send email
Rather than forcing a user out of your app, why don't you use MFMailComposeViewController to present the standard message composition window?
MFMailComposeViewController conveniently also has methods to set the message body and just about anything else you would like.
UPDATE: Oops, I misread "NSButton" as "UIButton" - what I wrote above only applies to iOS. Using the mailto: additions is the correct approach AFAIK on OS X.

Resources