c# pdf viewer library free : How to reorder pages in a pdf document software SDK cloud windows .net asp.net class World%20of%20Warcraft%20Programming%20(2nd%20Edition)11-part1773

Chapter 4
Working with Tables
69
You can verify the metatable has been set correctly by using the
getmetatable()
function. This function simply takes a table as the first
argument and returns the metatable, or
nil
if no metatable is attached.
> print(getmetatable(tbl1) == mt)
true
Now that you have an object with a metatable, you can begin redefining the
behavior of the table.
Defining Metamethods
A metamethod is nothing more than a function stored with a specific key
in a metatable. There are several possible metamethods, and they take a
varying number of arguments.Each metamethod begins with two underscore
characters. Youcan finda full list in the Lua ReferenceManual (available online
at
http://www.lua.org
), but the most frequently used ones are shown in
Table 4-1.
Table 4-1: Relevant Metamethods
METAMETHOD
ARGUMENTS DESCRIPTION
___add
2
Defines the behavior when used in addition
operations.
___mul
2
Defines the behavior when used in multiplication
operations.
___div
2
Defines the behavior when used in division
operations.
___sub
2
Defines the behavior when used in subtraction
operations.
___unm
1
Defines thebehavior when negated (unary minus).
___tostring
1
Defines the behavior when the table is an
argument to tostring(). This also affects the
print() function, which calls tostring()
directly.
___concat
2
Defines the behavior when used with the
concatenation operator (..)
___index
2
Defines the behavior when the table is indexed
with a key that doesn’t exist in that table.
___newindex
3
Defines the behavior when a previously unset key
in the table is being set.
How to reorder pages in a pdf document - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
how to reverse pages in pdf; how to change page order in pdf acrobat
How to reorder pages in a pdf document - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
change page order pdf; rearrange pdf pages in preview
70
Part I
Learning to Program
Defining Basic Arithmetic Using ___add, ___sub, ___mul, and
___div
Each of the arithmetic metamethods
___add
,
___sub
,
___mul
,and
___div
takes
two arguments and can (in theory) return anything you’d like. However, keep
the following in mind:
The result of one operation may be part of a largerarithmetic expression.
If you return a non-number from your metamethod, you should ensure
it is capable of handling further arithmetic.
If youreturn
nil
,it will break any arithmetic expression it is a part of, so
it’s best to avoid that.
The following function defines addition between two tables as a new table
with the elements of the first table’s array part, followed by the elements of
the second’s array part. Add the following function to your Lua interpreter:
function mt.___add(a,b)
local result = setmetatable({}, mt)
-- Copy table a in first
for i = 1, #a do
table.insert(result, a[i])
end
-- Copy table b in second
for i = 1, #b do
table.insert(result, b[i])
end
return result
end
To simplify the function, the arguments have been named
a
and
b
.The first
line creates a new results table and makes sure to set the metatable correctly;
without this the result might not work in a larger arithmetic expression. The
rest of the function is straightforward, copying the elements of each table to
the new resulting table. Here is a simple test:
> add_test = tbl1 + tbl2
> print(#add_test)
6
> for i = 1, #add_test do print(i, add_test[i]) end
1
alpha
2
beta
3
gamma
4
delta
5
epsilon
6
zeta
C# TIFF: How to Reorder, Rearrange & Sort TIFF Pages Using C# Code
C# TIFF - Sort TIFF File Pages Order in C#.NET. Reorder, Rearrange and Sort TIFF Document Pages in C#.NET Application. C# TIFF Page Sorting Overview.
change page order in pdf reader; rearrange pages in pdf document
VB.NET PowerPoint: Sort and Reorder PowerPoint Slides by Using VB.
Sort and Reorder PowerPoint Slides Range with VB.NET amount of robust PPT slides/pages editing methods & profession imaging controls, PDF document, image to
reverse pdf page order online; how to move pages around in pdf file
Chapter 4
Working with Tables
71
The metamethod correctly handles the addition and creates a new table
with the results of the addition. The other basic arithmetic operations could
be definedin the same way. Instead of returning a table, these functions could
return some meaningful number that can be used as part of a larger formula.
Defining Negation Using ___unm
The unary minus (negation) operator,
__unm
,expects exactly one argument,
and shouldreturn the resultof the argumentbeingnegated. In these examples,
this will mean reversing the array part of the given table. Run the following
code:
function mt.___unm(a)
local result = setmetatable({}, mt)
-- Reverse through the elements of the array
for i = #a, 1,-1 do
table.insert(result, a[i])
end
return result
end
Test table negation with a few examples:
> unm_test = -tbl1
> for i = 1, #unm_test do print(i, unm_test[i]) end
1
gamma
2
beta
3
alpha
> unm_test = -tbl1 + tbl2
> for i = 1, #unm_test do print(i, unm_test[i]) end
1
gamma
2
beta
3
alpha
4
delta
5
epsilon
6
zeta
Creating Meaningful Output with ___tostring
In thecurrentexample,it would be useful toprint thetable and haveit display
the elements rather than the unique string Lua provides. You can accomplish
that using the
___tostring
metamethod, which takes a single argument (the
table) and should return a string.
Run the following code:
function mt.___tostring(tbl)
local result = “{“
for i = 1, #tbl do
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
C# PDF Page Processing: Sort PDF Pages - online C#.NET tutorial page for how to reorder, sort, reorganize or re-arrange PDF document files using C#.NET code.
change page order pdf preview; reorder pdf pages online
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
with the functions to merge PDF files using C# .NET, add new PDF page, delete certain PDF page, reorder existing PDF pages and split PDF document in both
change page order pdf reader; reorder pages pdf
72
Part I
Learning to Program
if i > 1 then
result = result .. “, “
end
result = result .. tostring(tbl[i])
end
result = result .. “}“
return result
end
Because you know the input will be a table, you start the string with the
{
character. This function then loops through each element of the array. If the
loop is beyond the first element, a comma is added to the string to separate
each value. This is done so you don’t have an extra comma at the end of the
output. Then the value itself is concatenated onto the result string. Finally,
when the loop is complete, you close the brace and return the string:
> print(tbl1)
{alpha, beta, gamma}
> print(tbl2)
{delta, epsilon, zeta}
> print(tbl3)
{}
When working with more complex objects, itcan be very useful to providea
meaningful text representation of your data, so the
___tostring
metamethod
can be extremely handy.
Concatenating Tables Using ___concat
For thesetables, concatenation will end upbeingthesamethingas addition, so
you can simply usethat function for the
___concat
metamethod,as well. Both
metamethods take in two arguments and return a single result. In addition,
both are typically chained together, so you’ll need to ensure the resulting
object is also capable of concatenation. Run the following test:
> mt.___concat = mt.___add
> print(tbl1 .. tbl2)
{alpha, beta, gamma, delta, epsilon, zeta}
Because the
___tostring
metamethod is still active, the resulting table is
converted to string representation, even when printed like this.
Exploring Fallback Tables with ___index
Normally, when a tabledoes not havea valueassociated with a given key,
nil
is returned. That makes sense for run-of-the-mill tables, but at times it is more
VB.NET TIFF: Modify TIFF File by Adding, Deleting & Sort TIFF
Users can use it to reorder TIFF pages in &ltsummary> ''' Sort TIFF document pages in designed powerful & profession imaging controls, PDF document, image to
rearrange pages in pdf; reorder pages of pdf
C# Word: How to Create Word Document Viewer in C#.NET Imaging
in C#.NET; Offer mature Word file page manipulation functions (add, delete & reorder pages) in document viewer; Rich options to add
how to move pages in pdf; how to change page order in pdf document
Chapter 4
Working with Tables
73
appropriate to take other action instead. The
___index
metamethod allows
that to happen, following this procedure:
1. Code tries to access an unassociated key in a table.
2. If the table has an
___index
metatable entry that is another table, look
up the same key in that table and return it (or
nil
if it doesn’t exist).
This may possibly trigger the
___index
metamethod of the second table,
making a chain.
3. If the table has an
___index
metatable entry that is a function, call the
function with the table and the key as arguments, and return the result.
Example Using Tables
Let’s expand on the previous example by creating a table with an
___index
metamethod that allows for the translation of English phrases into German.
Run the following code:
tbl4 = {[“Night elf“] = “Nachtelf“}
setmetatable(tbl4, mt)
enUS_defaults = {
[“Human“] = “Human“,
[“Night elf“] = “Night elf“,
}
mt.___index = enUS_defaults
This example creates a new table that contains the German localization of
the English phrase
Night elf
.In addition,there is a default table that contains
the English phrases
Human
and
Night elf
.If the answerisn’t found when
tb14
is indexed, Lua will look in the metatable’s
___index
entry and return that
result. See this in action yourself:
> print(tbl4[“Night elf“])
Nachtelf
> print(tbl4[“Human“])
Human
> print(tbl3[“Night elf“])
Night elf
Because the metatable is shared between the four tables being used in this
exercise, if you access the
Night elf
or
Human
key in the table, you will get the
English version of the phrase back. The
___index
metatable entry here allows
youto provide partial localization for the German language by displaying the
English words by default when a translation isn’t found.
Read PDF in Web Image Viewer| Online Tutorials
Extract images from PDF documents; Add, reorder pages in PDF files; detailed information for reading and editing PDF in RasterEdge Web Document Viewer
how to rearrange pages in a pdf document; how to reorder pdf pages
.NET Multipage TIFF SDK| Process Multipage TIFF Files
upload to SharePoint and save to PDF documents. View, edit, insert, delete and mark up pages in multi Easily add, modify, reorder and delete TIFF tags; Perfectly
change page order pdf acrobat; how to rearrange pdf pages in preview
74
Part I
Learning to Program
Example Using Functions
Instead of using a table for the
___index
entry, you can specify a function
that takes two arguments: the table itself and the key being requested. This
function enables you to add logic to the indexing of tables. Run the following
code,which allows youto avoidhavinga long table of defaultswhere thekeys
and the values are the same:
defaults_mt = {
___index = function(tbl, key)
if type(key) == “string“ then
print(“Return default value of '“ .. key .. “' for key: “ .. key)
return key
else
return nil
end
end,
}
setmetatable(enUS_defaults, defaults_mt)
Then test it with the following examples:
> print(tbl4[“Night elf“])
Nachtelf
> print(tbl4[“Human“])
Human
> print(tbl4[“Gnome“])
Return default value of 'Gnome' for key: Gnome
Gnome
> print(tbl4[1])
nil
Notethatthesecondtolastexampleprintsa messagein additiontoreturning
thevalue.In fact, ametamethodthatis a function can doany numberofthings.
Catching Creation of Keys with ___newindex
Unlike the
___index
metamethod, which is designed to handle keys being
requested froma table, the
___newindex
metamethod can be usedwhen a new
key has been set in the table. Specifically, it is called whenever an assignment
is made to a non-existing key in a table.
___newindex
takes three arguments:
tbl
—The table being indexed
key
—The key being used to index the table
value
—The value to assign to
table[key]
Chapter 4
Working with Tables
75
When this metamethod is set, it is responsible for actually making the
assignment happen. This can be usedto stopa valuefromeverbeing set in the
first place.Run the following code in your interpreter:
function mt.___newindex(tbl, key, value)
if key == “banana“ then
error(“Cannot set a protected key“)
else
rawset(tbl, key, value)
end
end
The
rawset()
function here allows you to bypass the metatable (covered
in the next section), to prevent your metamethod from being called again.
As long as this metatable is set, you will be unable to (through conventional
means) set the key
[“banana“]
in any of the example tables, as shown in the
following:
> tbl1.apple = “red“
> print(tbl1.apple)
red
> tbl1.banana = “yellow“
stdin:3: Cannot set a protected key
stack traceback:
[C]: in function 'error'
stdin:3: in function <stdin:1>
stdin:1: in main chunk
[C]: ?
> print(tbl1.banana)
Return default value of 'banana' for key: banana
banana
Because the metamethod errors instead of setting the new entry,you have a
pseudo-‘‘protected’’ key in your tables.
Bypassing Metatables
When writing functions for the
___index
and
___newindex
metamethods, it
maybe necessarytobypass themetatable when getting or settinga value. This
is accomplished using the
rawget()
and
rawset()
functions.
value = rawget(tbl, key)
The
rawget()
function takes the table to query and the key to look up, and
returns the value of that key in the table without using the metatable for
lookups. When you are writing a function that serves as a metamethod for a
table, it is typically best to use
rawget()
to access values in that table.
76
Part I
Learning to Program
rawset(tbl, key, value)
To set a value in a table without hitting the metatable, you can use the
rawset()
function. It takes in the table to be altered, the key to use, and the
value to be placed in the table. You will encounter tables with
___newindex
metamethods less frequently than those with
___index
metamethods, but it’s
good to understand what tools are available, in case you need them.
Summary
In this chapter you learned how to use Lua tables to store data that can be
easily read and indexed. Arrays were introduced as a special subset of tables
with helper functions to insert/remove and sort array tables. Namespaces
of functions were introduced along with basic object-oriented programming.
Finally, you learned how to extend tables using metatables.
Thenext chapterintroducesyoutomoreadvanced features offunctions and
control structures.
CH A P T E R
5
Advanced Functions and
Control Structures
The functions and control structures introduced in Chapter 3 were relatively
simple but gave you the capability to create nontrivial programs. This chapter
introduces more advanced versions of functions and loops that allow you to
accomplish the following:
Create functions with a variable number of arguments
Return multiple values froma function
Loop through the key/value pairs in the hash part of a table
Sort an array with table data
Multiple Return Values
In Lua, functions are able toreturn more than onevalue in a
return
statement,
which makes accomplishing some tasks more natural. For example, colors
in World of Warcraft are represented as both hexadecimal values (such as
99CCFF
)as well as numeric percentages of red, green, and blue (such as
0.6
,
0.8
,
1.0
). Asa result, itcan be useful to convertthehexadecimal values (which
are widely used on the web) to the decimal equivalents.
Converting Hex to RGB
An example of a hexadecimal string is
FFCC99
,where the first two characters
represent the value of the color red as a number between 0 and 255 in
hexadecimal. The second set of characters is the value of green, followed by
blue. The
string.sub()
function can be used to split the string into its three
77
78
Part I
Learning to Program
component color strings, whereas the
tonumber()
function can convert the
string into a number. If the
tonumber()
function is called with the red part of
the string
“FF“
,it won’t return a meaningful result:
> print(tonumber(“FF“))
nil
By default, the
tonumber()
function expects the number to be a decimal
number (that is, in base-10), so it can’t convert this base-16 number. The
second argument of
tonumber()
specifies the base of the string that is being
converted. In this case:
> print(tonumber(“FF“, 16))
255
Because the output needs to be a number between 0.0 and 1.0, this value
can be divided by 255 to obtain the percentage value. Add a definition for
ConvertHexToRGB()
as follows:
function ConvertHexToRGB(hex)
local red = string.sub(hex, 1, 2)
local green = string.sub(hex, 3, 4)
local blue = string.sub(hex, 5, 6)
red = tonumber(red, 16) / 255
green = tonumber(green, 16) / 255
blue = tonumber(blue, 16) / 255
return red, green, blue
end
Test this function with a few sample values:
> print(ConvertHexToRGB(“FFCC99“))
1, 0.8, 0.6
> print(ConvertHexToRGB(“FFFFFF“))
1, 1, 1
> print(ConvertHexToRGB(“000000“))
0, 0, 0
Assigning Multiple Values
To get the results of a function with multiple return values such as
ConvertHexToRGB()
,you can use the following syntax:
var1, var2, var3, var4 = someFunction()
This calls
someFunction()
and assigns the first return to
var1
,the second
return to
var2
,and so on. If there are more returns than variables, the extra
returns are just discarded. In the case that there are more variables than
returns, the remaining variables are set to
nil
.
Documents you may be interested
Documents you may be interested