如何在Ruby中附加到文件中的特定位置?

时间:2017-03-01 16:34:42

标签: html ruby

我正在尝试创建一个网页,以便能够在线销售商品,并在创建文件以自动创建新商品时遇到问题。我正在尝试使用Ruby暂时取消文件的末尾,将正确的行追加到文件中,然后将结尾放回去。到目前为止,我的代码是

puts "what is the item number?"
item_num = gets.chomp
puts "what is item description?(not optional)"
desc = gets.chomp

file_text = File.read("template.html")

file_text = file_text.gsub(/Item#/, "Item #{item_num.to_s}")
file_text = file_text.gsub(/<img class="item-image" src="">/, '<img class="item-image" src="' + item_num.to_s + '">')
file_text = file_text.gsub(/Item-desc/, desc)
puts file_text

file_create = File.new(item_num.to_s + ".html", "w")
file_create.puts(file_text)
file_create.close

item_page_end = '

                    </div>
                    <div class="col-sm-12">
                        <div class="headings">
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="footer" style="width=80%"/>
        <script src="../js/jquery-3.1.1.js"></script>
        <script src="../js/bootstrap.min.js"></script>
        <script src="../js/owl.carousel.min.js"></script>
        <script src="https://use.fontawesome.com/55b73bf748.js"></script>
        <script src="../js/jquery.magnific-popup.js"></script>
        <script src="../js/script.js"></script>
    </body>
</html>
'

file_to_update = File.read("item_page.html")
file_to_update = file_to_update.gsub(item_page_end, "")
file_to_update = File.open("item_page.html", "a+")
file_to_update.puts( '<p class="col-md-4"><img src="../images/' + item_num + '.jpg" />Item' + item_num + '</p>')
file_to_update.puts(item_page_end)
sleep 10

HTML文件是:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>SHS Metal | Store</title>
        <link rel="shortcut icon" type="image/x-icon" href="../images/logo-icon.png"/>

        <link href="../css/bootstrap.min.css" rel="stylesheet">
        <link href="../css/bootstrap-theme.min.css" rel="stylesheet">

        <link href="../css/owl.carousel.css" rel="stylesheet">
        <link href="../css/owl.theme.default.min.css" rel="stylesheet">

        <link href="../css/magnific-popup.css" rel="stylesheet">

        <link href="../css/style.css" rel="stylesheet">


        <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
        <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>
    <body>
        <div class="main element">
            <div class="container">
                <div class="row">
                    <div class="col-sm-12">
                        <h2 class="title mt80">Store</h2>
                    </div>
                    <div class="col-sm-12">
                        <div class="headings">
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="footer" style="width=80%"/>
        <script src="../js/jquery-3.1.1.js"></script>
        <script src="../js/bootstrap.min.js"></script>
        <script src="../js/owl.carousel.min.js"></script>
        <script src="https://use.fontawesome.com/55b73bf748.js"></script>
        <script src="../js/jquery.magnific-popup.js"></script>
        <script src="../js/script.js"></script>
    </body>
</html>

最终发生的事情是程序将我要添加到“item_page.html”文件的HTML行插入到最后,然后在末尾添加“item_page_end”字符串。有谁知道如何修复它将HTML行放在Ruby程序之后

<h2 class="title mt80">Store</h2>

我找到的任何其他解决方案都是数组,字符串或根本不起作用。

2 个答案:

答案 0 :(得分:1)

如果您可以编辑HTML文件,我会看到两个可能的答案:

(请注意,在所有情况下,我都使用一个名为add_all_elements的函数,这个函数只返回您想要放在文件中的任何内容。)

  1. 将文件剪成两半,读取上半部分,添加元素然后读取下半部分。它应该是这样的:

    buffer = File.read("template_first_half.html")
    buffer += add_all_elements()
    buffer += File.read("template_second_half.html")
    

    它易于使用,但HTML可能难以阅读。

  2. 您还可以在文件中添加引用并使用gsub替换它:

    buffer = File.read("template.html")
    buffer = buffer.gsub("#####anchor#####", add_all_elements())
    

    也更容易使用,它需要在文件中放置一个唯一的子字符串。问题是引用在文件中必须绝对唯一。优点是HTML文件仍然易于阅读。

  3. 如果您无法编辑HTML文件:

    line_num = 0
    buffer = ''
    break_point = 42
    text.each_line do |line|
      if line_num == break_point
        buffer += add_all_elements()
      end
      buffer += line
      line_num += 1
    end
    

    基本上,您逐行读取文件并将其放入缓冲区。当行数达到所需的值(这里是我在42处设置的变量break_point)时,将所有元素插入缓冲区。

    不方便的是,如果编辑文件,则每次都必须重新设置断点。您还可以使用字符串作为断点来避免大部分问题。

答案 1 :(得分:0)

你可以这样做:

file_to_update = File.read("item_page.html")
file_to_update = file_to_update.sub(/(?<=<h2 class="title mt80">Store<\/h2>)/,file_text)
File.write("item_page.html",file_to_update)

有了这个,就不需要为file_text创建一个新文件了。 基本上发生的是第二行,这里使用lookbehind断言在&#34; Store&lt; / h2&gt;&#34;之后将file_text插入file_to_update。然后,您只需使用更新后的字符串覆盖item_page.html的内容。