Add implementation of ducksel.xyz/prop/usernames
This commit is contained in:
parent
6bb66e3b88
commit
6548d97be8
4 changed files with 237 additions and 8 deletions
117
website/_plugins/anyat.rb
Normal file
117
website/_plugins/anyat.rb
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
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
|
||||
elif 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue