website/website/_plugins/anyat.rb
2025-07-23 14:15:37 -05:00

117 lines
No EOL
3.9 KiB
Ruby

module Jekyll
class AnyAt < Jekyll::Generator
safe true
priority :low
def generate(site)
# Load configuration from data file
config = site.data['anyat'] || {}
return unless config['enabled']
# Process all pages and posts
combined_applicable = []
if config['settings']['process_pages']
combined_applicable += site.pages
end
if config['settings']['process_posts']
combined_applicable += site.posts.docs
end
if config['settings']['process_collections'] == true
combined_applicable += site.collections.values.map(&:docs).flatten
elsif config['settings']['process_collections'].is_a?(Array)
for collection_name in config['settings']['process_collections']
if site.collections.key?(collection_name)
combined_applicable += site.collections[collection_name].docs
else
# logger not installed
# Jekyll.logger.warn "AnyAt: Collection '#{collection_name}' not found, skipping."
end
end
end
for page in combined_applicable
next unless page.content
# Apply the transformation to the content
page.content = process_anyat(page.content, config)
end
end
private
def process_anyat(input, config)
return input unless input.is_a?(String)
# Optional ! for no conversion (use double bang to show how to use bang)
# optional = or $ for raw link or raw username
# platform@username@domain
# or platform@username with domain N/A or default domain
# Example: twitter@user, email@john@example.com
pattern = /(?<noconvert>!?[=$]?)(?<platform>[a-z0-9\-]+)@(?<username>[a-zA-Z0-9_\.\-]*[a-zA-Z0-9_\-])(?:@(?<domain>[a-zA-Z0-9\.\-]*[a-zA-Z0-9\-]))?(?=\W|$)/
linkers = config['linkers'] || {}
return input.gsub(pattern) do |match|
noconvert = $~[:noconvert] || ''
if noconvert && noconvert[0] == '!'
# If the match starts with '!', do not convert
# Remove the '!' and hand back the raw text
match_text = "#{$~[:noconvert][1..-1]}#{$~[:platform]}@#{$~[:username]}"
if $~[:domain]
match_text += "@#{$~[:domain]}"
end
next match_text
end
platform = $~[:platform]
username = $~[:username]
domain = $~[:domain]
unless linkers.key?(platform)
next "#{match} ^%^ Platform not supported ^%^"
end
# Platform info - resolve aliases
pi = linkers[platform]
n=[]
while pi.is_a?(String)
if n.include?(pi)
next "#{match} ^%^ Circular alias detected for '#{platform}' ^%^"
end
n << pi
alias_target = pi.downcase.gsub(/[^a-z0-9\-]/, '') # Normalize alias target
if linkers.key?(alias_target)
pi = linkers[alias_target]
else
next "#{match} ^%^ Alias target '#{alias_target}' not found ^%^"
end
end
# Substitutions
if domain && !domain.empty?
url = (pi[ 'link_domain' ] || pi[ 'link' ]).gsub('^u', username).gsub('^d', domain)
text = (pi['format_domain'] || pi['format']).gsub('^u', username).gsub('^d', domain)
elsif pi['domain']
domain = pi['domain']
url = (pi[ 'link' ] || pi[ 'link_domain' ]).gsub('^u', username).gsub('^d', domain)
text = (pi['format'] || pi['format_domain']).gsub('^u', username).gsub('^d', domain)
else
url = pi[ 'link' ].gsub('^u', username)
text = pi['format'].gsub('^u', username)
end
if noconvert && noconvert[-1] == '='
next url
elsif noconvert && noconvert[-1] == '$'
next text
end
# Link to url
next "<a href=\"#{url}\" class=\"anyat_badge badge-#{platform}\" target=\"_blank\">#{pi['badge']} #{text}</a>"
end
end
end
end