Bước tới nội dung

Wikipedia:Lua

Bách khoa toàn thư mở Wikipedia
(Đổi hướng từ Wikipedia:LUA)
WP:Lua (thảo luận) Trợ giúp Việc cần làm Tài nguyên Hướng dẫn tham khảo  
Các không gian tên tại Wikipedia tiếng Việt
Không gian tên nội dung Không gian tên thảo luận
0 (Chính) Thảo luận 1
2 Thành viên Thảo luận Thành viên 3
4 Wikipedia Thảo luận Wikipedia 5
6 Tập tin Thảo luận Tập tin 7
8 MediaWiki Thảo luận MediaWiki 9
10 Bản mẫu Thảo luận Bản mẫu 11
12 Trợ giúp Thảo luận Trợ giúp 13
14 Thể loại Thảo luận Thể loại 15
100 Cổng thông tin Thảo luận Cổng thông tin 101
828 Mô đun Thảo luận Mô đun 829
2300 2301
2302 2303
2600
Không gian tên ảo
-1 Đặc biệt
-2 Phương tiện


Lua là một ngôn ngữ lập trình có sẵn trong tiện ích mở rộng MediaWiki Scribunto trên Wikipedia. Kể từ tháng 2 năm 2013, mã Lua có thể được nhúng vào các bản mẫu wiki bằng cách sử dụng cú pháp "{{#invoke:}}" của Scribunto. Tháng 7 năm 2015, tiện ích mở rộng này hỗ trợ phiên bản Lua 5.1.

