My document contains two kinds of hyperlinks:
- Links to bookmarks (in the same document)
- Links to web pages
I want these links to display differently. Since they are considered the same (why? we could have had a nice hierarchy of link styles), I want to define a new style, and I will have to apply it manually to every bookmark link. I called this style “Reference”:
This way I will have web links with the default blue, and bookmark links with the cute dotted underline. This means I don’t want to edit the default style. I want to apply a different style to some of the links.
So I double-clicked on my “Reference” style and LO says the style has been applied. But however I look, nothing changed.
.
How can I apply the custom style to my internal links?
EDIT The problem has been solved by resetting the default Internet link
style to Standard
(see @ajlittoz 's answer), and creating two new styles : DocLink
(black + dotted underline) and WebLink
(blue + single underline).
Following Jim K’s advice, I also wrote a macro to automate the application of those styles. This is my first time writing a macro so it took me a little while to use correctly Basic and the LibreOffice API. Full source code (I don’t know how to use syntax highlighting):
' Append an item to an Object array '
Private Sub append(array() as Object, item as Object)
ReDim Preserve array(UBound(array) + 1)
array(UBound(array)) = item
End Sub
' Find all links in the given document fragment '
' From: https://stackoverflow.com/questions/37611030 '
Private Sub findLinks(fragment as Object, links as Object)
Dim portions as Object
Dim portion as Object
Select Case fragment.implementationName
Case "SwXParagraph": ' Paragraphs are enumerable '
Dim msg as String
portions = fragment.createEnumeration
While portions.hasMoreElements
portion = portions.nextElement
If Len(portion.HyperLinkURL) > 0 Then
' Ignore internal LibreOffice links (#__) '
If Left(portion.HyperLinkURL, 3) <> "#__" Then
append(links, portion)
End If
End If
Wend
Case "SwXTextTable": ' Tables have cells '
Dim cells as Object
Dim cell as Object
Set cells = fragment.getCellNames()
For i = LBound(cells) to UBound(cells)
Set cell = fragment.getCellByName(cells(i))
Set portions = cell.createEnumeration()
While portions.hasMoreElements
findLinks(portions.nextElement, links)
Wend
Next
End Select
End Sub
' Find all links (document & internet links) in the document '
' and apply a custom style depending on the link type '
Sub AutoLinkStyle
' I suppose in Writer "ThisComponent" is an instance of '
' "com.sun.star.text.TextDocument". Is ".Text" an alias '
' for ".getText()"? I couldnt find docs explaining it '
Dim document as Object
Dim fragments as Object
Dim links() as Object
Set document = ThisComponent
Set fragments = document.Text.createEnumeration()
' Get a list of all links in the document '
While fragments.hasMoreElements
findLinks(fragments.nextElement, links)
Wend
' Apply custom styles '
Dim msg as String
For i = LBound(links) to UBound(links)
If Left(links(i).HyperLinkURL, 1) = "#" Then
links(i).CharStyleName = "DocLink"
Else
links(i).CharStyleName = "WebLink"
End If
Next
End Sub