1. Implement a custom token
You can try to implement a custom token for that if you want to go on the safe way. Here is a great post how you can implement that.
2. Implement a custom field
Possible solution could to use a custom field which is inherited from the default General Link field. Which is returning back the current item if it is empty. Here you can find how to implement a custom field.
You can implement your own class, the following implementation is just a prototype but I think you need something similar.
using Sitecore.Diagnostics;
using Sitecore.Shell.Applications.ContentEditor;
namespace YourProject
{
public class LinkWithDefault : Link
{
/// <summary>
/// This is copied from Sitecore.Shell.Applications.ContentEditor.Link
/// </summary>
private XmlValue XmlValue
{
get
{
return new XmlValue(GetViewStateString("XmlValue"), "link");
}
set
{
Assert.ArgumentNotNull(value, "value");
this.SetViewStateString("XmlValue", value.ToString());
}
}
public override string GetValue()
{
var xmlValue = this.XmlValue;
if (!string.IsNullOrWhiteSpace(xmlValue.ToString()))
{
return xmlValue.ToString();
}
xmlValue.SetAttribute("id", Sitecore.Context.Item.ID.ToString());
return xmlValue.ToString();
}
}
}
To include this as a new custom field you can follow the instructions here: https://www.sitecore.net/company/blog/474/creating-a-custom-sitecore-field-4246