Mã nguồn Lua được lưu trữ trong các trang trong không gian tên được gọi là mô đun (ví dụ như Mô đun:Example). Các mô đun riêng lẻ này được gọi bằng cú pháp {{#invoke:<tên mô đun>|<tên hàm>|(tuỳ chọn) tham_số_1 | tham_số_2...}}. Ví dụ

Mã wiki Kết quả
{{#invoke:Example|hello}} Hello World!

Chạy mô đun

[sửa | sửa mã nguồn]

Mô đun được chạy trên các trang wiki bình thường bằng cách sử dụng hàm phân tích cú pháp #invoke. Cú pháp của #invoke tương tự như cú pháp bản mẫu, nhưng có một số khác biệt. Điều quan trọng là bạn cần chỉ định rõ một tên hàm. Hàm là một tập hợp các lệnh nhận các giá trị đầu vào, xử lý chúng và trả về một giá trị đầu ra.[1] Điều này giống như những gì mà bản mẫu thực hiện: bạn cung cấp cho nó các tham số, nó xử lý chúng và bạn nhận được một kết quả. Tuy nhiên, bạn có thể khai báo nhiều chức năng trong một mô đun Lua, trong khi bạn chỉ có thể khai báo một bản mẫu trên một trang. Hơn nữa, bạn không thể chỉ chạy trực tiếp một mô đun Lua - bạn chỉ có thể chạy một trong các chức năng của mô đun. Mô đun chỉ là một vùng chứa cho các chức năng và không tự làm bất cứ điều gì. Vì vậy, có hai lý do mà chúng ta cần nhập tên hàm: chúng ta không thể tự chạy một mô đun và nếu không chỉ định tên hàm, Lua sẽ không biết chúng ta muốn chạy hàm nào.

Cách đơn giản nhất để chạy một mô đun từ một trang wiki là như sau:

{{#invoke:tên mô đun|tên hàm}}

Ví dụ, có thể chạy Mô đun:Example với hàm "hello" như sau

  • {{#invoke:Example|hello}} → Hello World!

Sử dụng các tham số

[sửa | sửa mã nguồn]

Các tham số được truyền đến các mô đun giống như cách chúng được truyền đến các bản mẫu. Tuy nhiên, lưu ý rằng giá trị nhập vào sau dấu gạch dọc "|" đầu tiên luôn là tên hàm; đối số vị trí đầu tiên được đặt sau dấu gạch thẳng thứ hai.

{{#invoke:tên mô đun|tên hàm|tham số vị trí đầu tiên|tham số vị trí thứ hai|tham số được đặt tên = giá trị}}

Trong Mô đun:Example, hàm "hello_to" sẽ chào những người khác nhau tùy thuộc vào tham số vị trí đầu tiên. Cách thức hoạt động như sau

  • {{#invoke:Example|hello_to|Kate}} → Hello, Kate!
  • {{#invoke:Example|hello_to|Fred}} → Hello, Fred!

Một hàm thứ ba trong Mô đun:Example có tên là "count_fruit" sử dụng các tham số được đặt tên là bananasapples để đếm số lượng chuối và táo mà chúng ta có. Cách thức hoạt động:

  • {{#invoke:Example|count_fruit|apples=3|bananas=4}} → I have 4 bananas and 3 apples
  • {{#invoke:Example|count_fruit|bananas=5|apples=2}} → I have 5 bananas and 2 apples

Hầu hết các mô đun đều có trang tài liệu giải thích những tham số nào có thể được sử dụng và tác dụng của chúng.

Trợ giúp

[sửa | sửa mã nguồn]

Đi tới Thảo luận Wikipedia:Lua để yêu cầu trợ giúp trong việc viết mã kịch bản Lua để thực hiện một nhiệm vụ cụ thể trên Wikipedia hoặc một dự án Wikimedia khác.

Xem thêm Bài thuyết trình ngắn của Brad Jorsch về một ví dụ cơ bản về cách chuyển đổi một mẫu mã wiki thành một mô đun Lua.

Lua là một ngôn ngữ kịch bản có thể được sử dụng để phân tích dữ liệu, tính toán biểu thức và định dạng kết quả bằng cách sử dụng các hàm hoặc lập trình hướng đối tượng. Mặc dù một số tập lệnh Lua có thể đơn giản, để dễ hiểu, Lua cho phép các cấu trúc phức tạp bao gồm bảng, hàm động và mảng kết hợp trong đó chỉ mục con có thể là các từ cũng như chỉ mục số. Lua cũng hỗ trợ đệ quy các hàm được lồng lại, vì vậy cần cẩn thận để tránh quá phức tạp khi những người dùng khác sẽ không hiểu cách bảo trì mô đun Lua. Sau đây là mã nguồn của mô đun được sử dụng cho các ví dụ trên.

local p = {};     --Tất cả các mô đun Lua trên Wikipedia phải bắt đầu bằng cách xác định một biến
                    --biến này sẽ giữ các chức năng có thể truy cập bên ngoài của chúng.
                    --Các biến như vậy có thể có bất kỳ tên nào bạn muốn và có thể
                    --chứa nhiều dữ liệu cũng như các hàm.
p.hello = function( frame )     --Thêm một hàm vào "p".
                                        --Các hàm như vậy có thể được gọi trong Wikipedia
                                        --thông qua lệnh #invoke.
                                        --"frame" sẽ chứa dữ liệu mà Wikipedia
                                        --gửi chức năng này khi nó chạy.
                                 -- 'Hello' là tên do bạn lựa chọn. Tên tương tự cần được tham chiếu khi mô-đun được sử dụng.
    
    local str = "Hello World!"  --Khai báo một biến cục bộ và đặt nó bằng
                                --"Hello World!".  
    
    return str    --Điều này yêu cầu chúng tôi thoát khỏi chức năng này và gửi thông tin trong
                  --"str" trở lại Wikipedia.
    
end  -- kết thúc hàm "hello"
function p.hello_to(frame)		-- Thêm một hàm khác khác
	local name = frame.args[1]  -- Để truy cập các đối số được chuyển đến một mô đun, hãy sử dụng `frame.args`
							    -- `frame.args [1]` đề cập đến tham số không tên đầu tiên
							    -- được cung cấp cho mô đun
	return "Hello, " .. name .. "!"  -- `..` `..` nối các chuỗi. Thao tác này sẽ trả về một lời chào tùy chỉnh
									 -- tùy thuộc vào tên được đặt, chẳng hạn như "Hello, Fred!"
end
function p.count_fruit(frame)
	local num_bananas = frame.args.bananas -- Các đối số được đặt tên ({{#invoke:Example|count_fruit|foo=bar}}) cũng được truy cập
	local num_apples = frame.args.apples   -- bằng cách lập chỉ mục `frame.args` theo tên (`frame.args["bananas"]`, hoặc
										   -- hoặc tương đương là `frame.args.bananas`.
	return 'I have ' .. num_bananas .. ' bananas and ' .. num_apples .. ' apples'
										   -- Giống như ở trên, nối một loạt các chuỗi với nhau để tạo ra 
										   -- một câu dựa trên các đối số đã cho.
end

return p    --Tất cả các mô đun được kết thúc bằng cách trả về biến chứa các chức năng của chúng cho Wikipedia.
-- Chúng ta có thể sử dụng mô đun này bằng cách gọi {{#invoke: Example | hello }},
-- {{#invoke: Example | hello_to | foo }}, hoặc {{#invoke:Example|count_fruit|bananas=5|apples=6}}
-- Lưu ý rằng phần đầu tiên của lệnh gọi là tên của trang Mô đun, 
-- và phần thứ hai là tên của một trong các hàm được đính kèm với
-- biến mà bạn đã trả về.

-- Hàm "print" không được phép trong Wikipedia. Tất cả đầu ra đều được thực hiện
-- thông qua các chuỗi "return" cho Wikipedia.

Một ví dụ về Lua được đánh dấu bởi thẻ "<syntaxhighlight lang="lua">...</syntaxhighlight>" đặt xung quanh mã nguồn Lua. Để xem một số ví dụ phức tạp hơn về Lua, hãy xem bài viết: Lua

Để biết hướng dẫn về cách sử dụng Lua trong MediaWiki (và cả Wikipedia), xem mw:Extension:Scribunto/Lua reference manual.

Các tính năng dành riêng cho MediaWiki

[sửa | sửa mã nguồn]

Nhìn chung: Lua chỉ có thể nhận đầu vào dưới dạng chuỗi văn bản được truyền đến {{#invoke:}} và những gì có thể được tìm nạp qua mw.title.new(...):getContent()frame:expandTemplate(). Đầu ra Lua sẽ không được xử lý trước trừ khi frame:preprocess() được gọi rõ ràng, có nghĩa là các hàm gọi bản mẫu, hàm phân tích cú pháp, v.v. sẽ không hoạt động chính xác trong đầu ra. Ngoài ra, tất cả mô đun Lua trong trang được giới hạn trong thời gian CPU là 10 giây (bạn có thể xem trong mã nguồn của trang được kết xuất để xem mẫu hoặc mô đun mất bao lâu để phân tích cú pháp). So với Lua tiêu chuẩn, Lua của Scribunto thiếu tất cả các loại chức năng (xem thêm: mw:Extension:Scribunto/Lua reference manual § Differences from standard Lua)

Giới hạn đầu vào Lua

[sửa | sửa mã nguồn]

Mã Lua trong Scribunto chỉ được chạy khi trang đang được phân tích cú pháp. Do đó, thông tin đầu vào của người dùng duy nhất mà Lua có thể nhận được là bằng cách chỉnh sửa trang - nó không thể tạo một hộp tính căn bậc hai của một số bạn nhập vào hoặc tính toán lại một phần của bộ Mandelbrot tùy thuộc vào phần nào của bộ chính mà bạn nhấp vào. Đầu vào mà Lua có thể nhận được bao gồm bất kỳ trang văn bản có thể truyền tải nào trên Wikipedia. Điều này không bao gồm các tập tin đồ họa (chẳng hạn như .SVG, mặc dù chúng thực sự là văn bản, trừ khi bạn cắt và dán nó vào trang văn bản wiki)

Các tiêu đề Wikipedia bị loại bỏ thường chứa mã ẩn, chẳng hạn như "UNIQ5ae8f2aa414ff233-h-3-QINU" có thể cần được loại bỏ để phân tích cú pháp một cách hiệu quả.

Nếu một liên kết wiki sử dụng thủ thuật dấu gạch dọc như [[Wikipedia:Trợ giúp| ]],nó sẽ không hoạt động nếu trả về dưới dạng đầu ra - chúng cần được viết rõ ràng là [[Wikipedia:Trợ giúp|Trợ giúp]]. Các biến đổi lưu sẵn khác, chẳng hạn như 4 dấu ngã (~~~~) biến đổi thành chữ ký cũng sẽ không thể xử lý được. Với việc truyền tải bản mẫu, lệnh gọi hàm phân tích cú pháp và thay thế biến (tức là bất kỳ thứ gì sử dụng {{...}}) sẽ không được xử lý, cũng như các thẻ như <ref> hoặc <nowiki>. Sử dụng frame:extensionTag để thêm các thẻ như <ref> hoặc <syntaxhighlight> vào đầu ra.

Gán nhãn bản mẫu sử dụng mô đun

[sửa | sửa mã nguồn]

Vui lòng đặt bản mẫu {{Lua}} trên trang con tài liệu của tất cả các bản mẫu sử dụng Lua.

  1. ^ Cũng có thể có nhiều giá trị đầu ra, nhưng các hàm thực hiện điều này thường không được truy cập từ các trang wiki.