TO_REGEXP = /^to:\s+/i REPLY_REGEXP = /^inreplyto:\s+/i ATTACH_REGEXP = /^attach:\s+/i URL_REGEXP = %r{\Ahttps?://\S+\Z} MENTION_REGEXP = /\A@\w+@\S+\Z/ HASHTAG_REGEXP = /\A#\w+\Z/ post '/create' do protected! request.body.rewind # in case someone already read it to = [] inReplyTo = '' content = [] tag = [] attachment = [] request.body.read.each_line do |line| line.chomp! case line when TO_REGEXP line.sub(TO_REGEXP, '').split(/\s+/).each do |word| case word when 'public' to << 'https://www.w3.org/ns/activitystreams#Public' to << FOLLOWERS_URL when MENTION_REGEXP href = actor(word) m = { 'type' => 'Mention', 'href' => href, 'name' => word } to << href unless to.include? href tag << m unless tag.include? m when URL_REGEXP m = { 'type' => 'Mention', 'href' => word, 'name' => mention(word) } to << word unless to.include? word tag << m unless tag.include? m end end when REPLY_REGEXP inReplyTo = line.sub(REPLY_REGEXP, '') when ATTACH_REGEXP url, description = line.sub(ATTACH_REGEXP, '').split(/\s+/, 2) attachment << { 'type' => 'Document', 'mediaType' => media_type(url), # TODO: query with curl HEAD 'url' => url, 'name' => description } when '' content << '

' else # create links content << line.split(/\s+/).collect do |word| case word when HASHTAG_REGEXP tag_url = File.join('https://social.pdp8.info', 'tags', word.sub('#', '')) tag << { 'type' => 'Hashtag', 'href' => tag_url, 'name' => word } "#{word}" when MENTION_REGEXP actor = actor(word) m = { 'type' => 'Mention', 'href' => actor, 'name' => word } tag << m unless tag.include? m to << actor unless to.include? actor "#{word}" when URL_REGEXP "#{word}" else word end end.join(' ') end end object = { 'to' => to, 'type' => 'Note', 'attributedTo' => ACTOR, 'content' => "#{content.join('')}" } object['inReplyTo'] = inReplyTo unless inReplyTo.empty? object['attachment'] = attachment unless attachment.empty? object['tag'] = tag unless tag.empty? jj object create_activity 'Create', object, to outbox_html('create') 200 end