## Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements. See the NOTICE file distributed with# this work for additional information regarding copyright ownership.# The ASF licenses this file to You under the Apache License, Version 2.0# (the "License"); you may not use this file except in compliance with# the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#require 'liquid'require 'rouge'module Jekyllclass IncludeExampleTag < Liquid::Tagdef initialize(tag_name, markup, tokens)@markup = markupsuperenddef render(context)site = context.registers[:site]config_dir = '../examples/src/main'@code_dir = File.join(site.source, config_dir)clean_markup = @markup.stripparts = clean_markup.strip.split(' ')if parts.length > 1 then@snippet_label = ':' + parts[0]snippet_file = parts[1]else@snippet_label = ''snippet_file = parts[0]end@file = File.join(@code_dir, snippet_file)@lang = snippet_file.split('.').lastbegincode = File.open(@file).read.encode("UTF-8")rescue => e# We need to explicitly exit on exceptions here because Jekyll will silently swallow# them, leading to silent build failures (see https://github.com/jekyll/jekyll/issues/5104)puts(e)puts(e.backtrace)exit 1endcode = select_lines(code).stripformatter = Rouge::Formatters::HTMLPygments.new(Rouge::Formatters::HTML.new)lexer = Rouge::Lexer.find(@lang)rendered_code = formatter.format(lexer.lex(code))hint = "<div><small>Find full example code at " \"\"examples/src/main/#{snippet_file}\" in the Spark repo.</small></div>"rendered_code + hintend# Trim the code block so as to have the same indentation, regardless of their positions in the# code file.def trim_codeblock(lines)# Select the minimum indentation of the current code block.min_start_spaces = lines.select { |l| l.strip.size !=0 }.map { |l| l[/\A */].size }.minlines.map { |l| l.strip.size == 0 ? l : l[min_start_spaces .. -1] }end# Select lines according to labels in code. Currently we use "$example on$" and "$example off$"# as labels. Note that code blocks identified by the labels should not overlap.def select_lines(code)lines = code.each_line.to_a# Select the array of start labels from code.startIndices = lines.each_with_index.select { |l, i| l.include? "$example on#{@snippet_label}$" }.map { |l, i| i }# Select the array of end labels from code.endIndices = lines.each_with_index.select { |l, i| l.include? "$example off#{@snippet_label}$" }.map { |l, i| i }raise "Start indices amount is not equal to end indices amount, see #{@file}." \unless startIndices.size == endIndices.sizeraise "No code is selected by include_example, see #{@file}." \if startIndices.size == 0# Select and join code blocks together, with a space line between each of two continuous# blocks.lastIndex = -1result = ""startIndices.zip(endIndices).each do |start, endline|raise "Overlapping between two example code blocks are not allowed, see #{@file}." \if start <= lastIndexraise "$example on$ should not be in the same line with $example off,ドル see #{@file}." \if start == endlinelastIndex = endlinerange = Range.new(start + 1, endline - 1)trimmed = trim_codeblock(lines[range])# Filter out possible example tags of overlapped labels.tags_filtered = trimmed.select { |l| !l.include? '$example ' }result += tags_filtered.joinresult += "\n"endresultendendendLiquid::Template.register_tag('include_example', Jekyll::IncludeExampleTag)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型